From 1d6b7c71cbd3301915a0777404d0d6627373b979 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 3 Sep 2017 17:15:31 +0200 Subject: [PATCH 001/764] Optimise starting slice job a bit Moved some common code into a subroutine. Also replaced the start and end g-code directly in the settings list instead of checking for the key at each iteration of the loop. --- plugins/CuraEngineBackend/StartSliceJob.py | 68 ++++++++++++---------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 13aee06289..1e8698dee1 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -208,6 +208,27 @@ class StartSliceJob(Job): def isCancelled(self): return self._is_cancelled + ## Creates a dictionary of tokens to replace in g-code pieces. + # + # This indicates what should be replaced in the start and end g-codes. + # \param stack The stack to get the settings from to replace the tokens + # with. + # \return A dictionary of replacement tokens to the values they should be + # replaced with. + def _buildReplacementTokens(self, stack) -> dict: + result = {} + for key in stack.getAllKeys(): + result[key] = stack.getProperty(key, "value") + Job.yieldThread() + + result["print_bed_temperature"] = result["material_bed_temperature"] #Renamed settings. + result["print_temperature"] = result["material_print_temperature"] + result["time"] = time.strftime("%H:%M:%S") #Some extra settings. + result["date"] = time.strftime("%d-%m-%Y") + result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] + + return result + def _expandGcodeTokens(self, key, value, settings): try: # any setting can be used as a token @@ -222,18 +243,16 @@ class StartSliceJob(Job): message = self._slice_message.addRepeatedMessage("extruders") message.id = int(stack.getMetaDataEntry("position")) + settings = self._buildReplacementTokens(stack) + + #Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. material_instance_container = stack.findContainer({"type": "material"}) + if material_instance_container: + settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") - settings = {} - for key in stack.getAllKeys(): - settings[key] = stack.getProperty(key, "value") - Job.yieldThread() - - settings["print_bed_temperature"] = settings["material_bed_temperature"] #Renamed settings. - settings["print_temperature"] = settings["material_print_temperature"] - settings["time"] = time.strftime("%H:%M:%S") #Some extra settings. - settings["date"] = time.strftime("%d-%m-%Y") - settings["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] + #Replace the setting tokens in start and end g-code. + settings["machine_extruder_start_code"] = self._expandGcodeTokens("machine_extruder_start_code", settings["machine_extruder_start_code"], settings) + settings["machine_extruder_end_code"] = self._expandGcodeTokens("machine_extruder_end_code", settings["machine_extruder_end_code"], settings) for key, value in settings.items(): # Do not send settings that are not settable_per_extruder. @@ -241,13 +260,7 @@ class StartSliceJob(Job): continue setting = message.getMessage("settings").addRepeatedMessage("settings") setting.name = key - if key == "material_guid" and material_instance_container: - # Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. - setting.value = str(material_instance_container.getMetaDataEntry("GUID", "")).encode("utf-8") - elif key == "machine_extruder_start_code" or key == "machine_extruder_end_code": - setting.value = self._expandGcodeTokens(key, value, settings) - else: - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + setting.value = str(value).encode("utf-8") Job.yieldThread() ## Create extruder message from global stack @@ -268,11 +281,7 @@ class StartSliceJob(Job): # The settings are taken from the global stack. This does not include any # per-extruder settings or per-object settings. def _buildGlobalSettingsMessage(self, stack): - keys = stack.getAllKeys() - settings = {} - for key in keys: - settings[key] = stack.getProperty(key, "value") - Job.yieldThread() + settings = self._buildReplacementTokens(stack) start_gcode = settings["machine_start_gcode"] #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend @@ -281,20 +290,14 @@ class StartSliceJob(Job): print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) - settings["print_bed_temperature"] = settings["material_bed_temperature"] - settings["print_temperature"] = settings["material_print_temperature"] - - settings["time"] = time.strftime('%H:%M:%S') - settings["date"] = time.strftime('%d-%m-%Y') - settings["day"] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][int(time.strftime('%w'))] + #Replace the setting tokens in start and end g-code. + settings["machine_start_gcode"] = self._expandGcodeTokens("machine_start_gcode", settings["machine_start_gcode"], settings) + settings["machine_end_gcode"] = self._expandGcodeTokens("machine_end_gcode", settings["machine_end_gcode"], settings) for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key - if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. - setting_message.value = self._expandGcodeTokens(key, value, settings) - else: - setting_message.value = str(value).encode("utf-8") + setting_message.value = str(value).encode("utf-8") Job.yieldThread() ## Sends for some settings which extruder they should fallback to if not @@ -356,3 +359,4 @@ class StartSliceJob(Job): relations_set.add(relation.target.key) self._addRelations(relations_set, relation.target.relations) + From 0a2a7dda2330074074aed3127934c80298c1fe46 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 3 Sep 2017 17:19:30 +0200 Subject: [PATCH 002/764] Remove unused parameter And document that function while we're at it. --- plugins/CuraEngineBackend/StartSliceJob.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 1e8698dee1..00db2ffa00 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -229,7 +229,11 @@ class StartSliceJob(Job): return result - def _expandGcodeTokens(self, key, value, settings): + ## Replace setting tokens in a piece of g-code. + # \param value A piece of g-code to replace tokens in. + # \param settings A dictionary of tokens to replace and their respective + # replacement strings. + def _expandGcodeTokens(self, value: str, settings: dict): try: # any setting can be used as a token fmt = GcodeStartEndFormatter() @@ -251,8 +255,8 @@ class StartSliceJob(Job): settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") #Replace the setting tokens in start and end g-code. - settings["machine_extruder_start_code"] = self._expandGcodeTokens("machine_extruder_start_code", settings["machine_extruder_start_code"], settings) - settings["machine_extruder_end_code"] = self._expandGcodeTokens("machine_extruder_end_code", settings["machine_extruder_end_code"], settings) + settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings) + settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], settings) for key, value in settings.items(): # Do not send settings that are not settable_per_extruder. @@ -291,8 +295,8 @@ class StartSliceJob(Job): settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) #Replace the setting tokens in start and end g-code. - settings["machine_start_gcode"] = self._expandGcodeTokens("machine_start_gcode", settings["machine_start_gcode"], settings) - settings["machine_end_gcode"] = self._expandGcodeTokens("machine_end_gcode", settings["machine_end_gcode"], settings) + settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], settings) + settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], settings) for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") From 6dc3b2904797b46f28536c34bbd8c4259a436566 Mon Sep 17 00:00:00 2001 From: Buco Date: Wed, 11 Oct 2017 11:51:39 +0200 Subject: [PATCH 003/764] Add Builder Premium Add definitions for the Builder Premium Small, Medium and Large printers. --- .../builder_premium_large.def.json | 118 ++++++++++++++++++ .../builder_premium_medium.def.json | 118 ++++++++++++++++++ .../builder_premium_small.def.json | 117 +++++++++++++++++ .../builder_premium_large_front.def.json | 27 ++++ .../builder_premium_large_rear.def.json | 27 ++++ .../builder_premium_medium_front.def.json | 27 ++++ .../builder_premium_medium_rear.def.json | 27 ++++ .../builder_premium_small_front.def.json | 27 ++++ .../builder_premium_small_rear.def.json | 27 ++++ resources/meshes/builder_premium_platform.stl | Bin 0 -> 1348084 bytes .../builder_premium_high.inst.cfg | 27 ++++ .../builder_premium_low.inst.cfg | 26 ++++ .../builder_premium_normal.inst.cfg | 25 ++++ 13 files changed, 593 insertions(+) create mode 100644 resources/definitions/builder_premium_large.def.json create mode 100644 resources/definitions/builder_premium_medium.def.json create mode 100644 resources/definitions/builder_premium_small.def.json create mode 100644 resources/extruders/builder_premium_large_front.def.json create mode 100644 resources/extruders/builder_premium_large_rear.def.json create mode 100644 resources/extruders/builder_premium_medium_front.def.json create mode 100644 resources/extruders/builder_premium_medium_rear.def.json create mode 100644 resources/extruders/builder_premium_small_front.def.json create mode 100644 resources/extruders/builder_premium_small_rear.def.json create mode 100644 resources/meshes/builder_premium_platform.stl create mode 100644 resources/quality/builder_premium/builder_premium_high.inst.cfg create mode 100644 resources/quality/builder_premium/builder_premium_low.inst.cfg create mode 100644 resources/quality/builder_premium/builder_premium_normal.inst.cfg diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json new file mode 100644 index 0000000000..e7a5b9c24b --- /dev/null +++ b/resources/definitions/builder_premium_large.def.json @@ -0,0 +1,118 @@ +{ + "id": "builder_premium_large", + "version": 2, + "name": "Builder Premium Large", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "quality_definition": "builder_premium_small", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": + { + "0": "builder_premium_medium_rear", + "1": "builder_premium_medium_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Large" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 600 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json new file mode 100644 index 0000000000..bb2b2eb0a8 --- /dev/null +++ b/resources/definitions/builder_premium_medium.def.json @@ -0,0 +1,118 @@ +{ + "id": "builder_premium_medium", + "version": 2, + "name": "Builder Premium Medium", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "quality_definition": "builder_premium_small", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": + { + "0": "builder_premium_medium_rear", + "1": "builder_premium_medium_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Medium" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 400 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json new file mode 100644 index 0000000000..19fd3524cc --- /dev/null +++ b/resources/definitions/builder_premium_small.def.json @@ -0,0 +1,117 @@ +{ + "id": "builder_premium_small", + "version": 2, + "name": "Builder Premium Small", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": + { + "0": "builder_premium_small_rear", + "1": "builder_premium_small_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Small" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 200 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/extruders/builder_premium_large_front.def.json b/resources/extruders/builder_premium_large_front.def.json new file mode 100644 index 0000000000..159682dc1c --- /dev/null +++ b/resources/extruders/builder_premium_large_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_large_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_large", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_large_rear.def.json b/resources/extruders/builder_premium_large_rear.def.json new file mode 100644 index 0000000000..5e9cc062ae --- /dev/null +++ b/resources/extruders/builder_premium_large_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_large_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_large", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_medium_front.def.json b/resources/extruders/builder_premium_medium_front.def.json new file mode 100644 index 0000000000..9a330b4f4b --- /dev/null +++ b/resources/extruders/builder_premium_medium_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_medium_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_medium", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_medium_rear.def.json b/resources/extruders/builder_premium_medium_rear.def.json new file mode 100644 index 0000000000..49d4734306 --- /dev/null +++ b/resources/extruders/builder_premium_medium_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_medium_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_medium", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_small_front.def.json b/resources/extruders/builder_premium_small_front.def.json new file mode 100644 index 0000000000..2e6293d153 --- /dev/null +++ b/resources/extruders/builder_premium_small_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_small_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_small", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_small_rear.def.json b/resources/extruders/builder_premium_small_rear.def.json new file mode 100644 index 0000000000..d1606cdd79 --- /dev/null +++ b/resources/extruders/builder_premium_small_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_small_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_small", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/meshes/builder_premium_platform.stl b/resources/meshes/builder_premium_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..b315d4b6d4720b7dc57123ae214a0f5c286bc55f GIT binary patch literal 1348084 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�hbTgf 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�oy?S1LD=wVvF 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 z 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

ix;b0pB^KQ=@2%4_3)TaBR_VpVqW&eB(I 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%0Do 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 Date: Thu, 12 Oct 2017 09:26:45 +0200 Subject: [PATCH 004/764] trihex infill --- resources/definitions/fdmprinter.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ca424dfd2f..1b492a2cf8 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1354,7 +1354,7 @@ "default_value": 2, "minimum_value": "0", "minimum_value_warning": "infill_line_width", - "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == 'grid' else (3 if infill_pattern == 'triangles' or infill_pattern == 'cubic' or infill_pattern == 'cubicsubdiv' else (2 if infill_pattern == 'tetrahedral' or infill_pattern == 'quarter_cubic' else (1 if infill_pattern == 'cross' or infill_pattern == 'cross_3d' else 1))))", + "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == 'grid' else (3 if infill_pattern == 'triangles' or infill_pattern == 'trihexagon' or infill_pattern == 'cubic' or infill_pattern == 'cubicsubdiv' else (2 if infill_pattern == 'tetrahedral' or infill_pattern == 'quarter_cubic' else (1 if infill_pattern == 'cross' or infill_pattern == 'cross_3d' else 1))))", "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true } @@ -1370,6 +1370,7 @@ "grid": "Grid", "lines": "Lines", "triangles": "Triangles", + "trihexagon": "Tri-Hexagon", "cubic": "Cubic", "cubicsubdiv": "Cubic Subdivision", "tetrahedral": "Octet", From 95f018530ff40de5b79309ef3f77dc27dc72324d Mon Sep 17 00:00:00 2001 From: Buco Date: Mon, 16 Oct 2017 13:21:46 +0200 Subject: [PATCH 005/764] Add Builder Premium Tabs became spaces --- .../builder_premium_large.def.json | 68 +++++++++---------- .../builder_premium_medium.def.json | 64 ++++++++--------- .../builder_premium_small.def.json | 62 ++++++++--------- 3 files changed, 97 insertions(+), 97 deletions(-) diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json index e7a5b9c24b..aaeda0fdb1 100644 --- a/resources/definitions/builder_premium_large.def.json +++ b/resources/definitions/builder_premium_large.def.json @@ -8,20 +8,20 @@ "author": "Builder SZ", "manufacturer": "Builder", "category": "Other", - "quality_definition": "builder_premium_small", + "quality_definition": "builder_premium_small", "file_formats": "text/x-gcode", "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - "has_machine_quality": true, - "preferred_quality": "*normal*", - "machine_extruder_trains": + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": { - "0": "builder_premium_medium_rear", - "1": "builder_premium_medium_front" + "0": "builder_premium_large_rear", + "1": "builder_premium_large_front" } }, - + "overrides": { "machine_name": { "default_value": "Builder Premium Large" }, @@ -31,21 +31,21 @@ "machine_depth": { "default_value": 205 }, "material_diameter": { "default_value": 1.75 }, - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_print": { "value": "40" }, "speed_support": { "value": "speed_wall_0" }, @@ -55,29 +55,29 @@ "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, "speed_wall_x": { "value": "speed_wall" }, - "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_x": { "default_value": 175 }, "prime_tower_position_y": { "default_value": 178 }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": true }, - "acceleration_enabled": { "value": "True" }, + "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_print": { "value": "3000" }, "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_support_interface": { "value": "acceleration_topbottom" }, "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_travel": { "value": "acceleration_print" }, "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, - "jerk_enabled": { "value": "True" }, + "jerk_enabled": { "value": "True" }, "jerk_layer_0": { "value": "jerk_topbottom" }, "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, "jerk_print": { "value": "25" }, @@ -87,22 +87,22 @@ "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - "wall_thickness": { "value": "1.2" }, + "wall_thickness": { "value": "1.2" }, - "retraction_amount": { "default_value": 3 }, + "retraction_amount": { "default_value": 3 }, "retraction_speed": { "default_value": 15 }, "retraction_retract_speed": { "default_value": 15 }, "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, "adhesion_type": { "default_value": "skirt" }, "machine_nozzle_heat_up_speed": { "default_value": 2 }, "machine_nozzle_cool_down_speed": { "default_value": 2 }, "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_x": { "default_value": 300 }, "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_feedrate_z": { "default_value": 40 }, "machine_max_acceleration_z": { "default_value": 500 }, "machine_acceleration": { "default_value": 1000 }, "machine_max_jerk_xy": { "default_value": 10 }, @@ -113,6 +113,6 @@ "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, - "machine_extruder_count": { "default_value": 2 } + "machine_extruder_count": { "default_value": 2 } } } \ No newline at end of file diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json index bb2b2eb0a8..79825a5653 100644 --- a/resources/definitions/builder_premium_medium.def.json +++ b/resources/definitions/builder_premium_medium.def.json @@ -8,20 +8,20 @@ "author": "Builder SZ", "manufacturer": "Builder", "category": "Other", - "quality_definition": "builder_premium_small", + "quality_definition": "builder_premium_small", "file_formats": "text/x-gcode", "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - "has_machine_quality": true, - "preferred_quality": "*normal*", - "machine_extruder_trains": + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": { "0": "builder_premium_medium_rear", "1": "builder_premium_medium_front" } }, - + "overrides": { "machine_name": { "default_value": "Builder Premium Medium" }, @@ -31,21 +31,21 @@ "machine_depth": { "default_value": 205 }, "material_diameter": { "default_value": 1.75 }, - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_print": { "value": "40" }, "speed_support": { "value": "speed_wall_0" }, @@ -55,29 +55,29 @@ "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, "speed_wall_x": { "value": "speed_wall" }, - "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_x": { "default_value": 175 }, "prime_tower_position_y": { "default_value": 178 }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": true }, - "acceleration_enabled": { "value": "True" }, + "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_print": { "value": "3000" }, "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_support_interface": { "value": "acceleration_topbottom" }, "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_travel": { "value": "acceleration_print" }, "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, - "jerk_enabled": { "value": "True" }, + "jerk_enabled": { "value": "True" }, "jerk_layer_0": { "value": "jerk_topbottom" }, "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, "jerk_print": { "value": "25" }, @@ -87,22 +87,22 @@ "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - "wall_thickness": { "value": "1.2" }, + "wall_thickness": { "value": "1.2" }, - "retraction_amount": { "default_value": 3 }, + "retraction_amount": { "default_value": 3 }, "retraction_speed": { "default_value": 15 }, "retraction_retract_speed": { "default_value": 15 }, "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, "adhesion_type": { "default_value": "skirt" }, "machine_nozzle_heat_up_speed": { "default_value": 2 }, "machine_nozzle_cool_down_speed": { "default_value": 2 }, "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_x": { "default_value": 300 }, "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_feedrate_z": { "default_value": 40 }, "machine_max_acceleration_z": { "default_value": 500 }, "machine_acceleration": { "default_value": 1000 }, "machine_max_jerk_xy": { "default_value": 10 }, @@ -113,6 +113,6 @@ "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, - "machine_extruder_count": { "default_value": 2 } + "machine_extruder_count": { "default_value": 2 } } } \ No newline at end of file diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 19fd3524cc..358b41a072 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -10,17 +10,17 @@ "category": "Other", "file_formats": "text/x-gcode", "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - "has_machine_quality": true, - "preferred_quality": "*normal*", - "machine_extruder_trains": + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*normal*", + "machine_extruder_trains": { "0": "builder_premium_small_rear", "1": "builder_premium_small_front" } }, - + "overrides": { "machine_name": { "default_value": "Builder Premium Small" }, @@ -30,21 +30,21 @@ "machine_depth": { "default_value": 205 }, "material_diameter": { "default_value": 1.75 }, - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "material_print_temperature": {"value": 215 }, + "default_material_print_temperature": { "default_value": 215 }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_print": { "value": "40" }, "speed_support": { "value": "speed_wall_0" }, @@ -54,29 +54,29 @@ "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, "speed_wall_x": { "value": "speed_wall" }, - "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_x": { "default_value": 175 }, "prime_tower_position_y": { "default_value": 178 }, "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, - "prime_blob_enable": { "enabled": true }, + "prime_blob_enable": { "enabled": true }, - "acceleration_enabled": { "value": "True" }, + "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_print": { "value": "3000" }, "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, "acceleration_support_interface": { "value": "acceleration_topbottom" }, "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_travel": { "value": "acceleration_print" }, "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, - "jerk_enabled": { "value": "True" }, + "jerk_enabled": { "value": "True" }, "jerk_layer_0": { "value": "jerk_topbottom" }, "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, "jerk_print": { "value": "25" }, @@ -86,22 +86,22 @@ "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - "wall_thickness": { "value": "1.2" }, + "wall_thickness": { "value": "1.2" }, - "retraction_amount": { "default_value": 3 }, + "retraction_amount": { "default_value": 3 }, "retraction_speed": { "default_value": 15 }, "retraction_retract_speed": { "default_value": 15 }, "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, "adhesion_type": { "default_value": "skirt" }, "machine_nozzle_heat_up_speed": { "default_value": 2 }, "machine_nozzle_cool_down_speed": { "default_value": 2 }, "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_x": { "default_value": 300 }, "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_feedrate_z": { "default_value": 40 }, "machine_max_acceleration_z": { "default_value": 500 }, "machine_acceleration": { "default_value": 1000 }, "machine_max_jerk_xy": { "default_value": 10 }, @@ -112,6 +112,6 @@ "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" }, - "machine_extruder_count": { "default_value": 2 } + "machine_extruder_count": { "default_value": 2 } } } \ No newline at end of file From 70f0e8752bb55debb60e028819b12579cc6e0697 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 16 Oct 2017 15:05:51 +0200 Subject: [PATCH 006/764] Add extra --headless flag to commandline --- cura/CuraApplication.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6a4b996080..13d67d5c70 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -533,6 +533,7 @@ class CuraApplication(QtApplication): super().addCommandLineOptions(parser) parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("--single-instance", action="store_true", default=False) + parser.add_argument("--headless", action = "store_true", default=False) # Set up a local socket server which listener which coordinates single instances Curas and accepts commands. def _setUpSingleInstanceServer(self): @@ -679,9 +680,12 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - self.initializeEngine() - if self._engine.rootObjects: + run_headless = self.getCommandLineOption("headless", False) + if not run_headless: + self.initializeEngine() + + if run_headless or self._engine.rootObjects: self.closeSplash() for file in self.getCommandLineOption("file", []): @@ -1227,6 +1231,9 @@ class CuraApplication(QtApplication): # see GroupDecorator._onChildrenChanged def _createSplashScreen(self): + run_headless = self.getCommandLineOption("headless", False) + if run_headless: + return None return CuraSplashScreen.CuraSplashScreen() def _onActiveMachineChanged(self): From 6fae0a3e09f08433e84533f89d38a9ee1330a40a Mon Sep 17 00:00:00 2001 From: Buco Date: Mon, 16 Oct 2017 15:43:35 +0200 Subject: [PATCH 007/764] Add Premium Changed "setting_version" to 3 --- .../quality/builder_premium/builder_premium_high.inst.cfg | 2 +- .../quality/builder_premium/builder_premium_low.inst.cfg | 4 ++-- .../quality/builder_premium/builder_premium_normal.inst.cfg | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/quality/builder_premium/builder_premium_high.inst.cfg b/resources/quality/builder_premium/builder_premium_high.inst.cfg index f82b12aa15..5e990e64d9 100644 --- a/resources/quality/builder_premium/builder_premium_high.inst.cfg +++ b/resources/quality/builder_premium/builder_premium_high.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = generic_pla_175 -setting_version = 2 +setting_version = 3 weight = 1 global_quality = True diff --git a/resources/quality/builder_premium/builder_premium_low.inst.cfg b/resources/quality/builder_premium/builder_premium_low.inst.cfg index 2d83602b9e..8d8c3464d2 100644 --- a/resources/quality/builder_premium/builder_premium_low.inst.cfg +++ b/resources/quality/builder_premium/builder_premium_low.inst.cfg @@ -6,8 +6,8 @@ definition = builder_premium_small [metadata] type = quality quality_type = low -material = generic_pla -setting_version = 2 +material = generic_pla_175 +setting_version = 3 weight = -1 global_quality = True diff --git a/resources/quality/builder_premium/builder_premium_normal.inst.cfg b/resources/quality/builder_premium/builder_premium_normal.inst.cfg index b53e572887..7d401d4dea 100644 --- a/resources/quality/builder_premium/builder_premium_normal.inst.cfg +++ b/resources/quality/builder_premium/builder_premium_normal.inst.cfg @@ -6,9 +6,9 @@ definition = builder_premium_small [metadata] type = quality quality_type = normal -material = generic_pla +material = generic_pla_175 +setting_version = 3 weight = 0 -setting_version = 2 global_quality = True [values] From 774511370466667553ad06514935d25d3bc0a113 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Oct 2017 15:32:21 +0200 Subject: [PATCH 008/764] Re-use stack variable We're creating the variable but then requesting the 0th element from the list each time... That can be more logical and more efficient. Contributes to issue CURA-4243. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 5b1e084262..b4fc562378 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -651,13 +651,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # HACK # There is a machine, check if it has authentication data. If so, keep that data. - network_authentication_id = container_stacks[0].getMetaDataEntry("network_authentication_id") - network_authentication_key = container_stacks[0].getMetaDataEntry("network_authentication_key") - container_stacks[0].deserialize(archive.open(global_stack_file).read().decode("utf-8")) + network_authentication_id = stack.getMetaDataEntry("network_authentication_id") + network_authentication_key = stack.getMetaDataEntry("network_authentication_key") + stack.deserialize(archive.open(global_stack_file).read().decode("utf-8")) if network_authentication_id: - container_stacks[0].addMetaDataEntry("network_authentication_id", network_authentication_id) + stack.addMetaDataEntry("network_authentication_id", network_authentication_id) if network_authentication_key: - container_stacks[0].addMetaDataEntry("network_authentication_key", network_authentication_key) + stack.addMetaDataEntry("network_authentication_key", network_authentication_key) elif self._resolve_strategies["machine"] == "new": # create a new global stack From 2fc198a7ad61f4ddb14a031b3e92e10aec2ae52a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Oct 2017 15:48:19 +0200 Subject: [PATCH 009/764] Move manual criterion into base criteria filter This code was filtering on certain criteria, and then filtering the results based on an additional metadata field. Let's just move that last field in the original criteria too... Contributes to issue CURA-4243. --- cura/QualityManager.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index b6d47d919b..90ca285736 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -209,11 +209,13 @@ class QualityManager: definition_id = "fdmprinter" if base_material: # There is a basic material specified - criteria = { "type": "material", "name": base_material, "definition": definition_id } + criteria = { + "type": "material", + "name": base_material, + "definition": definition_id, + "variant": material_container.getMetadataEntry("variant") + } containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) - containers = [basic_material for basic_material in containers if - basic_material.getMetaDataEntry("variant") == material_container.getMetaDataEntry( - "variant")] return containers return [] From f7e048aee539431c8c09e0abace22965efcf9518 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Oct 2017 16:37:03 +0200 Subject: [PATCH 010/764] Remove unused variable Contributes to issue CURA-4243. --- cura/Settings/QualitySettingsModel.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 2ab4e2a9b5..4dcaec245a 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -92,7 +92,6 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): items = [] - settings = collections.OrderedDict() definition_container = Application.getInstance().getGlobalContainerStack().getBottom() containers = self._container_registry.findInstanceContainers(id = self._quality_id) From 6c4c7fff4d69844a14b7ba38217d564f54316c34 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 Oct 2017 15:09:45 +0200 Subject: [PATCH 011/764] Use findContainersMetadata whenever possible This ensures that we only load those containers that we actually need the data of. Contributes to issue CURA-4243. --- cura/PrintInformation.py | 2 +- cura/PrinterOutputDevice.py | 8 +- cura/QualityManager.py | 14 +-- cura/Settings/ContainerManager.py | 91 +++++++++---------- cura/Settings/CuraContainerRegistry.py | 18 ++-- cura/Settings/CuraContainerStack.py | 8 +- cura/Settings/CuraStackBuilder.py | 8 +- cura/Settings/ExtruderManager.py | 12 +-- cura/Settings/MachineManager.py | 36 ++++---- cura/Settings/ProfilesModel.py | 10 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 19 ++-- .../NetworkPrinterOutputDevice.py | 4 +- .../XmlMaterialProfile/XmlMaterialProfile.py | 30 ++---- tests/Settings/TestCuraContainerRegistry.py | 4 +- 14 files changed, 126 insertions(+), 138 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 86bcc2719e..9a500bec96 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -227,7 +227,7 @@ class PrintInformation(QObject): pass active_material_id = Application.getInstance().getMachineManager().activeMaterialId - active_material_containers = ContainerRegistry.getInstance().findInstanceContainers(id=active_material_id) + active_material_containers = ContainerRegistry.getInstance().findInstanceContainers(id = active_material_id) if active_material_containers: self._active_material_container = active_material_containers[0] diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index c6e98257ba..59a5e3ff2a 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -463,9 +463,9 @@ class PrinterOutputDevice(QObject, OutputDevice): result.append(i18n_catalog.i18nc("@item:material", "No material loaded")) continue - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id) + containers = self._container_registry.findInstanceContainersMetadata(type = "material", GUID = material_id) if containers: - result.append(containers[0].getName()) + result.append(containers[0]["name"]) else: result.append(i18n_catalog.i18nc("@item:material", "Unknown material")) return result @@ -485,9 +485,9 @@ class PrinterOutputDevice(QObject, OutputDevice): result.append("#00000000") #No material. continue - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id) + containers = self._container_registry.findInstanceContainersMetadata(type = "material", GUID = material_id) if containers: - result.append(containers[0].getMetaDataEntry("color_code")) + result.append(containers[0]["color_code"]) else: result.append("#00000000") #Unknown material. return result diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 90ca285736..5c0a16da96 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. # This collects a lot of quality and quality changes related code which was split between ContainerManager @@ -229,7 +229,7 @@ class QualityManager: machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() quality_definition_id = machine_definition.getMetaDataEntry("quality_definition") if quality_definition_id is not None: - machine_definition = ContainerRegistry.getInstance().findDefinitionContainers(id=quality_definition_id)[0] + machine_definition = ContainerRegistry.getInstance().findDefinitionContainers(id = quality_definition_id)[0] # for convenience if material_containers is None: @@ -245,7 +245,7 @@ class QualityManager: machine_definition = self.getParentMachineDefinition(machine_definition) criteria["definition"] = machine_definition.getId() - found_containers_with_machine_definition = ContainerRegistry.getInstance().findInstanceContainers(**criteria) + found_containers_with_machine_definition = ContainerRegistry.getInstance().findInstanceContainersMetadata(**criteria) whole_machine_definition = self.getWholeMachineDefinition(machine_definition) if whole_machine_definition.getMetaDataEntry("has_machine_quality"): definition_id = machine_definition.getMetaDataEntry("quality_definition", whole_machine_definition.getId()) @@ -290,13 +290,13 @@ class QualityManager: # We have a normal (whole) machine defintion quality_definition = machine_definition.getMetaDataEntry("quality_definition") if quality_definition is not None: - parent_machine_definition = container_registry.findDefinitionContainers(id=quality_definition)[0] + parent_machine_definition = container_registry.findDefinitionContainers(id = quality_definition)[0] return self.getParentMachineDefinition(parent_machine_definition) else: return machine_definition else: # This looks like an extruder. Find the rest of the machine. - whole_machine = container_registry.findDefinitionContainers(id=machine_entry)[0] + whole_machine = container_registry.findDefinitionContainers(id = machine_entry)[0] parent_machine = self.getParentMachineDefinition(whole_machine) if whole_machine is parent_machine: # This extruder already belongs to a 'parent' machine def. @@ -305,7 +305,7 @@ class QualityManager: # Look up the corresponding extruder definition in the parent machine definition. extruder_position = machine_definition.getMetaDataEntry("position") parent_extruder_id = parent_machine.getMetaDataEntry("machine_extruder_trains")[extruder_position] - return container_registry.findDefinitionContainers(id=parent_extruder_id)[0] + return container_registry.findDefinitionContainers(id = parent_extruder_id)[0] ## Get the whole/global machine definition from an extruder definition. # @@ -319,5 +319,5 @@ class QualityManager: return machine_definition else: container_registry = ContainerRegistry.getInstance() - whole_machine = container_registry.findDefinitionContainers(id=machine_entry)[0] + whole_machine = container_registry.findDefinitionContainers(id = machine_entry)[0] return whole_machine diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 85aed93cf6..52b97cd60d 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -55,14 +55,14 @@ class ContainerManager(QObject): # \return The ID of the new container, or an empty string if duplication failed. @pyqtSlot(str, result = str) def duplicateContainer(self, container_id): - containers = self._container_registry.findContainers(None, id = container_id) + #TODO: It should be able to duplicate a container of which only the metadata is known. + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could duplicate container %s because it was not found.", container_id) return "" container = containers[0] - new_container = None new_name = self._container_registry.uniqueName(container.getName()) # Only InstanceContainer has a duplicate method at the moment. # So fall back to serialize/deserialize when no duplicate method exists. @@ -87,14 +87,14 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, str, result = bool) def renameContainer(self, container_id, new_id, new_name): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could rename container %s because it was not found.", container_id) return False container = containers[0] # First, remove the container from the registry. This will clean up any files related to the container. - self._container_registry.removeContainer(container) + self._container_registry.removeContainer(container_id) # Ensure we have a unique name for the container new_name = self._container_registry.uniqueName(new_name) @@ -115,7 +115,7 @@ class ContainerManager(QObject): # \return True if the container was successfully removed, False if not. @pyqtSlot(str, result = bool) def removeContainer(self, container_id): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could remove container %s because it was not found.", container_id) return False @@ -135,14 +135,14 @@ class ContainerManager(QObject): # \return True if successfully merged, False if not. @pyqtSlot(str, result = bool) def mergeContainers(self, merge_into_id, merge_id): - containers = self._container_registry.findContainers(None, id = merge_into_id) + containers = self._container_registry.findContainers(id = merge_into_id) if not containers: Logger.log("w", "Could merge into container %s because it was not found.", merge_into_id) return False merge_into = containers[0] - containers = self._container_registry.findContainers(None, id = merge_id) + containers = self._container_registry.findContainers(id = merge_id) if not containers: Logger.log("w", "Could not merge container %s because it was not found", merge_id) return False @@ -164,7 +164,7 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, result = bool) def clearContainer(self, container_id): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could clear container %s because it was not found.", container_id) return False @@ -179,16 +179,12 @@ class ContainerManager(QObject): @pyqtSlot(str, str, result=str) def getContainerMetaDataEntry(self, container_id, entry_name): - containers = self._container_registry.findContainers(None, id=container_id) - if not containers: + metadatas = self._container_registry.findContainersMetadata(id = container_id) + if not metadatas: Logger.log("w", "Could not get metadata of container %s because it was not found.", container_id) return "" - result = containers[0].getMetaDataEntry(entry_name) - if result is not None: - return str(result) - else: - return "" + return str(metadatas[0].get(entry_name, "")) ## Set a metadata entry of the specified container. # @@ -204,7 +200,7 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, str, result = bool) def setContainerMetaDataEntry(self, container_id, entry_name, entry_value): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) #We need the complete container, since we need to know whether the container is read-only or not. if not containers: Logger.log("w", "Could not set metadata of container %s because it was not found.", container_id) return False @@ -254,7 +250,7 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, str, str, result = bool) def setContainerProperty(self, container_id, setting_key, property_name, property_value): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could not set properties of container %s because it was not found.", container_id) return False @@ -300,7 +296,7 @@ class ContainerManager(QObject): ## Set the name of the specified container. @pyqtSlot(str, str, result = bool) def setContainerName(self, container_id, new_name): - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) #We need to get the full container, not just metadata, since we need to know whether it's read-only. if not containers: Logger.log("w", "Could not set name of container %s because it was not found.", container_id) return False @@ -317,18 +313,15 @@ class ContainerManager(QObject): ## Find instance containers matching certain criteria. # - # This effectively forwards to ContainerRegistry::findInstanceContainers. + # This effectively forwards to + # ContainerRegistry::findInstanceContainersMetadata. # # \param criteria A dict of key - value pairs to search for. # # \return A list of container IDs that match the given criteria. @pyqtSlot("QVariantMap", result = "QVariantList") def findInstanceContainers(self, criteria): - result = [] - for entry in self._container_registry.findInstanceContainers(**criteria): - result.append(entry.getId()) - - return result + return [entry["id"] for entry in self._container_registry.findInstanceContainersMetadata(**criteria)] @pyqtSlot(str, result = bool) def isContainerUsed(self, container_id): @@ -336,15 +329,17 @@ class ContainerManager(QObject): # check if this is a material container. If so, check if any material with the same base is being used by any # stacks. container_ids_to_check = [container_id] - container_results = self._container_registry.findInstanceContainers(id = container_id, type = "material") + container_results = self._container_registry.findInstanceContainersMetadata(id = container_id, type = "material") if container_results: this_container = container_results[0] - material_base_file = this_container.getMetaDataEntry("base_file", this_container.getId()) + material_base_file = this_container["id"] + if "base_file" in this_container: + material_base_file = this_container["base_file"] # check all material container IDs with the same base - material_containers = self._container_registry.findInstanceContainers(base_file = material_base_file, + material_containers = self._container_registry.findInstanceContainersMetadata(base_file = material_base_file, type = "material") if material_containers: - container_ids_to_check = [container.getId() for container in material_containers] + container_ids_to_check = [container["id"] for container in material_containers] all_stacks = self._container_registry.findContainerStacks() for stack in all_stacks: @@ -412,7 +407,7 @@ class ContainerManager(QObject): else: mime_type = self._container_name_filters[file_type]["mime"] - containers = self._container_registry.findContainers(None, id = container_id) + containers = self._container_registry.findContainers(id = container_id) if not containers: return { "status": "error", "message": "Container not found"} container = containers[0] @@ -616,9 +611,9 @@ class ContainerManager(QObject): elif activate_quality: definition_id = "fdmprinter" if not self._machine_manager.filterQualityByMachine else self._machine_manager.activeDefinitionId - containers = self._container_registry.findInstanceContainers(type = "quality", definition = definition_id, quality_type = activate_quality_type) + containers = self._container_registry.findInstanceContainersMetadata(type = "quality", definition = definition_id, quality_type = activate_quality_type) if containers: - self._machine_manager.setActiveQuality(containers[0].getId()) + self._machine_manager.setActiveQuality(containers[0]["id"]) self._machine_manager.activeQualityChanged.emit() return containers_found @@ -653,11 +648,13 @@ class ContainerManager(QObject): container_registry = self._container_registry - containers_to_rename = self._container_registry.findInstanceContainers(type = "quality_changes", name = quality_name) + containers_to_rename = self._container_registry.findInstanceContainersMetadata(type = "quality_changes", name = quality_name) for container in containers_to_rename: - stack_id = container.getMetaDataEntry("extruder", global_stack.getId()) - container_registry.renameContainer(container.getId(), new_name, self._createUniqueId(stack_id, new_name)) + stack_id = global_stack.getId() + if "extruder" in container: + stack_id = container["extruder"] + container_registry.renameContainer(container["id"], new_name, self._createUniqueId(stack_id, new_name)) if not containers_to_rename: Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name) @@ -754,7 +751,7 @@ class ContainerManager(QObject): # \return \type{str} the id of the newly created container. @pyqtSlot(str, result = str) def duplicateMaterial(self, material_id: str) -> str: - containers = self._container_registry.findInstanceContainers(id=material_id) + containers = self._container_registry.findInstanceContainers(id = material_id) if not containers: Logger.log("d", "Unable to duplicate the material with id %s, because it doesn't exist.", material_id) return "" @@ -789,12 +786,12 @@ class ContainerManager(QObject): return "" approximate_diameter = str(round(global_stack.getProperty("material_diameter", "value"))) - containers = self._container_registry.findInstanceContainers(id = "generic_pla*", approximate_diameter = approximate_diameter) + containers = self._container_registry.findInstanceContainersMetadata(id = "generic_pla*", approximate_diameter = approximate_diameter) if not containers: Logger.log("d", "Unable to create a new material by cloning Generic PLA, because it cannot be found for the material diameter for this machine.") return "" - base_file = containers[0].getMetaDataEntry("base_file") + base_file = containers[0].get("base_file") containers = self._container_registry.findInstanceContainers(id = base_file) if not containers: Logger.log("d", "Unable to create a new material by cloning Generic PLA, because the base file for Generic PLA for this machine can not be found.") @@ -835,12 +832,12 @@ class ContainerManager(QObject): has_variants = parseBool(global_stack.getMetaDataEntry("has_variants", default = False)) if has_machine_materials or has_variant_materials: if has_variants: - materials = self._container_registry.findInstanceContainers(type = "material", base_file = base_file, definition = global_stack.getBottom().getId(), variant = self._machine_manager.activeVariantId) + materials = self._container_registry.findInstanceContainersMetadata(type = "material", base_file = base_file, definition = global_stack.getBottom().getId(), variant = self._machine_manager.activeVariantId) else: - materials = self._container_registry.findInstanceContainers(type = "material", base_file = base_file, definition = global_stack.getBottom().getId()) + materials = self._container_registry.findInstanceContainersMetadata(type = "material", base_file = base_file, definition = global_stack.getBottom().getId()) if materials: - return materials[0].getId() + return materials[0]["id"] Logger.log("w", "Unable to find a suitable container based on %s for the current machine .", base_file) return "" # do not activate a new material if a container can not be found @@ -853,25 +850,25 @@ class ContainerManager(QObject): # \return \type{list} a list of names of materials with the same GUID @pyqtSlot(str, result = "QStringList") def getLinkedMaterials(self, material_id: str): - containers = self._container_registry.findInstanceContainers(id=material_id) + containers = self._container_registry.findInstanceContainersMetadata(id = material_id) if not containers: Logger.log("d", "Unable to find materials linked to material with id %s, because it doesn't exist.", material_id) return [] material_container = containers[0] - material_base_file = material_container.getMetaDataEntry("base_file", "") - material_guid = material_container.getMetaDataEntry("GUID", "") + material_base_file = material_container.get("base_file", "") + material_guid = material_container.get("GUID", "") if not material_guid: Logger.log("d", "Unable to find materials linked to material with id %s, because it doesn't have a GUID.", material_id) return [] - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_guid) + containers = self._container_registry.findInstanceContainersMetadata(type = "material", GUID = material_guid) linked_material_names = [] for container in containers: - if container.getId() in [material_id, material_base_file] or container.getMetaDataEntry("base_file") != container.getId(): + if container["id"] in [material_id, material_base_file] or container.get("base_file") != container["id"]: continue - linked_material_names.append(container.getName()) + linked_material_names.append(container["name"]) return linked_material_names ## Unlink a material from all other materials by creating a new GUID @@ -1004,7 +1001,7 @@ class ContainerManager(QObject): # If the machine specifies qualities should be filtered, ensure we match the current criteria. if not machine_definition.getMetaDataEntry("has_machine_quality"): - quality_changes.setDefinition(self._container_registry.findContainers(id = "fdmprinter")[0]) + quality_changes.setDefinition(self._container_registry.findDefinitionContainers(id = "fdmprinter")[0]) else: quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition)) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 12f27e8156..8903e195dc 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -86,8 +86,8 @@ class CuraContainerRegistry(ContainerRegistry): def _containerExists(self, container_type, container_name): container_class = ContainerStack if container_type == "machine" else InstanceContainer - return self.findContainers(container_class, id = container_name, type = container_type, ignore_case = True) or \ - self.findContainers(container_class, name = container_name, type = container_type) + return self.findContainersMetadata(id = container_name, type = container_type, ignore_case = True) or \ + self.findContainersMetadata(container_type = container_class, name = container_name, type = container_type) ## Exports an profile to a file # @@ -116,7 +116,7 @@ class CuraContainerRegistry(ContainerRegistry): found_containers = [] extruder_positions = [] for instance_id in instance_ids: - containers = ContainerRegistry.getInstance().findInstanceContainers(id=instance_id) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = instance_id) if containers: found_containers.append(containers[0]) @@ -126,9 +126,9 @@ class CuraContainerRegistry(ContainerRegistry): # Global stack extruder_positions.append(-1) else: - extruder_containers = ContainerRegistry.getInstance().findDefinitionContainers(id=extruder_id) + extruder_containers = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = extruder_id) if extruder_containers: - extruder_positions.append(int(extruder_containers[0].getMetaDataEntry("position", 0))) + extruder_positions.append(int(extruder_containers[0].get("position", 0))) else: extruder_positions.append(0) # Ensure the profiles are always exported in order (global, extruder 0, extruder 1, ...) @@ -294,7 +294,7 @@ class CuraContainerRegistry(ContainerRegistry): quality_type_criteria["definition"] = profile.getDefinition().getId() else: - profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0]) + profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) quality_type_criteria["definition"] = "fdmprinter" machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() @@ -335,7 +335,7 @@ class CuraContainerRegistry(ContainerRegistry): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(global_container_stack.getBottom()) - definition = self.findDefinitionContainers(id=definition_id)[0] + definition = self.findDefinitionContainers(id = definition_id)[0] if definition: return definition @@ -397,13 +397,13 @@ class CuraContainerRegistry(ContainerRegistry): # set after upgrading, because the proper global stack was not yet loaded. This method # makes sure those extruders also get the right stack set. def _fixupExtruders(self): - extruder_stacks = self.findContainers(ExtruderStack.ExtruderStack) + extruder_stacks = self.findContainers(container_type = ExtruderStack.ExtruderStack) for extruder_stack in extruder_stacks: if extruder_stack.getNextStack(): # Has the right next stack, so ignore it. continue - machines = ContainerRegistry.getInstance().findContainerStacks(id=extruder_stack.getMetaDataEntry("machine", "")) + machines = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack.getMetaDataEntry("machine", "")) if machines: extruder_stack.setNextStack(machines[0]) else: diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 2d3bf683f6..7f34cc12e7 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -14,7 +14,7 @@ from UM.Settings.ContainerStack import ContainerStack, InvalidContainerStackErro from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.Interfaces import ContainerInterface +from UM.Settings.Interfaces import ContainerInterface, DefinitionContainerInterface from . import Exceptions @@ -235,7 +235,7 @@ class CuraContainerStack(ContainerStack): ## Set the definition container. # # \param new_quality_changes The new definition container. It is expected to have a "type" metadata entry with the value "quality_changes". - def setDefinition(self, new_definition: DefinitionContainer) -> None: + def setDefinition(self, new_definition: DefinitionContainerInterface) -> None: self.replaceContainer(_ContainerIndexes.Definition, new_definition) ## Set the definition container by an ID. @@ -544,10 +544,10 @@ class CuraContainerStack(ContainerStack): material_search_criteria["variant"] = self.variant.id else: material_search_criteria["definition"] = "fdmprinter" - material_containers = registry.findInstanceContainers(**material_search_criteria) + material_containers = registry.findInstanceContainersMetadata(**material_search_criteria) # Try all materials to see if there is a quality profile available. for material_container in material_containers: - search_criteria["material"] = material_container.getId() + search_criteria["material"] = material_container["id"] containers = registry.findInstanceContainers(**search_criteria) if containers: diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 09815da319..f7a1592155 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -3,7 +3,7 @@ from UM.Logger import Logger -from UM.Settings.DefinitionContainer import DefinitionContainer +from UM.Settings.Interfaces import DefinitionContainerInterface from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry @@ -34,7 +34,7 @@ class CuraStackBuilder: # Make sure the new name does not collide with any definition or (quality) profile # createUniqueName() only looks at other stacks, but not at definitions or quality profiles # Note that we don't go for uniqueName() immediately because that function matches with ignore_case set to true - if registry.findContainers(id = generated_name): + if registry.findContainersMetadata(id = generated_name): generated_name = registry.uniqueName(generated_name) new_global_stack = cls.createGlobalStack( @@ -74,7 +74,7 @@ class CuraStackBuilder: # # \return A new Global stack instance with the specified parameters. @classmethod - def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainer, machine_definition: DefinitionContainer, **kwargs) -> ExtruderStack: + def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, **kwargs) -> ExtruderStack: stack = ExtruderStack(new_stack_id) stack.setName(definition.getName()) stack.setDefinition(definition) @@ -127,7 +127,7 @@ class CuraStackBuilder: # # \return A new Global stack instance with the specified parameters. @classmethod - def createGlobalStack(cls, new_stack_id: str, definition: DefinitionContainer, **kwargs) -> GlobalStack: + def createGlobalStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, **kwargs) -> GlobalStack: stack = GlobalStack(new_stack_id) stack.setDefinition(definition) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index c8daca7f92..8585c3cf7d 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -222,7 +222,7 @@ class ExtruderManager(QObject): position = extruder_definition.getMetaDataEntry("position", None) if not position: Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) - if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. + if not container_registry.findContainerStacksMetadata(machine = machine_id, position = position): # Doesn't exist yet. self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) changed = True @@ -357,13 +357,13 @@ class ExtruderManager(QObject): if preferred_quality: search_criteria["id"] = preferred_quality - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if not containers and preferred_quality: + quality_containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if not quality_containers and preferred_quality: Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) search_criteria.pop("id", None) - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if containers: - quality = containers[0] + quality_containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if quality_containers: + quality = quality_containers[0] container_stack.addContainer(quality) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 563965915a..c5dec6b6cc 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -95,7 +95,7 @@ class MachineManager(QObject): # There might already be some output devices by the time the signal is connected self._onOutputDevicesChanged() - if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacks(id = active_machine_id): + if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacksMetadata(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: @@ -145,13 +145,13 @@ class MachineManager(QObject): @pyqtProperty(int, constant=True) def totalNumberOfSettings(self) -> int: - return len(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0].getAllKeys()) + return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) def _onHotendIdChanged(self, index: Union[str, int], hotend_id: str) -> None: if not self._global_container_stack: return - containers = ContainerRegistry.getInstance().findInstanceContainers(type="variant", definition=self._global_container_stack.getBottom().getId(), name=hotend_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="variant", definition=self._global_container_stack.getBottom().getId(), name=hotend_id) if containers: # New material ID is known extruder_manager = ExtruderManager.getInstance() machine_id = self.activeMachineId @@ -163,7 +163,7 @@ class MachineManager(QObject): break if matching_extruder and matching_extruder.variant.getName() != hotend_id: # Save the material that needs to be changed. Multiple changes will be handled by the callback. - self._auto_hotends_changed[str(index)] = containers[0].getId() + self._auto_hotends_changed[str(index)] = containers[0]["id"] self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) else: Logger.log("w", "No variant found for printer definition %s with id %s" % (self._global_container_stack.getBottom().getId(), hotend_id)) @@ -176,7 +176,7 @@ class MachineManager(QObject): if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): definition_id = self.activeQualityDefinitionId extruder_manager = ExtruderManager.getInstance() - containers = ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition_id, GUID = material_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "material", definition = definition_id, GUID = material_id) if containers: # New material ID is known extruders = list(extruder_manager.getMachineExtruders(self.activeMachineId)) matching_extruder = None @@ -190,12 +190,12 @@ class MachineManager(QObject): if self._global_container_stack.getBottom().getMetaDataEntry("has_variants") and matching_extruder.variant: variant_id = self.getQualityVariantId(self._global_container_stack.getBottom(), matching_extruder.variant) for container in containers: - if container.getMetaDataEntry("variant") == variant_id: - self._auto_materials_changed[str(index)] = container.getId() + if container.get("variant") == variant_id: + self._auto_materials_changed[str(index)] = container["id"] break else: # Just use the first result we found. - self._auto_materials_changed[str(index)] = containers[0].getId() + self._auto_materials_changed[str(index)] = containers[0]["id"] self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) else: Logger.log("w", "No material definition found for printer definition %s and GUID %s" % (definition_id, material_id)) @@ -818,7 +818,7 @@ class MachineManager(QObject): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self.blurSettings.emit() - containers = ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = quality_id) if not containers or not self._global_container_stack: return @@ -826,9 +826,9 @@ class MachineManager(QObject): # Quality profile come in two flavours: type=quality and type=quality_changes # If we found a quality_changes profile then look up its parent quality profile. - container_type = containers[0].getMetaDataEntry("type") - quality_name = containers[0].getName() - quality_type = containers[0].getMetaDataEntry("quality_type") + container_type = containers[0].get("type") + quality_name = containers[0]["name"] + quality_type = containers[0].get("quality_type") # Get quality container and optionally the quality_changes container. if container_type == "quality": @@ -1091,15 +1091,15 @@ class MachineManager(QObject): # activate a new machine before removing a machine because this is safer if activate_new_machine: - machine_stacks = ContainerRegistry.getInstance().findContainerStacks(type = "machine") - other_machine_stacks = [s for s in machine_stacks if s.getId() != machine_id] + machine_stacks = ContainerRegistry.getInstance().findContainerStacksMetadata(type = "machine") + other_machine_stacks = [s for s in machine_stacks if s["id"] != machine_id] if other_machine_stacks: - self.setActiveMachine(other_machine_stacks[0].getId()) + self.setActiveMachine(other_machine_stacks[0]["id"]) ExtruderManager.getInstance().removeMachineExtruders(machine_id) - containers = ContainerRegistry.getInstance().findInstanceContainers(type = "user", machine = machine_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "user", machine = machine_id) for container in containers: - ContainerRegistry.getInstance().removeContainer(container.getId()) + ContainerRegistry.getInstance().removeContainer(container["id"]) ContainerRegistry.getInstance().removeContainer(machine_id) @pyqtProperty(bool, notify = globalContainerChanged) @@ -1138,7 +1138,7 @@ class MachineManager(QObject): # \returns DefinitionID (string) if found, None otherwise @pyqtSlot(str, result = str) def getDefinitionByMachineId(self, machine_id: str) -> str: - containers = ContainerRegistry.getInstance().findContainerStacks(id=machine_id) + containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) if containers: return containers[0].getBottom().getId() diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index bf1993b184..6ba38dcf48 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -125,8 +125,12 @@ class ProfilesModel(InstanceContainersModel): # active machine and material, and later yield the right ones. tmp_all_quality_items = OrderedDict() for item in super()._recomputeItems(): - profile = container_registry.findContainers(id=item["id"]) - quality_type = profile[0].getMetaDataEntry("quality_type") if profile else "" + + profiles = container_registry.findContainersMetadata(id = item["id"]) + if not profiles or "quality_type" not in profiles[0]: + quality_type = "" + else: + quality_type = profiles[0]["quality_type"] if quality_type not in tmp_all_quality_items: tmp_all_quality_items[quality_type] = {"suitable_container": None, "all_containers": []} @@ -155,7 +159,7 @@ class ProfilesModel(InstanceContainersModel): # Now all the containers are set for item in containers: - profile = container_registry.findContainers(id=item["id"]) + profile = container_registry.findContainers(id = item["id"]) if not profile: self._setItemLayerHeight(item, "", unit) item["available"] = False diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index b4fc562378..f12c02fe8d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -130,7 +130,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # A few lists of containers in this project files. # When loading the global stack file, it may be associated with those containers, which may or may not be # in Cura already, so we need to provide them as alternative search lists. - definition_container_list = [] instance_container_list = [] material_container_list = [] @@ -146,20 +145,20 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] for each_definition_container_file in definition_container_files: container_id = self._stripFileToId(each_definition_container_file) - definitions = self._container_registry.findDefinitionContainers(id=container_id) + definitions = self._container_registry.findDefinitionContainersMetadata(id = container_id) if not definitions: definition_container = DefinitionContainer(container_id) definition_container.deserialize(archive.open(each_definition_container_file).read().decode("utf-8")) + definition_container = definition_container.getMetaData() else: definition_container = definitions[0] - definition_container_list.append(definition_container) - definition_container_type = definition_container.getMetaDataEntry("type") + definition_container_type = definition_container.get("type") if definition_container_type == "machine": - machine_type = definition_container.getName() - variant_type_name = definition_container.getMetaDataEntry("variants_name", variant_type_name) + machine_type = definition_container["name"] + variant_type_name = definition_container.get("variants_name", variant_type_name) machine_definition_container_count += 1 elif definition_container_type == "extruder": @@ -456,7 +455,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stack_id_map = {} # new and old ExtruderStack IDs map if self._resolve_strategies["machine"] == "new": # We need a new id if the id already exists - if self._container_registry.findContainerStacks(id = global_stack_id_original): + if self._container_registry.findContainerStacksMetadata(id = global_stack_id_original): global_stack_id_new = self.getNewId(global_stack_id_original) global_stack_need_rename = True @@ -465,7 +464,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for each_extruder_stack_file in extruder_stack_files: old_container_id = self._stripFileToId(each_extruder_stack_file) new_container_id = old_container_id - if self._container_registry.findContainerStacks(id = old_container_id): + if self._container_registry.findContainerStacksMetadata(id = old_container_id): # get a new name for this extruder new_container_id = self.getNewId(old_container_id) @@ -479,7 +478,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] for definition_container_file in definition_container_files: container_id = self._stripFileToId(definition_container_file) - definitions = self._container_registry.findDefinitionContainers(id = container_id) + definitions = self._container_registry.findDefinitionContainersMetadata(id = container_id) if not definitions: definition_container = DefinitionContainer(container_id) definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8")) @@ -626,7 +625,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): pass quality_and_definition_changes_instance_containers.append(instance_container) else: - existing_container = self._container_registry.findInstanceContainers(id = container_id) + existing_container = self._container_registry.findInstanceContainersMetadata(id = container_id) if not existing_container: containers_to_add.append(instance_container) if global_stack_need_rename: diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 9dedc87df4..07a8df985c 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -724,10 +724,10 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): remote_material_guid, material.getMetaDataEntry("GUID")) - remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material", GUID = remote_material_guid, read_only = True) + remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "material", GUID = remote_material_guid, read_only = True) remote_material_name = "Unknown" if remote_materials: - remote_material_name = remote_materials[0].getName() + remote_material_name = remote_materials[0]["name"] warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(material.getName(), remote_material_name, index + 1)) try: diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index de3b3fb71f..4dc955db42 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -94,18 +94,6 @@ class XmlMaterialProfile(InstanceContainer): if not base_container.isReadOnly(): base_container.setDirty(dirty) - ## Overridden from InstanceContainer - # def setProperty(self, key, property_name, property_value, container = None): - # if self.isReadOnly(): - # return - # - # super().setProperty(key, property_name, property_value) - # - # basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is self.id, this is a basefile. - # for container in UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): - # if not container.isReadOnly(): - # container.setDirty(True) - ## Overridden from InstanceContainer # base file: common settings + supported machines # machine / variant combination: only changes for itself. @@ -222,8 +210,8 @@ class XmlMaterialProfile(InstanceContainer): # Map machine human-readable names to IDs product_id_map = {} - for container in registry.findDefinitionContainers(type = "machine"): - product_id_map[container.getName()] = container.getId() + for container in registry.findDefinitionContainersMetadata(type = "machine"): + product_id_map[container["name"]] = container["id"] for definition_id, container in machine_container_map.items(): definition = container.getDefinition() @@ -249,11 +237,11 @@ class XmlMaterialProfile(InstanceContainer): # Find all hotend sub-profiles corresponding to this material and machine and add them to this profile. for hotend_id, hotend in machine_nozzle_map[definition_id].items(): - variant_containers = registry.findInstanceContainers(id = hotend.getMetaDataEntry("variant")) + variant_containers = registry.findInstanceContainersMetadata(id = hotend.getMetaDataEntry("variant")) if not variant_containers: continue - builder.start("hotend", {"id": variant_containers[0].getName()}) + builder.start("hotend", {"id": variant_containers[0]["id"]}) # Compatible is a special case, as it's added as a meta data entry (instead of an instance). compatible = hotend.getMetaDataEntry("compatible") @@ -519,8 +507,8 @@ class XmlMaterialProfile(InstanceContainer): # Map machine human-readable names to IDs product_id_map = {} - for container in ContainerRegistry.getInstance().findDefinitionContainers(type = "machine"): - product_id_map[container.getName()] = container.getId() + for container in ContainerRegistry.getInstance().findDefinitionContainersMetadata(type = "machine"): + product_id_map[container["name"]] = container["id"] machines = data.iterfind("./um:settings/um:machine", self.__namespaces) for machine in machines: @@ -592,10 +580,10 @@ class XmlMaterialProfile(InstanceContainer): if hotend_id is None: continue - variant_containers = ContainerRegistry.getInstance().findInstanceContainers(id = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainers(definition = definition.id, name = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition.id, name = hotend_id) if not variant_containers: #Logger.log("d", "No variants found with ID or name %s for machine %s", hotend_id, definition.id) @@ -630,7 +618,7 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material._name = self.getName() new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) new_hotend_material.setDefinition(definition) - new_hotend_material.addMetaDataEntry("variant", variant_containers[0].id) + new_hotend_material.addMetaDataEntry("variant", variant_containers[0]["id"]) # Don't use setMetadata, as that overrides it for all materials with same base file new_hotend_material.getMetaData()["compatible"] = hotend_compatibility new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index a6d33afc6d..d502d31cc3 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -140,8 +140,8 @@ def test_loadTypes(filename, output_class, container_registry): #Check whether the resulting type was correct. stack_id = filename.split(".")[0] - for container in container_registry._containers: #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates. - if container.getId() == stack_id: #This is the one we're testing. + for container_id, container in container_registry._containers.items(): #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates. + if container_id == stack_id: #This is the one we're testing. assert type(container) == output_class break else: From f1d125b2320dcfff10a3c3c26a2647eaa952e67d Mon Sep 17 00:00:00 2001 From: Buco Date: Fri, 20 Oct 2017 16:09:26 +0200 Subject: [PATCH 012/764] Added quality profiles Made some changes to the main profiles and added quality profiles for each material. --- .../builder_premium_large.def.json | 5 ++-- .../builder_premium_medium.def.json | 5 ++-- .../builder_premium_small.def.json | 5 ++-- .../bp_ABS_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_ABS_High_Quality.inst.cfg | 14 +++++++++++ .../bp_ABS_Normal_Quality.inst.cfg | 14 +++++++++++ .../bp_BVOH_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_BVOH_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_BVOH_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_CPE_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_CPE_High_Quality.inst.cfg | 14 +++++++++++ .../bp_CPE_Normal_Quality.inst.cfg | 14 +++++++++++ .../bp_HIPS_Coarse_Quality.inst.cfg | 15 +++++++++++ .../bp_HIPS_High_Quality.inst.cfg | 14 +++++++++++ .../bp_HIPS_Normal_Quality.inst.cfg | 14 +++++++++++ .../bp_Innoflex60_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_Innoflex60_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_Innoflex60_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_Nylon_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_Nylon_High_Quality.inst.cfg | 14 +++++++++++ .../bp_Nylon_Normal_Quality.inst.cfg | 14 +++++++++++ .../bp_PC_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_PC_High_Quality.inst.cfg | 14 +++++++++++ .../bp_PC_Normal_Quality.inst.cfg | 14 +++++++++++ .../bp_PET_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_PET_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_PET_Normal_Quality.inst.cfg | 23 +++++++++++++++++ ...nst.cfg => bp_PLA_Coarse_Quality.inst.cfg} | 8 +++--- ....inst.cfg => bp_PLA_High_Quality.inst.cfg} | 4 +-- ...nst.cfg => bp_PLA_Normal_Quality.inst.cfg} | 4 +-- .../bp_PVA_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_PVA_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_PVA_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_global_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_global_High_Quality.inst.cfg | 14 +++++++++++ .../bp_global_Normal_Quality.inst.cfg | 14 +++++++++++ 36 files changed, 552 insertions(+), 20 deletions(-) create mode 100644 resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg rename resources/quality/builder_premium/{builder_premium_low.inst.cfg => bp_PLA_Coarse_Quality.inst.cfg} (77%) rename resources/quality/builder_premium/{builder_premium_high.inst.cfg => bp_PLA_High_Quality.inst.cfg} (81%) rename resources/quality/builder_premium/{builder_premium_normal.inst.cfg => bp_PLA_Normal_Quality.inst.cfg} (80%) create mode 100644 resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json index aaeda0fdb1..5fc4b46c98 100644 --- a/resources/definitions/builder_premium_large.def.json +++ b/resources/definitions/builder_premium_large.def.json @@ -13,7 +13,7 @@ "platform": "builder_premium_platform.stl", "platform_offset": [-126, -36, 117], "has_machine_quality": true, - "preferred_quality": "*normal*", + "preferred_quality": "*Normal*", "machine_extruder_trains": { "0": "builder_premium_large_rear", @@ -34,8 +34,7 @@ "infill_pattern": {"value": "'triangles'" }, "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "default_material_print_temperature": { "value": "215" }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json index 79825a5653..56dab8f863 100644 --- a/resources/definitions/builder_premium_medium.def.json +++ b/resources/definitions/builder_premium_medium.def.json @@ -13,7 +13,7 @@ "platform": "builder_premium_platform.stl", "platform_offset": [-126, -36, 117], "has_machine_quality": true, - "preferred_quality": "*normal*", + "preferred_quality": "*Normal*", "machine_extruder_trains": { "0": "builder_premium_medium_rear", @@ -34,8 +34,7 @@ "infill_pattern": {"value": "'triangles'" }, "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "default_material_print_temperature": { "value": "215" }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 358b41a072..65103ce1af 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -12,7 +12,7 @@ "platform": "builder_premium_platform.stl", "platform_offset": [-126, -36, 117], "has_machine_quality": true, - "preferred_quality": "*normal*", + "preferred_quality": "*Normal*", "machine_extruder_trains": { "0": "builder_premium_small_rear", @@ -33,8 +33,7 @@ "infill_pattern": {"value": "'triangles'" }, "infill_before_walls": {"value": false }, - "material_print_temperature": {"value": 215 }, - "default_material_print_temperature": { "default_value": 215 }, + "default_material_print_temperature": { "value": "215" }, "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, "material_standby_temperature": { "value": "material_print_temperature" }, diff --git a/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..4e1294fdb6 --- /dev/null +++ b/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_abs_175 +setting_version = 3 +weight = -1 +supported = False + +[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg new file mode 100644 index 0000000000..e6ec6b2158 --- /dev/null +++ b/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_abs_175 +setting_version = 3 +weight = 1 +supported = False + +[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..c033dca279 --- /dev/null +++ b/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_abs_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..80bc8adaa6 --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = verbatim_bvoh_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 + diff --git a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg new file mode 100644 index 0000000000..54ff19f0c6 --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = verbatim_bvoh_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..8d026391db --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = verbatim_bvoh_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..4f5c56af04 --- /dev/null +++ b/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_cpe_175 +setting_version = 3 +weight = -1 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg new file mode 100644 index 0000000000..dfa7302ee0 --- /dev/null +++ b/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_cpe_175 +setting_version = 3 +weight = 1 +supported = False + +[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..8a72c81b16 --- /dev/null +++ b/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_cpe_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..646f69cee1 --- /dev/null +++ b/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_hips_175 +setting_version = 3 +weight = -1 +supported = False + +[values] + diff --git a/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg new file mode 100644 index 0000000000..cb28b7c3d4 --- /dev/null +++ b/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_hips_175 +setting_version = 3 +weight = 1 +supported = False + +[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..49ae840c49 --- /dev/null +++ b/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_hips_175 +setting_version = 3 +weight = 0 +supported = False + +[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..32a3695148 --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = innofill_innoflex60_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 30 + diff --git a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg new file mode 100644 index 0000000000..43d547436b --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = innofill_innoflex60_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 30 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..658e868a5f --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = innofill_innoflex60_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 30 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..14441b7c6c --- /dev/null +++ b/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_nylon_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg new file mode 100644 index 0000000000..90f9a2ed84 --- /dev/null +++ b/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_nylon_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b943f0bd02 --- /dev/null +++ b/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_nylon_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..c7c5782d96 --- /dev/null +++ b/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_pc_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg new file mode 100644 index 0000000000..01f5845748 --- /dev/null +++ b/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_pc_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..26a2183a91 --- /dev/null +++ b/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Not Supported +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_pc_175 +setting_version = 3 +weight = 0 +supported = False + +[values] diff --git a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..fb56005655 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_petg_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 60 + diff --git a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg new file mode 100644 index 0000000000..f6e735deb0 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..13b1e90be6 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 50 \ No newline at end of file diff --git a/resources/quality/builder_premium/builder_premium_low.inst.cfg b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg similarity index 77% rename from resources/quality/builder_premium/builder_premium_low.inst.cfg rename to resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg index 8d8c3464d2..88b1a899e9 100644 --- a/resources/quality/builder_premium/builder_premium_low.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg @@ -1,22 +1,20 @@ [general] version = 2 -name = Low Quality +name = Coarse definition = builder_premium_small [metadata] type = quality -quality_type = low +quality_type = coarse material = generic_pla_175 setting_version = 3 weight = -1 -global_quality = True [values] -material_print_temperature = 215 +material_print_temperature = =default_material_print_temperature + 15 material_standby_temperature = =material_print_temperature material_initial_print_temperature= =material_print_temperature material_final_print_temperature= =material_print_temperature -default_material_print_temperature= =material_print_temperature material_bed_temperature = 45 material_bed_temperature_layer_0= =material_bed_temperature layer_height = 0.3 diff --git a/resources/quality/builder_premium/builder_premium_high.inst.cfg b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg similarity index 81% rename from resources/quality/builder_premium/builder_premium_high.inst.cfg rename to resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg index 5e990e64d9..a61b4ee958 100644 --- a/resources/quality/builder_premium/builder_premium_high.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg @@ -9,15 +9,13 @@ quality_type = high material = generic_pla_175 setting_version = 3 weight = 1 -global_quality = True [values] -material_print_temperature = 215 acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature + 15 material_standby_temperature = =material_print_temperature material_initial_print_temperature= =material_print_temperature material_final_print_temperature= =material_print_temperature -default_material_print_temperature= =material_print_temperature material_bed_temperature = 45 material_bed_temperature_layer_0= =material_bed_temperature layer_height = 0.1 diff --git a/resources/quality/builder_premium/builder_premium_normal.inst.cfg b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg similarity index 80% rename from resources/quality/builder_premium/builder_premium_normal.inst.cfg rename to resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg index 7d401d4dea..6b0648b4e4 100644 --- a/resources/quality/builder_premium/builder_premium_normal.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg @@ -9,14 +9,12 @@ quality_type = normal material = generic_pla_175 setting_version = 3 weight = 0 -global_quality = True [values] -material_print_temperature = 215 +material_print_temperature = =default_material_print_temperature + 15 material_standby_temperature = =material_print_temperature material_initial_print_temperature= =material_print_temperature material_final_print_temperature= =material_print_temperature -default_material_print_temperature= =material_print_temperature material_bed_temperature = 45 material_bed_temperature_layer_0= =material_bed_temperature layer_height = 0.2 diff --git a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..fe0c1046b8 --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_pva_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 + diff --git a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg new file mode 100644 index 0000000000..13c6c7ef89 --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_pva_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5b16476b4b --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_pva_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..0edca57629 --- /dev/null +++ b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +setting_version = 3 +weight = -1 +global_quality = True + +[values] +layer_height = 0.3 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..193202cd6f --- /dev/null +++ b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +setting_version = 3 +weight = 1 +global_quality = True + +[values] +layer_height = 0.1 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..60aa0a150c --- /dev/null +++ b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +setting_version = 3 +weight = 0 +global_quality = True + +[values] +layer_height = 0.2 \ No newline at end of file From c132300fd553d28e10f1a6b9a361dd78688cac70 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 13:56:26 +0200 Subject: [PATCH 013/764] start --- cura/Settings/ExtruderManager.py | 44 +++++++++---------- .../MachineSettingsAction.py | 22 ++++++---- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index c8daca7f92..50525b6aeb 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -28,6 +28,20 @@ if TYPE_CHECKING: # # This keeps a list of extruder stacks for each machine. class ExtruderManager(QObject): + + ## Registers listeners and such to listen to changes to the extruders. + def __init__(self, parent = None): + super().__init__(parent) + + self._extruder_trains = {} # Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. + self._active_extruder_index = -1 # Indicates the index of the active extruder stack. -1 means no active extruder stack + self._selected_object_extruders = [] + self._global_container_stack_definition_id = None + self._addCurrentMachineExtruders() + + Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) + Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) + ## Signal to notify other components when the list of extruders for a machine definition changes. extrudersChanged = pyqtSignal(QVariant) @@ -38,18 +52,6 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() - ## Registers listeners and such to listen to changes to the extruders. - def __init__(self, parent = None): - super().__init__(parent) - self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. - self._active_extruder_index = -1 # Indicates the index of the active extruder stack. -1 means no active extruder stack - self._selected_object_extruders = [] - Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) - self._global_container_stack_definition_id = None - self._addCurrentMachineExtruders() - - Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) - ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -59,10 +61,10 @@ class ExtruderManager(QObject): @pyqtProperty(str, notify = activeExtruderChanged) def activeExtruderStackId(self) -> Optional[str]: if not Application.getInstance().getGlobalContainerStack(): - return None # No active machine, so no active extruder. + return None # No active machine, so no active extruder. try: return self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][str(self._active_extruder_index)].getId() - except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. + except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. return None ## Return extruder count according to extruder trains. @@ -521,8 +523,8 @@ class ExtruderManager(QObject): machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") # In case the printer is using one extruder, shouldn't exist active extruder stacks - if machine_extruder_count == 1: - return result + # if machine_extruder_count == 1: + # return result if global_stack and global_stack.getId() in self._extruder_trains: for extruder in sorted(self._extruder_trains[global_stack.getId()]): @@ -537,16 +539,10 @@ class ExtruderManager(QObject): self.globalContainerStackDefinitionChanged.emit() # If the global container changed, the number of extruders could be changed and so the active_extruder_index is updated - extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - if extruder_count > 1: - if self._active_extruder_index == -1: - self.setActiveExtruderIndex(0) - else: - if self._active_extruder_index != -1: - self.setActiveExtruderIndex(-1) + if self._active_extruder_index == -1: + self.setActiveExtruderIndex(0) self.activeExtruderChanged.emit() - self.resetSelectedObjectExtruders() ## Adds the extruders of the currently active machine. diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 4343c2c780..49f82a5c9b 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -171,17 +171,21 @@ class MachineSettingsAction(MachineAction): definition_changes_container.setProperty("machine_extruder_count", "value", extruder_count) - if extruder_count > 1: - # Multiextrusion + # Make sure one of the extruder stacks is active + if extruder_manager.activeExtruderIndex == -1: + extruder_manager.setActiveExtruderIndex(0) + + # Move settable_per_extruder values out of the global container + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStack() + global_user_container = self._global_container_stack.getTop() + + for setting_instance in global_user_container.findInstances(): + setting_key = setting_instance.definition.key + + + - # Make sure one of the extruder stacks is active - if extruder_manager.activeExtruderIndex == -1: - extruder_manager.setActiveExtruderIndex(0) - # Move settable_per_extruder values out of the global container - if previous_extruder_count == 1: - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - global_user_container = self._global_container_stack.getTop() for setting_instance in global_user_container.findInstances(): setting_key = setting_instance.definition.key From 560be2931a49a31bfd5b86670e0d0c6401a5d9ac Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 15:41:45 +0200 Subject: [PATCH 014/764] Create empty not supported container dynamically when no qualities are found - CURA-4451 --- cura/CrashHandler.py | 1 + cura/Settings/ProfilesModel.py | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index a78ecb8a72..ad80d286c3 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -53,6 +53,7 @@ class CrashHandler: self.exception_type = exception_type self.value = value self.traceback = tb + self.dialog = QDialog() # While we create the GUI, the information will be stored for sending afterwards self.data = dict() diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index bf1993b184..d7d413ea20 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -7,6 +7,7 @@ from PyQt5.QtCore import Qt from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager @@ -61,6 +62,7 @@ class ProfilesModel(InstanceContainersModel): active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = extruder_manager.getActiveExtruderStacks() materials = [global_container_stack.material] + if active_extruder in extruder_stacks: extruder_stacks.remove(active_extruder) extruder_stacks = [active_extruder] + extruder_stacks @@ -83,8 +85,30 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) + # If not qualities are found we dynamically create an empty container with name "Not Supported" + if len(result) == 0: + machine_id = global_container_stack.definition.getId() + material_id = extruder_stacks[0].material.getId() + result.append(self.generateNoSupportedInstanceContainer(machine_id, material_id)) + return result + def generateNoSupportedInstanceContainer(self, machine_id: str, material_id: str): + container = InstanceContainer("not_supported") + container.setName("Not Supported") + container.metaData["quality_type"] = "normal" + container.metaData["setting_version"] = 3 + container.metaData["supported"] = False + container.metaData["type"] = "quality" + container.metaData["weight"] = "0" + container.metaData["material"] = material_id + container.readOnly = True + container.setDirty(False) + container.setCachedValues({}) + definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + container.setDefinition(definition) + return container + ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): #Some globals that we can re-use. From d018e0b2bbee6166684b9c309ff64be42d0446a6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 17:34:31 +0200 Subject: [PATCH 015/764] First steps towards salvation - CURA-4451 --- cura/Settings/ProfilesModel.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index d7d413ea20..8aeccd7e14 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -72,6 +72,15 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + # If not qualities are found we dynamically create an empty container with name "Not Supported" + if len(result) == 0: + machine_id = global_container_stack.definition.getId() + material_id = extruder_stacks[0].material.getId() + not_supported_container = self.generateNoSupportedInstanceContainer(machine_id, material_id) + result.append(not_supported_container) + # ContainerRegistry.getInstance().addContainer(not_supported_container) + return result + # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) @@ -85,26 +94,17 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - # If not qualities are found we dynamically create an empty container with name "Not Supported" - if len(result) == 0: - machine_id = global_container_stack.definition.getId() - material_id = extruder_stacks[0].material.getId() - result.append(self.generateNoSupportedInstanceContainer(machine_id, material_id)) - return result def generateNoSupportedInstanceContainer(self, machine_id: str, material_id: str): container = InstanceContainer("not_supported") container.setName("Not Supported") - container.metaData["quality_type"] = "normal" container.metaData["setting_version"] = 3 container.metaData["supported"] = False container.metaData["type"] = "quality" container.metaData["weight"] = "0" container.metaData["material"] = material_id - container.readOnly = True - container.setDirty(False) - container.setCachedValues({}) + container.metaData["quality_type"] = "normal" definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) container.setDefinition(definition) return container @@ -181,8 +181,8 @@ class ProfilesModel(InstanceContainersModel): for item in containers: profile = container_registry.findContainers(id=item["id"]) if not profile: - self._setItemLayerHeight(item, "", unit) - item["available"] = False + self._setItemLayerHeight(item, "", "") + item["available"] = True yield item continue From 3794ae16ae767e14e901e6c8a68846efd6631de9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 17:41:58 +0200 Subject: [PATCH 016/764] Dont show layer height text in profiles drop down when there is not layer height set - CURA-4451 --- resources/qml/Menus/ProfileMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 17eb7cfb1d..b0f2ef14d2 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -17,7 +17,7 @@ Menu MenuItem { - text: model.name + " - " + model.layer_height + text: model.name + (model.layer_height != "" ? (" - " + model.layer_height) : "") checkable: true checked: Cura.MachineManager.activeQualityChangesId == "" && Cura.MachineManager.activeQualityType == model.metadata.quality_type exclusiveGroup: group From 56fa7036b3545ebdfad420fa28e8efc3b35bfcfa Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 23 Oct 2017 20:55:08 +0200 Subject: [PATCH 017/764] Add controls for jogging the head/bed --- resources/qml/PrintMonitor.qml | 277 +++++++++++++++++++++ resources/themes/cura-light/icons/home.svg | 56 +++++ 2 files changed, 333 insertions(+) create mode 100644 resources/themes/cura-light/icons/home.svg diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index a2626e53de..e8ab76a264 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -677,6 +677,192 @@ Column watchedProperties: ["value"] } + Loader + { + sourceComponent: monitorSection + property string label: catalog.i18nc("@label", "Printer control") + } + + Row + { + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + Label + { + text: catalog.i18nc("@label", "Position") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + } + + GridLayout + { + columns: 3 + rows: 4 + rowSpacing: UM.Theme.getSize("default_lining").width + columnSpacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "X/Y") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: parent.width + horizontalAlignment: Text.AlignHCenter + + Layout.row: 1 + Layout.column: 2 + Layout.preferredWidth: UM.Theme.getSize("section").height + } + + Button + { + Layout.row: 2 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 10, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 1 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_left"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(-10, 0, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 3 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_right"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(10, 0, 0) + } + } + + Button + { + Layout.row: 4 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, -10, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeHead() + } + } + } + + + Column + { + spacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "Z") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: UM.Theme.getSize("section").height + + horizontalAlignment: Text.AlignHCenter + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, 10) + } + } + + Button + { + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeBed() + } + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, -10) + } + } + } + } + Loader { sourceComponent: monitorSection @@ -754,4 +940,95 @@ Column } } } + + Component + { + id: monitorButtonStyle + + ButtonStyle + { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + else + { + return UM.Theme.getColor("action_button_border"); + } + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + else + { + return UM.Theme.getColor("action_button"); + } + } + Behavior on color + { + ColorAnimation + { + duration: 50 + } + } + } + + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2) + height: Math.floor(control.height / 2) + sourceSize.width: width + sourceSize.height: width + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + else + { + return UM.Theme.getColor("action_button_text"); + } + } + source: control.iconSource + } + } + } + } } \ No newline at end of file diff --git a/resources/themes/cura-light/icons/home.svg b/resources/themes/cura-light/icons/home.svg new file mode 100644 index 0000000000..617c3ce9da --- /dev/null +++ b/resources/themes/cura-light/icons/home.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + From 9cd88693825de607be097a0935723d7f8fc04e7e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 23 Oct 2017 22:27:05 +0200 Subject: [PATCH 018/764] Add settable jog distance --- resources/qml/PrintMonitor.qml | 95 +++++++++++++++++++++++++++++++--- 1 file changed, 88 insertions(+), 7 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index e8ab76a264..84097798bf 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -694,7 +694,7 @@ Column Label { - text: catalog.i18nc("@label", "Position") + text: catalog.i18nc("@label", "Jog position") color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") @@ -734,7 +734,7 @@ Column onClicked: { - connectedPrinter.moveHead(0, 10, 0) + connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) } } @@ -751,7 +751,7 @@ Column onClicked: { - connectedPrinter.moveHead(-10, 0, 0) + connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) } } @@ -768,7 +768,7 @@ Column onClicked: { - connectedPrinter.moveHead(10, 0, 0) + connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) } } @@ -785,7 +785,7 @@ Column onClicked: { - connectedPrinter.moveHead(0, -10, 0) + connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) } } @@ -831,7 +831,7 @@ Column onClicked: { - connectedPrinter.moveHead(0, 0, 10) + connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) } } @@ -857,12 +857,93 @@ Column onClicked: { - connectedPrinter.moveHead(0, 0, -10) + connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) } } } } + Row + { + id: distancesRow + + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + property real currentDistance: 10 + + Label + { + text: catalog.i18nc("@label", "Jog distance") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + } + + Row + { + Repeater + { + model: distancesModel + delegate: Button + { + height: UM.Theme.getSize("setting_control").height + width: height + UM.Theme.getSize("default_margin").width + + text: model.label + exclusiveGroup: distanceGroup + checkable: true + checked: distancesRow.currentDistance == model.value + onClicked: distancesRow.currentDistance = model.value + + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : + control.hovered ? UM.Theme.getColor("action_button_hovered_border") : + UM.Theme.getColor("action_button_border") + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : + control.hovered ? UM.Theme.getColor("action_button_hovered") : + UM.Theme.getColor("action_button") + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : + UM.Theme.getColor("action_button_text") + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } + } + label: Item { } + } + } + } + } + + ListModel + { + id: distancesModel + ListElement { label: "0.1"; value: 0.1 } + ListElement { label: "1"; value: 1 } + ListElement { label: "10"; value: 10 } + ListElement { label: "100"; value: 100 } + } + ExclusiveGroup { id: distanceGroup } + } + + Loader { sourceComponent: monitorSection From 35684e0aa45ff37b8ed0508939fb4798a4ddf362 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 24 Oct 2017 09:57:48 +0200 Subject: [PATCH 019/764] Move profiles dropdown text generator to separate method --- resources/qml/Settings/SettingView.qml | 31 ++++++++++++++++---------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 56fd789564..1892b9d5a6 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -51,27 +51,34 @@ Item { id: globalProfileSelection - text: { - var result = Cura.MachineManager.activeQualityName; - if (Cura.MachineManager.activeQualityLayerHeight > 0) { - result += " "; - result += " - "; - result += Cura.MachineManager.activeQualityLayerHeight + "mm"; - result += ""; - } - return result; - } + text: generateActiveQualityText() enabled: !header.currentExtruderVisible || header.currentExtruderIndex > -1 - width: Math.floor(parent.width * 0.55) height: UM.Theme.getSize("setting_control").height anchors.left: globalProfileLabel.right anchors.right: parent.right tooltip: Cura.MachineManager.activeQualityName style: UM.Theme.styles.sidebar_header_button - activeFocusOnPress: true; + activeFocusOnPress: true menu: ProfileMenu { } + function generateActiveQualityText () { + var result = "" + + if (Cura.MachineManager.activeQualityName) { + result += Cura.MachineManager.activeQualityName + + if (Cura.MachineManager.activeQualityLayerHeight > 0) { + result += " " + result += " - " + result += Cura.MachineManager.activeQualityLayerHeight + "mm" + result += "" + } + } + + return result + } + UM.SimpleButton { id: customisedSettings From 6294900bc72f4b791ccf6c820a69bc488d68faef Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 24 Oct 2017 10:23:07 +0200 Subject: [PATCH 020/764] Disable controls when manual control is not available --- resources/qml/PrintMonitor.qml | 470 +++++++++++++++++---------------- 1 file changed, 245 insertions(+), 225 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 84097798bf..412b6e9a59 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -683,250 +683,270 @@ Column property string label: catalog.i18nc("@label", "Printer control") } - Row + Column { - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - Label + enabled: { - text: catalog.i18nc("@label", "Jog position") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width - } - - GridLayout - { - columns: 3 - rows: 4 - rowSpacing: UM.Theme.getSize("default_lining").width - columnSpacing: UM.Theme.getSize("default_lining").height - - Label + if (connectedPrinter == null) { - text: catalog.i18nc("@label", "X/Y") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: parent.width - horizontalAlignment: Text.AlignHCenter - - Layout.row: 1 - Layout.column: 2 - Layout.preferredWidth: UM.Theme.getSize("section").height + return false; //Can't control the printer if not connected. } - - Button + if (!connectedPrinter.acceptsCommands) { - Layout.row: 2 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) - } + return false; //Not allowed to do anything. } - - Button + if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") { - Layout.row: 3 - Layout.column: 1 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_left"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) - } + return false; //Printer is in a state where it can't react to manual control } - - Button - { - Layout.row: 3 - Layout.column: 3 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_right"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) - } - } - - Button - { - Layout.row: 4 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeHead() - } - } - } - - - Column - { - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Z") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: UM.Theme.getSize("section").height - - horizontalAlignment: Text.AlignHCenter - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) - } - } - - Button - { - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeBed() - } - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) - } - } - } - } - - Row - { - id: distancesRow - - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - property real currentDistance: 10 - - Label - { - text: catalog.i18nc("@label", "Jog distance") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + return true; } Row { - Repeater + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + Label { - model: distancesModel - delegate: Button + text: catalog.i18nc("@label", "Jog position") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + } + + GridLayout + { + columns: 3 + rows: 4 + rowSpacing: UM.Theme.getSize("default_lining").width + columnSpacing: UM.Theme.getSize("default_lining").height + + Label { + text: catalog.i18nc("@label", "X/Y") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: parent.width + horizontalAlignment: Text.AlignHCenter + + Layout.row: 1 + Layout.column: 2 + Layout.preferredWidth: UM.Theme.getSize("section").height + } + + Button + { + Layout.row: 2 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height height: UM.Theme.getSize("setting_control").height - width: height + UM.Theme.getSize("default_margin").width - text: model.label - exclusiveGroup: distanceGroup - checkable: true - checked: distancesRow.currentDistance == model.value - onClicked: distancesRow.currentDistance = model.value + onClicked: + { + connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) + } + } - style: ButtonStyle { - background: Rectangle { - border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : - UM.Theme.getColor("action_button_border") - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : - UM.Theme.getColor("action_button") - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") - font: UM.Theme.getFont("default") - text: control.text - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideMiddle + Button + { + Layout.row: 3 + Layout.column: 1 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_left"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 3 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_right"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 4 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeHead() + } + } + } + + + Column + { + spacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "Z") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: UM.Theme.getSize("section").height + + horizontalAlignment: Text.AlignHCenter + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) + } + } + + Button + { + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeBed() + } + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) + } + } + } + } + + Row + { + id: distancesRow + + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + property real currentDistance: 10 + + Label + { + text: catalog.i18nc("@label", "Jog distance") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + } + + Row + { + Repeater + { + model: distancesModel + delegate: Button + { + height: UM.Theme.getSize("setting_control").height + width: height + UM.Theme.getSize("default_margin").width + + text: model.label + exclusiveGroup: distanceGroup + checkable: true + checked: distancesRow.currentDistance == model.value + onClicked: distancesRow.currentDistance = model.value + + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : + control.hovered ? UM.Theme.getColor("action_button_hovered_border") : + UM.Theme.getColor("action_button_border") + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : + control.hovered ? UM.Theme.getColor("action_button_hovered") : + UM.Theme.getColor("action_button") + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : + UM.Theme.getColor("action_button_text") + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } } + label: Item { } } - label: Item { } } } } From b50f027c8349945fa7fcfcc3b28f0df1d0c98e1d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 24 Oct 2017 10:25:53 +0200 Subject: [PATCH 021/764] Add not supported role to profiles model --- cura/Settings/ProfilesModel.py | 5 ++++- resources/qml/Menus/ProfileMenu.qml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 8aeccd7e14..59a2e8d78f 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -20,12 +20,14 @@ class ProfilesModel(InstanceContainersModel): LayerHeightRole = Qt.UserRole + 1001 LayerHeightWithoutUnitRole = Qt.UserRole + 1002 AvailableRole = Qt.UserRole + 1003 + NotSupportedRole = Qt.UserRole + 1004 def __init__(self, parent = None): super().__init__(parent) self.addRoleName(self.LayerHeightRole, "layer_height") self.addRoleName(self.LayerHeightWithoutUnitRole, "layer_height_without_unit") self.addRoleName(self.AvailableRole, "available") + self.addRoleName(self.NotSupportedRole, "not_supported") Application.getInstance().globalContainerStackChanged.connect(self._update) @@ -182,7 +184,8 @@ class ProfilesModel(InstanceContainersModel): profile = container_registry.findContainers(id=item["id"]) if not profile: self._setItemLayerHeight(item, "", "") - item["available"] = True + item["available"] = False + item["not_supported"] = True yield item continue diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index b0f2ef14d2..f3886d4743 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -22,7 +22,7 @@ Menu checked: Cura.MachineManager.activeQualityChangesId == "" && Cura.MachineManager.activeQualityType == model.metadata.quality_type exclusiveGroup: group onTriggered: Cura.MachineManager.setActiveQuality(model.id) - visible: model.available + visible: model.available || model.not_supported } onObjectAdded: menu.insertItem(index, object); From a9f2ad7ca348f974949d811b913f01e53d7ffa81 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 24 Oct 2017 11:03:51 +0200 Subject: [PATCH 022/764] Hide manual controls for outputdevices that don't support it --- cura/PrinterOutputDevice.py | 6 ++++++ .../NetworkClusterPrinterOutputDevice.py | 1 + resources/qml/PrintMonitor.qml | 13 +++++++------ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index c6e98257ba..837ecc97c6 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -74,6 +74,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._can_pause = True self._can_abort = True self._can_pre_heat_bed = True + self._can_control_manually = True def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") @@ -144,6 +145,11 @@ class PrinterOutputDevice(QObject, OutputDevice): def canAbort(self): return self._can_abort + # Does the printer support manual control at all + @pyqtProperty(bool, constant=True) + def canControlManually(self): + return self._can_control_manually + @pyqtProperty(QObject, constant=True) def monitorItem(self): # Note that we specifically only check if the monitor component is created. diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index cfa793996b..dee6b30e4b 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -103,6 +103,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._can_pause = True self._can_abort = True self._can_pre_heat_bed = False + self._can_control_manually = False self._cluster_size = int(properties.get(b"cluster_size", 0)) self._cleanupRequest() diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 412b6e9a59..f926444847 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -677,14 +677,9 @@ Column watchedProperties: ["value"] } - Loader - { - sourceComponent: monitorSection - property string label: catalog.i18nc("@label", "Printer control") - } - Column { + visible: connectedPrinter != null ? connectedPrinter.canControlManually : false enabled: { if (connectedPrinter == null) @@ -702,6 +697,12 @@ Column return true; } + Loader + { + sourceComponent: monitorSection + property string label: catalog.i18nc("@label", "Printer control") + } + Row { width: base.width - 2 * UM.Theme.getSize("default_margin").width From 46fc478f9d0974d50208d5cee3936db357d67970 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 24 Oct 2017 11:15:33 +0200 Subject: [PATCH 023/764] Tweak disabled appearance --- resources/qml/PrintMonitor.qml | 72 ++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 21 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index f926444847..b0b68d0338 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -924,12 +924,38 @@ Column style: ButtonStyle { background: Rectangle { border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : - UM.Theme.getColor("action_button_border") - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : - UM.Theme.getColor("action_button") + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + return UM.Theme.getColor("action_button"); + } Behavior on color { ColorAnimation { duration: 50; } } Label { anchors.left: parent.left @@ -937,9 +963,22 @@ Column anchors.verticalCenter: parent.verticalCenter anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } font: UM.Theme.getFont("default") text: control.text horizontalAlignment: Text.AlignHCenter @@ -1066,10 +1105,7 @@ Column { return UM.Theme.getColor("action_button_hovered_border"); } - else - { - return UM.Theme.getColor("action_button_border"); - } + return UM.Theme.getColor("action_button_border"); } color: { @@ -1085,10 +1121,7 @@ Column { return UM.Theme.getColor("action_button_hovered"); } - else - { - return UM.Theme.getColor("action_button"); - } + return UM.Theme.getColor("action_button"); } Behavior on color { @@ -1123,10 +1156,7 @@ Column { return UM.Theme.getColor("action_button_hovered_text"); } - else - { - return UM.Theme.getColor("action_button_text"); - } + return UM.Theme.getColor("action_button_text"); } source: control.iconSource } From 7dc4975b361570759ee602231f2efbf09d3afa61 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 24 Oct 2017 11:33:47 +0200 Subject: [PATCH 024/764] Tweak layout and texts --- resources/qml/PrintMonitor.qml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index b0b68d0338..ce169ba714 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -714,11 +714,13 @@ Column Label { - text: catalog.i18nc("@label", "Jog position") + text: catalog.i18nc("@label", "Jog Position") color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter } GridLayout @@ -733,12 +735,15 @@ Column text: catalog.i18nc("@label", "X/Y") color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") - width: parent.width + width: height + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter Layout.row: 1 Layout.column: 2 - Layout.preferredWidth: UM.Theme.getSize("section").height + Layout.preferredWidth: width + Layout.preferredHeight: height } Button @@ -838,7 +843,8 @@ Column color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") width: UM.Theme.getSize("section").height - + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter horizontalAlignment: Text.AlignHCenter } @@ -898,11 +904,13 @@ Column Label { - text: catalog.i18nc("@label", "Jog distance") + text: catalog.i18nc("@label", "Jog Distance") color: UM.Theme.getColor("setting_control_text") font: UM.Theme.getFont("default") width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter } Row From 9083fe1bf0d51063d355fae5557338aa2923f60f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 24 Oct 2017 11:53:56 +0200 Subject: [PATCH 025/764] Add not supported instance container type and qt role - CURA-4451 --- cura/Settings/NotSupportedProfileContainer.py | 47 +++++++ cura/Settings/ProfilesModel.py | 33 +++-- .../builder_premium_large.def.json | 117 ++++++++++++++++++ .../builder_premium_medium.def.json | 117 ++++++++++++++++++ .../builder_premium_small.def.json | 116 +++++++++++++++++ .../builder_premium_large_front.def.json | 27 ++++ .../builder_premium_large_rear.def.json | 27 ++++ .../builder_premium_medium_front.def.json | 27 ++++ .../builder_premium_medium_rear.def.json | 27 ++++ .../builder_premium_small_front.def.json | 27 ++++ .../builder_premium_small_rear.def.json | 27 ++++ resources/meshes/builder_premium_platform.stl | Bin 0 -> 1348084 bytes .../bp_PLA_Coarse_Quality.inst.cfg | 24 ++++ .../bp_PLA_High_Quality.inst.cfg | 25 ++++ .../bp_PLA_Normal_Quality.inst.cfg | 23 ++++ 15 files changed, 645 insertions(+), 19 deletions(-) create mode 100644 cura/Settings/NotSupportedProfileContainer.py create mode 100644 resources/definitions/builder_premium_large.def.json create mode 100644 resources/definitions/builder_premium_medium.def.json create mode 100644 resources/definitions/builder_premium_small.def.json create mode 100644 resources/extruders/builder_premium_large_front.def.json create mode 100644 resources/extruders/builder_premium_large_rear.def.json create mode 100644 resources/extruders/builder_premium_medium_front.def.json create mode 100644 resources/extruders/builder_premium_medium_rear.def.json create mode 100644 resources/extruders/builder_premium_small_front.def.json create mode 100644 resources/extruders/builder_premium_small_rear.def.json create mode 100644 resources/meshes/builder_premium_platform.stl create mode 100644 resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg diff --git a/cura/Settings/NotSupportedProfileContainer.py b/cura/Settings/NotSupportedProfileContainer.py new file mode 100644 index 0000000000..156f13ba4a --- /dev/null +++ b/cura/Settings/NotSupportedProfileContainer.py @@ -0,0 +1,47 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Signal import signalemitter + +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase + + +## A container for not supported profiles. +# +# +@signalemitter +class NotSupportedProfileContainer(InstanceContainer): + + def __init__(self, container_id: str, machine_id: str, material_id: str, *args, **kwargs): + super().__init__(container_id, *args, **kwargs) + + # self._id = str(container_id) # type: str + # self._name = "Not supported" # type: str + + self.setMetaData({ + "setting_version": 3, + "supported": False, + "type": "quality", + "weight": "0", + "material": material_id + }) + + # register this container + ContainerRegistry.getInstance().addContainer(self) + + # set printer definition + definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + self.setDefinition(definition[0]) + + +# register the container mime type +not_support_instance_mime = MimeType( + name = "application/x-cura-notsupportedinstancecontainer", + comment = "Cura Not Supported Instance Container", + suffixes = [] +) + +MimeTypeDatabase.addMimeType(not_support_instance_mime) +ContainerRegistry.addContainerTypeByName(NotSupportedProfileContainer, "not_supported_instance", not_support_instance_mime.name) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 59a2e8d78f..68d538c671 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -7,11 +7,11 @@ from PyQt5.QtCore import Qt from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager +from cura.Settings.NotSupportedProfileContainer import NotSupportedProfileContainer ## QML Model for listing the current list of valid quality profiles. @@ -78,9 +78,9 @@ class ProfilesModel(InstanceContainersModel): if len(result) == 0: machine_id = global_container_stack.definition.getId() material_id = extruder_stacks[0].material.getId() - not_supported_container = self.generateNoSupportedInstanceContainer(machine_id, material_id) + container_id = machine_id + "_" + material_id + "_not_supported" + not_supported_container = NotSupportedProfileContainer(container_id, machine_id, material_id) result.append(not_supported_container) - # ContainerRegistry.getInstance().addContainer(not_supported_container) return result # The usable quality types are set @@ -98,32 +98,22 @@ class ProfilesModel(InstanceContainersModel): return result - def generateNoSupportedInstanceContainer(self, machine_id: str, material_id: str): - container = InstanceContainer("not_supported") - container.setName("Not Supported") - container.metaData["setting_version"] = 3 - container.metaData["supported"] = False - container.metaData["type"] = "quality" - container.metaData["weight"] = "0" - container.metaData["material"] = material_id - container.metaData["quality_type"] = "normal" - definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) - container.setDefinition(definition) - return container - ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): - #Some globals that we can re-use. + + # Some globals that we can re-use. global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: return # Detecting if the machine has multiple extrusion multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 + # Get the list of extruders and place the selected extruder at the front of the list. extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = extruder_manager.getActiveExtruderStacks() + if multiple_extrusion: # Place the active extruder at the front of the list. # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. @@ -181,7 +171,9 @@ class ProfilesModel(InstanceContainersModel): # Now all the containers are set for item in containers: - profile = container_registry.findContainers(id=item["id"]) + profile = container_registry.findContainers(id = item["id"]) + + # when the profile is not supported if not profile: self._setItemLayerHeight(item, "", "") item["available"] = False @@ -195,6 +187,7 @@ class ProfilesModel(InstanceContainersModel): # Easy case: This profile defines its own layer height. if profile.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, profile.getProperty("layer_height", "value"), unit) + item["not_supported"] = False yield item continue @@ -213,16 +206,18 @@ class ProfilesModel(InstanceContainersModel): quality = None if quality and quality.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, quality.getProperty("layer_height", "value"), unit) + item["not_supported"] = False yield item continue - #Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. + # Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. skip_until_container = global_container_stack.material if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No material in stack. skip_until_container = global_container_stack.variant if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No variant in stack. skip_until_container = global_container_stack.getBottom() self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. + item["not_supported"] = False yield item def _setItemLayerHeight(self, item, value, unit): diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json new file mode 100644 index 0000000000..5fc4b46c98 --- /dev/null +++ b/resources/definitions/builder_premium_large.def.json @@ -0,0 +1,117 @@ +{ + "id": "builder_premium_large", + "version": 2, + "name": "Builder Premium Large", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "quality_definition": "builder_premium_small", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*Normal*", + "machine_extruder_trains": + { + "0": "builder_premium_large_rear", + "1": "builder_premium_large_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Large" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 600 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "default_material_print_temperature": { "value": "215" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json new file mode 100644 index 0000000000..56dab8f863 --- /dev/null +++ b/resources/definitions/builder_premium_medium.def.json @@ -0,0 +1,117 @@ +{ + "id": "builder_premium_medium", + "version": 2, + "name": "Builder Premium Medium", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "quality_definition": "builder_premium_small", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*Normal*", + "machine_extruder_trains": + { + "0": "builder_premium_medium_rear", + "1": "builder_premium_medium_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Medium" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 400 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "default_material_print_temperature": { "value": "215" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json new file mode 100644 index 0000000000..65103ce1af --- /dev/null +++ b/resources/definitions/builder_premium_small.def.json @@ -0,0 +1,116 @@ +{ + "id": "builder_premium_small", + "version": 2, + "name": "Builder Premium Small", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Builder SZ", + "manufacturer": "Builder", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "builder_premium_platform.stl", + "platform_offset": [-126, -36, 117], + "has_machine_quality": true, + "preferred_quality": "*Normal*", + "machine_extruder_trains": + { + "0": "builder_premium_small_rear", + "1": "builder_premium_small_front" + } + }, + + + + "overrides": { + "machine_name": { "default_value": "Builder Premium Small" }, + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 215 }, + "machine_height": { "default_value": 200 }, + "machine_depth": { "default_value": 205 }, + "material_diameter": { "default_value": 1.75 }, + + "infill_pattern": {"value": "'triangles'" }, + "infill_before_walls": {"value": false }, + + "default_material_print_temperature": { "value": "215" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_standby_temperature": { "value": "material_print_temperature" }, + + "switch_extruder_retraction_speeds": {"default_value": 15 }, + "switch_extruder_retraction_speed": {"default_value": 15 }, + "switch_extruder_prime_speed": {"default_value": 15 }, + "switch_extruder_retraction_amount": {"value": 1 }, + + "speed_travel": { "value": "100" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "40" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, + "speed_wall_x": { "value": "speed_wall" }, + + "prime_tower_position_x": { "default_value": 175 }, + "prime_tower_position_y": { "default_value": 178 }, + "prime_tower_wipe_enabled": { "default_value": false }, + "prime_tower_min_volume": { "default_value": 50 }, + "dual_pre_wipe": { "default_value": false }, + + "prime_blob_enable": { "enabled": true }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "3000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_travel": { "value": "acceleration_print" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "default_value": 10 }, + + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + + "wall_thickness": { "value": "1.2" }, + + "retraction_amount": { "default_value": 3 }, + "retraction_speed": { "default_value": 15 }, + "retraction_retract_speed": { "default_value": 15 }, + "retraction_prime_speed": { "default_value": 15 }, + "travel_retract_before_outer_wall": { "default_value": true }, + "skin_overlap": { "value": "15" }, + "adhesion_type": { "default_value": "skirt" }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, + "gantry_height": { "default_value": 55 }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_max_acceleration_z": { "default_value": 500 }, + "machine_acceleration": { "default_value": 1000 }, + "machine_max_jerk_xy": { "default_value": 10 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + }, + "machine_extruder_count": { "default_value": 2 } + } +} \ No newline at end of file diff --git a/resources/extruders/builder_premium_large_front.def.json b/resources/extruders/builder_premium_large_front.def.json new file mode 100644 index 0000000000..159682dc1c --- /dev/null +++ b/resources/extruders/builder_premium_large_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_large_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_large", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_large_rear.def.json b/resources/extruders/builder_premium_large_rear.def.json new file mode 100644 index 0000000000..5e9cc062ae --- /dev/null +++ b/resources/extruders/builder_premium_large_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_large_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_large", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_medium_front.def.json b/resources/extruders/builder_premium_medium_front.def.json new file mode 100644 index 0000000000..9a330b4f4b --- /dev/null +++ b/resources/extruders/builder_premium_medium_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_medium_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_medium", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_medium_rear.def.json b/resources/extruders/builder_premium_medium_rear.def.json new file mode 100644 index 0000000000..49d4734306 --- /dev/null +++ b/resources/extruders/builder_premium_medium_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_medium_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_medium", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_small_front.def.json b/resources/extruders/builder_premium_small_front.def.json new file mode 100644 index 0000000000..2e6293d153 --- /dev/null +++ b/resources/extruders/builder_premium_small_front.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_small_front", + "version": 2, + "name": "Front Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_small", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/extruders/builder_premium_small_rear.def.json b/resources/extruders/builder_premium_small_rear.def.json new file mode 100644 index 0000000000..d1606cdd79 --- /dev/null +++ b/resources/extruders/builder_premium_small_rear.def.json @@ -0,0 +1,27 @@ +{ + "id": "builder_premium_small_rear", + "version": 2, + "name": "Rear Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "builder_premium_small", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, + "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, + "extruder_prime_pos_abs": { "default_value": true } + } +} diff --git a/resources/meshes/builder_premium_platform.stl b/resources/meshes/builder_premium_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..b315d4b6d4720b7dc57123ae214a0f5c286bc55f GIT binary patch literal 1348084 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�hbTgf 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�oy?S1LD=wVvF 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 z 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

ix;b0pB^KQ=@2%4_3)TaBR_VpVqW&eB(I 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%0Do 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 Date: Tue, 24 Oct 2017 12:50:53 +0200 Subject: [PATCH 026/764] Optimise icon --- resources/themes/cura-light/icons/home.svg | 57 +--------------------- 1 file changed, 2 insertions(+), 55 deletions(-) diff --git a/resources/themes/cura-light/icons/home.svg b/resources/themes/cura-light/icons/home.svg index 617c3ce9da..a355aa07f6 100644 --- a/resources/themes/cura-light/icons/home.svg +++ b/resources/themes/cura-light/icons/home.svg @@ -1,56 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - + + From 0f807cd03e377118e671c4e8e5ab57f7c11f5fbb Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 24 Oct 2017 17:38:06 +0200 Subject: [PATCH 027/764] Wfter changing the view the old view is removed from rendering CURA-4062 --- plugins/LayerView/LayerView.py | 1 + plugins/XRayView/XRayView.py | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index d23dd90915..7543907780 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -335,6 +335,7 @@ class LayerView(View): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) + self.getRenderer().removeRenderPass(self._layer_pass) self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index ed8d14b8b4..e7715209d0 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -74,5 +74,6 @@ class XRayView(View): self._composite_pass.setCompositeShader(self._xray_composite_shader) if event.type == Event.ViewDeactivateEvent: + self.getRenderer().removeRenderPass(self._xray_pass) self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) From 7bf854aa0f517805a958e296fd85a1a0349fd067 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 25 Oct 2017 09:52:14 +0200 Subject: [PATCH 028/764] Remove some changes, debugging - CURA-4451 --- cura/CuraApplication.py | 1 + cura/Settings/MachineManager.py | 7 +-- cura/Settings/NotSupportedProfileContainer.py | 47 ------------------- cura/Settings/ProfilesModel.py | 19 ++------ .../builder_premium_small.def.json | 5 +- resources/qml/Menus/ProfileMenu.qml | 6 +-- resources/qml/Settings/SettingView.qml | 10 ++-- resources/qml/SidebarHeader.qml | 30 +++++------- .../um3_aa0.4_PVA_Fast_Print.inst.cfg | 14 ------ .../um3_aa0.8_PVA_Fast_Print.inst.cfg | 14 ------ .../um3_aa0.8_PVA_Superdraft_Print.inst.cfg | 14 ------ 11 files changed, 35 insertions(+), 132 deletions(-) delete mode 100644 cura/Settings/NotSupportedProfileContainer.py delete mode 100644 resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1680e7c6a6..3af1112afc 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -272,6 +272,7 @@ class CuraApplication(QtApplication): empty_quality_container.setName("Not Supported") empty_quality_container.addMetaDataEntry("quality_type", "normal") empty_quality_container.addMetaDataEntry("type", "quality") + empty_quality_container.addMetaDataEntry("supported", False) ContainerRegistry.getInstance().addContainer(empty_quality_container) empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index fc5c415f87..f77121a2af 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -862,8 +862,8 @@ class MachineManager(QObject): name_changed_connect_stacks.append(stack_quality) name_changed_connect_stacks.append(stack_quality_changes) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality, postpone_emit=True) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality_changes, postpone_emit=True) + self._replaceQualityOrQualityChangesInStack(stack, stack_quality, postpone_emit = True) + self._replaceQualityOrQualityChangesInStack(stack, stack_quality_changes, postpone_emit = True) # Connect to onQualityNameChanged for stack in name_changed_connect_stacks: @@ -927,7 +927,8 @@ class MachineManager(QObject): for stack in stacks: material = stack.material quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not quality: #No quality profile is found for this quality type. + if not quality: + # No quality profile is found for this quality type. quality = self._empty_quality_container result.append({"stack": stack, "quality": quality, "quality_changes": empty_quality_changes}) diff --git a/cura/Settings/NotSupportedProfileContainer.py b/cura/Settings/NotSupportedProfileContainer.py deleted file mode 100644 index 156f13ba4a..0000000000 --- a/cura/Settings/NotSupportedProfileContainer.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.Signal import signalemitter - -from UM.Settings.InstanceContainer import InstanceContainer -from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase - - -## A container for not supported profiles. -# -# -@signalemitter -class NotSupportedProfileContainer(InstanceContainer): - - def __init__(self, container_id: str, machine_id: str, material_id: str, *args, **kwargs): - super().__init__(container_id, *args, **kwargs) - - # self._id = str(container_id) # type: str - # self._name = "Not supported" # type: str - - self.setMetaData({ - "setting_version": 3, - "supported": False, - "type": "quality", - "weight": "0", - "material": material_id - }) - - # register this container - ContainerRegistry.getInstance().addContainer(self) - - # set printer definition - definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) - self.setDefinition(definition[0]) - - -# register the container mime type -not_support_instance_mime = MimeType( - name = "application/x-cura-notsupportedinstancecontainer", - comment = "Cura Not Supported Instance Container", - suffixes = [] -) - -MimeTypeDatabase.addMimeType(not_support_instance_mime) -ContainerRegistry.addContainerTypeByName(NotSupportedProfileContainer, "not_supported_instance", not_support_instance_mime.name) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 68d538c671..4f931e6d94 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -11,7 +11,6 @@ from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager -from cura.Settings.NotSupportedProfileContainer import NotSupportedProfileContainer ## QML Model for listing the current list of valid quality profiles. @@ -20,14 +19,12 @@ class ProfilesModel(InstanceContainersModel): LayerHeightRole = Qt.UserRole + 1001 LayerHeightWithoutUnitRole = Qt.UserRole + 1002 AvailableRole = Qt.UserRole + 1003 - NotSupportedRole = Qt.UserRole + 1004 def __init__(self, parent = None): super().__init__(parent) self.addRoleName(self.LayerHeightRole, "layer_height") self.addRoleName(self.LayerHeightWithoutUnitRole, "layer_height_without_unit") self.addRoleName(self.AvailableRole, "available") - self.addRoleName(self.NotSupportedRole, "not_supported") Application.getInstance().globalContainerStackChanged.connect(self._update) @@ -74,12 +71,9 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - # If not qualities are found we dynamically create an empty container with name "Not Supported" if len(result) == 0: - machine_id = global_container_stack.definition.getId() - material_id = extruder_stacks[0].material.getId() - container_id = machine_id + "_" + material_id + "_not_supported" - not_supported_container = NotSupportedProfileContainer(container_id, machine_id, material_id) + # If not qualities are found we dynamically create a not supported container for this machine + material combination + not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] result.append(not_supported_container) return result @@ -127,8 +121,7 @@ class ProfilesModel(InstanceContainersModel): extruder_stacks = new_extruder_stacks + extruder_stacks # Get a list of usable/available qualities for this machine and material - qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) container_registry = ContainerRegistry.getInstance() machine_manager = Application.getInstance().getMachineManager() @@ -177,8 +170,7 @@ class ProfilesModel(InstanceContainersModel): if not profile: self._setItemLayerHeight(item, "", "") item["available"] = False - item["not_supported"] = True - yield item + yield None continue profile = profile[0] @@ -187,7 +179,6 @@ class ProfilesModel(InstanceContainersModel): # Easy case: This profile defines its own layer height. if profile.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, profile.getProperty("layer_height", "value"), unit) - item["not_supported"] = False yield item continue @@ -206,7 +197,6 @@ class ProfilesModel(InstanceContainersModel): quality = None if quality and quality.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, quality.getProperty("layer_height", "value"), unit) - item["not_supported"] = False yield item continue @@ -217,7 +207,6 @@ class ProfilesModel(InstanceContainersModel): if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No variant in stack. skip_until_container = global_container_stack.getBottom() self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. - item["not_supported"] = False yield item def _setItemLayerHeight(self, item, value, unit): diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 65103ce1af..b4756f955b 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -11,8 +11,11 @@ "file_formats": "text/x-gcode", "platform": "builder_premium_platform.stl", "platform_offset": [-126, -36, 117], + "has_machine_quality": true, - "preferred_quality": "*Normal*", + "preferred_material": "*pla*", + "preferred_quality": "*normal*", + "machine_extruder_trains": { "0": "builder_premium_small_rear", diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index f3886d4743..fb1ade6e0b 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -17,12 +17,12 @@ Menu MenuItem { - text: model.name + (model.layer_height != "" ? (" - " + model.layer_height) : "") + text: model.name + " - " + model.layer_height checkable: true - checked: Cura.MachineManager.activeQualityChangesId == "" && Cura.MachineManager.activeQualityType == model.metadata.quality_type + checked: Cura.MachineManager.activeQualityId == model.id exclusiveGroup: group onTriggered: Cura.MachineManager.setActiveQuality(model.id) - visible: model.available || model.not_supported + visible: model.available } onObjectAdded: menu.insertItem(index, object); diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 1892b9d5a6..14c85d81e8 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,10 +63,14 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - var result = "" + var result = catalog.i18nc("@", "No Profile Available") // default text - if (Cura.MachineManager.activeQualityName) { - result += Cura.MachineManager.activeQualityName + console.log("Cura.MachineManager.activeQualityName", Cura.MachineManager.activeQualityName) + console.log("Cura.ProfilesModel.rowCount()", Cura.ProfilesModel.rowCount()) + console.log("Cura.MachineManager.isActiveQualitySupported", Cura.MachineManager.isActiveQualitySupported) + + if (Cura.MachineManager.activeQualityName && Cura.ProfilesModel.rowCount() > 0) { + result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f3887e2885..78e21f3a68 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -245,35 +245,29 @@ Column color: UM.Theme.getColor("text"); } - ToolButton { + ToolButton + { id: materialSelection + text: Cura.MachineManager.activeMaterialName tooltip: Cura.MachineManager.activeMaterialName visible: Cura.MachineManager.hasMaterials - property var valueError: - { - var data = Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") - if(data == "False") - { - return true - } - else - { - return false - } - - } - property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported - enabled: !extrudersList.visible || base.currentExtruderIndex > -1 - height: UM.Theme.getSize("setting_control").height width: parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width anchors.right: parent.right style: UM.Theme.styles.sidebar_header_button activeFocusOnPress: true; + menu: MaterialMenu { + extruderIndex: base.currentExtruderIndex + } - menu: MaterialMenu { extruderIndex: base.currentExtruderIndex } + property var valueError: !isMaterialSupported() + property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported + + function isMaterialSupported () { + return Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") == "True" + } } } diff --git a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg deleted file mode 100644 index 121d9c92bb..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_pva_ultimaker3_AA_0.4 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg deleted file mode 100644 index 071a72da0d..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_pva_ultimaker3_AA_0.8 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg deleted file mode 100644 index 485226fe3d..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = superdraft -material = generic_pva_ultimaker3_AA_0.8 -supported = False -setting_version = 3 - -[values] From e824996af7d468032d8410d7a0ab58c5d6e3f724 Mon Sep 17 00:00:00 2001 From: daid Date: Fri, 6 Oct 2017 15:44:10 +0200 Subject: [PATCH 029/764] Fix the OpenGL shader for older (legacy?) OpenGL. As the grid shader was no longer working. --- resources/shaders/grid.shader | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/shaders/grid.shader b/resources/shaders/grid.shader index ca1e56e060..07cb1a01a6 100644 --- a/resources/shaders/grid.shader +++ b/resources/shaders/grid.shader @@ -31,10 +31,10 @@ fragment = vec4 minorGridColor = mix(u_plateColor, u_gridColor1, 1.0 - min(minorLine, 1.0)); // Compute anti-aliased world-space major grid lines - vec2 majorGrid = abs(fract(coord / 10 - 0.5) - 0.5) / fwidth(coord / 10); + vec2 majorGrid = abs(fract(coord / 10.0 - 0.5) - 0.5) / fwidth(coord / 10.0); float majorLine = min(majorGrid.x, majorGrid.y); - frag_color = mix(minorGridColor, u_gridColor0, 1.0 - min(majorLine, 1.0)); + gl_FragColor = mix(minorGridColor, u_gridColor0, 1.0 - min(majorLine, 1.0)); } vertex41core = @@ -72,7 +72,7 @@ fragment41core = vec4 minorGridColor = mix(u_plateColor, u_gridColor1, 1.0 - min(minorLine, 1.0)); // Compute anti-aliased world-space major grid lines - vec2 majorGrid = abs(fract(coord / 10 - 0.5) - 0.5) / fwidth(coord / 10); + vec2 majorGrid = abs(fract(coord / 10.0 - 0.5) - 0.5) / fwidth(coord / 10.0); float majorLine = min(majorGrid.x, majorGrid.y); frag_color = mix(minorGridColor, u_gridColor0, 1.0 - min(majorLine, 1.0)); From d2873dc65a7e553555e44b5faf6c781d6a04eaaa Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 25 Oct 2017 11:06:12 +0200 Subject: [PATCH 030/764] The view class were not added after to the rendering list after changing them CURA-4062 --- plugins/LayerView/LayerView.py | 5 +++-- plugins/XRayView/XRayView.py | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 7543907780..a7dbb88209 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -112,7 +112,7 @@ class LayerView(View): self._layer_pass = LayerPass.LayerPass(1, 1) self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) self._layer_pass.setLayerView(self) - self.getRenderer().addRenderPass(self._layer_pass) + #self.getRenderer().addRenderPass(self._layer_pass) return self._layer_pass def getCurrentLayer(self): @@ -310,7 +310,8 @@ class LayerView(View): if event.type == Event.ViewActivateEvent: # Make sure the LayerPass is created - self.getLayerPass() + layer_pass = self.getLayerPass() + self.getRenderer().addRenderPass(layer_pass) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index e7715209d0..2983772647 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -56,6 +56,8 @@ class XRayView(View): # Currently the RenderPass constructor requires a size > 0 # This should be fixed in RenderPass's constructor. self._xray_pass = XRayPass.XRayPass(1, 1) + + if self._xray_pass: self.getRenderer().addRenderPass(self._xray_pass) if not self._xray_composite_shader: From ff847aa329134d825c0f3db4395c74a311c3c63c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 25 Oct 2017 11:52:43 +0200 Subject: [PATCH 031/764] Fix qml error when there is no connected printer Also fixes code style --- plugins/UM3NetworkPrinting/UM3InfoComponents.qml | 16 +++++++++++----- resources/qml/Menus/MaterialMenu.qml | 16 +++++++++++----- resources/qml/Menus/NozzleMenu.qml | 16 +++++++++++----- 3 files changed, 33 insertions(+), 15 deletions(-) diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index 87b8b219b7..d0c95e1524 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -119,11 +119,17 @@ Item onClicked: manager.loadConfigurationFromPrinter() function isClusterPrinter() { - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize - // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) - return false - return true + if(Cura.MachineManager.printerOutputDevices.length == 0) + { + return false; + } + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; + // This is not a cluster printer or the cluster it is just one printer + if(clusterSize == undefined || clusterSize == 1) + { + return false; + } + return true; } } } diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 5422457140..d3ecfb69fe 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -16,11 +16,17 @@ Menu property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool isClusterPrinter: { - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize - // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) - return false - return true + if(Cura.MachineManager.printerOutputDevices.length == 0) + { + return false; + } + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; + // This is not a cluster printer or the cluster it is just one printer + if(clusterSize == undefined || clusterSize == 1) + { + return false; + } + return true; } UM.SettingPropertyProvider diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index 79bc105b58..e9f2df1f38 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -16,11 +16,17 @@ Menu property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool isClusterPrinter: { - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize - // This is a non cluster printer or the cluster it is just one printer - if (typeof clusterSize == "undefined" || clusterSize == 1) - return false - return true + if(Cura.MachineManager.printerOutputDevices.length == 0) + { + return false; + } + var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; + // This is not a cluster printer or the cluster it is just one printer + if(clusterSize == undefined || clusterSize == 1) + { + return false; + } + return true; } MenuItem From 9b62b4850938248f9f9fc5d56bc227d416a1f08a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 25 Oct 2017 13:27:35 +0200 Subject: [PATCH 032/764] WIP - CURA-4451 --- cura/QualityManager.py | 28 ++++++++++++--- cura/Settings/MachineManager.py | 64 +++++++++++++++++++++++++-------- cura/Settings/ProfilesModel.py | 30 +++++++++++----- 3 files changed, 95 insertions(+), 27 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index b6d47d919b..d2a2df27ac 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -178,12 +178,32 @@ class QualityManager: def findAllUsableQualitiesForMachineAndExtruders(self, global_container_stack: "GlobalStack", extruder_stacks: List["ExtruderStack"]) -> List[InstanceContainer]: global_machine_definition = global_container_stack.getBottom() + machine_manager = Application.getInstance().getMachineManager() + active_stack_id = machine_manager.activeStackId + + materials = [] + + # TODO: fix this if extruder_stacks: - # Multi-extruder machine detected. - materials = [stack.material for stack in extruder_stacks] + # Multi-extruder machine detected + for stack in extruder_stacks: + if stack.getId() == active_stack_id and machine_manager.newMaterial: + materials.append(machine_manager.newMaterial) + else: + materials.append(stack.material) else: - # Machine with one extruder. - materials = [global_container_stack.material] + # Machine with one extruder + if global_container_stack.getId() == active_stack_id and machine_manager.newMaterial: + materials.append(machine_manager.newMaterial) + else: + materials.append(global_container_stack.material) + + # if extruder_stacks: + # # Multi-extruder machine detected. + # materials = [stack.material for stack in extruder_stacks] + # else: + # # Machine with one extruder. + # materials = [global_container_stack.material] quality_types = self.findAllQualityTypesForMachineAndMaterials(global_machine_definition, materials) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f77121a2af..467b5c00a2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -50,6 +50,7 @@ class MachineManager(QObject): # Used to store the new containers until after confirming the dialog self._new_variant_container = None self._new_material_container = None + self._new_quality_containers = [] self._error_check_timer = QTimer() self._error_check_timer.setInterval(250) @@ -70,10 +71,10 @@ class MachineManager(QObject): self._stacks_have_errors = None - self._empty_variant_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_material_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_quality_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_quality_changes_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + self._empty_variant_container = ContainerRegistry.getInstance().findContainers(id = "empty_variant")[0] + self._empty_material_container = ContainerRegistry.getInstance().findContainers(id = "empty_material")[0] + self._empty_quality_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + self._empty_quality_changes_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality_changes")[0] self._onGlobalContainerChanged() @@ -147,6 +148,14 @@ class MachineManager(QObject): self.outputDevicesChanged.emit() + @property + def newVariant(self): + return self._new_variant_container + + @property + def newMaterial(self): + return self._new_material_container + @pyqtProperty("QVariantList", notify = outputDevicesChanged) def printerOutputDevices(self): return self._printer_output_devices @@ -818,6 +827,7 @@ class MachineManager(QObject): if old_material: preferred_material_name = old_material.getName() preferred_material_id = self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id + Logger.log("d", "preferred_material_id=%s", preferred_material_id) self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") @@ -854,20 +864,20 @@ class MachineManager(QObject): if new_quality_settings_list is None: return - name_changed_connect_stacks = [] # Connect these stacks to the name changed callback + self._new_quality_containers.clear() + for setting_info in new_quality_settings_list: stack = setting_info["stack"] stack_quality = setting_info["quality"] stack_quality_changes = setting_info["quality_changes"] - name_changed_connect_stacks.append(stack_quality) - name_changed_connect_stacks.append(stack_quality_changes) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality, postpone_emit = True) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality_changes, postpone_emit = True) + Logger.log("d", "=======================setting new quality=%s, %s", stack.getId(), stack_quality.getId()) - # Connect to onQualityNameChanged - for stack in name_changed_connect_stacks: - stack.nameChanged.connect(self._onQualityNameChanged) + self._new_quality_containers.append({ + "stack": stack, + "quality": stack_quality, + "quality_changes": stack_quality_changes + }) has_user_interaction = False @@ -890,13 +900,24 @@ class MachineManager(QObject): # before the user decided to keep or discard any of their changes using the dialog. # The Application.onDiscardOrKeepProfileChangesClosed signal triggers this method. def _executeDelayedActiveContainerStackChanges(self): + if self._new_variant_container is not None: + self._active_container_stack.variant = self._new_variant_container + self._new_variant_container = None + if self._new_material_container is not None: self._active_container_stack.material = self._new_material_container self._new_material_container = None - if self._new_variant_container is not None: - self._active_container_stack.variant = self._new_variant_container - self._new_variant_container = None + if self._new_quality_containers: + for new_quality in self._new_quality_containers: + Logger.log("d", "stack=%s, quality=%s", new_quality["stack"].getId(), new_quality["quality"].getId()) + self._replaceQualityOrQualityChangesInStack(new_quality["stack"], new_quality["quality"], postpone_emit = True) + self._replaceQualityOrQualityChangesInStack(new_quality["stack"], new_quality["quality_changes"], postpone_emit = True) + + for new_quality in self._new_quality_containers: + new_quality["stack"].nameChanged.connect(self._onQualityNameChanged) + + self._new_quality_containers.clear() ## Cancel set changes for material and variant in the active container stack. # Used for ignoring any changes when switching between printers (setActiveMachine) @@ -926,6 +947,11 @@ class MachineManager(QObject): for stack in stacks: material = stack.material + + # TODO: fix this + if self._new_material_container and stack.getId() == self._active_container_stack.getId(): + material = self._new_material_container + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) if not quality: # No quality profile is found for this quality type. @@ -963,8 +989,12 @@ class MachineManager(QObject): else: Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) return None + material = global_container_stack.material + if self._new_material_container and self._active_container_stack.getId() == global_container_stack.getId(): + material = self._new_material_container + # For the global stack, find a quality which matches the quality_type in # the quality changes profile and also satisfies any material constraints. quality_type = global_quality_changes.getMetaDataEntry("quality_type") @@ -991,6 +1021,10 @@ class MachineManager(QObject): quality_changes = self._empty_quality_changes_container material = stack.material + + if self._new_material_container and self._active_container_stack.getId() == stack.getId(): + material = self._new_material_container + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) if not quality: #No quality profile found for this quality type. quality = self._empty_quality_container diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 4f931e6d94..8762512a6e 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -6,6 +6,7 @@ from collections import OrderedDict from PyQt5.QtCore import Qt from UM.Application import Application +from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel @@ -71,12 +72,6 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - if len(result) == 0: - # If not qualities are found we dynamically create a not supported container for this machine + material combination - not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] - result.append(not_supported_container) - return result - # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) @@ -90,6 +85,14 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) + Logger.log("d", "====================quality=%s", quality.getId()) + + if len(result) == 0: + # If not qualities are found we dynamically create a not supported container for this machine + material combination + not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + result.append(not_supported_container) + # return result + return result ## Re-computes the items in this model, and adds the layer height role. @@ -121,7 +124,8 @@ class ProfilesModel(InstanceContainersModel): extruder_stacks = new_extruder_stacks + extruder_stacks # Get a list of usable/available qualities for this machine and material - qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + extruder_stacks) container_registry = ContainerRegistry.getInstance() machine_manager = Application.getInstance().getMachineManager() @@ -166,15 +170,25 @@ class ProfilesModel(InstanceContainersModel): for item in containers: profile = container_registry.findContainers(id = item["id"]) + Logger.log("d", "profile=%s, id=%s", profile, item["id"]) + # when the profile is not supported if not profile: self._setItemLayerHeight(item, "", "") item["available"] = False - yield None + yield item continue profile = profile[0] + + if profile.getId() == "empty_quality": + self._setItemLayerHeight(item, "", "") + item["available"] = True + yield item + continue + item["available"] = profile in qualities + Logger.log("d", "---- profile available = [%s] , qualities = [%s]", item["available"], [q.getId() for q in qualities]) # Easy case: This profile defines its own layer height. if profile.hasProperty("layer_height", "value"): From 88ffe0d3584267baa5f2868638272969f9f2c94e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 25 Oct 2017 15:57:53 +0200 Subject: [PATCH 033/764] correctly show not supported when any of the extruders has a not supported profile - CURA-4451 --- cura/CuraApplication.py | 2 +- cura/QualityManager.py | 2 +- cura/Settings/MachineManager.py | 17 +++++++++++++---- cura/Settings/ProfilesModel.py | 1 - resources/qml/Menus/ProfileMenu.qml | 2 +- resources/qml/Settings/SettingView.qml | 6 +----- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 3af1112afc..2d1c35aca7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -270,7 +270,7 @@ class CuraApplication(QtApplication): empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not Supported") - empty_quality_container.addMetaDataEntry("quality_type", "normal") + empty_quality_container.addMetaDataEntry("quality_type", "not_supported") empty_quality_container.addMetaDataEntry("type", "quality") empty_quality_container.addMetaDataEntry("supported", False) ContainerRegistry.getInstance().addContainer(empty_quality_container) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index d2a2df27ac..0312c50daf 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -87,7 +87,7 @@ class QualityManager: qualities = set(quality_type_dict.values()) for material_container in material_containers[1:]: next_quality_type_dict = self.__fetchQualityTypeDictForMaterial(machine_definition, material_container) - qualities.update(set(next_quality_type_dict.values())) + qualities.intersection_update(set(next_quality_type_dict.values())) return list(qualities) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 467b5c00a2..bb8b8aefa4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -843,8 +843,6 @@ class MachineManager(QObject): if not containers or not self._global_container_stack: return - Logger.log("d", "Attempting to change the active quality to %s", quality_id) - # Quality profile come in two flavours: type=quality and type=quality_changes # If we found a quality_changes profile then look up its parent quality profile. container_type = containers[0].getMetaDataEntry("type") @@ -864,6 +862,19 @@ class MachineManager(QObject): if new_quality_settings_list is None: return + has_not_supported_quality = False + + # check if any of the extruder stacks have a not supported profile + # if that is the case, all stacks should have a not supported state (otherwise it will show quality_type normal) + for setting_info in new_quality_settings_list: + if setting_info["quality"].getMetaDataEntry("quality_type") == "not_supported": + has_not_supported_quality = True + break + + if has_not_supported_quality: + for setting_info in new_quality_settings_list: + setting_info["quality"] = self._empty_quality_container + self._new_quality_containers.clear() for setting_info in new_quality_settings_list: @@ -871,8 +882,6 @@ class MachineManager(QObject): stack_quality = setting_info["quality"] stack_quality_changes = setting_info["quality_changes"] - Logger.log("d", "=======================setting new quality=%s, %s", stack.getId(), stack_quality.getId()) - self._new_quality_containers.append({ "stack": stack, "quality": stack_quality, diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 8762512a6e..57498ffbd3 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -91,7 +91,6 @@ class ProfilesModel(InstanceContainersModel): # If not qualities are found we dynamically create a not supported container for this machine + material combination not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] result.append(not_supported_container) - # return result return result diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index fb1ade6e0b..fecea5ef99 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -17,7 +17,7 @@ Menu MenuItem { - text: model.name + " - " + model.layer_height + text: (model.layer_height != "") ? model.name + " - " + model.layer_height : model.name checkable: true checked: Cura.MachineManager.activeQualityId == model.id exclusiveGroup: group diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 14c85d81e8..c116fa933a 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -65,11 +65,7 @@ Item function generateActiveQualityText () { var result = catalog.i18nc("@", "No Profile Available") // default text - console.log("Cura.MachineManager.activeQualityName", Cura.MachineManager.activeQualityName) - console.log("Cura.ProfilesModel.rowCount()", Cura.ProfilesModel.rowCount()) - console.log("Cura.MachineManager.isActiveQualitySupported", Cura.MachineManager.isActiveQualitySupported) - - if (Cura.MachineManager.activeQualityName && Cura.ProfilesModel.rowCount() > 0) { + if (Cura.MachineManager.isActiveQualitySupported ) { result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.activeQualityLayerHeight > 0) { From e4fec1f63d0406221422bc191d6043db1d16fb68 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 25 Oct 2017 16:34:41 +0200 Subject: [PATCH 034/764] Move SaveButton downwards CURA-4490 Move SaveButton downwards so it doesn't overlay with the estimated print time in some language. --- resources/qml/SaveButton.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 7423fc2368..acc97ebf11 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -91,8 +91,8 @@ Item { id: saveRow width: base.width height: saveToButton.height - anchors.top: progressBar.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height anchors.left: parent.left Row { From b95ba24530b8ec98a8c524c46d9d644499e5cc74 Mon Sep 17 00:00:00 2001 From: Chris ter Beke Date: Thu, 26 Oct 2017 09:23:27 +0200 Subject: [PATCH 035/764] Remove some changes, debugging - CURA-4451 WIP - CURA-4451 correctly show not supported when any of the extruders has a not supported profile - CURA-4451 Clean up and add comments - CURA-4451 --- cura/CuraApplication.py | 3 +- cura/QualityManager.py | 30 +++++-- cura/Settings/MachineManager.py | 87 +++++++++++++++---- cura/Settings/NotSupportedProfileContainer.py | 47 ---------- cura/Settings/ProfilesModel.py | 39 ++++----- .../builder_premium_small.def.json | 5 +- resources/qml/Menus/ProfileMenu.qml | 6 +- resources/qml/Settings/SettingView.qml | 6 +- resources/qml/SidebarHeader.qml | 30 +++---- .../um3_aa0.4_PVA_Fast_Print.inst.cfg | 14 --- .../um3_aa0.8_PVA_Fast_Print.inst.cfg | 14 --- .../um3_aa0.8_PVA_Superdraft_Print.inst.cfg | 14 --- 12 files changed, 136 insertions(+), 159 deletions(-) delete mode 100644 cura/Settings/NotSupportedProfileContainer.py delete mode 100644 resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1680e7c6a6..2d1c35aca7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -270,8 +270,9 @@ class CuraApplication(QtApplication): empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not Supported") - empty_quality_container.addMetaDataEntry("quality_type", "normal") + empty_quality_container.addMetaDataEntry("quality_type", "not_supported") empty_quality_container.addMetaDataEntry("type", "quality") + empty_quality_container.addMetaDataEntry("supported", False) ContainerRegistry.getInstance().addContainer(empty_quality_container) empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" diff --git a/cura/QualityManager.py b/cura/QualityManager.py index b6d47d919b..0312c50daf 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -87,7 +87,7 @@ class QualityManager: qualities = set(quality_type_dict.values()) for material_container in material_containers[1:]: next_quality_type_dict = self.__fetchQualityTypeDictForMaterial(machine_definition, material_container) - qualities.update(set(next_quality_type_dict.values())) + qualities.intersection_update(set(next_quality_type_dict.values())) return list(qualities) @@ -178,12 +178,32 @@ class QualityManager: def findAllUsableQualitiesForMachineAndExtruders(self, global_container_stack: "GlobalStack", extruder_stacks: List["ExtruderStack"]) -> List[InstanceContainer]: global_machine_definition = global_container_stack.getBottom() + machine_manager = Application.getInstance().getMachineManager() + active_stack_id = machine_manager.activeStackId + + materials = [] + + # TODO: fix this if extruder_stacks: - # Multi-extruder machine detected. - materials = [stack.material for stack in extruder_stacks] + # Multi-extruder machine detected + for stack in extruder_stacks: + if stack.getId() == active_stack_id and machine_manager.newMaterial: + materials.append(machine_manager.newMaterial) + else: + materials.append(stack.material) else: - # Machine with one extruder. - materials = [global_container_stack.material] + # Machine with one extruder + if global_container_stack.getId() == active_stack_id and machine_manager.newMaterial: + materials.append(machine_manager.newMaterial) + else: + materials.append(global_container_stack.material) + + # if extruder_stacks: + # # Multi-extruder machine detected. + # materials = [stack.material for stack in extruder_stacks] + # else: + # # Machine with one extruder. + # materials = [global_container_stack.material] quality_types = self.findAllQualityTypesForMachineAndMaterials(global_machine_definition, materials) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index fc5c415f87..131160c8af 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -50,6 +50,7 @@ class MachineManager(QObject): # Used to store the new containers until after confirming the dialog self._new_variant_container = None self._new_material_container = None + self._new_quality_containers = [] self._error_check_timer = QTimer() self._error_check_timer.setInterval(250) @@ -70,10 +71,10 @@ class MachineManager(QObject): self._stacks_have_errors = None - self._empty_variant_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_material_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_quality_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() - self._empty_quality_changes_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + self._empty_variant_container = ContainerRegistry.getInstance().findContainers(id = "empty_variant")[0] + self._empty_material_container = ContainerRegistry.getInstance().findContainers(id = "empty_material")[0] + self._empty_quality_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + self._empty_quality_changes_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality_changes")[0] self._onGlobalContainerChanged() @@ -147,6 +148,14 @@ class MachineManager(QObject): self.outputDevicesChanged.emit() + @property + def newVariant(self): + return self._new_variant_container + + @property + def newMaterial(self): + return self._new_material_container + @pyqtProperty("QVariantList", notify = outputDevicesChanged) def printerOutputDevices(self): return self._printer_output_devices @@ -818,6 +827,7 @@ class MachineManager(QObject): if old_material: preferred_material_name = old_material.getName() preferred_material_id = self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id + Logger.log("d", "preferred_material_id=%s", preferred_material_id) self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") @@ -833,8 +843,6 @@ class MachineManager(QObject): if not containers or not self._global_container_stack: return - Logger.log("d", "Attempting to change the active quality to %s", quality_id) - # Quality profile come in two flavours: type=quality and type=quality_changes # If we found a quality_changes profile then look up its parent quality profile. container_type = containers[0].getMetaDataEntry("type") @@ -854,20 +862,36 @@ class MachineManager(QObject): if new_quality_settings_list is None: return - name_changed_connect_stacks = [] # Connect these stacks to the name changed callback + # check if any of the stacks have a not supported profile + # if that is the case, all stacks should have a not supported state (otherwise it will show quality_type normal) + has_not_supported_quality = False + + # check all stacks for not supported + for setting_info in new_quality_settings_list: + if setting_info["quality"].getMetaDataEntry("quality_type") == "not_supported": + has_not_supported_quality = True + break + + # set all stacks to not supported if that's the case + if has_not_supported_quality: + for setting_info in new_quality_settings_list: + setting_info["quality"] = self._empty_quality_container + + self._new_quality_containers.clear() + + # store the upcoming quality profile changes per stack for later execution + # this prevents re-slicing before the user has made a choice in the discard or keep dialog + # (see _executeDelayedActiveContainerStackChanges) for setting_info in new_quality_settings_list: stack = setting_info["stack"] stack_quality = setting_info["quality"] stack_quality_changes = setting_info["quality_changes"] - name_changed_connect_stacks.append(stack_quality) - name_changed_connect_stacks.append(stack_quality_changes) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality, postpone_emit=True) - self._replaceQualityOrQualityChangesInStack(stack, stack_quality_changes, postpone_emit=True) - - # Connect to onQualityNameChanged - for stack in name_changed_connect_stacks: - stack.nameChanged.connect(self._onQualityNameChanged) + self._new_quality_containers.append({ + "stack": stack, + "quality": stack_quality, + "quality_changes": stack_quality_changes + }) has_user_interaction = False @@ -890,13 +914,24 @@ class MachineManager(QObject): # before the user decided to keep or discard any of their changes using the dialog. # The Application.onDiscardOrKeepProfileChangesClosed signal triggers this method. def _executeDelayedActiveContainerStackChanges(self): + if self._new_variant_container is not None: + self._active_container_stack.variant = self._new_variant_container + self._new_variant_container = None + if self._new_material_container is not None: self._active_container_stack.material = self._new_material_container self._new_material_container = None - if self._new_variant_container is not None: - self._active_container_stack.variant = self._new_variant_container - self._new_variant_container = None + # apply the new quality to all stacks + if self._new_quality_containers: + for new_quality in self._new_quality_containers: + self._replaceQualityOrQualityChangesInStack(new_quality["stack"], new_quality["quality"], postpone_emit = True) + self._replaceQualityOrQualityChangesInStack(new_quality["stack"], new_quality["quality_changes"], postpone_emit = True) + + for new_quality in self._new_quality_containers: + new_quality["stack"].nameChanged.connect(self._onQualityNameChanged) + + self._new_quality_containers.clear() ## Cancel set changes for material and variant in the active container stack. # Used for ignoring any changes when switching between printers (setActiveMachine) @@ -926,8 +961,14 @@ class MachineManager(QObject): for stack in stacks: material = stack.material + + # TODO: fix this + if self._new_material_container and stack.getId() == self._active_container_stack.getId(): + material = self._new_material_container + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not quality: #No quality profile is found for this quality type. + if not quality: + # No quality profile is found for this quality type. quality = self._empty_quality_container result.append({"stack": stack, "quality": quality, "quality_changes": empty_quality_changes}) @@ -962,8 +1003,12 @@ class MachineManager(QObject): else: Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) return None + material = global_container_stack.material + if self._new_material_container and self._active_container_stack.getId() == global_container_stack.getId(): + material = self._new_material_container + # For the global stack, find a quality which matches the quality_type in # the quality changes profile and also satisfies any material constraints. quality_type = global_quality_changes.getMetaDataEntry("quality_type") @@ -990,6 +1035,10 @@ class MachineManager(QObject): quality_changes = self._empty_quality_changes_container material = stack.material + + if self._new_material_container and self._active_container_stack.getId() == stack.getId(): + material = self._new_material_container + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) if not quality: #No quality profile found for this quality type. quality = self._empty_quality_container diff --git a/cura/Settings/NotSupportedProfileContainer.py b/cura/Settings/NotSupportedProfileContainer.py deleted file mode 100644 index 156f13ba4a..0000000000 --- a/cura/Settings/NotSupportedProfileContainer.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.Signal import signalemitter - -from UM.Settings.InstanceContainer import InstanceContainer -from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase - - -## A container for not supported profiles. -# -# -@signalemitter -class NotSupportedProfileContainer(InstanceContainer): - - def __init__(self, container_id: str, machine_id: str, material_id: str, *args, **kwargs): - super().__init__(container_id, *args, **kwargs) - - # self._id = str(container_id) # type: str - # self._name = "Not supported" # type: str - - self.setMetaData({ - "setting_version": 3, - "supported": False, - "type": "quality", - "weight": "0", - "material": material_id - }) - - # register this container - ContainerRegistry.getInstance().addContainer(self) - - # set printer definition - definition = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) - self.setDefinition(definition[0]) - - -# register the container mime type -not_support_instance_mime = MimeType( - name = "application/x-cura-notsupportedinstancecontainer", - comment = "Cura Not Supported Instance Container", - suffixes = [] -) - -MimeTypeDatabase.addMimeType(not_support_instance_mime) -ContainerRegistry.addContainerTypeByName(NotSupportedProfileContainer, "not_supported_instance", not_support_instance_mime.name) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 68d538c671..5bbc3f6116 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -6,12 +6,12 @@ from collections import OrderedDict from PyQt5.QtCore import Qt from UM.Application import Application +from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager -from cura.Settings.NotSupportedProfileContainer import NotSupportedProfileContainer ## QML Model for listing the current list of valid quality profiles. @@ -20,14 +20,12 @@ class ProfilesModel(InstanceContainersModel): LayerHeightRole = Qt.UserRole + 1001 LayerHeightWithoutUnitRole = Qt.UserRole + 1002 AvailableRole = Qt.UserRole + 1003 - NotSupportedRole = Qt.UserRole + 1004 def __init__(self, parent = None): super().__init__(parent) self.addRoleName(self.LayerHeightRole, "layer_height") self.addRoleName(self.LayerHeightWithoutUnitRole, "layer_height_without_unit") self.addRoleName(self.AvailableRole, "available") - self.addRoleName(self.NotSupportedRole, "not_supported") Application.getInstance().globalContainerStackChanged.connect(self._update) @@ -74,15 +72,6 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - # If not qualities are found we dynamically create an empty container with name "Not Supported" - if len(result) == 0: - machine_id = global_container_stack.definition.getId() - material_id = extruder_stacks[0].material.getId() - container_id = machine_id + "_" + material_id + "_not_supported" - not_supported_container = NotSupportedProfileContainer(container_id, machine_id, material_id) - result.append(not_supported_container) - return result - # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) @@ -96,6 +85,12 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) + # if still profiles are found, add a single empty_quality ("Not supported") instance to the drop down list + if len(result) == 0: + # If not qualities are found we dynamically create a not supported container for this machine + material combination + not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + result.append(not_supported_container) + return result ## Re-computes the items in this model, and adds the layer height role. @@ -127,8 +122,7 @@ class ProfilesModel(InstanceContainersModel): extruder_stacks = new_extruder_stacks + extruder_stacks # Get a list of usable/available qualities for this machine and material - qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) container_registry = ContainerRegistry.getInstance() machine_manager = Application.getInstance().getMachineManager() @@ -177,17 +171,23 @@ class ProfilesModel(InstanceContainersModel): if not profile: self._setItemLayerHeight(item, "", "") item["available"] = False - item["not_supported"] = True yield item continue profile = profile[0] + + # empty qualities should show in the list (they are "Not Supported" profiles) + if profile.getId() == "empty_quality": + self._setItemLayerHeight(item, "", "") + item["available"] = True + yield item + continue + item["available"] = profile in qualities # Easy case: This profile defines its own layer height. if profile.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, profile.getProperty("layer_height", "value"), unit) - item["not_supported"] = False yield item continue @@ -199,14 +199,14 @@ class ProfilesModel(InstanceContainersModel): if quality_result["stack"] is global_container_stack: quality = quality_result["quality"] break - else: #No global container stack in the results: + else: + # No global container stack in the results: if quality_results: - quality = quality_results[0]["quality"] #Take any of the extruders. + quality = quality_results[0]["quality"] # Take any of the extruders. else: quality = None if quality and quality.hasProperty("layer_height", "value"): self._setItemLayerHeight(item, quality.getProperty("layer_height", "value"), unit) - item["not_supported"] = False yield item continue @@ -217,7 +217,6 @@ class ProfilesModel(InstanceContainersModel): if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No variant in stack. skip_until_container = global_container_stack.getBottom() self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. - item["not_supported"] = False yield item def _setItemLayerHeight(self, item, value, unit): diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 65103ce1af..b4756f955b 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -11,8 +11,11 @@ "file_formats": "text/x-gcode", "platform": "builder_premium_platform.stl", "platform_offset": [-126, -36, 117], + "has_machine_quality": true, - "preferred_quality": "*Normal*", + "preferred_material": "*pla*", + "preferred_quality": "*normal*", + "machine_extruder_trains": { "0": "builder_premium_small_rear", diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index f3886d4743..fecea5ef99 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -17,12 +17,12 @@ Menu MenuItem { - text: model.name + (model.layer_height != "" ? (" - " + model.layer_height) : "") + text: (model.layer_height != "") ? model.name + " - " + model.layer_height : model.name checkable: true - checked: Cura.MachineManager.activeQualityChangesId == "" && Cura.MachineManager.activeQualityType == model.metadata.quality_type + checked: Cura.MachineManager.activeQualityId == model.id exclusiveGroup: group onTriggered: Cura.MachineManager.setActiveQuality(model.id) - visible: model.available || model.not_supported + visible: model.available } onObjectAdded: menu.insertItem(index, object); diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 1892b9d5a6..c116fa933a 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,10 +63,10 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - var result = "" + var result = catalog.i18nc("@", "No Profile Available") // default text - if (Cura.MachineManager.activeQualityName) { - result += Cura.MachineManager.activeQualityName + if (Cura.MachineManager.isActiveQualitySupported ) { + result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f3887e2885..78e21f3a68 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -245,35 +245,29 @@ Column color: UM.Theme.getColor("text"); } - ToolButton { + ToolButton + { id: materialSelection + text: Cura.MachineManager.activeMaterialName tooltip: Cura.MachineManager.activeMaterialName visible: Cura.MachineManager.hasMaterials - property var valueError: - { - var data = Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") - if(data == "False") - { - return true - } - else - { - return false - } - - } - property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported - enabled: !extrudersList.visible || base.currentExtruderIndex > -1 - height: UM.Theme.getSize("setting_control").height width: parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width anchors.right: parent.right style: UM.Theme.styles.sidebar_header_button activeFocusOnPress: true; + menu: MaterialMenu { + extruderIndex: base.currentExtruderIndex + } - menu: MaterialMenu { extruderIndex: base.currentExtruderIndex } + property var valueError: !isMaterialSupported() + property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported + + function isMaterialSupported () { + return Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") == "True" + } } } diff --git a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg deleted file mode 100644 index 121d9c92bb..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.4_PVA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_pva_ultimaker3_AA_0.4 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg deleted file mode 100644 index 071a72da0d..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_pva_ultimaker3_AA_0.8 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg deleted file mode 100644 index 485226fe3d..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.8_PVA_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -weight = 0 -type = quality -quality_type = superdraft -material = generic_pva_ultimaker3_AA_0.8 -supported = False -setting_version = 3 - -[values] From fc48ba7baec1915e9ca6a2ba7ff90e52b267e621 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 09:48:31 +0200 Subject: [PATCH 036/764] Remove all not supported quality profiles - CURA-4451 --- .../um2p_pp_0.25_normal.inst.cfg | 15 ---- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 71 ------------------- .../um2p_tpu_0.8_normal.inst.cfg | 15 ---- .../um3_bb0.4_ABS_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_ABS_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_CPEP_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_CPEP_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_CPE_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_CPE_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_Nylon_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_Nylon_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_PC_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_PLA_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_PLA_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_PP_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_PP_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.4_TPU_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.4_TPU_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_ABS_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_ABS_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_CPEP_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_CPEP_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_CPE_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_CPE_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_Nylon_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_Nylon_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_PC_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_PC_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_PLA_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_PLA_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_PP_Fast_Print.inst.cfg | 14 ---- .../um3_bb0.8_PP_Superdraft_Print.inst.cfg | 14 ---- .../um3_bb0.8_TPU_Fast_print.inst.cfg | 14 ---- .../um3_bb0.8_TPU_Superdraft_Print.inst.cfg | 14 ---- 34 files changed, 535 deletions(-) delete mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg delete mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg delete mode 100644 resources/quality/ultimaker2_plus/um2p_tpu_0.8_normal.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_PP_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_PP_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PP_Fast_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_PP_Superdraft_Print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg delete mode 100644 resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg deleted file mode 100644 index 13b05df085..0000000000 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.25_normal.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker2_plus - -[metadata] -type = quality -material = generic_pp_ultimaker2_plus_0.25_mm -weight = 0 -quality_type = normal -setting_version = 3 -supported = False - -[values] - diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg deleted file mode 100644 index d471e39853..0000000000 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ /dev/null @@ -1,71 +0,0 @@ -[general] -version = 2 -name = Normal -definition = ultimaker2_plus - -[metadata] -type = quality -material = generic_pp_ultimaker2_plus_0.4_mm -weight = -1 -quality_type = fast -setting_version = 3 - -[values] -acceleration_enabled = True -acceleration_layer_0 = =acceleration_topbottom -acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_print = 4000 -acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) -acceleration_support_interface = =acceleration_topbottom -acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) -acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) -acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) -brim_width = 20 -cool_fan_full_at_height = =layer_height_0 + 4 * layer_height -cool_fan_speed_max = 100 -cool_min_layer_time_fan_speed_max = 6 -cool_min_speed = 20 -infill_line_width = =round(line_width * 0.4 / 0.38, 2) -infill_overlap = 0 -infill_pattern = cubic -infill_wipe_dist = 0 -jerk_enabled = True -jerk_layer_0 = =jerk_topbottom -jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) -jerk_print = 25 -jerk_support = =math.ceil(jerk_print * 15 / 25) -jerk_support_interface = =jerk_topbottom -jerk_topbottom = =math.ceil(jerk_print * 5 / 25) -jerk_wall = =math.ceil(jerk_print * 10 / 25) -jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) -layer_height = 0.15 -line_width = =machine_nozzle_size * 0.95 -multiple_mesh_overlap = 0 -retraction_count_max = 12 -retraction_extrusion_window = 1 -retraction_hop = 0.15 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 0.5 -retraction_prime_speed = 15 -skin_overlap = 10 -speed_layer_0 = 25 -speed_prime_tower = =speed_topbottom -speed_print = 25 -speed_support_interface = =speed_topbottom -speed_topbottom = =math.ceil(speed_print * 25 / 25) -speed_travel = 250 -speed_travel_layer_0 = 50 -speed_wall = =math.ceil(speed_print * 25 / 25) -speed_wall_0 = =math.ceil(speed_wall * 20 / 25) -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 -support_top_distance = =support_z_distance -support_xy_distance = =wall_line_width_0 * 2.5 -support_xy_distance_overhang = =wall_line_width_0 -support_z_distance = =layer_height * 2 -travel_avoid_distance = 3 -wall_0_inset = 0 -wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) -wall_thickness = 0.76 - diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.8_normal.inst.cfg deleted file mode 100644 index 65f9ba383e..0000000000 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.8_normal.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker2_plus - -[metadata] -weight = 0 -type = quality -quality_type = normal -material = generic_tpu_ultimaker2_plus_0.8_mm -supported = False -setting_version = 3 - -[values] - diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg deleted file mode 100644 index 65fbb4aa22..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_ABS_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_abs_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg deleted file mode 100644 index d92791970e..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_ABS_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_abs_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg deleted file mode 100644 index 3aa8fc43e0..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_plus_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg deleted file mode 100644 index c3bfa7a731..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_CPEP_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_cpe_plus_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg deleted file mode 100644 index 6594cd4403..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_CPE_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg deleted file mode 100644 index 4eda6ce767..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_CPE_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_cpe_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg deleted file mode 100644 index ca4589f150..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_nylon_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg deleted file mode 100644 index 94dcfe2aff..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_Nylon_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_nylon_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg deleted file mode 100644 index 46334b219c..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_PC_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pc_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg deleted file mode 100644 index 37998b3346..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_PLA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pla_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg deleted file mode 100644 index 51ea4d609a..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_PLA_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_pla_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PP_Fast_Print.inst.cfg deleted file mode 100644 index be9f93c662..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_PP_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pp_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PP_Superdraft_Print.inst.cfg deleted file mode 100644 index d2f54e3137..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_PP_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_pp_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg deleted file mode 100644 index ba1eaaf548..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_TPU_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_tpu_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg deleted file mode 100644 index 783d1dfa80..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.4_TPU_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_tpu_ultimaker3_BB_0.4 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg deleted file mode 100644 index 7f4dc9f23e..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_ABS_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_abs_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg deleted file mode 100644 index c0fe6216c2..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_ABS_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_abs_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg deleted file mode 100644 index 4aa96f3a02..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_plus_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg deleted file mode 100644 index 5e2d079f20..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_CPEP_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_cpe_plus_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg deleted file mode 100644 index 384d44cf93..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_CPE_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg deleted file mode 100644 index 87bdedb204..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_CPE_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_cpe_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg deleted file mode 100644 index 699bb575d2..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_nylon_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg deleted file mode 100644 index 261d63e6e7..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_Nylon_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_nylon_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg deleted file mode 100644 index ac8515a1ea..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PC_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pc_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg deleted file mode 100644 index 12d82993e6..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PC_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_pc_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg deleted file mode 100644 index f93273a33a..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PLA_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pla_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg deleted file mode 100644 index 499af56b4b..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PLA_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_pla_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PP_Fast_Print.inst.cfg deleted file mode 100644 index 5ffda57b8b..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PP_Fast_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_pp_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PP_Superdraft_Print.inst.cfg deleted file mode 100644 index aa50edcf55..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_PP_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_pp_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg deleted file mode 100644 index 6be3b596f9..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_TPU_Fast_print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_tpu_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] diff --git a/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg deleted file mode 100644 index e3484b3556..0000000000 --- a/resources/quality/ultimaker3/um3_bb0.8_TPU_Superdraft_Print.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = ultimaker3 - -[metadata] -type = quality -quality_type = superdraft -material = generic_tpu_ultimaker3_BB_0.8 -weight = 0 -supported = False -setting_version = 3 - -[values] From ac40de727237eb6f5c0f3f1fac8241fc300d40a8 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 09:54:06 +0200 Subject: [PATCH 037/764] Remove builder premium resources that were used for testing (separate PR to add them back) - CURA-4451 --- .../builder_premium_large.def.json | 117 ----------------- .../builder_premium_medium.def.json | 117 ----------------- .../builder_premium_small.def.json | 119 ------------------ resources/meshes/builder_premium_platform.stl | Bin 1348084 -> 0 bytes .../bp_PLA_Coarse_Quality.inst.cfg | 24 ---- .../bp_PLA_High_Quality.inst.cfg | 25 ---- .../bp_PLA_Normal_Quality.inst.cfg | 23 ---- 7 files changed, 425 deletions(-) delete mode 100644 resources/definitions/builder_premium_large.def.json delete mode 100644 resources/definitions/builder_premium_medium.def.json delete mode 100644 resources/definitions/builder_premium_small.def.json delete mode 100644 resources/meshes/builder_premium_platform.stl delete mode 100644 resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json deleted file mode 100644 index 5fc4b46c98..0000000000 --- a/resources/definitions/builder_premium_large.def.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "id": "builder_premium_large", - "version": 2, - "name": "Builder Premium Large", - "inherits": "fdmprinter", - "metadata": { - "visible": true, - "author": "Builder SZ", - "manufacturer": "Builder", - "category": "Other", - "quality_definition": "builder_premium_small", - "file_formats": "text/x-gcode", - "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - "has_machine_quality": true, - "preferred_quality": "*Normal*", - "machine_extruder_trains": - { - "0": "builder_premium_large_rear", - "1": "builder_premium_large_front" - } - }, - - - - "overrides": { - "machine_name": { "default_value": "Builder Premium Large" }, - "machine_heated_bed": { "default_value": true }, - "machine_width": { "default_value": 215 }, - "machine_height": { "default_value": 600 }, - "machine_depth": { "default_value": 205 }, - "material_diameter": { "default_value": 1.75 }, - - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, - - "default_material_print_temperature": { "value": "215" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, - "material_standby_temperature": { "value": "material_print_temperature" }, - - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, - - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, - "speed_prime_tower": { "value": "speed_topbottom" }, - "speed_print": { "value": "40" }, - "speed_support": { "value": "speed_wall_0" }, - "speed_support_interface": { "value": "speed_topbottom" }, - "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, - "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, - "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, - "speed_wall_x": { "value": "speed_wall" }, - - "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "default_value": 178 }, - "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, - - "prime_blob_enable": { "enabled": true }, - - "acceleration_enabled": { "value": "True" }, - "acceleration_layer_0": { "value": "acceleration_topbottom" }, - "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_print": { "value": "3000" }, - "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_support_interface": { "value": "acceleration_topbottom" }, - "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, - "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, - - "jerk_enabled": { "value": "True" }, - "jerk_layer_0": { "value": "jerk_topbottom" }, - "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_print": { "value": "25" }, - "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_support_interface": { "value": "jerk_topbottom" }, - "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, - "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, - "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - - "wall_thickness": { "value": "1.2" }, - - "retraction_amount": { "default_value": 3 }, - "retraction_speed": { "default_value": 15 }, - "retraction_retract_speed": { "default_value": 15 }, - "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, - "adhesion_type": { "default_value": "skirt" }, - "machine_nozzle_heat_up_speed": { "default_value": 2 }, - "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, - "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, - "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, - "machine_max_acceleration_z": { "default_value": 500 }, - "machine_acceleration": { "default_value": 1000 }, - "machine_max_jerk_xy": { "default_value": 10 }, - "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - "machine_extruder_count": { "default_value": 2 } - } -} \ No newline at end of file diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json deleted file mode 100644 index 56dab8f863..0000000000 --- a/resources/definitions/builder_premium_medium.def.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "id": "builder_premium_medium", - "version": 2, - "name": "Builder Premium Medium", - "inherits": "fdmprinter", - "metadata": { - "visible": true, - "author": "Builder SZ", - "manufacturer": "Builder", - "category": "Other", - "quality_definition": "builder_premium_small", - "file_formats": "text/x-gcode", - "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - "has_machine_quality": true, - "preferred_quality": "*Normal*", - "machine_extruder_trains": - { - "0": "builder_premium_medium_rear", - "1": "builder_premium_medium_front" - } - }, - - - - "overrides": { - "machine_name": { "default_value": "Builder Premium Medium" }, - "machine_heated_bed": { "default_value": true }, - "machine_width": { "default_value": 215 }, - "machine_height": { "default_value": 400 }, - "machine_depth": { "default_value": 205 }, - "material_diameter": { "default_value": 1.75 }, - - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, - - "default_material_print_temperature": { "value": "215" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, - "material_standby_temperature": { "value": "material_print_temperature" }, - - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, - - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, - "speed_prime_tower": { "value": "speed_topbottom" }, - "speed_print": { "value": "40" }, - "speed_support": { "value": "speed_wall_0" }, - "speed_support_interface": { "value": "speed_topbottom" }, - "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, - "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, - "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, - "speed_wall_x": { "value": "speed_wall" }, - - "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "default_value": 178 }, - "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, - - "prime_blob_enable": { "enabled": true }, - - "acceleration_enabled": { "value": "True" }, - "acceleration_layer_0": { "value": "acceleration_topbottom" }, - "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_print": { "value": "3000" }, - "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_support_interface": { "value": "acceleration_topbottom" }, - "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, - "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, - - "jerk_enabled": { "value": "True" }, - "jerk_layer_0": { "value": "jerk_topbottom" }, - "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_print": { "value": "25" }, - "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_support_interface": { "value": "jerk_topbottom" }, - "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, - "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, - "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - - "wall_thickness": { "value": "1.2" }, - - "retraction_amount": { "default_value": 3 }, - "retraction_speed": { "default_value": 15 }, - "retraction_retract_speed": { "default_value": 15 }, - "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, - "adhesion_type": { "default_value": "skirt" }, - "machine_nozzle_heat_up_speed": { "default_value": 2 }, - "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, - "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, - "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, - "machine_max_acceleration_z": { "default_value": 500 }, - "machine_acceleration": { "default_value": 1000 }, - "machine_max_jerk_xy": { "default_value": 10 }, - "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - "machine_extruder_count": { "default_value": 2 } - } -} \ No newline at end of file diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json deleted file mode 100644 index b4756f955b..0000000000 --- a/resources/definitions/builder_premium_small.def.json +++ /dev/null @@ -1,119 +0,0 @@ -{ - "id": "builder_premium_small", - "version": 2, - "name": "Builder Premium Small", - "inherits": "fdmprinter", - "metadata": { - "visible": true, - "author": "Builder SZ", - "manufacturer": "Builder", - "category": "Other", - "file_formats": "text/x-gcode", - "platform": "builder_premium_platform.stl", - "platform_offset": [-126, -36, 117], - - "has_machine_quality": true, - "preferred_material": "*pla*", - "preferred_quality": "*normal*", - - "machine_extruder_trains": - { - "0": "builder_premium_small_rear", - "1": "builder_premium_small_front" - } - }, - - - - "overrides": { - "machine_name": { "default_value": "Builder Premium Small" }, - "machine_heated_bed": { "default_value": true }, - "machine_width": { "default_value": 215 }, - "machine_height": { "default_value": 200 }, - "machine_depth": { "default_value": 205 }, - "material_diameter": { "default_value": 1.75 }, - - "infill_pattern": {"value": "'triangles'" }, - "infill_before_walls": {"value": false }, - - "default_material_print_temperature": { "value": "215" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, - "material_standby_temperature": { "value": "material_print_temperature" }, - - "switch_extruder_retraction_speeds": {"default_value": 15 }, - "switch_extruder_retraction_speed": {"default_value": 15 }, - "switch_extruder_prime_speed": {"default_value": 15 }, - "switch_extruder_retraction_amount": {"value": 1 }, - - "speed_travel": { "value": "100" }, - "speed_layer_0": { "value": "20" }, - "speed_prime_tower": { "value": "speed_topbottom" }, - "speed_print": { "value": "40" }, - "speed_support": { "value": "speed_wall_0" }, - "speed_support_interface": { "value": "speed_topbottom" }, - "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, - "speed_wall": { "value": "math.ceil(speed_print * 30 / 40)" }, - "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 25)" }, - "speed_wall_x": { "value": "speed_wall" }, - - "prime_tower_position_x": { "default_value": 175 }, - "prime_tower_position_y": { "default_value": 178 }, - "prime_tower_wipe_enabled": { "default_value": false }, - "prime_tower_min_volume": { "default_value": 50 }, - "dual_pre_wipe": { "default_value": false }, - - "prime_blob_enable": { "enabled": true }, - - "acceleration_enabled": { "value": "True" }, - "acceleration_layer_0": { "value": "acceleration_topbottom" }, - "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_print": { "value": "3000" }, - "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, - "acceleration_support_interface": { "value": "acceleration_topbottom" }, - "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_travel": { "value": "acceleration_print" }, - "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 3000)" }, - "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1000)" }, - - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "default_value": 10 }, - - "jerk_enabled": { "value": "True" }, - "jerk_layer_0": { "value": "jerk_topbottom" }, - "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_print": { "value": "25" }, - "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, - "jerk_support_interface": { "value": "jerk_topbottom" }, - "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, - "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, - "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, - - "wall_thickness": { "value": "1.2" }, - - "retraction_amount": { "default_value": 3 }, - "retraction_speed": { "default_value": 15 }, - "retraction_retract_speed": { "default_value": 15 }, - "retraction_prime_speed": { "default_value": 15 }, - "travel_retract_before_outer_wall": { "default_value": true }, - "skin_overlap": { "value": "15" }, - "adhesion_type": { "default_value": "skirt" }, - "machine_nozzle_heat_up_speed": { "default_value": 2 }, - "machine_nozzle_cool_down_speed": { "default_value": 2 }, - "machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] }, - "gantry_height": { "default_value": 55 }, - "machine_max_feedrate_x": { "default_value": 300 }, - "machine_max_feedrate_y": { "default_value": 300 }, - "machine_max_feedrate_z": { "default_value": 40 }, - "machine_max_acceleration_z": { "default_value": 500 }, - "machine_acceleration": { "default_value": 1000 }, - "machine_max_jerk_xy": { "default_value": 10 }, - "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E15 ;extrude 15mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\nT0 ;Start with Rear Extruder\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - "machine_extruder_count": { "default_value": 2 } - } -} \ No newline at end of file diff --git a/resources/meshes/builder_premium_platform.stl b/resources/meshes/builder_premium_platform.stl deleted file mode 100644 index b315d4b6d4720b7dc57123ae214a0f5c286bc55f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1348084 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�hbTgf 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�oy?S1LD=wVvF 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 z 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

ix;b0pB^KQ=@2%4_3)TaBR_VpVqW&eB(I zq8g|mfxEMbxZGV2d^AeVq-P=$=ql9mkCxqq_99<&QjJBOrueoQ-e1xsFmv^_gguB7J`66ji3_@8#t-NxtfvBvcnU!AR5)?0p{c7+NOxS!i%;q|7m-uDK{ zlcSv`0$ttdyRSuh+Iad)W54sdF&o$^w_v&H#sz^261bn6($RbGvhmkLWvAgz6M?Sb z7cD&RDf-^s@^MsSy~}4NFSU|O=x>Dz61Y2?#+)_ttGV*El(9pcCIVfh=DF~?ZG-ra zt>dXilSakVsnhEJZ&nQzBye{&jibiZR%2$?l=rD!A%U((jja3*&1)TxHugJ*O{u32 z>swrgQM*C~3EZ7cUwtdxO1--;uUt><3JG-i2rKOa2<8viM5-|+UrV*;>m(6N_aG`r z;C^n4rQ51dwcY5cXvJf@a#11 z?s~W$mIM!wx90!lt^Hi}<6*PCGu=I1&rG^y`r;nN1iP{o_f`wW2dQ=6tQr+FIAzqE zzs)}|zhZ?6&U53rvtM6XV(S!h3)Tiquqzg44QBNSR%uR*Lyc*Jy33ab8k#S$HeiJb zPG{rfz^0*6kN($P7jrl!*i~e-x2lfZcE;u7Q6sf~lzjHX?jDJ?0V_;!IveMyPY#pw zi}!QXz#NVVcFBR>s(JHJHDCHIc-5_vKAVTB1!XQRi~+ySzRBSJL89F7Tg zxp9WRR`oD-u$`4fP6!W?t=>!*zScF76ec*Gjpyf!B4nl!N5lz?D<;_W?2%pd&KR!V z^*67%>k0^bITTynd@`x;pyFDOek@!UU(Y@ts#r zGB@_;B+>w?Jo=I1zj7+E||kH z!LHjOpNzUgaEAVyRb%zg;(GA#a>1?Z$PJKN;RS8)a_gW^{RkKWzap-8c za-6dA&Ouv!wf(QO`{9l7&!%33kn{m1v|(2~+N|R^EApcYA&O z+iek#c?l~_aGo1y&re0_gfoXk2doX4VAtM>2}W3%Fx5<1d1t?rVBNU+Eb$R@I98b8 zbT+a8jR)#n1-c45=5S1~>%|`l#$OU==yO|HWUqWK-RVneu>;p#R+!*)HqNRg4AXy> zcQ{sJZNLP(MyF0Nbn6gx^P^Q`Y*>_Dzx7G{2aGFLnBa7_&6cI*Q2n|6SN9i;D<;_0 zu|a|{CNNm#Ja6Tl%kJu~f0lEY(fH0;VS>}yI5jz>kIuDnra2AYITP%9cP7E8855)y zFPn!NnTI-c&P$ukxv0Sk6P(V*`&cRm>E{6t%;~r$GQqAX3lfcuo6y%ea6W1bTGc|2 z{{F$th;hXV6P(UQV!e5DeWF2j-4FLcCfK!OZIW@}eSjL7e*tPVZ&gDdipi^UVO+7o z1gEntqLMBYUqye!xMG4`ZN7Xm4m1r=f4#D5{E;`GK6SdfeulLHD@<@Y8zXULWNAR~|g$Yh)W0sNbiYZEk>Xld%&D1RSHo4mjE`BJYQjgW#;%H~#Ou;7Js9(LR+!*) zHj*zpBgL@T0s21H228LkN1qg}y=>FX$tvr#to%Y8ZjtO=Z z4e?U>%HW;%1FXFB@s3&Lkh}GC70i8DVS>}y*b9GCM)rAHQwL-2!vwqB+3c$Dxd4@^ znUzJ(_N9VsccqA~gK@ZY5 z52p9h$MHE>VS@AA=s}msDN9UvZFa`riV1dkW%5?{aT0LQX{*MEmVUD7CDYu3xeqH$ za5@`jAZtd+t812<$8b$#f?a-o-l}oMU==mf$~(uDkC6EidYZ$rHeiJb&U54KLyjS` z@5KCOC#(&aU{{t{Z?&#Kh|1ezHEJZC=p`?mn(f|-xhN}4a5@{w;wsVd-tj+ui(n4N z1iMzmc&nnBL)BtsWswW?>m^sYb~*Oo`(T9$PG{qjpBp6A$$H{3#uXFn`rQi8KYySf zS)sM4(Y zsa<^{)yCW#QKLw%Yhv~I4zermAFMFJ>1;f&ow-{qkLn=@Vh+ayyB-xuF)o~lRBt|5 zH7cc=Bz6x8m8~(ZSYd+G+35aVvavYYY>;e$am56?=Ct``Ec=YUYNnNUzB1~K!?npJ zZ=nV&OmI3Ivy63V9UpT=%Llk7GQqAcW0Q>^ztF#Zgq3&xyG&Mhkq%LE7Um_aFv00; z?CJmb?Y5U6Do0>#zy!OV?)`4`euVz*^{l+}#(NGk|N8E-)~(YfD@<@Y8*e7Y4#xz$R=)pgWM6_zbtWr|Y$j|m7u0vkw^$pn!UU(YajLlaBlFh4KzRXc118v2 zQD6>NDN?O`Y1K$R`pMj0wYkiPzZEM?a5@`LE#q?OS+APNT$sZ#!LFtUJ{j4TN2naf zti1DI84K#D236&FeCMn%!Rc(9?P=*6dh9Wz;xVq6VArdDNk->{a8+rZm3MBtxt9L1 zGMD@lHCSPS)7ds#DX%tq)5r{RHpUeb?5fc_(I{FqTpj4V9W@pYYNc!Ldo5n#H^>ST zoX$pW!VJ~V`(707F~4GhU1R@FFtUY&sk+&%EVBJ%fEIVwh!(hBvBCtWvvDr`NI%{4 zuhF6yYB0gB>s1nr-@`-Inuk`6U;TRMOK&O)AIuY3VS>}y7$wz*=^V+s9ow-sV1iv| zyc3M!$Zan>VC9_yqoef0@=biLXLqbH!Rc&VcO!@C%Z*pNk78Ug!LES+~#e3=d3Wn>1^C<+xFLubhPP>dlVDwTC+02Si2)gE$wAxkiDf*%5z_?q9Hvg+$t53<4pr?W9bUS3o8uU=MX z!W@nXcD-Km$tcz@Kt=4{gBoi$6w!0@SJb_*HeiJbPG=*ruJY(ga~kV;SQ{|Gt`h~m z80YUh)y}DVQR8^S6m!SR#`-?y46HE0>1=c=Z1Bu1-Y-Cp!F-nqcHKDr)!5M6sT@7` zp+;1neP+uSU3F8;eOO_F)7jYT8#T`y`cH2igK@O>$+!@kD=}q_?tT4gp zZ0rt}zvVlqc(mSu-yjq0s#WQiF*lu4O*?GWc;bJ^;lR0xI+**g!UU(Yaa#SluL#*W zNGD)iF~P2jKYkleYB*K=p9fJRU72W6vs}2=SR1gy1gEo+#~HX?{8yu=9*?yF6YOdp zWK#_$qaRt|A=LQr?v!|0yR&|ZwE-(ka5@|P0HS}2uLnEp7MQ~^!LELlz0?=)0M)x* zJZgL{nN~i#(?H+A_rVGioX*D8=T}iV;G?hpg>l6MyT+qW(d`uhs((%^iyWS*l+5v~ zl&+0&#R?Og&c?ibwvcVJpd$(HwM?*UdYoO^ItQw&53L$mr%G8OC7mvZ&%p{4oae?H z@(Om5nX4q5`SCfJVAroCyP8!XNG)Gv<(=PG?I_FnUp9N;cg_kEoaaU=Wm^xqqVg{D zBGv{>ucif0~7`5621i&)22P;f)Iva#fw9K3PQv4s7!!g0G9;3X~(#s)ga3(8@ z98@t%_TFMRtmn?GFv00;JTaL)M7F<>P0YdCfC+Xza(b)RI#eaUuxhwgN6M9#+lek1 zSFA9>>1^C_9!JSeOBai-*4lvnEq2A^@KzaDhpFv*kD|ubHU2W`>27fxHCSPS)7ds# z`bSP#tH%qm71u;2*!5}y`jPbwSGxvTdFRX(n#pf@&?g@A5>}YtbT*#+G;bomw$Cj$ zU~RwzyWSSEtB}$WD!STn)RCpd5v@0V_;!IvWYM(dA_I?loi>)&@+lt8jlW z)#Y4->fvo=k!@9T$pYTBWf|PhSz&_H*~pkwOD|8{ZzF$TTrt6}o9k_AS^G%U`(LZZ zsO-;0)?=-ufxi_iOmI3IXS|x95}EwNWgXl@r@yq;A55^TN$@wL z65hL{Z(226i3`n)2ZCfI)&{IF!Rc(9E#>!lGegcWc^`98CfN0H{TCx+>qr%~<1A{d zE%DTx+Omx-h-*75OmI3IN!D{2ktJ&_Ut?S`!LGr%KO2QlM5u$)&Y?zuwmEfyL$&39 z_|92jg7e(yb^l|7*&w>F4BS~%)^9{bQwTN~T|H z4!F=?`b>WAW`zmP(BN6>laXeNt^;I`QIRGS?8=_!x3Mm7fC>n`g&L`E^fSLc^q1q2 z;9-RcPTk_dwZ*$51AKGYEnBWWz zb|BOG#pmttR^-kZ?m@7tQT^Y>=F@nO$;<1gv3%1^N6pR+#HX{vH7iVTh6eqw2BkP^ zAAIK<_AJ(eU{_tg-$s|eoT}h4t44C#5aCmQoOvwG0L=;$oS{KShc*L5hn82(1;ax< z2zK@D|J%5NzO{dkvi?>#U#}F?Iu_RN(T9Zg2C$Vc&-pCOAW5v-OTzBC_Zxy$16VCfN1wpTCW4rJSm6Cu{6( zUA$2&t3E(484~MYg^6n=Fhh=Zs-AW$k8`{D7_qC`0R8?$s9=I!KgRtwI#zP3N|o<| zm^W>Vm|h`F-?@E8u);)v11ZMp5OnNKXVu7ex3yS5B}7MeeCR>2tK^yA#t-yAs&&Px zaduixy?#+Uc_=#8!N2p;ML!!8%m}ru$AyM`#lRV1Vbkp#U1WGts9=SOn%ln^D;r0u z;Hl@W&r$ZCIp9innR95Yg9&!=l@E8${=3b8yj|!45h_?=;zh(aqx{B5_0LZ0dR2YF zWb;7|oT9_`!34Yb3XYkKY;1lzF<2JD_rVGixhwuK{y@*nPfxAu?&uk}-HmdLlD&t; zI+$P=--$5OUz*YVZE}osybBeqFp&fOOFn#wRQbwUHRi;)91HWt$(-Y39Zax`@2J>& zt?4B?E*K^QzJv-^n20(2%gFIO65pnEkLo`&Tmli*dyY6B;?; z3N0d4$N_6!ax*%;%ogG&2Vq<>!7iSu;gkQDTL%2yRBDVXR+zZl%S-)pJVFKhYt65Y zm9BuCjIUgaam56?c*cqRV02BnX-s)J3*(9vCg$a_tN3COs&{6q#*=!@W%|K?NH2^l zCfLO@XRPjuwUrh6Wt1TpSFA8`5YIVNT;Xbc8*47wsZ5B>tUilJ<6<35u!~m!)>*Z1 z>HO=Gn2Yb66(-hY@K#5bhpDx*taam56?cx8!wpL5Z&sKbe_w`oc4};Z^j8={5 zK_lc9-`b{i|6qb$yh29j$YlfM?4%K9nvbD^6(+VxZ`I~YklI<>T63-}+Fuq~wauJ~ z&%p${c%_d#=ksvcF2i~A2F4XDOmusTcVQO}Qga4d>+|O8gJk1fKg@@?mN3CC-m$>5 z)JE;(!9(fwFZ>2sVPbi-T|M_lZ}o%LKEt52P36P7MfIW4u?{BK#XB#!?grG7d#0Du z?=h}eVIuA^`p~ZnP?7Jg{gO4g%F3{rQuiDY>tKRiyn}?%J~NLTTe+#8igCpX6BEjL zsV7KbhvfcWjU%b$$=&{XB!1^iu#0!X@SL;pGjT6xkY0sx#R?N^y4lp5nNIblj)=P=#keW+lCi5?Yx8L6^6)tDvLe&W}hwH?PA#OXZvKA2z^@37*U zIO$sah{Z9w2d=xUFtH;t*=Ujx^Y*9KzNqMytKRiyi<&GuhXRYD)SIs z824IMn7BLtyK%L=Q?)8!)p+MO%l!ChuSFA8msArO)is4z&G3)t<_n#f~kTcozU-(-w!7hFx zgnjBJetMPHFY_XMagdC;MB^y!JO3rFHaK_e1=xm|zz_X~cPk6*2nRihc1zF|Jr);%Ke}!-eOZ zv*%jR2U}emrBg@GbCklhgb8->6H~mw<=s$itC>qg;Qql16Mr^LFh<0Ls)Yxw=bUG8 z;`j31q2d6>6%*{@C%>38RO+K!d?-`$%*w#C|j33l<5c+8eM zHr2C2^T-g4D^{2&8JlFJdK<1v^tYaEmmck_>&8})t8qVPf?a%~z-DWdy}VxYxTYM5 zam5M~6OVr~_AH1{X_s5)0Ayq#y*P6VxesdtCfLO%Bk)evp!E94n0E4Cj4M`{$ldgd zk*9Q|ns?MX&(QJ8d(-wTR8GXWVuD?K!UIp2s+}^ceT|SeF|Jr);{B(uMwK~{s_RSZ zT*kdN%gvb|2g(%~S4^;rPpY8r$EQAK#nA)hMvN;~nCN%#yHVtJq`I8jsxkL{Zqsd! zl-69733l;`8=T~LJKx>nN3@K_xMGEgLgSK+(Vrt#=`Pk8mg$$r`yPymlc&bUI+$P= zpBzG#?96t@y#3Mg6z);1co40A8I`ez{9%!G-sini%&q=Y_B)Q ziWQ>=NNueR=$sW3*$bu^o7|D=;aTh4QqM6v#L?6JQ^?Ke4j5+rp51^33l;`G@LN4omo2mYb~2#4#x@;73$;N znXe<%#9UU5_g_oMGM|-Pj&a2VyZB@s)*l5b$&o**$v<$fWrc|~@4eKSRuRg#fpu1G z&16H)U0+hhVO%l6E?&YUxN0`iI@kB_uWqv6YHyha z*Agb!#U~xneQ#ZmJdo*$h{SJ@6()Wq+SR>lVd}+E>wMyd6@6s4>xaZQtPPl87oXU~ z?s;He`S-TD;tR$VD@Ifl!5huVw9n2R#OE{y0z#RR+f1TEI*F)^~z$WrdT7+0(?F@LbP zYKZqPWi+fasmt=k%A6%Knfo!Wm|z#51jg??>tI>?We0N(#uY0}6ljb0B3BMp!BN)v zUHgndGVPGXW>JhQCfLO%nsH5h+(TxqeZUOG9F7$x>ZbBmvO|#SxyCw&JYjaYeB}4a z9FE^P6YS!X*+_<&on`;*UfPc9E-OsDKu>8sIZ%CjW1Xjt|Eslpd@QdngKHua?BWyV z_(k<~$f=u)>yo(Fvckl$40d(va)9zGVbw4SSC#$B)X{6PHeiBXd{Q1yOuUN7s^c5z zB#bLon0VXGOP#M2pgOl&i5gE*WtGDZb=1u=PF;t+)rI~3EXR0VPe=! zoBFZEsjl|3&goyQc18FWcIp2xu9#pKCl`>k7`92Qe%MQ=!S9?ECNB0!F7HQkolRt%*^?r zw{D1QA}dVvl;4awK~8lyW(jJf$$rUvyTGM0Vh+ayyEvhQ>(!rc&6Jl;Jq_cE6(-V8 z{bFo7?o`K@Ek=!eIkV`rL7jA6TuYc>7bmUo1gmrbeI}}r9*%Lv3KLbmJ{u17P8fS^ z5o*{ASJ4aqsH=BkTrt5ePK;qU%Db-aytTA$iE9ZfOf1=%WVHPhpay(eh#EhlTIs;% z=&FKiI}_~UWY`v{>ejJpOjs7Czh{1H{)M#x6YSyy zAKm~~Gg5cUcG8T*xMGEgy?5{~p^-sqMzocQ+n8&R4(Y$lyodWa6YSz7BJwz^2kPWw zQRZZfD^{5J&@RDf7#yt9ZJ3W5L*I?mRo`YaUt(M_!7ffzVixWbquZt(?@qwDVugw5 zJPAf-yodMfxp}CuGa^o>?eoQV6~+}4?BZl7R(H*!^~+V)9RFclvBJc@N(n}H5vu$@ z&P9zLU54w%3tNe$7*|ZNixaL`pZoULqTnQpVd7!UBx9F5Tvc0b<%EAPQ~GkSk4%F(924x~Hb*bU|cc5E>7g52X^DB=02>7YG4k>3KQR(emB;h#ph^dW!%L9Y1aHcT=v4a zVuD@VSpcUj&b)M2_KKEv>t0L!3z*oOJ=r*#fZhq?t$qOUb56xS?Hea+;U2{VySPIF zo`3AG@2Jr$M&82bV1)^4j?|D@*FHT!P3)EqvG|q;;t)9#$#MD!7lE+fp>=0PbIrv=qS%)T(QE$gY;f%Nk+V5q~%o9 z$ThH_{BXL3JdAP01iQHB2v#hirDXO>_2fo;AFMF3_PCdd92%i=51xV=6$aOrfh#M@ z>=;)}u!}pPpqE8XB@f&!D2HKOvBE^w5W9MKDqQ(*nT#5p26UFC24|9QasOa~UEI+H z_m3<7GF|acVgqWh!bIR5bl^`Lt{x^%LXEwnTyp5xOQJj0228MvJJVpcWQ&r?M>dMe z*4lu&+%U1Jy0@BN1!pq-y1G5a6)Q}v znCzvtqHFelW5=RKoIRf$8Qfae#&3`bc5yE>jP{$UWbNJ^^=gbOR+uPr!luH`IMuiH zV^Cvv`sZR^&j{TD*Agb!#Xa5d)}C%|F(zXVJqzQC6(+)Nrx@wNoT~r%(Wr6g>m1Q( z=3u=UvGUt}}FFo$D>iLmUyjl9L3D&~6}YUIi5C8iFI)deuFJP2}e z$2^?O%oXU!-ZnMDY_rkbhg^AUpei(D}IMpk!Sk&m=tBpBO4A*(Fzsm%>xPu|ieiWH(F3;OvFUGiH zg^8y-z8NK2;$3|qBT(bj@q=c`8+~+6%;A_|7k6T`*(P#uW)>4W$j zOt6c4f?|iIQ7b)uQC7VHM7`Y-)+uHs%4`ANT1iQFXDQ0B< zh3FM`ZkuiKJ7Ddg0SM?g)%4R+tF=1Mjaz z-&%W`{;2V4WSkDRcZ&DL@0dNZgsL|&c&IT`9D>`9Z zF~KhGVT?V150U!Oj-#R=?zOBiktbK8k$5Uht;!pP8kb9l>XbPNVj$)|Ot6bPD`Uqi zb4OjTPiol#pMw=9vLq!M?WTvT9P3@EF~qNhUYxp+?1!}h6YSy+(Rd1wP*>kvTS{ic zHIWr2Hsev_cr8hnY6YSzn*La89)dD*Ab0v>pT(QDLv$)Sj z-=`7kbZB?fm>HEp2OaMs?_pdq!7lFDjjYV6cjk;)PWcq$iWMe~=l^Ov3`OsRjS;9J zN}n>fw?X$kj4LMC#hu5|PiDXhv&@R#@-V&+R+vbA^P92pAaeBI!%*YnSeM!8aI{Q~ zam56?xaT^0{7xuj{;_1JoPlx03KL6K{4mxb|FOP%C~DYhPjGksI!d}QFJXdR+&dm) z_qkdB()JkH2{l+@A}9LLXT$m3n9sqeaW(T9N2SK27r!F{&nAZY%JOGRNN?P0Sz*HEi@e(Ba5Z6{A8Hhs&{m$vmRqjEZ;%Og@w+aN zyIb2yMm@I6cDUEF!o(}LUCpc;u09%Ftk01WA+v9NBJN;qzy!PaogG+t`Sy?*T=BvW z^>mouh zu2^B>d$6|(92cq*@^%D~eSNIV<@?1Eh~FR+?3#m4w{PZzsJ@$9gQzkfMmoP$b^L>I z#R?O-qrKHx5M4vsgUC}pP97`Q(H(?q2@~w9-p^ZYULC9+d};|IY|}8gyvT3&MvN;~ zn7Gp2TiMnIt5ch;PhL&N$W+fm%!2*#x1xWGU8QPytEoCjrE<0ak^6dIIeq6Wb2zRg ztT6GrqPGe)gH*8$Z9t?QHbB0~w87k7FwVgQyE5QS%1MWU)EPgk#?9%GvU}Cz=KI@W zf)ys#UbU;s{{^a$>8(IaTa!=DJAS~N*r~SMxf`SUXP~OHu5H7krd;>H6QsTuwf?%J|E(=kitRPe?&)SaCO?>x{AghZ6ULy-69rUvP)K&;Oh!{y}Yj|k0kFAojdt> z5bUZ~%&y8l3|D~{yP<|pt$K3LvNvMzal2%N3BEpJ*Pz-TGE0O1MA7Cx9t67r5}RDN4r?m`VF*cJE;@7fxQBY^F_**f-uGXb+%6osLnh7t;!^{Ex%+}$vcd$dre(`!l8{h0%QsNK3HLb=W|FLE}P)Kyj00y_zg0_u3m4x z8QB&^s$tozS@`qSIm}(D{N+M?AFMFJ^HR(JPBt`0G!rr&*Agb!)u!%OV~i20M(ZA^ z5i)7SU5OueZwTn~lv{V1O zU*FLi*IiaT2#@^|x1*7+Qx>z$COin4aq+8^kkTc3?JbKpB?g$dqgLRvPg zmVT3d78=?5co6LRQYguoIV({0d~EFwzR%TIpSp0&EPBx{Sz&_r%P?E|qm1sf_pEsv zpMwc@J*f7{81@M7=Zvs+Ik%hDbWWE|4>)3%tT4g*et4SkPi`HV`?om{-v<-y3Yq-b zFdGG^x#_Ll+J26L`bz3TIuYZF6()H95?!+||1=L7dGvjZD<;_0Dfd_7;7O;tb$BFd zgjW4!Hp^H;e?kpbnBaX_o9)Yj6XwrtW%W|!<3X^i*2!w{p;4L4ruiG{!~h=;f?fBT{xp_XaH>-0tQxDEZ*m*yoVw%{yJUq4-rvVlzm3_AoT}_3>#2;7(ZkVvsZ;-h-ykbY@N)|E772ak@NHn|fmjAU?2b)C&?CGz=xMGF>U4Cwa=Yw1KiZ_?hyAAhqCfN0EAl|)>Zf|~Btfze+ zKD-mIa&`4gT-#Y;f}elcY@5@36qADs>gO$dJP39TLbCW)&OlZ0iB+RS-rREi<6`>o zNxNi)34V@;Ewa?vWur!^bdbM~2f?n5I4LX6o>*?#gQI%wioN06|tPNOUf}cks z1`H4^}&$;o2?sH0(z0k)!4K(tAQO9Jo5xhLYWHeiJbJ_lm6T{~Y)jtl)) ze8Jj)33d(p+e>{6h)|n9$A{#qFI*0(hK8?33f%4v8l!j0_p3g=2t@`o}uDh%-!RL!`N-yhnVLx11PR81R33g>%@Y^uZHDb_I>r~jhI;%wD znO5@pF}q}i2|g!CRYOultpIgI>tYjAV z>q3p>0;~;~VAmM`@5Xv`JgI-(s`2di1NXSj-Q-%_KUiUc&);E2_PUtaqF4jj8fyb4 z*k!E2{K^@r(rlWA8lBy-=Jz8Vq_s!J3KM*e&}RFm)l75Aidym<=5S1~D@*z>Mgyds z>QAsvfA(B)+^qLsBiRAtiWMgKJS1i^kI$P0$CQ?5@i~}aSHQAQ#;wi~3Y|+(qYSR< zUoupcQ!y`Lg$X{_X|r{E;-za<&nXYI_3bTEh71jn!u*(>qX!!mYrV78dYK$0DOD})%StMd@zzP$5&KA#W zYnInpa~>9b+vEG7e~VpraLU`aV3^vp$vPc<|4UOn`0+lm0rOo}nBeomI3d)lj=phv zqWFNd0Tb+MIyk{tQ8!eb7%|`aTXpHAUvBCl(%?I1g$X|QjK5XxhPu-2EaElB6%*`Q z6OdrEZX2R%`z=6?`Z=BGi@VA32xFHOCiwg|?gm{N>4!Jc`F6$HfC+Z3o|j;Z?jEcL zSF=vt4;$#zS-MPghvRR>3KM(|9eK{Z4Ryb4Dei<;J{|7OOzy!PM;v`4u!+2Bd|56aUUN+NxXY4kQUbahC znBZIh_8Gh@=p7~8=2EN;m|$1>mq|w6jDhMwoR#KSdZxDiP%6HdZQS#EN1%d-vRW9L5zZOmI#EZyMj6N@qEiO*?TP zWP)9#w|z0Pp%X%tvR1k#uv!{jVQ?kA7~_f+COB_`+(g0aW|jseb#2_wnPAskzi-Cm zIHzio+DZwPops)<|JcyMxVE#x1m|Wj+T$0PvvStdF02ihU{}YyKaAmqQ_Z|%)sXEc zn%(BM*Zr|JV1)_J|KKF~ri!LBO6o1R4>G|n<4&^C32V;r%a)^ty#A@(rNLxVuD>i+ou>?`Z?8{;#P{TMVya_uiaIb!W@njCOB7y=LXx`3;%i!T?F4b z6YNSe+NNyhoJu5HHO59P61`ft(Xkj;tT4g(IIM9-ZxG8DRn;zxT_)Joy|I^?)FMC~ zxwQ&4vhI8!qJ4xOjnBaf6P)wI^TDQ1M3*5&bt$Y3m|)kGk6vorD|BhzW~DQme9kOO zRxG0vuvTM*3C=6pY_}?8l%jVA-3n_1CfL<|gk7CliY^{Qt(0lCwPj>rNM@aM9-o60 zCOCJAYe{TTSvvI-^E}oDOt35MGps*Cg4Fd&Yf)qSGKZ8sADRKU?y|xJ=SQ(4yrPQy zqt_NQ8rOCv*p&uPc#qW%R_DH0H7-X_b4XV zHMhODI{in88g{`-7I&QECr?kUYEH(uVucCL^J0JZyCFN3J?Q>`do2^}5^d1=D_yAi zv1vVO=wzoX{qtcw-sdSN2WpSJ|`}q1}jW(-W@#$@|2Q2 z+FlVpn2R#OuAVo%RB#QPdO2s+@GDqFzV%8aZ{q&J3KN{$$0>`3+JF@%xE}=ekSE6p*UGxG6uu88*wv!ZFQX$8RnC%IQRBd?&Z22dXBmpM0V_;! zUkmJ6PX2~|?Z5-KqsI0E-OT#Fon;|>=d3Wn{Zeqh>vhggj@cMjtT4fSs&Ey}-bimNR?d+Q^F$`tl^BP&53LAR)qYwv z)_rs84f|fjSHZQN6(+df7Uu2m481S#kozO{!kJ*#*Te)P1t-sbUEYft9bA5Tf4drH zF{}+(VS@XHq3_`H`uctPa5LG@$Ae(kkIjijg^z*i#Jqi|VVl%S-wj`F4#wJm6(+d< znavh(va;@LZZi$c6PaLF_=+UsO|3w6xsBDeZslLTx=+dz(}vH%3KQJN4V@4s7tt?o zJu~C5HeiBXi*9~0f@cJ%llc#zMyrJz>=oXm6vBCuRqr-ExwHfs6j2U%%eCJHC zYfNCJJrd)J6(+c^9!}$ye`02zSX8&f*kyuUes8`SujV?{ z@{3ldLWkpl*`kTiUGX_sVS@Vu;vMUO8_YaQtLlSTpEJR(p6kCOdGA#F)*V8PO?VSj z;)phSBi072Fu{Eeaaw&%8}nhXL$AkrkO_9JbR`=d&^3Ed-+0t0v!bwhbx2n|4{HNf znBabmxEq{V;JzQIw7}S9f?e-?ei`qoJJq{VZq%qbvRiy)#sKYw`#CF2aNkLEVw>E` zk>{n-KXGkmf?W-s{x$T}yMffhaF1ew zT~k|PezgN{Q95p-##Hl9kv6!!o`rG63KQH16!WXx3q_ywHT7fMYnfnItvp_8Lg@f? zVWmcmKG`ma4~GrC5!YQ-nBab<_#B0<3*}oExmHI2Mb zu99wz`v)sba9>uO#mSUfuIZ9ZkHNku6YP5Hw5!5>168#qM^Iz@z~XZEkX-sC&VI1M z1oxN4Y4yzo<+Xwz%!^nXFu|@P=k02C#US-N#j5c&p^mgqcyIoNvC9e*+$R?+`WzMI znbrr)e=rwif?X+pc&o~`U{(0oQPg;Hy19IIc)OVn^Ac8=;C{b2M|QlfG}?_a|HGV` z33lbj8&-Qg4OWlmA483vW0Ar>-Pyc=am5M~+_xBSoVw6Z4mj}BeF5W&33fg1;H?T> z3{lqy9!HIh!=3WQ(Q)pg7+0(?!TpzUx~)qix%X^Z-wOB~Ot34es<%qn6RHAQpFoWR zX`M2r>)(#-SR1gy1ox4~Ta>;wke8j=#5_F5VS-&P-q=;~Sz#*cA16_xSB6e9HZTWEEWbxfv8xX;+wBzimsUOl#cdZ)DZB6CXJBP#u%;8vJg8O=7 zCX=n4?3nAgSc$a(6YT2t(@XWp5TWiYJcSxtTGo`iW_%ZU@wZ}y3GPphy^N;$WW`5c z#b&Gxm|)klPF||nrU-S)bs9B(Mi-W+;`7Ps_|92jg8QuFx;xuTR-cknX2yMx33lC? zWy2YONOhsn8PsUg7te^ASCxk`c3EM9`^95L|MI*ji|0}Ia6e~)T@gc53^gTE^(lH5 zH74ggE;?pvEWhE}&I%LU_a4vgF3k|_w$+j^@!XjSb~W4c%jk79QWZ?HYE&COTm=2- zAj7aWV1)_p-*2oY9ITP(_Qm!C%p>z9&*Ko$? zScV{VbA7vpE$`b^!Mj0f`V}jiQSZw!(QMo}b4R6c$qEyk3&EXp>Tc2EdN(s&6yE4T z{}#KJW%pLIcLu8(13RI{Sg+s0_SI=l2=tSzFu}PHq%%t#6O|qmHrsY^c@XTnTnsg4 zho}>!t!zf6s5G+p?^NcJ_I{ETCO8*@p39dmh{S|{+?m_CJP3AG$>^j`D@<@M#AeGl`I6Y#qpzdPUoH=VU4;kP)zmD=W@NCEdXW=S$*ENeigdI5Br8mC zE(E6&>Yfq<4|@qY&*ed|Ysq&nb!9Eg3< zx#L4oqhy{nBIVRWF~5_aWQ7S%d7u~TwmxF*o~>eCkjsN$*J1RW_%H$Yk1AF+W9Ybn zqR#ejVtEfg$qEyk3qj`=T}}jT(;{@7%Y$H7Lhw)H){02=B0d5&Y7EOGZoEz_;w^kftZYVT;~VjPD`t=ae=Am);FJeuuYbLa-$x!FSFI6P)tET5Za4cY&ny!UyAu33mPQ z;y^Xjqr!oc;433ff(k!XBe6Q;5}w6YnwO5HKz+?&O)seY0b z55glck|)hZ^FZejqULy)2f^tPze0(|#hal@_Oh}WYJGxvYT-nY7T0!GnBZIpI)(gu zzziPLSab|_c@XT1Kc8Ui_z|M6eOoA~lUx?~=VK8c3Z=6ndoOIl=3in!8nBZIpdfhj;Y-ZUz(oqN3T_)JoBxj=0 zw;tYBFxtvy?hobU1=*cCM}$=JU&Q2m+}gBo4Wd+D65 zea)RQ!OUK1B1VdzWQ7S% zc_44_c8~e9Mn^L?(&a(0Yuc&LMtGk9Rqmjb%{Z|Cjv4)9vl-IOPqM-Ur#$dGKeXDM z@b3iVaa2w^r#h5#G-@PvGVS-a0IN$C+-@UQWMe_q{Fu|^;AAcFwhhpzF#L8wg{dOn*&ny}A zBm6#CVS-a0xKh7q5r4G!RdY;lmj}VFn@duRtGk@4bQLR`(XMhoN9K9ybx4q(WQ7S% zd0_u)XE(>?XP3>_SQ{|GuDC@ubv`G$q-7Y78sd3wQNDF*eGKD@6(%_4fj3*{`|dd2 z{*1Y`t;>U8*WLDBYRvoqwfcosqkpk}qQ;@`=87(Uk`*R67lO2G-G(CZ*+Fw~xXXiJ zm+uEJwXa5?>VDA5W@PHKO3YvR$ZXczPqM-U=R(jMx65ded~=;yYO2eFVAqV^c2)gF zpc)@L5jAGDKPm3iIc#>Dfw4;p6P)tElb;KVMa}AenI){TO9Z>NoUyB;>w{GL+EzAW zY`&)=^TcK5q&Ppx3KN|2K*y8p+eMc)JHb>^E8$GXI4Qo8S^VvnBbHL z_5ik@6S;@pc1Ph}%LKayeU`k|`gfyt;baAtZLcx1S{4CaZfFu}PH?BX20BCci3 z?4BIx@*vo?{IOlV${nV<&#YJL|hH}R-^8aa2mx2X81pJaszPI=(8;iWSoOOMBnB&-dXU{}_Hc9mmp zxXPB*%1yM`@k?C%)J;5|;3rvOf>R#Y9lULd!6}u*zaw291iR{?8{&=HSP$N^YFu0W zT6C&7S9I&?Cs|>FQyy4z4%{vtnmt7tr^|z2*S9-1b^BO^dcMudW;{H3QJg5dUwpxL z&I%Kp@<8{bq(!3rhZ&+0#uXFn+MCm+4poU%1OAuI2-x(us5I`j7>KdU3KN|2z`8bD ztk4}cipgDF9t67@j{0pZjfqrdxRuQ?s*D#&#gjy6DAvxTFu}PHJpZWbE8NEpiHXrz zI}^dK)8~E~mzGAV-Ic7|#F#Xd#QU<|vKOu;tT4eT56nvv-a3-LofbWCy<&o0vx+7g z7jUM?d}-A<6tdRQadtZSZknHDg$Yi1*lc^wv~!dzb6FIe=<*=gm1WR(Bj2z{HSupN zo6&OMvP1P-WRMN|`bk!p;FJfhyN-tOJ-S^LBSTys1iOq2UyZC4(Vt@_j!CQBV{cv*Uofti@W_G~UyLVsxA27jbr@grPi^zYD!Uwud+h*H znBbHLQYjnrm{<257b82lJP3AmfA-0+RgF+_wXNJl$-RG?nHwaCmjPIRkirD#LeQD} zmcLofy<0TtkM#!;?7DO~$@p_hxO$!1%1z`;+HQt5yderj`$<-q;FJdvZpl;3vqzVT ziC7yj!LET16Ajz-Fy%U8)u>VGs=2e!Zn0^upJaszPI+LqRC0~^@6vJN+YFZn!LGjb zvF6Meraq0avKd>-y*0C5ogw}i>?c`af>R!NhufY#W{Z0r#kKA(4}x8rkulj&EmURe zWMwn<6}0L5OWTVgPCv;C6P)ru#{I-`(>Rnz9LCy!33k0XnqU-fAEL%owz3&d^QF}X zGbK5?U|g}n1gAV~wxS0wngw33cDS%MV1iwzz9$&j2LvmfVG(M4RvC2slWV?3u{L0Z z3C@M!{?X{Fxpvco`d50oJP3CEF+9;Iu{20EzHim|Q6#;dHgdYV{Q&IAkirC~Jn%l2 zofpk?*{8VM&B2}w5$t+Y7d;2=2C9!stZYWZMcz8%K`FD;d_Tzw6P)tEYU1n(vviFN z<^fz2nPAte8lQ}o6#`Z1u2weV;r{R8*6(%_4fw?I9Qaz4uWP0^=c@XS6 z*YC42bY_66Q`*XAyzBSKO#Nk**)Z5ovcd$XJkaf};6`)Nf3fD&jxG;^UH*^17{OTs z)Nn5=H?jA^QM2UD<5)rZNmiKPln36s)M=)Gh2dI4{}#KBl>K2`!dpY{?XtlrpPI=&WUg1T2 z!t5*N*C8$sf?buXr5J5iI@P~FtQucu1{ zL9i=JPn)Xs&8a3`TZI~NfBkkmIh;nf?}+<3DNJz61D`zmO~>)u=gelf*D}Gbv^cZ< zWnh5HxMMYHtSjv=3c7!rM^J+mCOG9`vo#B^B3}7ub7+9egJ73F>!rMr^V&Dj%4SUN zx~K#Pd{AnBbHL?grxq2;258=K4672f?n$c6K#xf1ujlW-V&OZ*~jUyVK?Z z%-dOEf>R#I#BH7{mad;;{>0jV33lb*V^`}32dN@yt=z=8Dfh*ZsP(2V)*q}e!6^^S z$XuJn%2Gqj&3Hcm6YO#(+f~j+!79%st47OapG1>8W6Y5*KgkLcobte4#=S#gMrvVZ z!uP=hyCxU*R?)>m)RA@TQDc8GZ&`jtRdZlxKgkLcobtd9WaTrWRGDOV1B@#s*wwk9 zw_4#Hsv7?O(gx zn_)OJ$p4lX^X(hrCs|>FQy$2~oxCEFpZ)E7d8o^SVAtEVc2#J5m|9lK%1sQLo>um$ zb<6Qzte^ByC~v|k51TE6*LgAgx9OOT>lG918dT4&`t}T0DG#k0`~S7c?|(HBQPZ(L zCxr=4d7yXO=_BIow4x&2B&^SgVAtv$Ug~VN2$i(P%4W2z@R#o z_I7`_Xw$2k*cR&YAlT)b&P$EPSp!G3mCcB#a#OVIyD}{7pXdS`WrPK-`FFXJ-IAgxYx461gAVOFL^mZlvuf1oWuQ`33gR^ z^V@jc3vY_8WaTCvT%9iN7k(%5Vr{?*6P)tE_ff62ST<;%*pGP$6YQ!}=a(^d0Xh%= zvTAH?)L1+(=_U6L^^>eH!6^@{2ivC=HyWK3H?THff?eOIBpYq*IWNobtfAaA&N$ zciYRNKIZLAuxr7pFUE=o5vo-wD>t#XN-@)Scq$o*am5M~obtd9WYg5<&1a{?8>~N= zVAsQ1pN+hJ5z6$kauc0?$Cz!?eHDZ8`(T9$PI=%2#DwPNrltEupB^p`f?eCaKN-LG zgsZ#PtQsf$*PFW%?~643{Uj?)aLNPwiD|~0-A}I;j#(}bf?dP1Cm9Fq;VSZfZ|J@_ z@~rvm&>_(eYfe^};FJfFddHWUx&ECjrsA5&1iQ8dB^quSrk=O8vKjwJ)ma8qv9(e7 zaKw&lw_*qCwG(D;${}+D%J-?|i@3{Jm>E=e>C5 z%P#+XC7^~VE?vO4q} zLe!c7IF3Nm*o}+>UraWjy zpYNWWc<+vDI<5O4fv)wmQ~fy3i+U}MY{t<0`SqV2T(nO#E033Mg> zN>nEgp!2V4pQRf8!!l&6GJ!H{=0J`L5}5L!ogb!2skD&0Ck2@ZblEE;tF2CYh@$_` zX6!%wQU1NPh8|i2IVwnC%EMx*Q0|~y{A{#rOzWaZplivD6jiJ5Av|vw*^H7OZ%CK% zG4e2t+fhLRQy%n&ibtzt$tKHX6B@&r2*{P}FP5g(qPJ~+*=1xi+`jLYs~f+NzElGh z{9H_V&>2GGC(6Y|_RA1jr$z!@CA7b45}j*c4KuPC$+JUcP+GF|rFj%8NMOo??xNvM zWzJMmO47&V?9TBJp!=hHV)-x4ZFV9JAfYZDu5w~xom&>1w3g3m(NrmNX% z)g|s?_!T3Yk;^j8^^;ma-w{lEETABPDG!S!;{JBmJN%w3Py0AXpld;Mi@5vBU2NT8 zWHX8mxvNAZ zo=(qNRFJ@w2c=RvJFyF?vGO+Ut094|?mHaB?sp!dVjm+n;hDLBjjZ=m&Z2c6RFJ@w z2d%I?@nx~Kj>@XE27m;*$~Uo!_47SNXysU{aed|}A)Wg#E3hO$#h+IU^K_t+1!zq{e_ok0<>S|;&TAt3! zumAU48${O?Do9|;gWf(A6~{K5T%uK{xd9UBT1988d++lVyK5S`iT0iaxLPGJrYDU> zQ9%Mz9&~a`%X=(BtKrflB*;Xdt73J}HB>r_Ln{*nz2-Nla5Tn!Z@Fy%p~Y);zA){mOSF3{Wn33RobVi60osYkey zk(+qBO0tk2*H|cBSEwL?DGwSm{8_-3@7Ta5(cAzDbh-A=QJ)PC6lc=@U!&?;mbT|3 zi>G}xRFJ@whs6?f%9Dl19%IF5j|B;IrR~U4|63d=0&g1Gj6zNxY>3Qa7ifPF6(lg_ zVX<8NUX~qhc#$<+OnbucS?Efk{KxJs^rqMax2VRdzFEqafIR%%vVj~GBrxScyZY~U zEBQOzX8v?fL;_v;yQHiCED99+I~v)HUK7eGMPKLV4QWjV6(lg_LBEgsyIjkCxXa3o z4Kfkv%Gj8u>H`8ra491<;e0{WZam7*%hA3wDo9|;gHC*J)Ji+xbC><5xd9UB>XIu} z?VKJUO8+uy%v@DK4*4e!A4YQnRFJ@w2PHsPf70@Azrk+Nvla<-JzbEj&awy4cOFMI zM*JHf-*(GnMd*2s3KEzLp+5bD8`_zZn>5eVP+q{tD(ckr63I(@yB!F!3QG+ydZS}+ zw@=6Dzkl`;Ckywb8b7Wx*OQ~uwWI%paa54Nlm{ggdR~lP^4dYJ{t;>-&^7L(Rg631 zEj$hx`H!()9~Flt};Kq8f)sRH3z{=i2MR zc8&@XmQyH&_EKM~%+$baNI*n%Z&uByF0V&|wJfw>SGkzG5cykUE_ zYc;}51iCIhb`TY}`-^hXM*gGq9v8OkYK@o+yX+hlBrq33zrp1DN`s$EwdHA{CIVfG za1di$Y0a{~k^czH%h{&;;jUXI+c_#oU@nCAYj6Bf`X3I|;%|qV2z0GjZV}I80z^Vy zAF5IGfGexKqqQ=LzH?NNz+4Ee8U$I{x}hbsMS7@-Kv(O{IjUAEP(+_M@*i*dHeu<0 z>y>D_c2PkBb0O4u_QsLbj2aYEBR&W^H&&}>`w{ujGz+4D*Opt?#x89!fP8ADy?y5-DcT2Do9{1#K@n&Q7jRQm8b`yCIVdx7tvX) zKj@s)13^^d=if0(yn8El*3-^WK>|}A7R!W-*A(^FNhO1>DtbB@Eke(l&fkytL z?y66&`DeCeFZ$UzDo9{1gj$L$JC(oB?<>u2gqjF+eR`0jw*2NV8kY*88vC-&M{oMx zmbD79b5xMPTnMd^jT@^(wfdmU|3l9Y_$+j-ypgDGZtpL4?=|utQ)boHR?ca~=B&1J zRFJ@w2d#^SlvV~l{I0}T2s07r8emCOk5F#Ad4(}l!?V(i9J#llPkx?;v8r~x;9Mc^(Y|1rS(s^&QU=Eb0L(Ens)!(gp!VI z@{3Rtfv(Hd6V$aSJ|eA`k^gA@ElmrqUy?QQw{ujGz?27FyZ_0UX4P}EOBX^-1iBVi zNl^1u^bsrbPox?lcT31$)3THfbX}o>1g1RbWTSDdG(WE_CF*jhi9lD{umrV3dvEb0 z#>ju%`&dhM&V5PQ>u2YvAb}|l8kaPhtyS&)PHFrp)I^|bVp4)S!R{qS4l?o|F-@Av zPV>W*0`z^Lf&}J5ESB%>wrbrPNM&5vFcX2U5z&e2<;$L;#+@ltV|~w7GE05qdg_dw zqhcaViIGcRH7$?BX60w)FcX1UkW7vC4XSw3cW&fAlB+5*PybS9#;>t+RFJ@22=!T3 zeWP{T7ojZp5NaaOwJ$SStw6mvy;F?*N9!CW_Y{2*^O%0;s33v45b6*LO4qEHIw}8M z3N;bvDjt%mz9>)c7&&Oq$UiY!adb5xMP zTnLQ-JU(edDv!`k{R%Y^=&Bu>qsBgW7j1eN`HvT=YqjjQjpXLBc8&@XnDU_h_Jk+e zk+qw&{?|iI1iE}?Tg1%P9wN4mkh*-l&1)K#X?_zD#yFc(6nc_7Eo>jci8K%o#E1yWC_=8YiNH1m;5MEQ_iuwfi~Gwd)Tv1HaleJs33tU59%+;`WEw|(=RQydYFko*M}`uG3S(*2T3!QjPbUE3i)CUoE_vX5$oX>Nc7y2__HhzC<>&9Z@! z&G28*hDD8D5L4@*ouh&T=0d3d%KfIIUs)<(djtUZ(3!yiL)c>YD4Va|meH3aU&~@U1Mc6k7h_qV^sYdq{g_TSwublR>b5xMP zln0#@vXf313#zNR()|hvbQQKzFHSx>>t*jEs`2?$bEcf1uk4^_EhSU;G z$I#!A+sJ0Dx4u(KJ}b#OAGdQ~%=KWPKbqf@0Zx}UZ z_?}Yym)BzT7Snwf6eKVgLeKNv?-l)y3@@6CdQNT7=i5t|M zg#_3+Do9|;gLcVY#woEs4=9~!e1!zMY~xeZqw501TKjUU;rYCzvc`$Co^)NIf&}J5 zES6i}4=M9QZY!5)oQMRvN>oi&=M@VO%laGnk1Mt|F7GzGu~1+7&Ot!}Qy#Py-fNEX zu-Q9>(|8vNbT!VKq^=v|FEXne*^F!lNA2Q77xpxg?z^BMfhiBl#BHsobnNg|d08gR zM4)Q`z1OnNc|S4jwNc~7^l+{Hp9ZYPIhu2Vf&}J5s2g|a5m!e`q9Uu(oD&FiU0al( zZq255dT%lEADtUSYj>P#u;=US92F!m7ec2^j|^~maMH@A(>w|ZbaiNypq{MnE2@t( z@*kI%f7jaeEX#V1uya(9z?26)ITtLAu`bQc4$^!O33PR)_huaJLvzmVM*ib;yCSmd zeMi=zzn!Ck1g1Qwb0Dso_8`Z?j?lao33T=8nV^=U%;>#3MmD3%p=vU5!+pim!_HAb z0&^jB_nAIHb8h!lX-e~RB+%u1GeK>8z)K8CH)<4n)kuDGTdGW)Zs({VfhiAq;(S}H z&0TRtNhum;BG45(CsD2P$5Z4wXXHQHCAW}cP8CsdpS5#Tkie7&{T)wEYK2bhQ1aFZ zGZE+tnUtjN>EtO~ZASiMR}oh^s>XenRAX)c3KEzLp$?%cPqfeziG=T)5}5L!civC_ zp`E;#TZ^q0W+KovesY%jX^p#R*WJiw1P{BboqJV5UfN^ls33v45L(|o`B|IiHb7%p zp(X-ddCKId&#$|SgtA+yhL*fjOP*I>`b@KPRFJ@22t9E=z0~$?T%ozsdOH&6TGiJg z9#r-a>;D)vUXSrl5leTj?RH+}TDo zp5D3~(?6G+d_ea^RFJ@22+gA&Zr0{seWY!q{SPG2W!vW<>~%cF%^gPmquQuCuHl|- z**Pjm zV9JBCWQPlC^&b7un$Q{<66ngckh0-(y+o6mMmA&e$F<7COU|+n&1+FX0#hE;Gf{79 z%>4!#S|shOA%U)+@sw%k;VtU^Fluy|cUvjHu!RS@!(r3M+Tt@qY zNTBO?f>ms);UgYi+(k8x<;_u&z7>c1+qQ(4E)Y2M|-Oa!{d(K}gp_N22|vyB=vYPDvEu3m~+dxG}1K|umj z9`v@&39(A|+Z(h)rNc}Fx>_xD5P=E)B5$mb|HwG3u;Kspa2d1I&QU=Eb0HSXw}kh~ zqvx}=)YqXV0$rni(m8iC0z|J>M*d^NCB`=I{_A=w(9Tgo0#hE8QT&{#>{-mT=QKA! z0$rP$TEyZ%0b>euf^sy1_Pjtr0#hFJ#BohghPv)>?L~6~B+!+-C_~*jK2ZF5Y}6Q8@4M0? z@gKH^)^|}s0&^j>kJIC`(x*ptWjXE9BZ00{zyGQ^g963+)kgl~NBi^2nc>w~*Nt|L z3KE#|pswN}AC>rJ6P0OSLQMp^2KG-=CzlTt)q;*tjV}9^E7Pf0?e0iBM+FH?c~F-{ zwMWXtDchCVS3*q$y2i$(sKd_$2%mOF{^P=fX3CmQ3fn}_K~#{yln1Q{yPi?Xx?NG) z(A)qCblo14th%=d5O(H2WI%VgmAb}|l>K3W}$hGgeU&^;yVI~4y&*&_@2aWthT8NSV=C{=>brkQzonDU^G zt(}E5r)O3cOJg`B&{c!ZXIOdITP#U1YE&s!S$-V(PI*N04^)uAln3RC#`|i~6aOf$ z?uD8Nbk*6Fpt`*B67E-x{D()Le`V84+mvn->>L#&Fy%q_#1hN3z+v&qafdJyfiAD! ziR$f2UZVN}BmdFJt%dZP*i1>HaXTtVV9J9=eM=8(Qw|f)^(9f+jzU)-AjAhpdf*{5b9h$9;expRw!F@Xm1+`boCpMtS)%yA!-ygvKeC@ zGI^*-znGq3c8&@XnDVe#yqEmcZk!mU9KRcCBG46nI7Qt+J@jKf8#VI!Dzc%Av-XPa zC8!{QDGz$$taOksXH-^p(RGCcy4p8QQ)hg47nzrg{KwJK&7`_=xi*pRiKrlfDG$0| zWjM-4`RBNX+zK@j=o%CMS6#8sU6kHnv5kp=|}AbUJ0eecDJZUTb?b)I^}GTeyRm?BFRHj=4ZJhPS=a=I=l^S%b!+s33tU4_c=# z7pi@{|6XhUE!0Gy%cqD{+}`0Smbk`Jjbrhpl($9N$hk{sPZ$&=Fy%q>kCIh2m!03V zW97n31iIWOS;hAOUcxiQsPU}h0;P6lefj64ouh&TraWlu^J#O;k~hiPP^y6hx)Nfo z;(d9_51ze9HQd@>P#zbkF16)$jtUZ(@}RpgIbj3EIf2$h)VobbIBRHTX`{NRNiLTTPGJ4Xcx zOnF!=ZO^7FGHSf5Rxr#&perajLrtLm-S_*9{6|2+bY;@p0&FqubE1L-raY)~;NNeG z_4Gf=!y-WzB0SH)6P*r0&^i2i>&!saX#RqbWaI2 z5$O7Ij>bN8&Rtm3J5+~2WQ*+gR>B+&JtL8@Bm zL4c@R*vMuiFYl}LbaY`CX>NcD5}5L!EAiENWx`OYY^5r&69gy@6FEQx>bk4{a#fy56d%0Do zHL~I9UZT#c-c;k47A+Hg7F2RuM{!h;z+4Ee+&zkuW83tOIr1yWM4-#-5asSJc#F6& zBV*zeKSwU!w@SM;$Hq}X0&^i2%dihOB(Brp*D^R5||62^ka$i6tx#~Qf8wH<*uCaTpLi6zzY2OA=jYD&MSm z7pFL#F7|n@e3wFJi@;~0D_2E2v*rcO&r1)X8Xd}3m;IW%%fe@D92F!m7eeoF)91>H zy*A3}m4ZzKx^C}x5DljLiv{zIj7jGgY1*cr<795l#!*26b0IXFsMkljv^g&C{S7h^ z==xE~LF}MDfFm_Msm6$1>$N)d=ExO`Y#bFNFc)I6w6YbEm49569(U<%5%?^0IoT|t z=K{)LJ@KL%%f`No`CcqaRtUCnRFJ@2h{ckB;bP6Y=e9gY*A)`zdNDCaeepR!{JYf1 zm^>S{*>%(QD0$V-#!*26b0IX_{#!8m+p2gOc_YX~peyi8mKs_;P@Hu2qZ-!!)0NaM zbLFuqHjWAsmwMxJpDHWBEWq5f5W^1^f&}J5==8mZ(^<}>9WwKA zkcmLo;tQ#&B|1PHo;I9nw3#-91?bK)WVDT=f&`{K=v0*!>zTfMzRVv>=WN4gq3f+@ ziaNG?fQWA%Of`<3oX7^%w93oAHjWAsmH|4NXFKv%We$!g(C{$j_6 z5maNE-)vSh-w|#8I2%U=2~2s=d6vQSYR*~JWx@Y~Oa!{l)=5%d*Q9qAPc~9jw1bs$jjiy$tqmv~Y$DJ#Z&;$5HN{Wt`8JAbR2wvp{WB>x+WowZ zqk;tHLM)bbJMXaIyalwrMT1QQy4+tSs7qpe#S_~Ys&RHy1S{~QzEW$ajiZ7D=0a#M zwNV_~{HCU|;WeEP2cLzmM=KK4Zhw5lh^phL#*lWinB`owk~7i9Q9%N8A(S87dyTyd z{-8|1MCa+lXQAuj(gby86(5oRnUOKsduR-M+pr)jPxmWSkic9By%#w(n%$k;obii6 zCIVgQ4--`PzTU!j;Y6zO`%ZthB)$>bFw(|RK>~9jlqO%gkIgJKnk7CDG7;!%f><%53Y-PA<1`RFJ@22%RGMdL=uxWHB3^C)h-wiSmv!>2xrSH&dtlYIA6M?Q(TT|6$-91F!uu!VezeQ!&1#hF+6@ME?1qsZB(7&!< zbLGvPIM(9=ozDQDg|2?p{;H+3+(pr5)2YURt(sm7#tfimf91$LR{ z2B;u`DGxfC`}=lzu;WY?PGdME(DlBkgQ)-BL;Mw2+_|k2JA8-Ul>(oIuGZTeM8}Dq;&|I|s!?TNxZItxL~)y8IrMqY`-1#!*26b0HSXbN`$2#Ket?Rw39# zpzGHNtH`|JB{phCjd}y;N%gTyOe>ljpn?SELg-375ht4+mM*_Df=mRuYVNd(sf)Zt zPNb1B8CP+x?748Nwr7crqk;tHLMWXXd0S@uiPF~H3o;StN{F$F7al$$m%ow!@F^1} zd$oV96(3>as33tU56W#Xx+Du6EF?eBb%g}FvX5AWX9Hg`l^gkw@OH!G_s-?zWO~-3 zf&`{KES5_jPs%&In_PcA$V8y4@GPr%nBpsrl``@lhv#>Z+xEN4`jc%O6(lg_LGM@l zce{LQohci93o;Sty4}<&3LW(m?_U@-Di^6IW9to&tM<@*5ELXZPPc+F*_#2%dMAbodG@zU2D42nFDm*Yk{vuji$@{D-Uxbq&n8d zQ9%Mz9`tt{a#hwnyd&M;1(^tR`Nm|b8(Rem%Sj_+@}=8Z<=}vsa`OfoM+FH?dC<5$ z?wMjOe@%WU7;GZY^}2C}dZ;D+9ix^|jrqMD*xt%xc z4>l3#Vmtq;*GmP8drge|$AzNx*dCVwa>H&KCxU_m=0fOPoS9>&Ut+IxdmCgT&=u{J zrjEE9AU5SS@*iQ9`>?KRGdW?BjiZ7DraUN9{bL17Z@5fWq3;|CbX7l|q8=O(Anw06 zYD|7Hn$25QNcN-q6)H$z%7aEr`hM2PHAG&bYZnQ0eW3RO?4h%%ZfQowq~Gb8%s2OC zZ5iEnQ9%Mz9<=K07Q-?;o5-=x=*&#`EOc%4OHzOIp#6^pM#g00!MW^5hd^!lQX5AF z3CxAi8Q34LunRsvwA#6YO$55;EK5{^k@^KCk>&B*YV{R$N% zFc(69IlWV6&b`g_wx(bcfv(55lhm*fPciY8QKQPBpUR3A6WKbN8=!&&rab7*VC}-z zA3Di)CI*=ZbZz>btgdG9mGe8gq;?lzs7 z37>_o_w7?v|Dhh@T7;1?>0kD!>)?@5EP}psRFJ@whsBbm+m&SBJ8UM6;gCRAww|W` zDC{9#`5XC<`de?uJok)ZdFa|j1qn=fSS;5HUyHWPiDxV6??3`wiQUuHy^rZVimiVQf6j4NyS> zb0M^{eXgTyQT`Mwn;m2#(4{A4tM_xU zN63Y%os}xPXdVR$5}5L!6Xjl9m)Sm=@~l{}i9pxyK~`~+-n%qnp^-6h3!W#(=KIsC zkZ$9sAb}|lizTsQoP3k}nro;0!6pJ-_t#p5@bDJ?{f+#`krEMd@z)Mo`bHZ^1qn=f z&~s3~BL|J@s(qtz2@>e)an34E)bSDj)ZaxlGQ~_;F7~SSg~rsVAb}|l>Syr3Ds71= z+FKf5A%U(zr>$cCUmvk7pOODqyfZ|87*tg1G&ev62~2s=Id{3v$@mtEOrteqB+&JF ziB+t->?@SFMvbu*`pD{^o5|cX$3X=NOnFcbOU*s9z>Rt@ zHK$6JdZuZhNStkCOzI}@Qf_pZEkhU6xE&NEFy%r03{TD}57Zm-Q!W~}1A(rpD>BsY zZ32aJ+e1{tvBD3s{rU7EEi%s33v45b9exeTEHg z?IvAmJrN0X`E5y3i%#+vwT2k^5B@BiMaIt6c81$HDo9{1gq|NeF0n>gxn%)b7exYH zC+NMF;dlMSvGPX#Bl%2*j4{4K1qsZBQ2%c3Tg-FOLaiKKS4g01U4=x|R>@B^ zd1TaZX)=%1&%4m|G|dfAK>~9jbZ+haIQFT0fXjj8AQOSEQb!Zi`h$GMh8;%6Bz8tP zOU@gmL`B&+Do9|;gWfrL=@$FpxlwVTUK}LQ)io+X%|rQ*m0?E4t}7(aReOJe`iaiQy)nedf9(I|&!!Z0VvA_c3l$_V7eYHG z`f=tQ*_X|w{SPG2EkOnK0ofm#k>t_O~=_Lg81fv(tX$!b)Nhwz$g zWK71s+^x72oX!5MuyIt7z+4FJrK#Vmc!(AajQqzt)i>tjqbTM`&stQF zz+4Ee4%V;dnzb~Zy}KG@BG9$w%U?C|t-I*yXyiXUb_Hu;10$G9y#}Ztfw>Uc|7ho- z6>z)5=6|B~UHB|?ZJU~*>X+R`!P`cSW7T4{{=H_fW7};U6(lehLcMC?U$y<8uCU(J zmw^PjwmW92XK%QRIpIder16S8vVZpwW}~?QDo9{1gla5nA-~f8`8rxdMgm;}mS(H( zf4hs5-HiOl`G7_;ZfGCYe~XQyf&}J5=&jRivXpIivvDtiOa!`y6tIW|bk5z+YDWHJ zxz7N(cz#3Hdc2LJf&`{K=q<;U*T}qI7BL^{%RmBMc4-kV+dV`;j!|R(%W?9KcU~4p za|2Y6z+8yM;#=pCY+xD62GiUC33TQ4q;n1G((n9~9j zbOzl!O?v)vW+kXk1_^Yfy><|D=v>YlJB*CU)9ktO;gsG=nKd?!3KEzLp>@%}SLIlr zmr8k>40uiR?u`iT zWm{ksubjQb$*LErM(ptj*=2ii%3InvDo9{1gmS`j;^f>~7Huc>Um=06G4$@the_UI za+;IM`&u~lks*PuN%XFZkjp+|gz)SU9-HbqU!)ZvDlB1bQzdpjsdV9J9= zeV5kAIV%>(L)Ksufv$5_s~DEYU+imTXG_^;&^W(|1mCRxl*oBxQv@k`v#yO zfw>UcS8K6BDO2K>Oh}`B10YPUlnm9`HBeM6VdOv3Iy_gB%TARs=cu<96eKVgLc2>Y zg;=TAv9dGmMo-;TIwMgJy>9idK?ubFc(6r&WGCTrJXJ8++-&cfv#`VU()rO zw^*>Q7u8rY-dR6gt(LO<4CAOEfw>S$fOhGme|gj}W_Xa3i9pxDrB*R_iI1q*s}I#U zey*-=@3lc&x|4BKkie7&Wy2r0(^q^hNu4!LCIVf}LakyY%{fox?MF36zpt*3pj_(u zt&F3B1g1RbgmKM9-+O+(ObT!^5$MY5Xcc-HKT-FPkz;weten1b#Y)-qAmgYYfhiA4 zj67?gCw{sjJB@KN5$Jl8>>#FJ@e?PT45S(p^n&`c5|?C`D~zLp1m;30OSY|o-tS9> zWD!m#0$nkY4x+!mzv!~t$g#}ZlPD);{FLP$FpdfmmHm2O@Aj7fv(%s1NomGAif_kaxCp{x0HN& z4c&>ZD^!rcTnHuB-&T=Pyq&(EY9N8GbC0vsfV2QHZjd+C2#Z{#o%~o=U$U2RRFJ@w z2kp2Y{uR@uPA9!%h?9vx*S`Ll>bQRbh4R73vDm}PDz7Fv>s8J(jtUZ(3!xN5hyGs(}Q$ z3VZxjAHAe8!xw+55wvzD+xEMX-u)8eCI#{)mz?27d0zUf5vL02@6}p!ofv#T5Qq)S$0b*hAVN_$6 z%SX05DpU5S>k1VlFc(65ETxO_9n}ixSLmLI1iGFKO;%6QIMLT3h-w@?k%w2VcTX@Oa#45k{(?v~<3Uu~Bo&M}S(5||62 zq{YeRyjJf$^03{>M4&75bfUUtn4cJ$cO=y){iF&n+c`j%ienrVBrq3Zv6OIh<8^=b zlab+0CIVfZn6QTXul-IWgFwDAc46M%HtGPc~1V0tSentNT91#y+pO0m$#_AcO2CSn_h*l z92m?R?qD1hBrq33U19lK@|hR6F}LAPCIVfH4kW5mcTgX4y9rdoNtWdD;cnLAB;%+c zfw>Us(~qjndyIU}zS^8j1iDW9C#kKoJVpO=Mvi66=G^?Z=L5F(Hsh!ufw>S`r(RHk z_v(|EH;r;K5$KY=={)2>Px{U$QH_b8-?LlAv)N<1C!&G`rab65SUib&+^ozGO{61M z;j_?Hc~Xj6`;CW~_0Gt#Ow4tH&9706+fFc!3KEzLp?|9$XIYQ6jrrzbP9_3f?QW#1 zE$M8Li)*J+jq#zO?7;rYJbpXls33tU4~u2G<9K%X1LJMzx;`A<%D{^b$<&Ot!}b0Nmb-1DX5 zITt>A3jNN3KvzhM9M!3fhv?hR$e1{^TqV!Bm*acRGL8xom68h z0$u*SEFy&7UGuE+EUHm+*>%}5DL*ex&nQ%oz?28=b1rqz*Ih5mm(g{F1iHp0(Ruog zp5jirQDgtFWGOoQVB_goiwY8$@-R*pE2pnLW8wShd5#3SW>GIr)KX8e^v-Om(eHC1 zJ-NySHsS!|s33v45IR%Vx4xb)?IznZ+Q~$qtH5suF|DDOII`5pu~h6`UQe_vV|gw! zjtUZ(3!&?3L>oQ4+%lF*&p{;6^+C0Yr_a2^w5~>uC8b0Sz5E6jHu*l|s33v45L(M9 z-A->4SdDE6butm?$~V<2*lKU_s*I5_S%0gpp4)M;;;S=`3KEzLp_y0nPWtvqy6fDL zP9_3fsnmB;-OES3{cY5^JIqNcD5}5L!j(D|$Uh>)ptv`+1kwDjkaH}X$ z+gA*_9YHnXZ`IUO+SZg6>AFG%3CxAid#YzL-Qn>hIe}^*fvy(R8|CuFS1j9ZAemg7He#!Wc zb2U_uz+4Ee^)0KSe-^)F)^sNmfv(xRY0jzm3zzCqRO80TEV*^ZfAT^+K#PX_kNqpzgj2P#Nl%7f;$aj#_DxLW#5 z`VAt1u8WZtv9D`@D0PULW;pa(4 zj%C}*D_Wuab@hC7-$exp%!Sa(_Tnj8#<7liS(+Olfv#;QGu88j0>vwJ5!J}=(A;%{ z=B)Rp=LafCU@nAaUirh7kxM%22c|li2y~5WouNK07%0AG7&W4|{ZtwitfNQYp?fPtdpo6(lg_VX>^<_lBiCuc?=! zu@4gHn)+Xg$~y*#qhpO6%d{%b+0u%+^y$Xj02CxJU3ruCxQm zYQ{C%|LAIDOkT9K^8ebrls9Rdhzb&z@}RxDhE@5V7eC}Z8jB)_r3!!{%1mpIEiL&;58pFY7p)0XRqRQU*iYlv&9Lu}2wfKyM#bhUX)}n$0 zraWjwHn0OP_T;4&LVpJm=t@dWP_rug3fJLAjwO4SGq3OTAZ7y1qfkKtQyz2U+wJeyzNkYDC_z#veNOWUcAiMFk1Wg;19_Yr{k5E@xk9?u-PwV&*2QL+^Tt zvA>NP8M(^xe=e_Qdue`-3KE#|pq12z_4wW^x0x&b&XGXZ(8ft>)tX+S;t?aqa`JwD zKF{wuYfS45s33v45V~KLEXOzJao~)uD?z$|}A7EAM0 z*Vsw_20VbCA4s6*yJU3KE#|pq++`k!(XHSAK-9 zDoSNKNheHJkOnFcj(y*dzeZlrTke=sApzD@ry87Gd zA@W=?axBMt1}cYIIrIIro`?z(mZQBgf)0 zuDe#t)tO(u$T%uUU@n9*)z%N%H|Gxg%p4~Zfv(sgS?bD6ci}0FjLFB6Ri$`XlfS;l zI4VeBE`)a6^Vp>462>QnIhhD_jd+r+?x^b_^8d4$YK)GYCkKR9&*L;`JmCapIFvqiau1wrNp>@1*s1RFJ@w2X%SJBul5(m3btM z+mS%mxZ4&{@q>qGdCADJB(3=-|5=dAsu*)lP>{fs2VIG2CG>v_=H)8YKmuL)eH=u{ zNKf&8osnZH`6QoSVE!%EndSzlAc46MI-9Ci9X;&OQ|3%_10>Lu{)pb&m&Z#y_uED_ z`uUg9-~ZUiu4{~=f&}J5s5{!DrEW>u!d}yNjs&_^H?j)1Ltdgwh3!;hR(4grLi_;M zjphcZAc46M>OHTj>Y>fsv3s+eOa!`|M$^1@sJBqx8#NBZ*U?MwyrI0g!Z<2OV9JBe zZ`V8OEeDKHYSP{v66gw9WEF4f`G_B9jU3C*^Uiu@bwx~H+8;y(2~2s=ZeP!i`dZ6Y z?K<5{kU-b6`BqUa*+-07W#m{ggKO)1cI1;A=(<7$2~2rVRwl8nzJAg`8A10%B+xaF z-UoT@tgomr+Q_lAb9K@k4^EO1v|oz~5}5L!)4%&R*YC92CpXZ#4-)8VTFok!j`b7Q z+w7(qZS$4TAD=iV+ta=?Do9{1gu22y*3`S!dMA(5`V|uB8h4R;)k^z|dPzo&NS|E# z^Y>3>kTEv^1qn=f(ErtjqPjM@fbK_osYsyfRwoD1=YYR(I%DKmUUhvXzlJ;L8)%$} z3KE#|pyzqHA2Qd-s`~8lbZ>{xLf7wO7V-Yy05N=lkz;wk=Af)uu7tk+DC4LgfhiA4 zZ7nz|Q$I{#Y33R38v4~cy14P*HeN8y7+&NwPaV9J9sSnKjBN|{c26IyRa0$tVC(6hEkpvZs6 zsL|g0l=8b~UA-ZF=cpioxe)4Z8()njSYNDaKJj z0#hC|ZqIX%sVkiIX*4%L0$sIRr>g7y0>tDtM#kh^WE=~M&Z}>yxdAFjV9JAbs_#1T zW`9fRz393^0$rXd$?ChW{^Cn1BV+RAQ#xDX@L6WjJrNZoFy&#f?5SRn-_1&wD`;+j z1iCW+OH${!`-|M4jT$8$7U44nN6Wj17)J#OOnFcTo%g@IOySFN*;pqNfv%9kNor=a zpIEZT$gzw#Sb>ksvp~MRM$ZpWkie9O#Zu{k3*WmbO1_Jv=LZnz>N6@)olwM26b&$P zEQhT%`Hl|_`GpY8bUzQtr!+OI_dU3>E;s{MM=xj0RXjLCUtXI`j= zpY|@Aaa54Nln3S2x^?2aGVVlwq`3hS=<4_`K|MClM~p9IWK0fLaOOq(hAMS;GmZ)p znDU@E5U**^k0s_}_vyMq0$m9XiE7pJ-eS*ZqelO?HFz3NO>x+VoAszEtkVuEJmSoW8w!0UHe%o6r7jtUZ(3!#x^Ttj~0i_XSUKLZlz zDrrqpMGr6GI?Kqh%-dR+@7yg}R4n7DAc46M>Y%GynP=}zW?{3POa!_{-cM4OANCX- zTuxJswrkSZsh3|^H<}xuf&}J5=!}%XdHLXFC3sI-Lq-B!nJ<&o5>@EEmU)bf$?I#k z*x-%%_?-*%8w3Rj%!N>o*Nn$3`*9t9h~@@JpzBhFRCVJn4>9kRQKQU%YuWcXWqCjP zK2SjdQy%n2=%;I0*|b*tJdN9tK-bwBX=+qw4^cAO$gw&UlI z{}mGGS~@*LJ@Cg}d>vxsSiI|BiK(^SneT{U92F!mXoP1+r-G2Xbnp0v##xBE~gns1qn=f(62V5ss3y0VWv^vD-!71 zL+5Nio#iDaem822-0Y;6+&h+4q`3hqNMJ66-ntOa^`O~-tk*o+V}Z{?7xS}|}A^c?)uK~HWKt+bgyujz)*LRWO8RlNJ_Ee6hxr5d>| zJL}h;v~-O+MtfeMAb}|li=|IiNBzTqmfAg<8z6zM`HQXMORSIR>V1)Fl!>mRcd7SS zD^KHgRFJ@w2VL#Ogg(>OLN=xA3JG+*8%Oz%NMCWUwUIF?eypnA`jLk$MKw@C0#hE; zJ9w~_9@1pJbfmcf66i{4ZWXQD`-!>vjf}~{VWsu-XItd}`nN&_3CxAilT)j!uU+*( z`q1}*1iEIubP#`j`iXg0j2cVh^6E{`-;ud!Zh#6BnDU_Y_TbWbN$RgHzL5F=;Iq(G zE7(DJ&GQ#M!;Kuv;-Oz;&CE2}jMjHiK>|}AH1_$PEd?p?e7`NMOo?MoYVAO0R{A?nl=Z66ji;nyot1xoZCvGBPGNwpWlld}`^}>7IxR z5}5L!p1apM+Me_6b(QYBNTBPRElX|d5Gaq<^R92NLL-NGXqcMFU0pmK#)KQt}KX_;+1>`Bhp?1qBIAdC*L_mzDLK-(Fux z_bVjO6)`nk-INm`9=RJimcLK`Wdjpy=&>~CG%1ib!CVOSeu&xZTO&pPLvsTp(6uHj zO&xkCK&+~Ji)xe#TFg48l-KjpdLk-FV9J9=mdUZ~a>l>oa_fvyTmQq_vn0)(3D zHq{syc9Hp4Dx^yq`=EjZraUMOI5U%7kF20)&~=3bx?Za(YBxG_V99HvM%{`f&}J5sN?r`C+YfP0N)wsz{f4gQmfFqdWQ|q-0GLlRuhVNh@!inxwYMpsd^>2 zi<|#Fr5Z)1^_Pi#M{uX~eGC;OE)>sJkICIVef>oV1u zv^No+@R*34nboA~Wapjde$Y@sqFCu{b!Qn5;o)l#MeCi^Moyf}v+RKq33QcMpQ(1H zp1U%e9}zM2!Z|JWf)C%Y<+nryiLo`Z)hd78McyY5iRkoWbxgB!-S~#h<#Z&_)ogR7 zn)BRUTqtD_*$KT}jxH_D$K~&-qk=>`muz+4HFr_+(*q)k)DBkuB!6KQ6@L?fuJb!H z)n4>Yy|@|%k+VKlX}_lt>z+APM+J%21GCiu^oG0&7Y$;JbE@(o@QX`#r!W(NuFD5A z)fpk~;*rH5zS1|RpIIS?H65#?g2bpX+3MYa?&3h0@s}5uRayC;@8#0%z9s@)R_e>x z-ojlBjWKF;ztDqa-mk0QAKywx1&JQhv(?tEXm@Fi@eQ8nQJY;ntLlxZ#~lfDbvT=; z^3v|&)Fb2nYG%LQtjL-`-S5#gi3$?0BC^$@wcJJPe#W)y{k;TxKYpT~VV`Ou&=nn> zscy;TE|QiSSE6#ynf3f?*Z0~&6;zN&pPjAt{nuUm+wd6?S{GeuHh;1%fA}&a(6#AY zrdqC$yZAiP_zk{$e_qi}1nO(zUocdVIPow`jjiJ@qShNV&V-a!R&?~xoyuA{66hN8 zI#c~z$zALjW)R<8x@ljt`tz1Q3-YpOGt^6O=>NB_`EJnNDMR&6b{8|8jsL6gXOec$dK6CcP1Q^m^AA_i4PNLp>9Lu5r~e)XBL$gi9;qUpM!ifiB1V!g$O1 zA2d{uz~3fyy`(Qu3O$(2m(2{6NT91g)eN~lx zlu8Nxpfru{!bk2arz3%`-{mvZqOaY>BzNO#k3W7%v3gQBdA*)GDoEh3ndaxddDy52 zZ`t@x{w4xlZpAXx*$3&Ag5dj9qe!y^W$NupY@3r^M+FJ|HB&$J&{Smr9~>jfhnWa; z1>~kqr!nqgeg~t5$FMI-lLG(a>a63cc-r@WIN05a9oUV9%9)WJ8wDGcKIfoff`O#n z-Q6vA2b>+dusc4seiV}~MSl1CJkRTQ?e{-kT-W=|?C#9HGqV$0)weuEqJjk0O(Ndy zGi~ksLv6A&Ku4hKXm++zvmNasXw>di!QIDALn}0sv&T3~RFJ^hY%uiLRMAv7Tbnsq zT}PnHoSLmXaPSf%Dr?XD(?D<2pmHN*{ae>mRFJ^BNuxOT2F3ku5hl-$iqH}0I-i)W zxaRi~d!K0W%Jn81D{&<${OVx0>H93GGfv%y+*~;HDm`aMsSbCA8n{0fpwE+ik0q+8Ac3`+W{a$dWbNK5{0p@i zkU&@Zk}QSWdyBwDT8(<-*@Yd=SBzgO?IBS?0&6q1Wb*fC`L5n)Mn{W|K-aC%ET!cG zFEN%TWzznl<;t@fG5MHNN`yoO39QZZU2W4ZlWJeoHu!V2jzHIy0a;4m8ZQwZuB9=w z#%$9+*Y>F096}^2NMLQIwa5pWx;&hltX2#T&=Kf*+crxXXz>z-T50#n{OovK_SEKb zm%p<_1qrOpR7#?c+mh2d$suZW9f7Wg^|F-w9lgXL4=ws!dUVmYs?Bg&_Qo|86(q23 zQqOB&Gxe7kFDp}IKmuKPs%0s8oxH^ALR#59U)WLY>J%lTrbL@iK?3V0eJipHQV-o6 zE8nFBFeK0wSu0CvLs4}8NA1nIpl3JL^n9S4f9E$t1&KQ`*@|;>FR?vId!L7&3sf)n z;?k*db&dqO>Lz6=j$OQj`&Er7O6PKPbXB+mtwj16pZRy>w|metSFH0}9qDVI4~;s{ z&~nu;b1HKmGK^ck#xPWnz`AKLJnnsny+1ONpZ?uIN1$tfQ>HR!B(30Cs@2-nefP3C z@5XS`qK`IIkifcWFtD1}Sj~A>9y~ozMFL$d8)Yh4f!@NOX{Dt0xkIc*<6gYl_CysG zB(OHqy1NL;=9Os0M=f`dNT6$L$xLMhjnEf5q17l)^9okIjy-Rb<}Oh|0&6qvu(5Fw zTmLYQP0nM{5$Fo}l%Yga_7)W`-J>*`UvI|h7kgmZcR50$f&|uP8pX+*YU*2Si0z+C z(K-TMH;!c}oj!Vr>RYrldMq2_l6zvm`Z*(5qJjk0X6mIn&9SA2C#p?-0(1nroMvVy zVaL40VK41oRa#m|{o1aHEHc1ZqJjk0O&UEf=%fA^!{v{&)pZ2Ajs(#zf~&kl?gTCR zOp1?EUp_a>cGs_|s33uLlV&uo*{i<~dNU|PX*knMxHQ+w?wv-vRP*K# z*)lTPgbET^H)*%&*vqO**FYJb8o-c1SE+yu<@o|H(Y%OO2genQQA_7`mxV7HIVwo} zXqBau_onlTg0*@+Ddwd5;&x*>u9KsVK-axV8OrYcUSi{Ftp)I6-U{`3ZgCmYqBBPY zi4Wg1l>^kW96nb|bnJb-%JngM!g~=(B*kQ zUHRuaorx5nmG)6@QrXGxCO%|sqKXO<7?o(w-Op^c|8orb9cE~T;Xl`9*Q zwA57eM1({I35-f~9rs?EE=H}lwKx~8BhWRsX}S{F-&@39)Y9;dZEQkN1$sC?N8s2+PiL(wR@Fuc9I(YxV9|R-&vx91V$x;p{?bh zTCQ#jxxrRlN1$s^e428W_Mu<5R*RzRldh|+WIvfoZ68#Sz!*bs=i(Xa%buQc?AQn$ zfv(IGX-Y8lwx9OX%C2Evy1MhWpBywX+Jp)c7?o(f+JyqL)#qMv9`%ZlK-UqOrdVmz z;AT^;4!VSXSKs$(E9a_4jtUYOm1u{ib3aw<%u4cc2S*)&uCJfclm<1uMcY^{ie7(q zMx8P2n`&zA!BIit;NlD=;_UFZ7g2y}HVouTxh5te5KG-6Xo zOF=66&tnE{;b&t_A=)ZEB}q!KA<3hwb@`;QRgx%vTGWD5h!OA!(kB(OHq4D6^_Q{fe7ZB<`H>j-qo=c&p{ zI`u8%yS77<>#tij-v>KX2SbQN1qrOp)Gm2xQSGZeR{t3npd--bwJ=qg6-Tp0_G;JB z?aoPcP}d6br;oEl1qrOpv?}FTf;wbS4O!(%bsd4Oy?&|6#GT&a$wlpXtSDAM{%qMn zR=jgfMFk10n+8MJx~j5dGLy$bBXk710z0KDt=D*qvXiy4J3&^HcY?aemKS$J*>ug4j3KCeGX_w|cCFIr` zd1ah%)Dh^qG%ZzWa>`pw_^3r6%e?#Q#e2upsRKMYDo8A>nXXjo;Vq^w*V-lV$BwAa z*954|eQ5_X_$_qB-$+$vzwj34Y+CeLK9Z?fw+h<~=17hT5?lMFD~V&g#i}D(8a~@T z*&4)6Hr;q0ts~IYw?LY*BHLR$e4(WwwzW4cm@YNlR^dmk7$38ar7GiJ`v_MD zt?Z7B<~%F3E`Lv7uuwq)BOmoSpLOOF4wU1Qq5@SU(A92Fs?z?2kGOwXtApVIPQ1~n zLfmsxqKXO<82RXV^lixF{NJ!88yqAO=;}3rPPMw`BcffjSmHR)z?*HLl@>-1i3$=J zE2*VF?lB9rb!0!BEII;R6CG2P7yEp~JU1;SRtfCR_Jmh)DV!J~Q9%M@CGGGxeyM5J zg_}0Fl9O}N^|ISngPwUv@fY zzrzLsjfO;T9A%FSH(jq%ATn{VsM6*#;$ryon7v3Z0x*9jtUYOD`_TR;uTw% zb)D&Gu}L}tU1ic!lqTza#OShGOpGdU&g3_53Olncl%s+KMm`#cOABK2JMCksbecI5 z=<3`jRp}S!BX&n?*I`@wl$A@d=QFP}jtUYOD{0huO;H}Rq$uA+EA@~-7sg6@pSNtt zzZPl0M`Xt6q9_s=A88fc@qs*Hm>suLdpGt`iV_#*D}MHQ=!)_2RC0>)ZL+V3@z=`k zQICQA?&Jq?LF3&{A}*Hl!Hz{p4UYG^+hHO?SQ1xM%zbXBaMteEK(z6u7d?4A(= z<>HbBC!?v6xgDk@O0D>=xQ}FS-DulSA-AI+SGk7=c-{>da3#5d2&>cz*tFr zgVY;pZo9j-+AD)}1iIedr&B7OeZ@tl#VgOxZPj}Z_qfQzksK8yF!IqZ=12F~0-K&R zEw4ODN1&@&jT9x(%~w42{u>j&6lQ@9hO-Z}%ReeeVC16~a`Iy4({m-eQ*5}7Kvx2- z?r#$4D@tD0?$y3hcDz{c*K7jK#zh4QeH6`2t;sK5{LD_%uBS+#3u7hC7cJ04Z{q9_s=AF0ooHJp2So@P1p^);ar?Lg7QPmG=Wz!l@;J6bVPriGtqyjqKi3wn>> zN5y$&rmwH4Ac2w3V0e>0lJ}{wfpws-uSlRPzh{c_yP2PmLaT#L3;XjktCq8IrxI0E zkib|;YnNtq<~1&LWj(h$NF>npry`wvQrAxmKdZ&7+qP2teT%&8VI>cV3KAGA=}SZI z7xuJlGgFnu79D}EnAl`xu7jVLcwL*N_iT?Vn>yOZ7MmL(Q9%M@C7pJolr*_1nYJb= z(K-TM8J&}r@A>`2q@7wCbE-zFKi>>j-_;C}s33u{lIE&q-B3rKn4t~`4bTzjI{Gq6 zDUj(aiU(--Dt?cH+*J6e`q@JBGC)BBV zBrsM|Pq-PAhkGijT|Y-1fv)a%l9Yeae8uk#TATXf$9(d6`=7Rn(>ysUNMNj_S@-69 z>d|6ZarvWybOgFOHcwV|m)z%C)$nF>R`_je%whZL8GaODk?}| ztfZOCN)O(BWw2?&N(YGqy2@NlRvdrQuJZ4+c$GV;9Jii*;o_d{E>S@OVj%@*Y~C4V}t<)|PxTg7!rI{|XWqD`{7ik3{L(rG{Nm&DbgwCNC{^uINfw7W$ zMWckYu3uwn>guQ?&}H^bQohsk`21Om?I)cI%3{h&Q^CHT92F!mR?;3RkvG(Tza*II zxYOyU@LT9wb16v~K&wn!oY!J|HwOpRe@LRKM*m2T3KAIkXikyxEpAKuJnXuR))DCX zR4G}hdCp&S{`-wSX6kVEFrX}ZNhjo?f&@lBgP~WRE38V*JnRsiWQGK~`YudXgw0<} z?xI~s)XqBG-&mfRXk{2GNMNj_`H2rZ^P1roO*yo>9|?3}tfaT|i81`E^D9$*n(2fJ z5*Qz8&O~B3-xF6v-EC~hBI!ifl2Zf3c>2zP@v&h06lH33fM`-!E4!mdMRBF_Z(FB% zA8n{0fsv0!iuR7@Pd$Y?d~%?Q1iHR8N>Lmp2Z(d0v^wZp)0YoUt*wrs`3$Hafsv2a z;{$Ls8~_teo0kjgY7yfw7YI-?e;;%lT-h7JU${BhYoM ze6r%RDL_ni(9)PwYPb4s>0#T1>|lus5*RCKuQ0o0b+&6^+pAFlIs#pz_a`Z#F#)3F zqrWRaS2mZf2fgDwyqqN}NMNj_S>9JW%Q)WO^yOl89f7V&6x-L)NgIAYwdXOr$_TlA zKtEFn8s9|)35O~lyeltC!`3$Ha zfw7WStXG>L8#prdl;$%afi5v9NqKsVcIKX`wW)ti94N1}uEwHiJ_9O9VC18om%m94 z4)$VcxFr`s&*YOrbL;~*V@uHBcD6*(_JtQ@0V zN6MxK{8RpXroyz#CMrl^tfX<#d|kP9S#4Wq+DQiqbYZNdo^V1iUw+ibRw*$?7e$f4 z_((es`v&u_`PQlB3pQl!mZm5h+M7k&7I$4SKGvb{oMElZBBg^?cB@2<K)CZnN^D=ALH`z9cO2$w%_g&6(lfL(s$>xm)O-Q z)6}u`Ejj{S+Y6^C1w75dG)`L;U$5uCrh)Nw)$<=BBq~T?tfcqHOkvBD{KZx+&m_4DT{T-JE5)aq z#iK&ny}BCIRG!UvVX8I4S)zgj#!7>s;sjUO^Q4JYy<1&JpsQ?Fl44$L7PV_@&wRCa zpgcFUKRfu~nu-b%82RXZ{$Ql6dSV4@8xf%+(6!`ok`lJcEX;4T_xTNqqB*UWuuO`( zs33un&tOQh1{P6!SL3@ zNoMuf!Lqwk+yw$%&UKTOFEh>JVrQ*Qz4CFonwd9()f?i;Q9%M@C5?q&*stEaJ(_uk z2k8iO{W~*Ri5zPd#j0uXD(>_HTd7*rSl20$92F!mR#L7u_IK&MD#ujJI7vsK>+<7d zbZ ztp?TS>)!6S6{eksQ9(i=*y4{qr?syG*G{;s>)B8*#@K<73l7G>_~bvuHF&E4!78TltHjZ`DCGj|>$g zF!IqZoAlLngWE547R6m8(DkxMs?y<&S*R_wI#}gUM_zF3D|NvBL=_bzFji8(c1e9+ zc;!dcZ>NJq0$tJNQ}kX&BckFZcCVZ*A`l9l8!)E(%=;3 zb_0u;v`R}O+!CX{`&!J@l;$&_f&|7&>Z>jLtd44#m%ZK;pd--LFDF^q)5Ri+_0jHC zN{xE*>^lpqMmr&(f&|7&gW>5vtz~%9Mpl&KE)wV}aV1$fG|(b^MryJBc;Qg!&Z%p&=Kfz+m)RaG7%O30r){$WcK8V6zsmQUPN?{%-K!a;YVpAx zx~b>sWI0rj&_~g?-<|o%`D@i4)2itRbYZNd@6OS_eCngK>ix7BT@*zE<0Fl?@9fU& zg_n~XX?(YiW17-rszp3Me%lq}<75{)AurS-R$S0xV&YbJ?(bhl4yE}Fs33unkMzb!2ZjlyIXN*<{yFG5o_q{19H^e5Ys33u{lJ?8^QJNoGR#bl3 zs*fKWGr2Ynk*FYnkRsia=cV{@n$Lg)y6oaol#^Ah!rrWvU1Llyxq3or{(f4t2^AzTRvHW&9(0fg zwp8UNn$Lg)x~^TLU1%MwBEv=N53bnIP!2y=ke9w~;4k zbZyB=QS6OYVY#NocK5;;)a*@{*br*bpn?R(O8Ul9KU|Hyy@z$18Kfi7wWoWk()*1? z9NePCtECgW+gScq%x_mDM+FItl{EVCY>??~uTQ2fxzRcTUE>#|DswMd#CcUq!(sJo zHhXS)+r|T-92F!mR?;rCtuC;jV`bEoA3-_-U0>g(Ds?tl#IHJ98a3Zn;I*<=t9{PX zZf~F3#J%?LvzLx-eGKOu!*M`0|bhS>tDnE{Y<7@sZ~BEpNh~xV4rC zX+8t)M~3l{d!{R~e=Nf7``>oSWhXu?yQREK^BGV<0wW)dI)AId@7^@YW-|g+B+ymE zomPP6v5J>#wL19zcNyN{ZGFl2CaS0)fw9tHm=&DNYL=-jZ?ATcNT6$5opj}RWviG| zLW?Co*Y9JVD>Kw;1`mk}5*RD#44%RRS*G`W)ll4`BhdAkRvh{Xt5{i0i-{GBuXb^~ z*=)Sv2^O&FKx%g3O_fhz5@!gQuZMd z6(lfL(mSf?b@g=RIqa-CKu4hKMgKHq_(rQ}d`i2HtU*QPj9O2a{~%|H3KAIkXe9Mp zX_*+6m+z$c3`n3Wy-}L7`6QiWc29dA&AK&{lN~Gbt~8$k6(lh7(JpD{8p+}voOlJA z&wvEF#+OY~s$RB=vkSDcTfwfCG)r;bkL71qqCmG&ibMf?7JY3J>q*s3Xu7&?8N8-EI{XQ?%Ib zHgbbnxcLVrhk0^Tkib|;ZP6#r>iAMNcGE9NN1*H3f;44Xq*VmQYq4EK2ggOlaJF)6 zBu51ajFmJqbM89Rrb*9Ck@uo?1iHRnOjDK&vWoBoEsbFpX0RN--qtZPl%t{}AXd`2 z=#ArSYrbCU)c7DBf$>qle`4>1LVWQ*S5y=2%#8{X`Y1Z|ayh={lf8UT-_?*n7sg5& z>zmY)M>ec3AJcpWRFJ^tU$hsjkjF>Ka_Xod75e=F*w07K`YP5tv?0y6kHyXHtI<6(o#yb|NCtB1XFoCZfy1vhqoLH+hcs9Yg|Mp9awB zTm!9Qb#X0MvQdsYHKeCB(Y-<{@9USS=?_BWUMg2epsU@z9A*Az ztN1id%T@l!u4N_KWuIc?~XI0v< z_ozY3RX5jqwuWUxc%U$S^e3WDc0JRNCQU$291L)fwDoB(~$WV?hw~A3~0*NSf+@5Fl_LOFN9!Q{T&CYbCdKIfM zj?!|a%qYgc#wt>wSb_=?y_TgbRT@~u!rnuPxVx zeoP$9`=s7fYtUL5RFH^1m7;7JY8FHCk0j#o_mRA6p@Ztbv^E?Gbj|FOqCBVX=Y7vG&^C{vQb1-ZW+ca2e(nHn_NOQjJAB2)j^l|4z2(D4{zznL)Gk2+U9po=m1=Zi;q^x$ zM8vG<&RXoZoj@vE4HZB3lO^H3T{psUiwY^7FVZ&9PDmaFh*MOfk3 z(R@AC4^)uYs%9%yX;1QfNzp`1IXc$#D>;%sq@$j& z`W3@aK_cR8juM;4TWlUbg^2pAXQ_)jj^o#;Z-4~4N;jmFXlQT4iaRC|VK(eix2`mE z59%ABg2brSxk|Nm-lA{EsYEQC@kA}ot^5nsK_t-Cva3P((_Swt8)>3E@x1CZBJ2m3lzxNVxtX3h66pGqU=U?W`iMCNv|K&9R8dZ>-Igz* za)k;KV^a-6&Eq3(XKQI>1Ubp$^PKoaiit>|tMYg|@q_jQaQjC~W8B>~veKZ+yeyR~ zRFIf9#ZJsyO1od&o=(K;Q$6J@UWyl_a)kuCD!j83N80#`;hVKwElqKktaT=fqxLQ; zNEAx66H!fl#o?thh^TnMEdM$Fl0_D1s3XvIr-e}*eB&$H4AOGNeEj9Q9Y@#_YG0v( z#7BkB$9e86qTFT@ktZ=ky8W}5wWc(XKv$FDMiIKsPpqk}<*Idsk+RCXF6bRPWv_mqa)k;K<7XO0 z>AC@8;H}w2c;-xyvz^T9PAXSOpzA?bI*H~(0JX2QT=ldYA{*yfrXHg-P(h;gK%;1% zK(h_E&mrQgA&9=sUr+~ATNDX&P5fggoK~7eRG5~l7dHmTlIbs0Np%nvByJZmio+Ys z;==H`L{!Z`K(4rvSC*i66cXrKzRpf;ZebDW&9q!`I)}GvzvA*X#S&DIn7*6(oFL{zxUKU88>)I59XvM4|{;qcAEe7S66RviVODVRag2ctS1`*?C6(ugt zC!*r0RJHF@Z#j#e2NLL7wKG?_L}Ra>2ee#8Ctg;M(_DRDiY2HZvFB*6vUER<2yb3M z#LJpH)q68W%RN-CkU-bCW`C4e>J@FDspV>A{b2RxnIIWTxAKSo?K>lZu6oCQE1Q2?#oAt4uBP4JX8S%aSiYt<11d;tqw^-t6$uotltn}o zXtc83#-UMi9Q6&5Kv#R0UrO9BtJqOc%aw>-Wm>T;SYD^L4=PBEZA-i37Y-C(eraj= zN7ZKLoG{si;`0e}1&9{6*yo6(k})q$|9ORU8RfO2jFz zs(jpnj`AjzD}eLE_6B+J#{m&9Zo;r4d{)h_7CI zUbRsh4heL{k4jN|Uj&Hf+qEn2IzEt>@L#FkqrL$uNTj%@DC|vusJ?0i5$<_I`G+k5 zsx~Hr1iI`hq$u%~14Q}+Em!;QjppUu3#s*}?~Do(skFi^r)q$38McxLpF&aGyYL`e zExK1opsQe>6y@~*e=)STmaBZNLwK`RZ(MBjJWxU6`1@p~I}r!ODk3&*iQtbr|1_1N zXO0BA8n>i9wwC#cosG0yH6A;Xn-V&(5mc^FL1I>!6y^OQKk=pNY9dO%58>-u(|jK) zyGWqx&W;qt=ZUXq^hZnMWx79Kw)r57ruu;j5^=Os$dG%!A|z2uBV@jr?^yYY#ZVnY z0$r7QrYez*eZ^y&cIEfuJovJuX>2vUKTttpNb^*s2JNI%`S2Pd?o8>)zs)bjZ&SQN z0$s!Erzvw+_=sW=TCTc&b>^M&RpPyB_ajKB8(jEmwz%ROUX#o%wotpQD0A-umf^Pp-GHwqHlY=T0Sg|6%UDDz)K| zKv&sm8A|jz+P}S)maA&*Q(3W^z4$h2m!N{g$B+yqa)GzlRdziQB?moW5#6jjjLH=f z=o*=jsf_6CEhgq_X*ku{%gP(ge6tp>KtZDWt4zhEjkmBRX=z;OGK*z+jN@miTp@w3 zEtYKMX(`$V@_}~cN7uDvLyC^#e<%%9khtlStt8S}TlubRAi}@pP1C%}k^CdI8IVBN zf!DtjN9uE)Sgqx1e3|1esVs!gq4q8+NHifL^Cz9uGZzo2Lq#b+LZ6#uOL>H;s{Xbs&MRfa`W*O>tkb zGFZ#iXxU8`ACiYJp*n~P64{UK#6ucYdtu&2#Kuy-a{P~p@@9z0!6fRvjHJi6$I+Z5YTL1NS*qj=NMUwl8agNPrNDCt(ddE8!l9!Q`oGSVofr}&FTJG5MF z>JTi~JUea+r*{-8NGzLg6gAWQMewSfM67HQCZm3|QTI`~LIPdM1B@bs*2F!E(sH%& z-7uNT4!&43CLEovIY(h#$_-flM$t$TRM#y_*vd{oboKv%VscA^h`Y4~WT zE^>}3znn;Y15}V0d(lozDrXT5Q?)c4iglF5GOEg{^sYq$U5!n4qSRK4cy?J!!*-S0 zx_)(Ja2B;oKtbYWSIX6Xi>P*b4-sAF){!q`OmYj=4js+Qm2 z`L|7t3KHr048nP}RZJQdL&T=wGb#-S$R|{;kU&@C#ebBCcd5tHOUqTUhx65>^dW!y z2B;v>f6X6d&>O2buk0hDH*;6}l$|J@sazp}uHL0`l*|mPm|soH)!RQwwy(p+{O#kQ zf<%pSIZA;7f#P1t{Y0#9Qr-5kWt1F7?Oi0$wSMg{GDz`sVd2zrh(ne~zI&k6;3y}UYg!%@k zAW>mUrt&tNzS% z)NPxgtT$UlSi3_+)V^4jpJ?PJ9qE}Pfv#JH)0IoFEMiA3Emzx*R^_fYTFJ2#uTVk4 zCp}Gh_r)R-${r?y)o;xgoN6NfrLv0zx?257Rm{CD;#``R#=1i7`IoQ?(x2ikDoFhP zkgCk^vWUE&wKTpR>cvlH7nM_}4kCfB?e%G{^Kr9qJE>iHsbRf&@kc*ZKYD+lg2bqz zsmkwIvskj{2oavCR-PXDQ2jyQIgvnD>;l?9v4B~`hiJK4!v7Udj^PB9kg8asyvEEu@>qVdY_|$#NPb0 zyK%1o5#e-sPkjR<&~-5-O)1#ON2Hh5a^)6Zi*IhxoX)6@VW=SS`(>I^y1I{W z$#XhBaAp@iirNfFpsQBn3`IHaEtGFs8c%bLJakWY{)X-qDo9+al%Z_gMJGGF z($esL{Dpas_T$y*c_4wVItw$Euz}v<&Nc1Ip9IA*p9a3XB*hX`kT^3XQ<+C!;>yIH zA!5zPb?jZcV7`sY6%y!TdFcH?XNDzg)^asvfHw?{$E zr;4)|kHWbFT?Z2AGEe=bJh1Z?JBDewQf`NuHrxy5W~zgzAhC4vFJ*s{m-sR`mWaLg z4#aI87{$L(n;HppJf73KAWE{Z_*0yh}^zI3m`I zc51y+VZ0l~L?qDlh|Wd6-@seAf7a5t(&c``yBcgcG zKkCiOgZUkL9!Q|;zWq$83xH! z2?oBM-XBPy%b}Q2{5#iIG|Se~5Pb&9MXw*R#?+=p1&KYCsXsW)S4{Y(rQuLwge?8` z6uU!x10>LOx{p!ZYVRl9ZQ7Mr{5?eW+%lhCrFShVNHDWebZA36U>-V8M0|sZa_zbv z>@D>TkU&>VxKY@C`H50XwOkFFHb$QJ|7!B2>p%sG*ttgWF3V4NPQO4z*UnLLS01Bj zJ+(`aKv&>oqxePpc;y|Xh_;3o?wo>HGu{XhkY^j7rswUb%QDtMWQmu>vz&AXq}X4KwA z0$mU9*oof%nuYREOXHq%Pg&u8j@p3gIVwm@dub<Kh<| zu9CiXVpFt56kM)ddGy{^^6rDGat8GcP(h;3a692U$09stULoR1XcKv0NNd@a=6)c7 zu1$9h;(@(YWLdOaoh?>D_V8;jV=3;Ug2d_P1~H+8Rj>h9i6|XkL^hA^EoaibLIPc{ z8qx>55Ua>xTCT=4`l@a_(?^!2_XjFS>}g>T36rftG`~hfh0t5-jfF#G8+ztQpsVWl zKgvJntzvUUEmwC(ZdT7-vdAbZSEwMdI^&Ph;GR`{C~}>Mj7JmI7YE17=Tvr)K-Yzk z9Hm>5mDWdTY2-aqUHzFfN_M7lg$fd1Lvxf4c7bB)Yb}ixr?%O4t&EhOR0okj*Ov5O z${(7)d*YyW<)eCv*nS=%vM%)vP(fk>5e-WOitH^ni1^uTm#NZ%NLiNNgGit&b#k_{ z|EE`M4Xf;~CrS~8zNX(ANRyI+t9(%SZ(u!pS!HXQ`+*7)YjQG`AvEK6RsEYpG~IEF^_o6J&ZF3l1iD^r&QNkj zS;g-XTCO79KeJUc`pN>-hC>C3N=q`7%28IK*xw>z!>b~^WpHn~Un^JeTj;`dY_yu= zLOH%+q>GePu24Y&*M(5~s_R4`!?jvLiU#GaVqfuIuFta#VoE-% z2;S>X#N)x<-0|58X8HDr%_?s%iUgX)+#@|*vm4oqU-iwRQbbSJJnig7`zB`baE2QZ zeY|}5(iJJ{(VDf{mghz>_mj`xRVmXS8AX>bJ|b$8o9j4f6q8k-{}Mx*x91lQ-%@Ep z9p7=^DDHms5&nyMxL#0=VnVu)7&_10_2gcos1fh;-&~n~zh^TN!qp-3y!nx1M&bXP zPO01J;rd{WQCuuUU&eOzat)qt6uxhLM1hCBC|6A#*O^}Dsck!7VlrPo%P8iQ@fElF z_jcVMWE2KRU-5NXZ&&+%M)93~Y2Di1L@Y10Sbbfn8e6txEH6ZNv0i;&k+!tAYn^sR z5lkmvwBO&$b)}_z@^e&YBZs!^@& z#eC^2@_2Q3&D+mjw66ER8kMqiJg?q~_JJr77>f!Lg<9E*lvtW0?5U-Za4>`yAGSqR z=ij#>fiBD;eI=_H%v0tcQO7$KjY9>ALR25+CSS48^fwJQnj4D8s#|~U(i7m)UwM;m z(foP$9NWc&^`^t)?Zv1BKe2tNo9l*=ROh$*iG;dtuIobS%IW|Axw{u`Me#}f%BYQ& zMw?JUV(f5=3`_jP+j3fDs5l~$zpn43o;$JJh6K9sj!@i<3g@+)0@U8&%}uBvv7DYq zA$lIkr?o3D^lBnMe`%7ssroG!B+!LVmUb6wAIf7(+-_f>$O3jH++JK;?k~0&d$`_@ zv=^4av_t4^H`n`7_M*xG|Nq9Ttc??S`}Q~DR`s9CP(dO-%wE(f>MwrH)~-CeO&H&L zwYe>Qd8m#+mxYL(1^va{zfp8W^-;X}sVb~*`NOPWfW25Vn)Vlr@8LRksJ+=wUCe#0QA98a*jj z2ZoR28FPoRdtEo_2z22+G#JKC4dN+zT$tasSlzusVwN{On`r@}^(*bl=iDB_>vpKe zE*?6rBhZCUmRd4?sfW6o~i}t^| zr(H*KFF)R+$1!Gq_@ItJ7v2$?mqBN3b@SfDyk5N2T{#j7W$XnTX%^j2YiZ;-4CW;| zuV>lwp6dv7Vavc^C~~ANKj8D7{UeOL{5+!=H-tvX_qe;R++q|HY5${DbKPBcQ|~VC zBFlfvZnJ$Z{82;#+dn3kp@KxCgGMohcG8(SPHUI6ZsN|H+rF`U?`=8)U3d=-hJaUH z_@?liY-O=@-MvDhDBWqNf6QVA-D#SUlD`N4zUMOA_u#vZKo>q6T94yionLwS4@(nu z_~tO9m^sNJOy}KQFVWoNyi+WH-}>_g8AboS7BSYvk| z98ddbMC!ih%z3_ncbeLPAB(UPcANf_dW8@>@qV^dlq=ZF_4hbCv4vK+sd=^b)dBtw zd%M!Wf9C7JQAv-YZ~v35VlcHb@t0`l$gdySw+?pP_mqn+4J67PvlFf9%g>28Emu<} z8TqNL`S`k?O>_jh@R|$;(?EOvCMAuzRcy^sL8A6=8Y!YaXK|~R#?11Cc#wS>v-vdF z5$Mw2t4#a*Y`sSbZkW@Cd%ZS@IketUdr}8W*@@A#Yrw0JUjOIHD;0{{7fr@=s)~F zx!QixAk3*&G50|)SIn)!U_W^^8&D{PEoj+KcO6Kqzh)3^Xin-GmjX=ANtOj z@l?Bx=2^X2pN}dlwr{A8K-Y#72JxBh+m^q*iL=8SnljgvVqa@U^Lh_*mDbe)MHKZK z3O~$MJgWzaY4rE4y{X9WN-U2`>+e88V*Zm{WlYULad?e(0-&{ogcBJ)dMsx+d6$%MrRXkZ?=QRlMs4im-)R8ej7# zn4Iih<^QU%6){EH8_cP-DO`FWC+|O06Is}T3t9!c^rN3`h2^15wJ01T=3GNyA-@aPF z*DtmogQuy9cPH?H1r6d%id7t<@>A2^Al7G59i(zK;(M<0jApC6W+DH|yIuheqYEOMZ_`27WS>x3b? zT=ku15aX9xMRI&E*CJ5{v2m4E4ES4iw{`BI=IL@$tv6^mN9A58gJ^ltDxO#VzxQg& zjaq88PPLaAe}i1cNv^^ndTc@aoPJ9%tw zcO8MQJvM{b=TGYmqBLS%vkG#j=TCKUbX{JB=A>;Y`JZ?Aj*WK0ez--%*YR*IOz*_A z%m4F#YWplGA!is;)bJOLI4VfAS!*Y9##ls~zi;Q|=Zne;ZBkXo*d{sxUG1maiG2$# zqC{Wq9W}T_VL7OInwmbZ8AruRtHGu%r8br4|IJnP3WcQmu{70My}2$8B#wpIiS@M7 zJKdtCvAKN#IoLa&OeonvN1zLz6U|Q?n6B2{Zzm@-Xrp_ANOWjyC*Gu3gyDsj#<2tM z)FadFWZ@Ym9f2+!rJ~t8Z)(dvF;CU7>NR~;@qeRgmw$DazJ;%;KZgC(5$KvgGaXk?Hj8sLv^17yddb>xtJK|19!KS&F?QilsKyH zuK$9eg2bMV)atKm7DX;-y@~S&ddVHHwLwRq3-5@*V7K2aXD^?wI(53DyH`le8fX+JKGGZ(8Y88(ueE$-<;qLd za>eiI2z23dqBh+039{SVL$<|i9veA>#y@xdX9VI7{eAhGzj)N)|6Y0fQ6X}5gHJa9 z##?mPfrOlD6qAYsh&A)IUaGOnXlX7|R*gToPe-5&?>dcaSDz@|8g+Fk7dexCppn!- z+GA%8jhA2!v!)mYujVgi&D2IeEG$em9o*8iwOA-a1&KFAY^drl9{e5sSg>M(3_rOy zF4}2{E)B=oM$vkuzxbM8pC0YQ(rtpA+Wu)=PU2GCy+UFH<+d5!!$p5bCZ5k4FO$dA zwjFd_r6bUV_l@q=`*7(z#*MX1J7&XibsTSRMmqx4$U`$_|BgT^J0saVAser}&K7sBtQ!$7 z-Own~Z~2N{G_r|fz4Se5(P&wH>KUd~T^olA5)K{cyMe(^H0!2~svYVcB0srrV>drO zu_1vjyd$*FMDy`-)ZVr1z|v2#s2~wckzpt8O||^*xM-2k3G$_RDXW*u+9QE3{K{c4 z391bsqy{Bf+dG4kj|oz)c*sHz+vr5z0I z=q|_X?d^;@AJ6Elt}uec@GDVTvEgFAyMjpS#+ye4rAB^S$zS?3m0Iv5p|@3{vOsLEf1zU@Tc&SY(Yo}qu<-*{Ogo6hPABS_Tu zjnWd{3Xh#LIvf68&0VankU-VpAELDH_H=f89NRF+sJF6m1oOZM61y@)X&;C%M+Qf^ z&W6v#`3~lR1gi3PiPCNl?c(-$uzP^v(IVEtjt54NI8`A^doi+$+hgzO_Qr2FYskDD z@LQ-FZIB1uyEE%5EMITqk9Ol_Rt}6Hv1cKD9k_B=x5v`ZW=82bE4c>}sETV6t&Myr zJWfa<)HihQfe|ED(iag{y%HW9de=0h5uO;|NX+_GOe6c z^;CJKGkG9^s!xsMv~IpV+~vsqCcWYLq9!i~Mv&O{L!1^p*)&EUbgO>vd zRAt%lUK=(@cnr&bQ{R%YwGvO|zz7lp7rfV|O%)z1@2=DDj%vz}2NI}ynDwLfVyEzU zTx_}icYHTqR~SK}ajK7+&l%xS;dNs@)Ae?|97v$5=ZsI7a;#ZBke34^Nc=Sai&puK@R;BmAO~a(;T}k!DpTqN?c5*2 zBki9d@|1FYxCcg%xa*yuy*w#A>YkV@XD-~5dmw?TY(LP0cKwA%ZI3_XiQjkTb%hZm zCIm~))-(@iw%w0A&dTv#b$S0l0#)BVl$?!eZqXb|X6$(-ce~b@?4oS`xLIc76-JOKQazP( z37t7jk4cejl-6wq$n5-q1ghFLPvxxHPn^%g&-YPkHfYYvfe|D!(EamDbcfgUDB#mc zNx$GJzh*!JRUdk$a{fqnU(IqHzB^Dk>b=6j&L0>-;!9{MXED0BZF*FB(OG#{zfc4_ zM;L{iM zZpM%XN`@JSc{z|k)$FaF&ar33b^FpQEtL*0?{W`}Ac4=b(38u(9g5G&XkHE^P^D6? z_PDt47!guKi7%STV0DENBs$X5Vw>}d++g1J5=x#>AA=naBv5rx_i+A8@6ns>>X~m@ zWkP;`gI)Vz1c_r8J)BKuiae_9T3U_$N}$2|AQGrLP=cN?Ehs!*_VQI~KB&$;FoHy- zDjv>V^ftNKcKdXFFIT%;otFa%R6Uv|IaeNR?=HuOC9(2L`W8K_D~uqqZocGHH?((q zod4s9?5EV{9!Q`nW^01BrLXY#amhisYL<@N10zT*j!4j?R>C8jW18GzTPyB?1gh>= z{i>z=L3mV&9xCU&)Z1X=6-JO~?)<8aEhIeNwDXa#{TsqPkU-VZ!|~d_e8Qvh+xw1J z=?3!Sfe|FG>+xDd8sTw0`<9@ocRL&Wni_r!Rq3jI)`Ig3kKPk@MjTi+h1TsHzn4QCn3d(c?v4eapE1{CHpliHW;DYI%zYk7gm=^vkQ- z^14C-RR` zos?_0V)aaWezrZ=hfjjyNJLNkUhSy#e)n1LQK?H1Mv$;SFIwYVE9J+qjK-=|9bHJE z3P&PIIyj`U5*?r2D46Sn10zTbY3k|hnom5FTJ=X&IaIWmv4T91KoyQe^rX|ZDoX9X zWw{4Nkche9;S8MB!Tr?Bh#G-P^#Q@gO7cJgRX7sSyD}>aD6x2`(FHbAb~0z ziRfuu&*Sp+0e!g#MvypnI6?caweZOIY>Dh0G>m&7fhrt{=zeYB1o_F{5!?eKNZi!E zYO4zikJZnL$miOR<8_4us&FKtcSe7I>Udu^lpk}9An^x{iBD;~GM|nP|2;e?$ASsG z97v!FMc+TUUJT{sKmt`b64Besbp!RS&Bt;N zj3ALfV`6Yo;nC&6Bt3WDk-Qv8pbAGK`tED(W%`n|Lyf}Jb}@p)#%dq5(`|)^-1U^6 zDy%Or2NI~lkw~H!KoJe{wz`FkmW68bav*^!oE@fncXtB~{f5jvFoHyU$UAKbtzl|< zJQ!5X81k?TF9#B+!r5V3HR7~tq#NhYj|WDOSlK2Z?$(v5bw%Kvq0|`{&>@dCIR->&^ zC@_t}>Ix%BEc`E8o480kDcfRM17octkHU@z5~#x2VOq;#WeuZzo+1h>2S$+ioz@+k zMQgp7<#=4XlF_khMTH#?Bv6I3!;&=Kzm&1)QFVol?HEC#=I3{svQK!Fq8v%~bn?~XP4%T0s12S$*Hp?T`)Q^KR<>)yKG zvr)VpNT3R5hb8IouBv*OxnsBoMvxdp^VI${ziS@z%ViI^b}k;zJ&-^Z&JNSFAFIE2 zeONS}w=0Yw(Us<@Ys3qW*ZJx>_BNitJ&-^Z&JNRc`-I~TB|MaSU<8TMG*6xNKjE>g zM6kRt+gN@)kU$mA4pUu81LO^-M{*C0AW@m-sn4Gf9@Wxsko&(K%sr4m70wRRN+FjH z$^Cr$^W%XLBvR8nb*-O-$Bh$D zc9_;@I9^H7mX+sY2}Y0@MNd&6@0%Q0&3L{9^-%yz5*;kogc9_1Zn{m9-?D{GPI}c(63HzH!N5Up3&OQAjmZVX-op#0m3^f2ZQJZ2+Mg>w${1^W)=m11Qiqs+uq3PzCF z=J0gBDoHcK{H@=%f0S2R^~-C_ArB-_g>w!xik>Z?EIyixdtd~K>9oQ|{S`D@%RTlr zp*LSnm**ZxpbF<4Xcee}>6KfZOK}g3AaNnk!+7|;~6<-b1UwF1gdb(L6SCY373~vsn0zyg2ch!6SN~V zpJ;l#XgyQjJH9LTKmt`b=RogJO*HR18@S$6r!%OAN15~#vC z2YO@u@DWFN({|hgBSytyDH?fUTn)(MukXYjSs9mcrJgy8KuD>|k zoqHgGDx7nmH;Wfd)oaR4c{wnG#OL}Sv@U~%$A|I<^|SBWat|a>g>w$H#_v>J@A#r7 z_rM4e4_?zZ!;T1#>e=4ui(>0>4EaMMs+eqW?RlZkU$mA zInerWSDG1XXN}+<7(wF4*-=`a%Jc*s_sBA?x6yx8MeczFs&LMMW)0f3HSW#-;$n4$ z5hOO$i_*5zbA6^q(~13zZ6#{DSY083Dx7nmXHwUrRJ||)LOcO zdtd~KTdktCv=4+wrQD5;#YdiS4(ohII{>66Q0 zOk0#iVdX#qRXFEBE1tv$8X=9n6joOlK_V*6J8cVnN71aS0lkYEO(qrN9!Q`H=N#xg zmdn|VpGOqo9vDF)G;gf-cCGNJH!_Pcq_l&3Ab~2JbD;HJr@z-r539sIFoMM3=5gBc z?DP~8Kjw2LKGEM5Z_GWAKo!n8(3b>O9MgBasKGrjg2bMUH2Xo%Uzr}CmT%Up6bRuS zNT3Sm9Ozx-7c=zqGn;S^j3BW!+ehu#cHyz?atnR$iJsg82~^>n1HG&7m0z!uw+;8e z2oeoue$s-j3y+<@tar8gw=efV0#!KYAW4(&dbtjcY|lL~f`o%+KMF+(kDrFtcJ!oY z2U$Ny0#!KYK-as!Zg>1Prycje2of3SxxNzDgoj`HO0v)J-n<-0pbF<4=o=#io5-Qv zTXGMK*a*)AZQWMkv7^;;dDN3m+yjZqpu#x^TIX)aS~*Ad2HXQ9NZ>olG`AFZLsmXD z;~q$$3g;Z?zVnt_@?U3U?tu{`?C(22ewC)T-BS_fa zai21;u<|6JH1|LPRXFEBE7w=duN3W(hkIZI34D{Cz8adViW2lW2lqe%RXFD$Nd?n> zucS)r$vrTF1g<|o>!cR?LAjJQS{`yJm4XDSaHR*DFDc`v^gVo24!cs+wgvZuzUP|j}EA^=lYbh8(!oCXB*iTuNzkOYL(QXbK zfhx>cY1ZJx6ZywR8}(WLwNNmE#QpC)oi%HVm8P2Z^-%nqM{*A&P=y&Qy*a7;DWBhX zl6znTiTm`%X%$xo_uI=0w?B}(&i6D}Icx-|Fk_{4agJ=48wWn%9vH#jeVB#T<*X?@ zJ_a0;fBVmydmw=-%vfpm-BXkXq%aPU<8S-^d+;v2EyaNkn}-As+Zy(NT3Qc zR{9F~q;(PP(q!Qt7(wE7@MmpXqQ}UG+g;AvW;u{R6=tmTZr}1#t}*{+;vN`5!f~0N zrs^fiv0-;5{iJ^YF9#B+!i<$xx~*PL?~*Sa_rM4e6Z(A6-Ygd$VU?%rJu4O99!Q`H zGgg{sI6PX<*CK(pU5p^H+4sE`_)K_gc)d$MP%b<7Kmt{mvC^8dWmoCdN50}77(t@# zomj0-J<$hC6uYgjZj^?5Ab~2(Sm~=)y>&fDn!mXRMv&O0(>nCWgvYibU-YG$Uhwe> z2~=UmDoMVtZ|S2(?&BU9K|($iqZMo@#>7EknT@T*PH+z-P=y(*Bo!?mrElx7gnM8F ziK}tZ+C^Gj&|J~M^Ije!&n|pE(j36bCk=s(`UJdi*YW~}sd!d@?mUcFEbB}AaOlUw3fb5SGPyy&_c$UQe(IW5~#wAmFC-zdl){)dT|eo zAkj2DTATEz@W@ov*Vr<16Zb#@RhY3-?)>1b{`uY#?tu{`26u_ke(vARU5<9?GZ;np zU*;Z2pb9fqI-k$DrI-14ANRlr67y@n(_#~ZM?~9beeK`xxCaub!i<&PuZ?x-Px}7N zJurgA4=rM~n2BQLma?xd==ppzD(sjefhx>cX)b)nO1;>HSKI?5NCZrZ)4tM|NzJh& zY|I9|olh?Afdr~BW2JAOZ5*YKTAIK;FoMMR^Y68|8e(;rH*1ILH}e+-wsxDnLV^<{HO?tuiVFk_XZ950qdq)(rPdtd~KgbeZ8oqfWiN0kDOTydrc z5~#wAmG1C*4|2?EnwfiG1c}k1U$l0cg-6q;Y2~&r%(_AXRhY3#QupsN%8zen;2s!3 z0@r$yq>z=}axyUA$zzLp?Q`%G8Ju<{qG za7{1D&x<#ggKHV``Ki4Wj38lO|0-fhxLh`{iXIu>U%@qZab;c1kZ2vRjg90u&lfJw z45Jl{AYosBcfrFEa_?!y^yQC-*$7l&h9pTP3cPao968|HrG_dPK|+7y;Vk~6SmXDf z;vsTEa2@V}1gbDYqHib^xa8Qd^@iyI*%lHHM|wEVJnrCLo2rAKya}Oj?g&7i!C7U?{5T^)F^){$ZIT<(Dc zsxU*6q|E(dgT8O!!#yy9#I3AfHRV^~QR+ewM~yQJxd#%c!VHPldZ|_@Xl<#S+yf&> zWY`|BMNSeP;R{+EDpYzg_do(wm?25h$VsImPUJT|FoMLxI-j+!lZ8j6F2!BjemBd3 z1gbDYqNncPe2#ch%&aSnAkpU8NA1vW!Xvv+xNC47^LQYED$I~1>E(BgTqoO_#~dR_ zG@SQA>wi&rWU2DbRWqO2u8=?#W=N8>CjT$4#+Os^1J%@ji$VB(mp=)8>y59@l;h*2kyr&OMMo6=p~@m(k?1YvYvb z+yf&>6v`BE*H(NkaE=VIp%Bv6GJk|fnDnN3%{vvLoNAn~|Cw05as zCwDn|eqNyWjH}N*kU$k?NK{vcbLfu#LnBx@FoMLLtkK%BFT!I%p2hm}rgSRi5OOSzRH4D$I~* z&9edTU6r10_)$@o-}!ec|`5xd#%c!VHOy`Fz85ChQ6Kzz7l(md9$>TXlDrBi*htdhp%B+ye^goVz0BGb zMv%Dv{=Igd)_^cQ>Q6i8>fUTN_do(wm?25hJx5Vj-fLO82S$)MSNo&Zv$60<{a~1D zm$ZO;Ab~2(kmyO-66+#P<;%f6FoHy@4WG13!-U78d#fTQ-&n*wkU$k?Nc7y2*R`qx zC*|ZG7(rquJT zj-Rg1=jA{GRhS{s{lUQjj&94%}$$qA)*m$ZWZdOQopqdo5hUziCFxYt zLw{Rs3GY!zpbE1WNutb4r_77jE=G`8al*ryd6t-arOeAknHTp!0#%s3(08zkhv<}f zaSx0j5!uwk+15*VQ0C>L%!_*i=y@MMMW@V*dtd~K@Qaf3=1MUaPMMdBGB56d z1gbE5ktE8zbjrNA2S$(>;*gwMYX}d@yj+xd@z#z6sxW(@H}%R!xhV7E9vDHQl9r$? zP7wDdDD!er=EXgbKow>$Y(8eIK-!9->`Q=H;Nwi+dn}D$HK!O{6OC9F%!+4~!sDVf=gTer@4FnU{kyFYbW^ zsxW(@HR3N8kSX)x9vDI5LWel*7Cp;p9&^gP9F%$SK8OUWFnf_C%DiOCytoHOkeJ;% zR?C@9j3tzLIVkhu9!Q`Hvln^`qE<(lGB56d5hNxLeW&%CCp;+ga!}^QJ&-^ZW-pRN znU_qN7x%yj68?K*v~C5&{V2-3WXim_2NI~l?1ipHwP`YCUfcsCNcb0`we$`M56Zk` z%DlLTjQ|y9FEqAGb7acA_*FPY@OS&{kJkQcC+Bv6If3!Mk^ES4$r3Sw9K7(v2wNVHaJyYQgQOQy{0 zFuSru0#%s3&~wO57Ri)(xtIq=koaQ>y=B@)-1DN$OQy_=XOKvs3bPkFM{SrVQ|84z zFoHzmm(kkIFT#T|FPSng7b^!6sKV@p?rjIolqvJ#9vDGF?Hi-{{U+{tQRXF6=EXgb zKow>$wBFL^i85tgI;$&;AR*;?r~O-2+>fHn%R!kJ_do(wn7v36WnMC6UfjbLf#0qC z@}1UVpYWi}%R!kJ_do(wn7v36WnMC6UfcsCNSuBUtL-l(?nhDP<)F-qdmw=-%wFi( zk6mSC%DlJ-Mv!js_Pk2z~<)F-qdmw=-%wFj2%$AvC%DlJ-Mvy4w_d#3rKzLB* z<)F+w>Oi z9#wa(9GOpFd0?D^1gh{WAM~ZzQz5Pg+sf&)Pmi^I{{sp8S1_V;U)FCe>MmEj+*JvH z?=#|87%_X1q(5JJ8e{t}k`L!@tY8EQ`?nfjwR@|d-o2FH;Y9*fn7z<*mR^~S{)bNT zyWto?;=&paXRmPa{zs)}H}%@v_Hz#;P=(nGJ>P!yv)i z=-H1tJN1=+Wal0jLE>Z}y}jI5ct;PW-s*q$AOwb2Y)EVJurfV zv-M}q@l<#`xIfa7rG|OO9SKxn_Cnu-ta8&4md`8)Mv%yp?UT0Zi}1Ma;Uxz|n0MTf zKow>$^lsnLy7JAPe!LtQL1NX_58CLG;+W@b)>@99YTj{20#%s3&>Wd-zC7F~ANRlr z67lrj#Ipgy<6xD!^4W>8yni5pD$HK!-o)|4a_=9#xd%p&@R}c|g`E-}C%*n6_bzjv zdmw=-%wFhAO@$xHXWx2o4~!sDb#bhAqnsE^{%L(dj+=afdmw=-%w8nvgqNq%`{6@A zUSR}@0SDh{i?;}mKX*QrTc-`@9!Q`Hvlm+NWTLmCk3GyiFoHxBt>xXfqIf5+`kc@5 zu!d8(2NI~l>_w8s`Q=k02hKM=AQM8O#gG_n=NaL#;#eAGi)XOu0R*Zrd!hF~bU)=_ zfx6rSBS>`49HUKT-*@Kk{H!dRN$Ju48GnKf2~=VB!d7%Bq4+$z&Y#l52om1cC^twa z-id2@DYMd~OAhXV1gbE5p?lj^N-2R^s|T?swlIRk*mLwe9IabxmSfO?%*v!2f&7U^ zBv6If3$6ARQ$jhvbQ6D~5hF-k|2JA|)I_{@*X@2rWlFaw?tuiVFnf`t3+)1wz3a>C ztQ;6YVvro8dA$`L9h;?5g0I%l+0#@=pvsoLNP$xeC_9f%;~p46;^3heZS{2V-koo| zPjbS%Y1{(|n+mcQnj>45U0FDPC-=Zi2nnt8JIyDTc<=6O*(Y-QJe#-&5~#xLg}&B& zF^#hQ^-b=95hQMujMaV%6CN+-(ppO$PH_(;P=(oxB*kBODL=^)&pj}L#DqL?+QE$C zy}Rijx5<-^nQuWLfhx>iXm!eAC*>u6nGJT#F@nT$zxP_XzQUuP^o#uIjQJJ>5~#xL zg;w8Fev^kx%ELV{f<#>H4_c7}!sEYr&E!alzI{gR3JFwU_CoUvUpvXYBa3hkj3DtO z^dq%h;o+M;ojfa3M(%+GsxW(@+_`8fIU;v)?tu{`x*qwY-OeW7CHsAJH%Et_=35X* zpbE1Wde-?_7RQ8CrML%1knp2CDl(t&h_1LhVx?rh1%U*rFngi%;MBpc;)_di4~!sj zvgsG?t+(*VHtL+K@eT7W2qaL2*^4AyX`ENTcc~cnzz7l#7Jk*L|0j+|+C1g;O0jAA z@jwDq_$5P0YFuTc{^O}a+yf&>lslWC4c{v~s=XYiPuMOQ)pNG6eYX!)_+>$AS35T9 z4|e7szi9X9IZJa@E@yC7eHeYEo4v7)1gbC#qg9~d z@49}iXuiFS5hS{;h}Z6a6|0{1Ke9Pu(jxQiWh79AS(qek_TL(G;aERj4vZl2qTOe$ zDcyrK%W-PxImfUv=G)6ipbE1v`ZjsKJaX;5KXMO@Ah9d&C#|BdsH-8nLu7SE3tm@9 zpbE1v8h!50mK}M!au19k5&PtWmcuDL0{`12XFOVudmw=-%))3j#Qx{xh2OQ}9vDI5 zpz&VIHdT1sJ#b(CC9Q*dAb~2(!X(L{_jhx?smVPsg2aLCaoUsH!lPG?3`&KSCAkL@ zsKP9a-uY>iPigt$d+vb|B(wvu+Cxo@C2iIeRQBKVGf(Wf8I;rD^p+uiMgfezCo}U+XK@(m2{cU zaStR=g;^MVt1+;(GW_{T?tu{`Jl0Td@R#sd^?hTd)t~dZ2NI~lER3Ehy4F>R&o!NU zU<8SZlz+_VD^`fz)vUGBqEBh=fdr~B3zMWGdHN_9w5;3%BS`qBi_v;z6f4Bu*V-#f z1~%p^o*;oL%);pXs0;m+{Sj4y*eV_vK_VhPTAQ;)cuf7To$}9*zwp&zkU$k?VUl$D zX&+_6*|&Uk7>pp%s$h)vPkpfpZN1j5l%Y=)osGLlpbE1vNvhtzyVCQ^Xq}Y_nNX1voLIPEoh0%FX`$2gx`5LUQ zFoHyZru3}y&%z_5Z9ZjYjqeP0Jdi*YW?_^YEGwi8@G8Ss#={5_`>V!j{oV_YneEdk z8>f}w9!Q`HvoKoM;8I#;;~tHd10zTjRo-jYT8h;vhtIqr2Xs@o2NI~lER5C!ym(dK zyP!EQ2S$*n+u?&&c#ZJ5RdThQYFY#Cfdr~B3zMYJHpzz7nnW_{G|+z=iO zI@XuZZfnUskU$k?VYH&d?XvRvJ-v-z*or5R_aPyl{-i~J5FUl^uXo(q+K#s?Bv6G} zm?WL*THaB0uDPNdMvzEIAFsJmiB(T`_bTLS)W=*=4hd9Y7DjVRS^jY4x@4{>hY=*! z)cc}&C6;6Pox=KJ!&@;2s!3V)>o~ZSqRt;kbB0S31_<9!Q`HvoLxe=i)Pc#neXJ z10zTb?=3m|H4`4gXMfalAFs$gkU*9FOXCfuWHtWi62v_)g2eil^o0ug(ztmox^jOG zBY0h5?tuiV@N4Zf?zRdv@+=JC9vDHQaYqm5yGg<${&;c2qhluSfds1T-zLBQ&|yrP zmYI8C1PS~ixFnSf`N8NjFM4pxLm?D=BGZ>JT$9x@U(6=baRJVWV%Ms%t= zd>vuTevxRlL2_ofN%wJhISP%=WE85=lCSHG1gbD&rM0Qfc^EgUbl~N{2ohuRNzR;; zg~#vrZt7o`_2lJ10#%r?N>YYn$Mt@G{dhSrf<%3v1nrY5JjO0qqF);_lpk{>P=y(* zB&{kqQ4bk8l6znTiB6O|r=on&tgDPWis)k zN?o6q0|``N#wtlwuhVlGYnpKnj35yb{9e1>g6>E0atxgOK|VjaBlkc8RhY5Tmo}c>Ai_oYvs&6h8XM{3K&7cIs2m) zLAjdgF=}jYd1&5I2J3@Jpb9fqNjkltnw+8KSY8f{ATf_}=dcB`I$B0KLq@QQQL~NK~V&`2AJkQMmJZ{bw$({b(10zVR-<_ZhT_HUDUOv%(>)VYVb0koO87tk7+VENLH@PGC zzz7o8dP&ZKO@&9T&}>GXN=>;35~#wARg(Umm)EFry&ga27(wFE3(46dTJ-Z7TCP9C&mTyjYDhy*XRb$LM%bs%K;uiX-P{8sNVII=>5OUiU)|5m%$c@QH=sFOXNxrs16()=~v@Tqyd`j%J69Y~<+!9-8zZv{F# z|DIA`rFZq66O7C~+dAf_qjN1pkSIsrqc5CVcog0lYLr#aJC3zD;6MUZPse#WD-p4- z7xQS-BGeeu=!?U%?otOvkf=_zyXssgr$-4~Qj zw2`~aZS29c26mdG`cG^dDZ2URI=#evmdmw=-?7?)M_-`}g_e#I<@6lrf39YNA^BmoeGQZ1`;I#jsKOph=UTnJar>RZzekS|B<9Yb^^ofdkJa}E7!P*7bg^%&BY`UH z!SqaO-Ok3v$v?Z;cf&D)M6KnX&g(RmnB_RUdXSO1)U+V}&3hPSP=!61)^r-t*$B_r z%fY^Rj}at%7kN52c?gf&yZakm=lROa0|``}>g?%U$ezaKS4&N5bTIlAt1Po}U<8T0 zBR!qbojSS8F+ZTEF=gLu?tuiV7MAgJPWw}2!a2`2H)>B@DzkE61c|3ks;lE2-5#L@ z+8KL$o#!4%pbBSI>H8mLY8%lXFLMu!ATj#0hqF^T;j#EeU1LYKR0^vrBv56WRh53* zUD+r_v)Zh#FoHzYRUXd%n?l^>h+bRC82l)|!rCqpHkEC*w)XEujP0%SDy*(>z7>gg z<>>3#WrTPp-L2~^>%sw527_B{{pD?BFiP-#Jnlv#-@v z;;9@+pbBSIX|0!Bk$U6e8ZQS%kO(R!ISlH{iVfB40axJdi*Y&Z^Qp_4VKN z)Y+SG4~!u3rf`DRq?GXZ-8EYu<=>On6%wezSyfv5b8<&L`b}Hzfe|GBe)2^dNzW9S zk0`};jAjX zD^uw2pj1~oD{O4X2oe$WuFT{_k4lSPI&$0}z&(&a70#;CTCDYR$yW}9@OFg}B*yrB z(yq}QvRPMhq0zEBvNx|QBv6I3s*==h^>q1KgI2t*FoMLR>mRf^WrWAnED>`486n&Q z2~^>%Dt*}@`k0(~Z$0jT5hQYMp|y7g3y+79@8$gU8}YhA0#!JxO3!|b`Y2Z|S)F@e z1c_IR;xzfJ@JK&2mr^l9b?$)#s&H17a_0p(m9z21`0>C966cr2YUL}4v1GhQIi+<` zKVDZzpbBSIX?}NnNu}Y8Y`h#8L1HDX;=(xYfe|E(>@ixSp5k14+R;zxxbFwR#lRo z&FQGjDdovMFoHzbooKCedU4G#r{y5!*Y$NB>^z7Bs&H0SlAgZmtlVn7x;i^YVFZax zSE98p^sbEA&o3AQmGSyUetm@ms&H17)+&D9QOP>-t&4eJ1c?UkqP0Vf#WmdE34IjT z)HXUR2NI~lSyg)G?w2;onvz3x=7A9;w$_Nz(!LQM>$Z1RwvO4#J&-^Z&Z^SYY&w4A$81*&xzz7mMdc4!B=M=d? z!AikO*Q?$Jt1Bc>g|n*kJoR^_mCq}(8mz7`g2di(v09%c!Xv0m31vyi5(c~WK>}4c zt13xn2jo&#Hx4k^^%X{t*quL4tCU{kY8`KQD-X*D^Ku}8Dx6i7B5Uc{wnG zgm>V3t#@zXu{7j`96GKU_do(wIIBu)m<~NHKmN6@!Opc9L1INcdNzvQX)yao_)lBq z2HQGw4ay_Tq)* z!F5A;U10=?+DAWW%d_-wm!rnrjgBz}%@)xyM*>wit4cY}>THhHuFl*8BS;jWcV&Lf zBRpR9uIn;d4&ok2pbBSIC23TFU9K-zI&lw-AaSF~7i~vo;jw$;4|=HFkJl9vsKQxQ zN!oX=g`Rg-JKlCNf&|XI(26HJf75f#>Bc>fKo!os(EVCT+8{|2jomS^{&hV@I6Wse zcRnbPS`*vDVn3+?-Oaz3R?=#A0wc*0xAw%*Oi^+k^fiq{4@vUY>Zl{RH~YJtz=-f* zgz(;dKXX#zC-GZ3wL)R$zGpJhYjxazuTbGulD)zR62jx#k|TjCK^NE?mBa%hNQmu} z>#9P9NL7@)Vuc%t$K&GAXGuK7Z?Omxq7E5tuU#ZiRkw>-hv!EoB}8P;KRInjZSN>| ztxwFEOnxph|4B7Gtj~5n;zxY)>Eh zS{2^^f9;A9Vh_JPg7{mg5;anx!p$T{5F<#4<0OvYMCIS<=Ql(wy1Pzzuv!$`Y~R^- zD(Oe3s9ifDBFPbnCHJSXM4_={1KTS`u>ECw!nWC-2#;?GjMxa(q!Zh2qDNh|EB{>< zsZ-e8W*&DknA?eUWfAT@VQp9Jp+xPKwMw&m?$IZaz=)0bNf7Rqm@Fa6#A;ORZQ=-* zNMOW9c$no7$3se%s0%7l3#@#+?Isc!K|<6Os|7nDBK!!tJ=jqbd;7nShw$J8?4jKQ ze@hU&Ri=2%#qnV7Hsb$09=w%+O4PL368l8i0}zjcnuU=%w;L z@ngT$c1JfJ$yjr!^KQFt&YYLLwVaKHIz1)x??errU~De^vn$W;>_st>9MSZJH+h`9 z7HV9KOf6^dTe%(yvCUNWaulPz(x%msC*|0&9wSJkqdm;Gp{p}9?IAs9*=C5bvQ4%COVr!!crQ({;&DgPoNs2oI`R zooZOgHnED0K$W#^dZd;ak-c8EaEw^n-dfbnR(7Dr=j0uu`+q=QlcRz=*Z&t&Q6=(A_^+IatlI)?V$;59=+JuT5nU%)?FS zYX;5o!-%zQmc#6u%)`A`dPHb3e@o@dODj~&Tl8l7{<&FlT|K+qA0yVbc|2~`?Cx&6 z?%Fk8zrATASnUdxwav=mK7t1Ij{uBV+h)6p*epEUt;C@IVIx>85h`n&dAM7mLH#2D zBi6RrKQ8?#JlL_I8aAkZ*a+6zh05ACJ$R2YsDA`t#M(Cdx!A+RUTaYQuo0}+3YE3Z zJlrFLLH#2DBi6P#`iPq5waZ2ygZhV!V55&vS=-Emjc_}c2N)}^eeuVLwQZhDcGB}D zX8&-XKa7a&H*5qOAB76f5|ZRTN9j5D4fV%Ja)deVwro4ZxE;G*|9kUg+ZjjDOoitX zdS-jk-J*9sRtsR)aaLRM+j-B}W2P zybgnV@hgKQ<$%3Hnw3fT*$Ipw!D@tM`sQ^B?iCWKV(mEja^Sw>7@TrBFoFb*uJ&>u zfhzuYp0Rv$JfMvtVU5B6i$E3j0{dQBecP8`Q;9PGwl_P05zzWh%-^N1WUznXoA>*N4Il2@ovDTM=z?svSsZL*l7s}iR`;C9 zS~X=tiQDFwSZ`D-`a3(<+6Z<8-TmPBq@m8~Ut2oM_0OjH_z!bd?af=AUe5KC(rUYZGq+Q>$e{I~ZEj0JUP%a1Le{FqHrqqtZMJsw zz({h0s4Hu)kPzEU6}84JU&z*MN%jgONTghHBv4hi)i7Qo8~Z1%E3A_#4zqslJjkM9 z9j08nNZ_$anLw4<&wKItYde7vB(N4zCQv1QiOq{APp}9QqU5hjC!Gt&2oj>!$K1Z3 z!~+RbiR1CO^}Qs7I3DE>zf?urEivn@Dr!1(@RKA2Mvy>nd&!YNm8j{aO&=!lzz7m4 zmjek@iB{=z+bsD5-fO3~&m9m{uaJ_vOXbxiS^Co_liZ35H0lE){ei0DzR5$WU$I1jt6Ur zqTblZAZkIJaV!EONT9d997v!_)SDRLEDwwzk#afG7oSJ%r#U~<=W4W#Z?k(h;_qVi z-15K(5@K82EBfCAQ}w;DoBN47SQdd1v+c5M%iG=ZMdpRQRuJr-kk~_Z^)jUTe0TZG zJ3rrgusessgN+|zJEeZ!+{xy`g^FL76c6JbVou-k@PG&sxVQFWjs&W56ko(W#QiAC z10zWM-z8^tC5{@quZHzz-z$tDA-2W+T5GS8BbZ7M;{KpTU_@*)LX=6|;Z2@EmDm>d zoh){X?KL|ZU(PHgQMK|-`KK}H!BKGQA zg4GrKUDglSu`xYvs;oxXc48k)+$)SAAv{FMA0$hls&>YUynNq!U<3(K@^3wmK$Vv9 z68A{#=ZSlT5hS*pGzoFP)+&b}SQ`~8){cd@XeAbb5hR4)x5onsREb*u)&nC*hR6Kk8zu&{aE|4n#vLbUwk z3Dz3$cg422X86_v38u0L_ACy~WhiVuqs7P@{x||y+umCHE|-E&er(R?fb0aj$`ErF z;&<7(*4lQ@mn3@Betbz4^DsV*E~#RECS?L6NbuGZEM{x597v!F_tstxEMdhhk-<5B zYr$u^tXg1mmgs>IB*vEe7%bPJ`7$wol~{5lP=$MF_rM4e(!I3m^4Bf-9AL@>s_Z3S z^R`JQmZz~6`D#>VRm`52+n-$(v+~$)==!aepO(dc1~6xtR3 z7OLzer~8}=J&Qx%q@U$4S{%Dm$;Jm%&$@Y7_qj!HLC}+s|@k1!6hkmfTi-asVsu^bMdUf-6GioFk)@f zEMDTsz&ymW2D`H5vJt4VwoMQ7Sp!C3#M<`Ote$3i@F#=}wpW(Q*QT-v<{_RnU?sP4ZJ7>*HZ+w33TKC4Ep-A1r>EL7Gu zE5}9i=^cd;7_qj^elGSfvDfmwvQ%b27b@0+t#Y_W23~TESlj04BWgPFNhe;rmdclp zQ9{MW7;~GIgPz4v=vf?vMz{?av9`@~iFmG4lHBJHh0Y%~f{l+tg=Y!=EDk$I(bs!t zZNNx!MB=kJ3O$P>7n#}CMhKdz@LVEEIc7Zf6Ic75#UBKxn%I-B?%t|w+sy7hsC7Js zJH_Aa1V)k)f@axWFwZ$}?D#K$5oW|ov$j8gpLw6tBCOv{iTFU--4iXZzq=d?5^USt zce?uu-gW{bNeMyIn&cO<8{!{R4V4N7i@Iv&afEW-4}8Yc{5#t#+9RXfrKJJv|46WF zIH9uq-X=qcdPjn7n}25>=H2ks{QkM6^5V0=rpnwFekl>=z9V6Iu>G$!Rt{%1j2>2* z%vonan_bW<^D(mm=c9jf) zdu8|IwX3*mSh0S~REe5KKi<#RyKC5XJg~Hk5VW1ZNK(QoIeX^g#*XdbEI((2*-Gf? z@#6MgYk4FkL<9-8E&guK8c-kPZ5Q_{X)OrvZwV1Wf^Ca7&3hE}{?+`=7fbblzaM3) z%x!b8%vQqYuaXj8^dyJ)U8EVo`X2QtK9-<|Ri?K#zi$b#CrDVe&PE^B_e4KT>Va+7 zEC(ZK+}$Ahp>>?iUL;h^L(p~tBi2!S%g;E1mZVM}Cn*1>{xPD_qZ#YIkK3&_EK)$N zP~pC6ZAYq0d+%2NT$`5u&Yt%vTy}z@by?@SyWZ3KW*b>!ES(@pE9`a^|jX;&P%{*>jYNix-WHT~fJmZfMYdcbHzi7Q0Uv943 zxHFb=T@FZjW0FR>*}G4mEy0UDigR%GzcguSQmt zeNT)v7ObrtfDvmuQe9tpgj!*ZH!$B zwj{l&KIfcn57sxRj~LEX#cc$ttZnAO z`Udq8Na2jCHHs9;|OrA2FJKj`z1z_iZYRU>>Y*P#-axJ-Y6X5ol@TZTuW9x_On#?Z7Pf4$K&@2N<`bHj`7nb zufP0qr#d^`0RCInnITfO{+=>nKjT<5Bj~zh9lg`Qu4D}3$G&R%)VKIKD&*B|^z>VX8Rx>WpL9iPQ3nYzLV64(~(B}W2P^_!Ga zXOGCAj0Z-Lu(vBb=18C_HlU*VengpMJTQVp_W}=sYg`TcKL}KH85pD*e>##O3ad-i zch55L$lQdb>g1Yv`F6@}7b8g6`v;aBRh2p|QM2?Y#XV9cFoHzf_yuYYkDz4Afdr~@ z{QZae)nj@x1V)hPw`sQO7hUK7AW*fd`;;mLP$u9OW0O`%1gP3AJ(KZ9G9F!yUkV;}@Hwx= z*rl!2d4-$vZS2AJl4Ask9<%GH2`%a+b3BkhRmvkn*Utmg3~6@o{k5*)?yEVEg{Tqj zS^kl<0Tj$ zs<+=yR~Jq?noR9t1PLn_N$P_tdCcve#VZrPJ$dK40`oSz9Q*utr!E8sgoUY@@;{(!(Kh?15YaY*-N`}%Rk`}Q zf_sEMcN3#pB9SE|pyDP8JfV3LU*Jcwpdj zH__tR2*ay%Jr}#Hh!G_Eme~Ps;=L>5nS?Mn7aCOQV)zEQE=bi!7I0fsipTN^*{nuV-}td zj-D5$Mt@@OVBub21PR|pM}wOV3{wLq=lCB4s=|sL5AHBLOs)MZdzTD7FoHz+t$Tvs z)C^NM4NbaNNT7<{9SG|ircQa8HHimCkPye;PMq-^7$737H3*t*i@&E#um}=j+a#z> z@htVv$l=8>BDR^w=L>%XpKkKpT@EBLk{n^S-LJ7v^uY}yBKn7SHy-7B6g)ZhId8kz zjTN2Ja*)JC8xeUod!>(4)TxAsq?;v%;Hb@q_@Xo7(eB(S|nQs}%l zjs+!7RDT{c-bSG6@6gl1?N>f`xAtop&dC)AZ3wDfvaf*=B(R0j9NFNsN=)gyK~MFz zHUd?nsvHjfe#CQkYu|oJR`$vH99g@SFff7ywl}(8d!(hZAYEC_4CAXAb~18PIeEBAmJ0UBY0km=hk?Y=z#>Pu)WzmFoHzB_Q!+o&3kT* zyNMo1pbGnq-2)>?bnv|y9C7uzb^b{7Kmt`MA3=;Dfo;LQSK^qnQAQlWZ^tVd+Y|Rn z5Ugb&A+{68M1xT@CT8(F3%$jX)K)F-iJwa9V>#xCk2I z6pSE&XKG2JQBa(AyQz}xtB;!N z;4(fY;`oR(eG3~1j38n6$VAt=bj_>K^{#R#V=48{FE7+wC49BDryI%!LH1_UONiVXf2Z_|xjRQb!I`9_3yrV+4sonf=tzw&rn?B$j(n4#HO$ zLjqNJY>3dBI;i9ZEBW|@lIrsg%X!I-^cB^q^Udu)3zt%t|G3;Lxr0hh#6Sl|knk^9 zQT?z&5L9vpmE2$@M*>y3GL=%>)c%#XH(qiFmE2$@N7Z23tMIX=%1%(p9W47|Ptsuo ziEbwx}@6m!3sA)tv!fZJ70khBS=i`SV7JFVU5+= zgIK1@);>c5RVBNWRQ2P6pw=G5vSGHq8b*+4{j|JVa89_@+N-mSo3d>ifvT_1OQ=WN z3WDW=>>NdRm;7+A&<|^b@^c_Cf<($5*zd5{+FK%eUjmvfb!5E&$0CmI+*V)VR{YQ}cU)tY~@xeUxwkw8_tZbj9)%1bvv*NKUl zFh-CV)}e?Rk$*WoZIOjMShh{qi9Fjz0#(svzEk5pU%Cm*=rMxC_uKN$&B zVfiHKpMisoyt`|TAQx6 zB0+^4dTQ$J z+wk{5Fw5IoBaMxZsKt8A{V#SH@%FHL=4q4CSgcwjjg2uKBTxMy63p_p)<|PxosN-j zp7VT%5pNH><8xEeSgcwjS*+`HjQo4!bAe!%x3xwZ8|!q8JoeDB4kO+kc2E4VCym9b zHPYBvr(@)jSDp$4v%IY}(%7hUjJ)u(!yQJvJ?tJld0HBaRcoZNQRx^t{n7)0V3xPF zMj9KHj*-tT|8a*AZx6fgSTQ4w#i}*Z*r;@jY=7Uqfnb)mwMH5nm5!0)cirA$#M{HJ z{AxxTi&bl+u~F$5*?<2R1HmkBYmGEEDjg%&&Tr^2;_YGg@cLP4ELN?N#zv)Mq;tV} zfnb)mwMH5nm5z~@4h+v`#M{H};?1+tSgcwjjg3mj$lQ7N27+1M&i&DRYB2VJ$t&j9 z9{Peb7V9vqAO7>vL|k#WuB4}>^zJ;d^ToX5>68E4BIc_6_rz8)r-WlZ5`*g}#B9~x zKgPxEw##nZCc%3xH5eh$xpk|UH5+S?VAg*w-zMhVMuNx7^WeM^2}Vd9UAaxnnHo(n zi}Ok(7$GsWdQyUaRjw5YW^rDLHBPy0Qp`3R%=N`Av?DvFBzR<{1|uYPr5!xMNnMg) z*4^oEk_RWX5bUX47fp$|G3?oR9*mGU^^#hGy;EwCU>2`PticG0pL{mWKCNFgnqU^M zTO`<1>_N`jkzjO3mW^O0bL#J2DDB>3&+s7Nr2^L(tq2#L#H?n&_5 zOAQjt^3~w=XU+(TJ5KZ@`0b?z31)Ew$Max>#HwHPB>3&61_@@3o*CHZPk(Qdn03v& zCmt0eB(A78OE8zqQITL4*REKD5fW$Id4mK4yVM}TEUs{|2Ji3(9~>96;78x>jF5O> z?YNkMA8U|cmOlZ!{=Q;_#O~$eVmk?94HC@a`)4E=Au;jJaj~5XqX}m5{WB7bkl1+B zxCAe}^dO%Z_#VY)qF93w5`5DeO)%@ERa+#O3hXYmi_T zuX=i$NZ%lv#mbq1tL2AI8;Cop`Yp9ttR$Fq-FN!p-m88SZWb#eB=&rJAnv3li?uR~ zl?1bnylo)vz3MmmX0b9t;?Q#gaVJ&3K{kt(1hZcH{6O4$O%`iq7Aqqpj-Rw$+(}Iq zYh@NI31*$~m4UeT+I~)5Roh><@9AALVkX!(uAUJy#D4eBSusN}^?BpHW`YqCU;5#! z1dmKVJ%0nitW&P(i@SrY!3c>zcl#1dr&5Civ-T|Z#oa;HV1&dYf9p#ywn_~W%=+y) z195kdH5eiB>dt`#^Q_b$!L0Ms|A=sRkTn<~aq=?*2?kxML4sMU<_6-1DQhr7!tSxg zrb@(q{l;YDv2$1JUl361RxK^wefIOwghohMI}+*M&Hqo>%wA?)^?YA~Rh*AX2}Vd< z`00TJt9VI*S;z0|OR%F0!3c@7UhPY;qn9L@bwv6SEbl@vLgJb0`w}egB?)F-^yI7r zTfGpBka+XLtOQ$qNrG9gP0os$@_8;P1S2H&rvJfXK7A5|lH+COG6~K^9RKAr{cJ9i zU>47>xN6y4W`qRCfB9}Ao697a#eQm>J2RIVA;IyV&1LoavbjuxS-jthJDAO7Mo4h{ z7e6tZ%Ose^anm@EW-c>Af-^=U8qYGD%Osc;XNJ~c8QZWpSYuf_mspmz?dQ$RuoR&Y z64owr$(XHCoXM>H#u}sM#H9$Oi_fq>oyT6zIM&uIqsw`yUy=z%mLi%OtrwmxR?E`g zMVhmA?!n3|RuatO+*SPcY_T#zf~!xl6SBohf?1rq@;8cVCuED25fWTQi=B`yRuatO z+?7YI?l;I5DY_XDH7U!r;z0dwp;HWlzi(JZpU|=JH*>*b_GaTZ=V&eT?rPo@l z+3O?0tRFqv6E^`{i#2m$Le^PlL6n}DswnqAHn>CDaF{QgI4 zF|Tu1`t-xi%+_MfE+-=-W-qSA?a$U?%`PViX7Q>Qi#5BPjF1?1YjOLtwOF&uNrGAI zn`O&xePzd*Zf`FC%|2eAyY|&$UU0ltBp4xa@WOP*6h~O+T%Fx^~ z_A`&2bR-xd!K*NuVAklP+OfYDGrLcJxEAxYe|n%6w~Be@jF8|JiAP0(S)GHmxE;+J zjF5=uk*t@>tQQi@st?s-{&u!rDzjb~A;CL8TQ8MaFC>_C!O>dGXUWz}W!4L`uD+%g z^N1qR8gzM$VuZv)_tfI1Q)|%WHHrkY?l^N=+>>byy1Yg)LSlHL7B{w9gD$U8B$)N^ zm#4)&nbx4oYZN0SdK1&)=2>gd^rNbLM;Pt2ekO)!gn6A4C0-1f0r+_SXzT782g!7TPoticG0!+)y9 zJxkUg!7TPoticG0Jzt#`_bge11hd$iu?8a~mcMI8+_Tgj5N6|YRr`e0VtYQ=o7u)) zFdLT<635cFeYTS%+qes6&nfwn6n#+)}R|x8{5Zl_9jJ8?bd=;E_P z-sh#eof0uM#s~=>VXD#WcFOy_NHB}fL}j;A-si Date: Thu, 26 Oct 2017 09:55:01 +0200 Subject: [PATCH 038/764] Remove builder premium extruder definitions - CURA-4451 --- .../builder_premium_large_front.def.json | 27 ------------------- .../builder_premium_large_rear.def.json | 27 ------------------- .../builder_premium_medium_front.def.json | 27 ------------------- .../builder_premium_medium_rear.def.json | 27 ------------------- .../builder_premium_small_front.def.json | 27 ------------------- .../builder_premium_small_rear.def.json | 27 ------------------- 6 files changed, 162 deletions(-) delete mode 100644 resources/extruders/builder_premium_large_front.def.json delete mode 100644 resources/extruders/builder_premium_large_rear.def.json delete mode 100644 resources/extruders/builder_premium_medium_front.def.json delete mode 100644 resources/extruders/builder_premium_medium_rear.def.json delete mode 100644 resources/extruders/builder_premium_small_front.def.json delete mode 100644 resources/extruders/builder_premium_small_rear.def.json diff --git a/resources/extruders/builder_premium_large_front.def.json b/resources/extruders/builder_premium_large_front.def.json deleted file mode 100644 index 159682dc1c..0000000000 --- a/resources/extruders/builder_premium_large_front.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_large_front", - "version": 2, - "name": "Front Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_large", - "position": "1" - }, - - "overrides": { - "extruder_nr": { - "default_value": 1, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} diff --git a/resources/extruders/builder_premium_large_rear.def.json b/resources/extruders/builder_premium_large_rear.def.json deleted file mode 100644 index 5e9cc062ae..0000000000 --- a/resources/extruders/builder_premium_large_rear.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_large_rear", - "version": 2, - "name": "Rear Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_large", - "position": "0" - }, - - "overrides": { - "extruder_nr": { - "default_value": 0, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} diff --git a/resources/extruders/builder_premium_medium_front.def.json b/resources/extruders/builder_premium_medium_front.def.json deleted file mode 100644 index 9a330b4f4b..0000000000 --- a/resources/extruders/builder_premium_medium_front.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_medium_front", - "version": 2, - "name": "Front Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_medium", - "position": "1" - }, - - "overrides": { - "extruder_nr": { - "default_value": 1, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} diff --git a/resources/extruders/builder_premium_medium_rear.def.json b/resources/extruders/builder_premium_medium_rear.def.json deleted file mode 100644 index 49d4734306..0000000000 --- a/resources/extruders/builder_premium_medium_rear.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_medium_rear", - "version": 2, - "name": "Rear Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_medium", - "position": "0" - }, - - "overrides": { - "extruder_nr": { - "default_value": 0, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} diff --git a/resources/extruders/builder_premium_small_front.def.json b/resources/extruders/builder_premium_small_front.def.json deleted file mode 100644 index 2e6293d153..0000000000 --- a/resources/extruders/builder_premium_small_front.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_small_front", - "version": 2, - "name": "Front Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_small", - "position": "1" - }, - - "overrides": { - "extruder_nr": { - "default_value": 1, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} diff --git a/resources/extruders/builder_premium_small_rear.def.json b/resources/extruders/builder_premium_small_rear.def.json deleted file mode 100644 index d1606cdd79..0000000000 --- a/resources/extruders/builder_premium_small_rear.def.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "id": "builder_premium_small_rear", - "version": 2, - "name": "Rear Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "builder_premium_small", - "position": "0" - }, - - "overrides": { - "extruder_nr": { - "default_value": 0, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0.0 }, - "machine_nozzle_offset_y": { "default_value": 0.0 }, - - "machine_extruder_start_pos_abs": { "default_value": true }, - "machine_extruder_start_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_start_pos_y": { "value": "prime_tower_position_y" }, - "machine_extruder_end_pos_abs": { "default_value": true }, - "machine_extruder_end_pos_x": { "value": "prime_tower_position_x" }, - "machine_extruder_end_pos_y": { "value": "prime_tower_position_y" }, - "extruder_prime_pos_abs": { "default_value": true } - } -} From 8826f86b542ce87b9662747d6e8370cd02b1cd15 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 09:58:01 +0200 Subject: [PATCH 039/764] Remove debug logging - CURA-4451 --- cura/Settings/ProfilesModel.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index e7db392568..2981873de8 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -6,7 +6,6 @@ from collections import OrderedDict from PyQt5.QtCore import Qt from UM.Application import Application -from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel @@ -167,8 +166,6 @@ class ProfilesModel(InstanceContainersModel): for item in containers: profile = container_registry.findContainers(id = item["id"]) - Logger.log("d", "profile=%s, id=%s", profile, item["id"]) - # when the profile is not supported if not profile: self._setItemLayerHeight(item, "", "") @@ -186,7 +183,6 @@ class ProfilesModel(InstanceContainersModel): continue item["available"] = profile in qualities - Logger.log("d", "---- profile available = [%s] , qualities = [%s]", item["available"], [q.getId() for q in qualities]) # Easy case: This profile defines its own layer height. if profile.hasProperty("layer_height", "value"): From f0ed3bc588632837921795de5cc74f79a60c9568 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:05:35 +0200 Subject: [PATCH 040/764] Always populate extruder stacks when creating global stack - CURA-4482 --- cura/Settings/GlobalStack.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 88218c2f1e..81f9db76d0 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -23,9 +23,9 @@ class GlobalStack(CuraContainerStack): def __init__(self, container_id: str, *args, **kwargs): super().__init__(container_id, *args, **kwargs) - self.addMetaDataEntry("type", "machine") # For backward compatibility + self.addMetaDataEntry("type", "machine") # For backward compatibility - self._extruders = {} + self._extruders = {} # type: Dict[str, "ExtruderStack"] # This property is used to track which settings we are calculating the "resolve" for # and if so, to bypass the resolve to prevent an infinite recursion that would occur @@ -61,12 +61,15 @@ class GlobalStack(CuraContainerStack): # \throws Exceptions.TooManyExtrudersError Raised when trying to add an extruder while we # already have the maximum number of extruders. def addExtruder(self, extruder: ContainerStack) -> None: - extruder_count = self.getProperty("machine_extruder_count", "value") - if extruder_count <= 1: - Logger.log("i", "Not adding extruder[%s] to [%s] because it is a single-extrusion machine.", - extruder.id, self.id) - return + # CURA-4482 + # extruder_count = self.getProperty("machine_extruder_count", "value") + + # CURA-4482 + # if extruder_count <= 1: + # Logger.log("i", "Not adding extruder[%s] to [%s] because it is a single-extrusion machine.", + # extruder.id, self.id) + # return position = extruder.getMetaDataEntry("position") if position is None: From 701e9a91c23f30f51d4fb4a9830d76677de1b48a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 26 Oct 2017 11:13:28 +0200 Subject: [PATCH 041/764] Allow using longer accent for machines in job names --- cura/PrintInformation.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 86bcc2719e..f3b178c356 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -313,7 +313,12 @@ class PrintInformation(QObject): elif word.isdigit(): abbr_machine += word else: - abbr_machine += self._stripAccents(word.strip("()[]{}#").upper())[0] + stripped_word = self._stripAccents(word.strip("()[]{}#").upper()) + # - use only the first character if the word is too long (> 3 characters) + # - use the whole word if it's not too long (<= 3 characters) + if len(stripped_word) > 3: + stripped_word = stripped_word[0] + abbr_machine += stripped_word self._abbr_machine = abbr_machine @@ -339,4 +344,3 @@ class PrintInformation(QObject): temp_material_amounts = [0] self._onPrintDurationMessage(temp_message, temp_material_amounts) - From 2f441ba7e1221294abee83646a0de6a4338c0fbf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 26 Oct 2017 11:36:59 +0200 Subject: [PATCH 042/764] Remove debugging log lines CURA-4451 --- cura/Settings/MachineManager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 131160c8af..bbeafc9a06 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -827,7 +827,6 @@ class MachineManager(QObject): if old_material: preferred_material_name = old_material.getName() preferred_material_id = self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id - Logger.log("d", "preferred_material_id=%s", preferred_material_id) self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") From de34464e47a822887c6e8b4d9ddedbd2c3f5cb54 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:38:21 +0200 Subject: [PATCH 043/764] Update ProfilesModel to always use extruder stacks + some refactoring - CURA-4482 --- cura/Settings/ProfilesModel.py | 70 ++++++++++++++++------------------ 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index bf1993b184..a04ff00392 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -12,6 +12,11 @@ from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager +from typing import List, TYPE_CHECKING + +if TYPE_CHECKING: + from cura.Settings.ExtruderStack import ExtruderStack + ## QML Model for listing the current list of valid quality profiles. # @@ -28,9 +33,10 @@ class ProfilesModel(InstanceContainersModel): Application.getInstance().globalContainerStackChanged.connect(self._update) - Application.getInstance().getMachineManager().activeVariantChanged.connect(self._update) - Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) - Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) + self._machine_manager = Application.getInstance().getMachineManager() + self._machine_manager.activeVariantChanged.connect(self._update) + self._machine_manager.activeStackChanged.connect(self._update) + self._machine_manager.activeMaterialChanged.connect(self._update) # Factory function, used by QML @staticmethod @@ -54,17 +60,12 @@ class ProfilesModel(InstanceContainersModel): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: return [] - global_stack_definition = global_container_stack.getBottom() + + global_stack_definition = global_container_stack.definition # Get the list of extruders and place the selected extruder at the front of the list. - extruder_manager = ExtruderManager.getInstance() - active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - materials = [global_container_stack.material] - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - extruder_stacks = [active_extruder] + extruder_stacks - materials = [extruder.material for extruder in extruder_stacks] + extruder_stacks = self._getOrderedExtruderStacksList() + materials = [extruder.material for extruder in extruder_stacks] # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. @@ -87,35 +88,16 @@ class ProfilesModel(InstanceContainersModel): ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): - #Some globals that we can re-use. global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: return - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders and place the selected extruder at the front of the list. - extruder_manager = ExtruderManager.getInstance() - active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - extruder_stacks = new_extruder_stacks + extruder_stacks - - # Get a list of usable/available qualities for this machine and material - qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + extruder_stacks = self._getOrderedExtruderStacksList() container_registry = ContainerRegistry.getInstance() - machine_manager = Application.getInstance().getMachineManager() + + # Get a list of usable/available qualities for this machine and material + qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) unit = global_container_stack.getBottom().getProperty("layer_height", "unit") if not unit: @@ -174,7 +156,7 @@ class ProfilesModel(InstanceContainersModel): # Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile. quality_type = profile.getMetaDataEntry("quality_type", None) if quality_type: - quality_results = machine_manager.determineQualityAndQualityChangesForQualityType(quality_type) + quality_results = self._machine_manager.determineQualityAndQualityChangesForQualityType(quality_type) for quality_result in quality_results: if quality_result["stack"] is global_container_stack: quality = quality_result["quality"] @@ -198,6 +180,20 @@ class ProfilesModel(InstanceContainersModel): self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. yield item - def _setItemLayerHeight(self, item, value, unit): + ## Get a list of extruder stacks with the active extruder at the front of the list. + @staticmethod + def _getOrderedExtruderStacksList() -> List["ExtruderStack"]: + extruder_manager = ExtruderManager.getInstance() + extruder_stacks = extruder_manager.getActiveExtruderStacks() + active_extruder = extruder_manager.getActiveExtruderStack() + + if active_extruder in extruder_stacks: + extruder_stacks.remove(active_extruder) + extruder_stacks = [active_extruder] + extruder_stacks + + return extruder_stacks + + @staticmethod + def _setItemLayerHeight(item, value, unit): item["layer_height"] = str(value) + unit item["layer_height_without_unit"] = str(value) From 152f6f840579b8cbf077fc24e3667b1cbe8bbe40 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:51:24 +0200 Subject: [PATCH 044/764] More profiles model refactoring - CURA-4482 --- cura/CrashHandler.py | 1 + cura/Settings/ProfilesModel.py | 24 +++++++------ .../MachineSettingsAction.py | 34 ++++++++++--------- 3 files changed, 32 insertions(+), 27 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index a78ecb8a72..ad80d286c3 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -53,6 +53,7 @@ class CrashHandler: self.exception_type = exception_type self.value = value self.traceback = tb + self.dialog = QDialog() # While we create the GUI, the information will be stored for sending afterwards self.data = dict() diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index a04ff00392..a46e3d146b 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -32,11 +32,9 @@ class ProfilesModel(InstanceContainersModel): self.addRoleName(self.AvailableRole, "available") Application.getInstance().globalContainerStackChanged.connect(self._update) - - self._machine_manager = Application.getInstance().getMachineManager() - self._machine_manager.activeVariantChanged.connect(self._update) - self._machine_manager.activeStackChanged.connect(self._update) - self._machine_manager.activeMaterialChanged.connect(self._update) + Application.getInstance().getMachineManager().activeVariantChanged.connect(self._update) + Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) + Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) # Factory function, used by QML @staticmethod @@ -153,17 +151,21 @@ class ProfilesModel(InstanceContainersModel): yield item continue + machine_manager = Application.getInstance().getMachineManager() + # Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile. quality_type = profile.getMetaDataEntry("quality_type", None) if quality_type: - quality_results = self._machine_manager.determineQualityAndQualityChangesForQualityType(quality_type) + quality_results = machine_manager.determineQualityAndQualityChangesForQualityType(quality_type) for quality_result in quality_results: if quality_result["stack"] is global_container_stack: quality = quality_result["quality"] break - else: #No global container stack in the results: + else: + # No global container stack in the results: if quality_results: - quality = quality_results[0]["quality"] #Take any of the extruders. + # Take any of the extruders. + quality = quality_results[0]["quality"] else: quality = None if quality and quality.hasProperty("layer_height", "value"): @@ -171,11 +173,11 @@ class ProfilesModel(InstanceContainersModel): yield item continue - #Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. + # Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. skip_until_container = global_container_stack.material - if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No material in stack. + if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): # No material in stack. skip_until_container = global_container_stack.variant - if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No variant in stack. + if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): # No variant in stack. skip_until_container = global_container_stack.getBottom() self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. yield item diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 49f82a5c9b..be76c0724a 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -176,25 +176,27 @@ class MachineSettingsAction(MachineAction): extruder_manager.setActiveExtruderIndex(0) # Move settable_per_extruder values out of the global container - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStack() + # extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStack() global_user_container = self._global_container_stack.getTop() - for setting_instance in global_user_container.findInstances(): - setting_key = setting_instance.definition.key - + if extruder_count > 1: + # Multi extrusion + # Make sure one of the extruder stacks is active + if extruder_manager.activeExtruderIndex == -1: + extruder_manager.setActiveExtruderIndex(0) - - - - - for setting_instance in global_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - if settable_per_extruder: - limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) - extruder_stack = extruder_stacks[max(0, limit_to_extruder)] - extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) - global_user_container.removeInstance(setting_key) + # Move settable_per_extruder values out of the global container + if previous_extruder_count == 1: + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + global_user_container = self._global_container_stack.getTop() + for setting_instance in global_user_container.findInstances(): + setting_key = setting_instance.definition.key + settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") + if settable_per_extruder: + limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) + extruder_stack = extruder_stacks[max(0, limit_to_extruder)] + extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) + global_user_container.removeInstance(setting_key) else: # Single extrusion From 59580c0ade189a6a131ba1f5e848ab0f0cef8072 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:52:58 +0200 Subject: [PATCH 045/764] Remove commented out code - CURA-4482 --- cura/Settings/GlobalStack.py | 10 ---------- cura/Settings/ProfilesModel.py | 1 - 2 files changed, 11 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 81f9db76d0..2f27c4ab72 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -61,16 +61,6 @@ class GlobalStack(CuraContainerStack): # \throws Exceptions.TooManyExtrudersError Raised when trying to add an extruder while we # already have the maximum number of extruders. def addExtruder(self, extruder: ContainerStack) -> None: - - # CURA-4482 - # extruder_count = self.getProperty("machine_extruder_count", "value") - - # CURA-4482 - # if extruder_count <= 1: - # Logger.log("i", "Not adding extruder[%s] to [%s] because it is a single-extrusion machine.", - # extruder.id, self.id) - # return - position = extruder.getMetaDataEntry("position") if position is None: Logger.log("w", "No position defined for extruder {extruder}, cannot add it to stack {stack}", extruder = extruder.id, stack = self.id) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index a46e3d146b..7432605481 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -91,7 +91,6 @@ class ProfilesModel(InstanceContainersModel): return extruder_stacks = self._getOrderedExtruderStacksList() - container_registry = ContainerRegistry.getInstance() # Get a list of usable/available qualities for this machine and material From 62cb5a48cb1634c2e47cd6bb5c153bcc92d537e4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 12:42:33 +0200 Subject: [PATCH 046/764] Refactor user profiles model to always use extruder stack - CURA-4482 --- cura/Settings/UserProfilesModel.py | 42 +++++++----------------------- 1 file changed, 9 insertions(+), 33 deletions(-) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index aa815ef4aa..5ae9055759 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -22,47 +22,23 @@ class UserProfilesModel(ProfilesModel): # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() - machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders and place the selected extruder at the front of the list. extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - else: - # if there is no active extruder, use the first one in the active extruder stacks - active_extruder = extruder_stacks[0] - extruder_stacks = new_extruder_stacks + extruder_stacks + extruder_stacks = self._getOrderedExtruderStacksList() - # Fetch the list of useable qualities across all extruders. + # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. - quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - - if multiple_extrusion: - # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is not None and - (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] - else: - # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return filtered_quality_changes From 7d46eead606170b7fab9c1f1e51b10caf554adf1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 26 Oct 2017 12:49:41 +0200 Subject: [PATCH 047/764] Fix broken unit tests due to evaluation context CURA-4498 --- tests/Settings/TestExtruderStack.py | 2 +- tests/Settings/TestGlobalStack.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/Settings/TestExtruderStack.py b/tests/Settings/TestExtruderStack.py index 66b4d51b04..6ed2c6649b 100644 --- a/tests/Settings/TestExtruderStack.py +++ b/tests/Settings/TestExtruderStack.py @@ -251,7 +251,7 @@ def test_getPropertyFallThrough(extruder_stack): for type_id, type_name in container_indices.IndexTypeMap.items(): container = unittest.mock.MagicMock() # Return type_id when asking for value and -1 when asking for limit_to_extruder - container.getProperty = lambda key, property, type_id = type_id: type_id if (key == "layer_height" and property == "value") else (None if property != "limit_to_extruder" else "-1") #Returns the container type ID as layer height, in order to identify it. + container.getProperty = lambda key, property, context = None, type_id = type_id: type_id if (key == "layer_height" and property == "value") else (None if property != "limit_to_extruder" else "-1") #Returns the container type ID as layer height, in order to identify it. container.hasProperty = lambda key, property: key == "layer_height" container.getMetaDataEntry = unittest.mock.MagicMock(return_value = type_name) mock_layer_heights[type_id] = container diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index 89dd76aec1..afd3d2b425 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -63,7 +63,7 @@ def test_addContainer(global_stack): ## Tests adding extruders to the global stack. def test_addExtruder(global_stack): mock_definition = unittest.mock.MagicMock() - mock_definition.getProperty = lambda key, property: 2 if key == "machine_extruder_count" and property == "value" else None + mock_definition.getProperty = lambda key, property, context = None: 2 if key == "machine_extruder_count" and property == "value" else None with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): global_stack.definition = mock_definition @@ -318,7 +318,7 @@ def test_getPropertyFallThrough(global_stack): container_indexes = cura.Settings.CuraContainerStack._ContainerIndexes #Cache. for type_id, type_name in container_indexes.IndexTypeMap.items(): container = unittest.mock.MagicMock() - container.getProperty = lambda key, property, type_id = type_id: type_id if (key == "layer_height" and property == "value") else None #Returns the container type ID as layer height, in order to identify it. + container.getProperty = lambda key, property, context = None, type_id = type_id: type_id if (key == "layer_height" and property == "value") else None #Returns the container type ID as layer height, in order to identify it. container.hasProperty = lambda key, property: key == "layer_height" container.getMetaDataEntry = unittest.mock.MagicMock(return_value = type_name) mock_layer_heights[type_id] = container @@ -355,7 +355,7 @@ def test_getPropertyFallThrough(global_stack): ## In definitions, test whether having no resolve allows us to find the value. def test_getPropertyNoResolveInDefinition(global_stack): value = unittest.mock.MagicMock() #Just sets the value for bed temperature. - value.getProperty = lambda key, property: 10 if (key == "material_bed_temperature" and property == "value") else None + value.getProperty = lambda key, property, context = None: 10 if (key == "material_bed_temperature" and property == "value") else None with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = value @@ -365,7 +365,7 @@ def test_getPropertyNoResolveInDefinition(global_stack): # must get the resolve first. def test_getPropertyResolveInDefinition(global_stack): resolve_and_value = unittest.mock.MagicMock() #Sets the resolve and value for bed temperature. - resolve_and_value.getProperty = lambda key, property: (7.5 if property == "resolve" else 5) if (key == "material_bed_temperature" and property in ("resolve", "value")) else None #7.5 resolve, 5 value. + resolve_and_value.getProperty = lambda key, property, context = None: (7.5 if property == "resolve" else 5) if (key == "material_bed_temperature" and property in ("resolve", "value")) else None #7.5 resolve, 5 value. with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = resolve_and_value @@ -378,9 +378,9 @@ def test_getPropertyResolveInInstance(global_stack): instance_containers = {} for container_type in container_indices.IndexTypeMap: instance_containers[container_type] = unittest.mock.MagicMock() #Sets the resolve and value for bed temperature. - instance_containers[container_type].getProperty = lambda key, property: (7.5 if property == "resolve" else (InstanceState.User if property == "state" else (5 if property != "limit_to_extruder" else "-1"))) if (key == "material_bed_temperature") else None #7.5 resolve, 5 value. + instance_containers[container_type].getProperty = lambda key, property, context = None: (7.5 if property == "resolve" else (InstanceState.User if property == "state" else (5 if property != "limit_to_extruder" else "-1"))) if (key == "material_bed_temperature") else None #7.5 resolve, 5 value. instance_containers[container_type].getMetaDataEntry = unittest.mock.MagicMock(return_value = container_indices.IndexTypeMap[container_type]) #Make queries for the type return the desired type. - instance_containers[container_indices.Definition].getProperty = lambda key, property: 10 if (key == "material_bed_temperature" and property == "value") else None #Definition only has value. + instance_containers[container_indices.Definition].getProperty = lambda key, property, context = None: 10 if (key == "material_bed_temperature" and property == "value") else None #Definition only has value. with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = instance_containers[container_indices.Definition] #Stack must have a definition. @@ -402,10 +402,10 @@ def test_getPropertyResolveInInstance(global_stack): # definitions. def test_getPropertyInstancesBeforeResolve(global_stack): value = unittest.mock.MagicMock() #Sets just the value. - value.getProperty = lambda key, property: (10 if property == "value" else (InstanceState.User if property != "limit_to_extruder" else "-1")) if key == "material_bed_temperature" else None + value.getProperty = lambda key, property, context = None: (10 if property == "value" else (InstanceState.User if property != "limit_to_extruder" else "-1")) if key == "material_bed_temperature" else None value.getMetaDataEntry = unittest.mock.MagicMock(return_value = "quality") resolve = unittest.mock.MagicMock() #Sets just the resolve. - resolve.getProperty = lambda key, property: 7.5 if (key == "material_bed_temperature" and property == "resolve") else None + resolve.getProperty = lambda key, property, context = None: 7.5 if (key == "material_bed_temperature" and property == "resolve") else None with unittest.mock.patch("cura.Settings.CuraContainerStack.DefinitionContainer", unittest.mock.MagicMock): #To guard against the type checking. global_stack.definition = resolve From 79754209015e7fce11a66cbc7870a6946245c86f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 13:34:59 +0200 Subject: [PATCH 048/764] Always set active extruder index when loading active machine on start - CURA-4482 --- cura/Settings/MachineManager.py | 5 ++--- cura/Settings/QualitySettingsModel.py | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index fc5c415f87..d0f5cfb119 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -106,9 +106,8 @@ class MachineManager(QObject): if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacks(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) - if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - # Make sure _active_container_stack is properly initiated - ExtruderManager.getInstance().setActiveExtruderIndex(0) + # Make sure _active_container_stack is properly initiated + ExtruderManager.getInstance().setActiveExtruderIndex(0) self._auto_materials_changed = {} self._auto_hotends_changed = {} diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 2ab4e2a9b5..d0379dc510 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -224,7 +224,6 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if self._extruder_id == "" and settable_per_extruder: continue - label = definition.label if self._i18n_catalog: label = self._i18n_catalog.i18nc(definition.key + " label", label) From 0b5709605654c91e17bf7b4bc7de57f751306659 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 13:44:47 +0200 Subject: [PATCH 049/764] Always use extruder stacks when switching global container in machine manager - CURA-4482 --- cura/Settings/MachineManager.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d0f5cfb119..c52dc65bf3 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -248,13 +248,13 @@ class MachineManager(QObject): if old_index is not None: extruder_manager.setActiveExtruderIndex(old_index) - self._auto_hotends_changed = {} #Processed all of them now. + self._auto_hotends_changed = {} # Processed all of them now. def _onGlobalContainerChanged(self): if self._global_container_stack: try: self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged) - except TypeError: #pyQtSignal gives a TypeError when disconnecting from something that was already disconnected. + except TypeError: # pyQtSignal gives a TypeError when disconnecting from something that was already disconnected. pass try: self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) @@ -270,10 +270,9 @@ class MachineManager(QObject): quality = self._global_container_stack.quality quality.nameChanged.disconnect(self._onQualityNameChanged) - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): - extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) - extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): + extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) + extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) self._global_container_stack = Application.getInstance().getGlobalContainerStack() From 0021dee84bd89705e13739459c6d7f0a52689894 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 14:04:05 +0200 Subject: [PATCH 050/764] Always use extruder stacks when copying value to all extruder - CURA-4482 --- cura/Settings/MachineManager.py | 56 +++++++++++++++------------------ 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c52dc65bf3..f547ccf4a7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -264,9 +264,12 @@ class MachineManager(QObject): self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) except TypeError: pass + + # TODO: remove this - CURA-4482 material = self._global_container_stack.material material.nameChanged.disconnect(self._onMaterialNameChanged) + # TODO: remove this - CURA-4482 quality = self._global_container_stack.quality quality.nameChanged.disconnect(self._onQualityNameChanged) @@ -274,41 +277,33 @@ class MachineManager(QObject): extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + # update the local global container stack reference self._global_container_stack = Application.getInstance().getGlobalContainerStack() self.globalContainerChanged.emit() + # after switching the global stack we reconnect all the signals and set the variant and material references if self._global_container_stack: Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) + self._global_container_stack.nameChanged.connect(self._onMachineNameChanged) self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - # For multi-extrusion machines, we do not want variant or material profiles in the stack, - # because these are extruder specific and may cause wrong values to be used for extruders - # that did not specify a value in the extruder. - global_variant = self._global_container_stack.variant - if global_variant != self._empty_variant_container: - self._global_container_stack.setVariant(self._empty_variant_container) + # set the global variant to empty as we now use the extruder stack at all times - CURA-4482 + global_variant = self._global_container_stack.variant + if global_variant != self._empty_variant_container: + self._global_container_stack.setVariant(self._empty_variant_container) - global_material = self._global_container_stack.material - if global_material != self._empty_material_container: - self._global_container_stack.setMaterial(self._empty_material_container) + # set the global material to empty as we now use the extruder stack at all times - CURA-4482 + global_material = self._global_container_stack.material + if global_material != self._empty_material_container: + self._global_container_stack.setMaterial(self._empty_material_container) - for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): #Listen for changes on all extruder stacks. - extruder_stack.propertyChanged.connect(self._onPropertyChanged) - extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) - - else: - material = self._global_container_stack.material - material.nameChanged.connect(self._onMaterialNameChanged) - - quality = self._global_container_stack.quality - quality.nameChanged.connect(self._onQualityNameChanged) - - self._active_container_stack = self._global_container_stack - self.activeStackChanged.emit() + # Listen for changes on all extruder stacks + for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): + extruder_stack.propertyChanged.connect(self._onPropertyChanged) + extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) self._error_check_timer.start() @@ -721,15 +716,16 @@ class MachineManager(QObject): ## Copy the value of the setting of the current extruder to all other extruders as well as the global container. @pyqtSlot(str) def copyValueToExtruders(self, key: str): - if not self._active_container_stack or self._global_container_stack.getProperty("machine_extruder_count", "value") <= 1: - return - new_value = self._active_container_stack.getProperty(key, "value") - stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] - stacks.append(self._global_container_stack) - for extruder_stack in stacks: + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + + # TODO: remove this - CURA-4482 + extruder_stacks.append(self._global_container_stack) + + # check in which stack the value has to be replaced + for extruder_stack in extruder_stacks: if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.getTop().setProperty(key, "value", new_value) + extruder_stack.userChanges.setProperty(key, "value", new_value) ## Set the active material by switching out a container # Depending on from/to material+current variant, a quality profile is chosen and set. From d6ef96a8250528a50ee6f7a0eb33b3d8ad6d62a3 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 14:07:47 +0200 Subject: [PATCH 051/764] Add todo comment --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f547ccf4a7..68302186b7 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -725,7 +725,7 @@ class MachineManager(QObject): # check in which stack the value has to be replaced for extruder_stack in extruder_stacks: if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.userChanges.setProperty(key, "value", new_value) + extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved ## Set the active material by switching out a container # Depending on from/to material+current variant, a quality profile is chosen and set. From 8378c6f3c94a878ea7156057cc1d2d7addeacf18 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 14:30:18 +0200 Subject: [PATCH 052/764] Always add extruder quality changes when getting quality changes by name - CURA-4482 --- cura/Settings/MachineManager.py | 57 +++++++++++++++++---------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 68302186b7..26de5dba87 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -945,10 +945,8 @@ class MachineManager(QObject): quality_manager = QualityManager.getInstance() global_container_stack = self._global_container_stack - global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) - - quality_changes_profiles = quality_manager.findQualityChangesByName(quality_changes_name, - global_machine_definition) + global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) + quality_changes_profiles = quality_manager.findQualityChangesByName(quality_changes_name, global_machine_definition) global_quality_changes = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") is None] if global_quality_changes: @@ -956,47 +954,52 @@ class MachineManager(QObject): else: Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) return None + + # TODO: remove this - CURA-4482 material = global_container_stack.material - # For the global stack, find a quality which matches the quality_type in - # the quality changes profile and also satisfies any material constraints. + # find a quality type that matches both machine and materials quality_type = global_quality_changes.getMetaDataEntry("quality_type") - if global_container_stack.getProperty("machine_extruder_count", "value") > 1: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = True) - else: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not global_quality: - global_quality = self._empty_quality_container - # Find the values for each extruder. extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - for stack in extruder_stacks: - extruder_definition = quality_manager.getParentMachineDefinition(stack.getBottom()) + # append the extruder quality changes + for extruder_stack in extruder_stacks: + extruder_definition = quality_manager.getParentMachineDefinition(extruder_stack.definition) + + quality_changes_list = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") == extruder_definition.getId()] - quality_changes_list = [qcp for qcp in quality_changes_profiles - if qcp.getMetaDataEntry("extruder") == extruder_definition.getId()] if quality_changes_list: quality_changes = quality_changes_list[0] + # TODO: remove this - CURA-4482 else: quality_changes = global_quality_changes if not quality_changes: quality_changes = self._empty_quality_changes_container - material = stack.material + material = extruder_stack.material quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not quality: #No quality profile found for this quality type. + + if not quality: + # No quality profile found for this quality type. quality = self._empty_quality_container - result.append({"stack": stack, "quality": quality, "quality_changes": quality_changes}) + result.append({ + "stack": extruder_stack, + "quality": quality, + "quality_changes": quality_changes + }) - if extruder_stacks: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True") - if not global_quality: - global_quality = self._empty_quality_container - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes}) - else: - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes}) + # append the global quality changes + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = True) + if not global_quality: + global_quality = self._empty_quality_container + + result.append({ + "stack": global_container_stack, + "quality": global_quality, + "quality_changes": global_quality_changes + }) return result From 938ae5af1deaffe53ef3244f6ff0f59e06442f12 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 26 Oct 2017 14:36:23 +0200 Subject: [PATCH 053/764] Added function to catch prepare and monitor button click CURA-4062 --- resources/qml/Topbar.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 5dacfc72ea..c69c786d5a 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -30,9 +30,11 @@ Rectangle Component.onCompleted: { startMonitoringPrint.connect(function () { base.monitoringPrint = true + UM.Controller.disableModelRendering() }) stopMonitoringPrint.connect(function () { base.monitoringPrint = false + UM.Controller.enableModelRendering() }) } From 38fdb5e56f72aa96ffc04f87e9877196fce05dd6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 14:45:24 +0200 Subject: [PATCH 054/764] Refactor extruders model to always use extruder stacks + cleanup - CURA-4482 --- cura/Settings/ExtrudersModel.py | 72 +++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index b13e51723b..f2bb9f761c 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -66,18 +66,18 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self._update_extruder_timer = QTimer() self._update_extruder_timer.setInterval(100) self._update_extruder_timer.setSingleShot(True) - self._update_extruder_timer.timeout.connect(self.__updateExtruders) + self._update_extruder_timer.connect(self.__updateExtruders) self._add_global = False self._simple_names = False - self._active_machine_extruders = [] # type: Iterable[ExtruderStack] + self._active_machine_extruders = [] # type: Iterable[ExtruderStack] self._add_optional_extruder = False - #Listen to changes. - Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) #When the machine is swapped we must update the active machine extruders. - ExtruderManager.getInstance().extrudersChanged.connect(self._extrudersChanged) #When the extruders change we must link to the stack-changed signal of the new extruder. - self._extrudersChanged() #Also calls _updateExtruders. + # Listen to changes + Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) # When the machine is swapped we must update the active machine extruders + ExtruderManager.getInstance().extrudersChanged.connect(self._extrudersChanged) # When the extruders change we must link to the stack-changed signal of the new extruder + self._extrudersChanged() # Also calls _updateExtruders def setAddGlobal(self, add): if add != self._add_global: @@ -128,21 +128,24 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): def _extrudersChanged(self, machine_id = None): if machine_id is not None: if Application.getInstance().getGlobalContainerStack() is None: - return #No machine, don't need to update the current machine's extruders. + # No machine, don't need to update the current machine's extruders + return if machine_id != Application.getInstance().getGlobalContainerStack().getId(): - return #Not the current machine. - #Unlink from old extruders. + # Not the current machine + return + + # Unlink from old extruders for extruder in self._active_machine_extruders: extruder.containersChanged.disconnect(self._onExtruderStackContainersChanged) - #Link to new extruders. + # Link to new extruders self._active_machine_extruders = [] extruder_manager = ExtruderManager.getInstance() for extruder in extruder_manager.getExtruderStacks(): extruder.containersChanged.connect(self._onExtruderStackContainersChanged) self._active_machine_extruders.append(extruder) - self._updateExtruders() #Since the new extruders may have different properties, update our own model. + self._updateExtruders() # Since the new extruders may have different properties, update our own model. def _onExtruderStackContainersChanged(self, container): # Update when there is an empty container or material change @@ -150,7 +153,6 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # The ExtrudersModel needs to be updated when the material-name or -color changes, because the user identifies extruders by material-name self._updateExtruders() - modelChanged = pyqtSignal() def _updateExtruders(self): @@ -161,14 +163,17 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # This should be called whenever the list of extruders changes. @UM.FlameProfiler.profile def __updateExtruders(self): - changed = False + extruders_changed = False if self.rowCount() != 0: - changed = True + extruders_changed = True items = [] + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: + + # TODO: remove this - CURA-4482 if self._add_global: material = global_container_stack.material color = material.getMetaDataEntry("color_code", default = self.defaultColors[0]) if material else self.defaultColors[0] @@ -180,40 +185,44 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "definition": "" } items.append(item) - changed = True + extruders_changed = True + # get machine extruder count for verification machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - manager = ExtruderManager.getInstance() - for extruder in manager.getMachineExtruders(global_container_stack.getId()): + + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()): position = extruder.getMetaDataEntry("position", default = "0") # Get the position try: position = int(position) - except ValueError: #Not a proper int. + except ValueError: + # Not a proper int. position = -1 if position >= machine_extruder_count: continue - extruder_name = extruder.getName() - material = extruder.material - variant = extruder.variant - default_color = self.defaultColors[position] if position >= 0 and position < len(self.defaultColors) else self.defaultColors[0] - color = material.getMetaDataEntry("color_code", default = default_color) if material else default_color - item = { #Construct an item with only the relevant information. + default_color = self.defaultColors[position] if 0 <= position < len(self.defaultColors) else self.defaultColors[0] + color = extruder.material.getMetaDataEntry("color_code", default = default_color) if material else default_color + + # construct an item with only the relevant information + item = { "id": extruder.getId(), - "name": extruder_name, + "name": extruder.getName(), "color": color, "index": position, "definition": extruder.getBottom().getId(), - "material": material.getName() if material else "", - "variant": variant.getName() if variant else "", + "material": extruder.material.getName() if material else "", + "variant": extruder.variant.getName() if extruder.variant else "", # e.g. print core } - items.append(item) - changed = True - if changed: + items.append(item) + extruders_changed = True + + if extruders_changed: + # sort by extruder index items.sort(key = lambda i: i["index"]) + # We need optional extruder to be last, so add it after we do sorting. - # This way we can simply intrepret the -1 of the index as the last item (which it now always is) + # This way we can simply interpret the -1 of the index as the last item (which it now always is) if self._add_optional_extruder: item = { "id": "", @@ -223,5 +232,6 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "definition": "" } items.append(item) + self.setItems(items) self.modelChanged.emit() From 723f6ce2265c889cb3f5b4385420fc43cf7f3238 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 15:10:52 +0200 Subject: [PATCH 055/764] Only get extruder settings from extruder stack - CURA-4482 --- cura/Settings/ExtruderManager.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 50525b6aeb..0b48568364 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -398,16 +398,12 @@ class ExtruderManager(QObject): # \param setting_key \type{str} The setting to get the property of. # \param property \type{str} The property to get. # \return \type{List} the list of results - def getAllExtruderSettings(self, setting_key, property): - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack.getProperty("machine_extruder_count", "value") <= 1: - return [global_container_stack.getProperty(setting_key, property)] - + def getAllExtruderSettings(self, setting_key: str, prop: str): result = [] for index in self.extruderIds: extruder_stack_id = self.extruderIds[str(index)] - stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - result.append(stack.getProperty(setting_key, property)) + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + result.append(extruder_stack.getProperty(setting_key, prop)) return result ## Gets the extruder stacks that are actually being used at the moment. From 9b066ea78be8c0bdda7c57a6cdf3b7e75e69b1a3 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 26 Oct 2017 15:27:01 +0200 Subject: [PATCH 056/764] CURA-4451 Bring back again the PP 0.4 fast profile of UM2+ that was deleted by mistake --- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg new file mode 100644 index 0000000000..d471e39853 --- /dev/null +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -0,0 +1,71 @@ +[general] +version = 2 +name = Normal +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pp_ultimaker2_plus_0.4_mm +weight = -1 +quality_type = fast +setting_version = 3 + +[values] +acceleration_enabled = True +acceleration_layer_0 = =acceleration_topbottom +acceleration_prime_tower = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_interface = =acceleration_topbottom +acceleration_topbottom = =math.ceil(acceleration_print * 500 / 4000) +acceleration_wall = =math.ceil(acceleration_print * 1000 / 4000) +acceleration_wall_0 = =math.ceil(acceleration_wall * 500 / 1000) +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + 4 * layer_height +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 20 +infill_line_width = =round(line_width * 0.4 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cubic +infill_wipe_dist = 0 +jerk_enabled = True +jerk_layer_0 = =jerk_topbottom +jerk_prime_tower = =math.ceil(jerk_print * 15 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_interface = =jerk_topbottom +jerk_topbottom = =math.ceil(jerk_print * 5 / 25) +jerk_wall = =math.ceil(jerk_print * 10 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 5 / 10) +layer_height = 0.15 +line_width = =machine_nozzle_size * 0.95 +multiple_mesh_overlap = 0 +retraction_count_max = 12 +retraction_extrusion_window = 1 +retraction_hop = 0.15 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.5 +retraction_prime_speed = 15 +skin_overlap = 10 +speed_layer_0 = 25 +speed_prime_tower = =speed_topbottom +speed_print = 25 +speed_support_interface = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel = 250 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 20 / 25) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_xy_distance = =wall_line_width_0 * 2.5 +support_xy_distance_overhang = =wall_line_width_0 +support_z_distance = =layer_height * 2 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.38 / 0.38, 2) +wall_thickness = 0.76 + From b9c318d4326ab684f33987488fb91e6d15f44f28 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 26 Oct 2017 16:53:31 +0200 Subject: [PATCH 057/764] CURA-4451 Minor changes --- cura/CrashHandler.py | 1 - cura/QualityManager.py | 7 ------- cura/Settings/ProfilesModel.py | 4 ++-- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index ad80d286c3..c6f94f0a80 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -75,7 +75,6 @@ class CrashHandler: ## Creates a modal dialog. def _createDialog(self): - self.dialog = QDialog() self.dialog.setMinimumWidth(640) self.dialog.setMinimumHeight(640) self.dialog.setWindowTitle(catalog.i18nc("@title:window", "Crash Report")) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 0312c50daf..abd14fa841 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -198,13 +198,6 @@ class QualityManager: else: materials.append(global_container_stack.material) - # if extruder_stacks: - # # Multi-extruder machine detected. - # materials = [stack.material for stack in extruder_stacks] - # else: - # # Machine with one extruder. - # materials = [global_container_stack.material] - quality_types = self.findAllQualityTypesForMachineAndMaterials(global_machine_definition, materials) # Map the list of quality_types to InstanceContainers diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 2981873de8..6353d3ce84 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -166,7 +166,7 @@ class ProfilesModel(InstanceContainersModel): for item in containers: profile = container_registry.findContainers(id = item["id"]) - # when the profile is not supported + # When for some reason there is no profile container in the registry if not profile: self._setItemLayerHeight(item, "", "") item["available"] = False @@ -175,7 +175,7 @@ class ProfilesModel(InstanceContainersModel): profile = profile[0] - # empty qualities should show in the list (they are "Not Supported" profiles) + # When there is a profile but it's an empty quality should. It's shown in the list (they are "Not Supported" profiles) if profile.getId() == "empty_quality": self._setItemLayerHeight(item, "", "") item["available"] = True From b91824aab1bad7391ab5b16623297e823b77e445 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 17:54:36 +0200 Subject: [PATCH 058/764] Move towards making extruder manager a first class citizen - CURA-4482 --- cura/BuildVolume.py | 51 +++++++++-------- cura/ConvexHullDecorator.py | 21 ++++--- cura/CuraApplication.py | 27 +++++---- cura/Settings/CuraStackBuilder.py | 5 +- cura/Settings/ExtruderManager.py | 58 ++++++++++++++------ cura/Settings/ExtrudersModel.py | 2 +- cura/Settings/MachineManager.py | 2 +- cura/Settings/QualityAndUserProfilesModel.py | 42 +++----------- cura/Settings/SettingInheritanceManager.py | 21 ++++--- 9 files changed, 121 insertions(+), 108 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e87bfebd94..ba9314477d 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -917,24 +917,23 @@ class BuildVolume(SceneNode): # which extruder to get the setting, if there are multiple extruders. # \param property The property to get from the setting. # \return The property of the specified setting in the specified extruder. - def _getSettingFromExtruder(self, setting_key, extruder_setting_key, property = "value"): - multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 + def _getSettingFromExtruder(self, setting_key, extruder_setting_key, prop = "value"): + extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") - if not multi_extrusion: - stack = self._global_container_stack + # TODO: remove this - CURA-4482 + if str(extruder_index) == "-1": # If extruder index is -1 use global instead + extruder_stack = self._global_container_stack else: - extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") + extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - if str(extruder_index) == "-1": # If extruder index is -1 use global instead - stack = self._global_container_stack - else: - extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + value = extruder_stack.getProperty(setting_key, prop) + setting_type = extruder_stack.getProperty(setting_key, "type") - value = stack.getProperty(setting_key, property) - setting_type = stack.getProperty(setting_key, "type") + # default 0 for numerical values if not value and (setting_type == "int" or setting_type == "float"): return 0 + return value ## Convenience function to calculate the disallowed radius around the edge. @@ -945,6 +944,7 @@ class BuildVolume(SceneNode): def _getEdgeDisallowedSize(self): if not self._global_container_stack: return 0 + container_stack = self._global_container_stack used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks() @@ -953,26 +953,33 @@ class BuildVolume(SceneNode): return 0.1 # Return a very small value, so we do draw disallowed area's near the edges. adhesion_type = container_stack.getProperty("adhesion_type", "value") + if adhesion_type == "skirt": skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") bed_adhesion_size = skirt_distance + (self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * skirt_line_count) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 - if len(used_extruders) > 1: - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - #We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the skirt with. + bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + elif adhesion_type == "brim": bed_adhesion_size = self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - #We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the brim with. + bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + elif adhesion_type == "raft": bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") + elif adhesion_type == "none": bed_adhesion_size = 0 + else: raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index bfeb690192..50fa8ce7f6 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -302,24 +302,23 @@ class ConvexHullDecorator(SceneNodeDecorator): self._onChanged() ## Private convenience function to get a setting from the correct extruder (as defined by limit_to_extruder property). - def _getSettingProperty(self, setting_key, property = "value"): + def _getSettingProperty(self, setting_key, prop = "value"): per_mesh_stack = self._node.callDecoration("getStack") if per_mesh_stack: - return per_mesh_stack.getProperty(setting_key, property) - - multi_extrusion = self._global_stack.getProperty("machine_extruder_count", "value") > 1 - if not multi_extrusion: - return self._global_stack.getProperty(setting_key, property) + return per_mesh_stack.getProperty(setting_key, prop) extruder_index = self._global_stack.getProperty(setting_key, "limit_to_extruder") - if extruder_index == "-1": #No limit_to_extruder. + if extruder_index == "-1": + # No limit_to_extruder extruder_stack_id = self._node.callDecoration("getActiveExtruder") - if not extruder_stack_id: #Decoration doesn't exist. + if not extruder_stack_id: + # Decoration doesn't exist extruder_stack_id = ExtruderManager.getInstance().extruderIds["0"] extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - return extruder_stack.getProperty(setting_key, property) - else: #Limit_to_extruder is set. The global stack handles this then. - return self._global_stack.getProperty(setting_key, property) + return extruder_stack.getProperty(setting_key, prop) + else: + # Limit_to_extruder is set. The global stack handles this then + return self._global_stack.getProperty(setting_key, prop) ## Returns true if node is a descendant or the same as the root node. def __isDescendant(self, root, node): diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1680e7c6a6..7904066966 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -200,6 +200,7 @@ class CuraApplication(QtApplication): self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. + self._extruder_manager = None self._material_manager = None self._setting_inheritance_manager = None self._simple_mode_settings_manager = None @@ -259,20 +260,24 @@ class CuraApplication(QtApplication): # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) + empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) + empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not Supported") empty_quality_container.addMetaDataEntry("quality_type", "normal") empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) + empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") @@ -413,7 +418,7 @@ class CuraApplication(QtApplication): def discardOrKeepProfileChangesClosed(self, option): if option == "discard": global_stack = self.getGlobalContainerStack() - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in self._extruder_manager.getMachineExtruders(global_stack.getId()): extruder.getTop().clear() global_stack.getTop().clear() @@ -421,7 +426,7 @@ class CuraApplication(QtApplication): # before slicing. To ensure that slicer uses right settings values elif option == "keep": global_stack = self.getGlobalContainerStack() - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in self._extruder_manager.getMachineExtruders(global_stack.getId()): user_extruder_container = extruder.getTop() if user_extruder_container: user_extruder_container.update() @@ -686,16 +691,13 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) - # Initialise extruder so as to listen to global container stack changes before the first global container stack is set. - ExtruderManager.getInstance() + qmlRegisterSingletonType(ExtruderManager, "Cura", 1, 0, "ExtruderManager", self.getExtruderManager) qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) - qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", - self.getSettingInheritanceManager) - qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", - self.getSimpleModeSettingsManager) - + qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager) + qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) + self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) self.initializeEngine() @@ -717,6 +719,11 @@ class CuraApplication(QtApplication): self._machine_manager = MachineManager.createMachineManager() return self._machine_manager + def getExtruderManager(self, *args): + if self._extruder_manager is None: + self._extruder_manager = ExtruderManager.createExtruderManager() + return self._extruder_manager + def getMaterialManager(self, *args): if self._material_manager is None: self._material_manager = MaterialManager.createMaterialManager() @@ -784,7 +791,7 @@ class CuraApplication(QtApplication): actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions") - engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.getInstance()) + # engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.getInstance()) for path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.QmlFiles): type_name = os.path.splitext(os.path.basename(path))[0] diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 09815da319..e3774b0153 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -62,6 +62,7 @@ class CuraStackBuilder: variant = "default", next_stack = new_global_stack ) + new_global_stack.addExtruder(new_extruder) return new_global_stack @@ -79,7 +80,9 @@ class CuraStackBuilder: stack.setName(definition.getName()) stack.setDefinition(definition) stack.addMetaDataEntry("position", definition.getMetaDataEntry("position")) - if "next_stack" in kwargs: #Add stacks before containers are added, since they may trigger a setting update. + + if "next_stack" in kwargs: + # Add stacks before containers are added, since they may trigger a setting update. stack.setNextStack(kwargs["next_stack"]) user_container = InstanceContainer(new_stack_id + "_user") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 0b48568364..a32b333326 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -83,18 +83,23 @@ class ExtruderManager(QObject): @pyqtProperty("QVariantMap", notify = extrudersChanged) def extruderIds(self): extruder_stack_ids = {} + global_stack_id = Application.getInstance().getGlobalContainerStack().getId() - extruder_stack_ids["-1"] = global_stack_id + + # TODO: remove this? - CURA-4482 + # extruder_stack_ids["-1"] = global_stack_id + if global_stack_id in self._extruder_trains: for position in self._extruder_trains[global_stack_id]: extruder_stack_ids[position] = self._extruder_trains[global_stack_id][position].getId() + return extruder_stack_ids @pyqtSlot(str, result = str) - def getQualityChangesIdByExtruderStackId(self, id: str) -> str: + def getQualityChangesIdByExtruderStackId(self, extruder_stack_id: str) -> str: for position in self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()]: extruder = self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][position] - if extruder.getId() == id: + if extruder.getId() == extruder_stack_id: return extruder.qualityChanges.getId() ## The instance of the singleton pattern. @@ -102,6 +107,10 @@ class ExtruderManager(QObject): # It's None if the extruder manager hasn't been created yet. __instance = None + @staticmethod + def createExtruderManager(): + return ExtruderManager() + ## Gets an instance of the extruder manager, or creates one if no instance # exists yet. # @@ -420,20 +429,21 @@ class ExtruderManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() container_registry = ContainerRegistry.getInstance() - if global_stack.getProperty("machine_extruder_count", "value") <= 1: #For single extrusion. - return [global_stack] - used_extruder_stack_ids = set() - #Get the extruders of all meshes in the scene. + # Get the extruders of all meshes in the scene support_enabled = False support_bottom_enabled = False support_roof_enabled = False + scene_root = Application.getInstance().getController().getScene().getRoot() - meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. + + # Get the extruders of all printable meshes in the scene + meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] for mesh in meshes: extruder_stack_id = mesh.callDecoration("getActiveExtruder") - if not extruder_stack_id: #No per-object settings for this node. + if not extruder_stack_id: + # No per-object settings for this node extruder_stack_id = self.extruderIds["0"] used_extruder_stack_ids.add(extruder_stack_id) @@ -469,9 +479,10 @@ class ExtruderManager(QObject): if support_roof_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) - #The platform adhesion extruder. Not used if using none. + # The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("adhesion_extruder_nr", "value"))]) + try: return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids] except IndexError: # One or more of the extruders was not found. @@ -518,10 +529,6 @@ class ExtruderManager(QObject): result = [] machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") - # In case the printer is using one extruder, shouldn't exist active extruder stacks - # if machine_extruder_count == 1: - # return result - if global_stack and global_stack.getId() in self._extruder_trains: for extruder in sorted(self._extruder_trains[global_stack.getId()]): result.append(self._extruder_trains[global_stack.getId()][extruder]) @@ -544,8 +551,23 @@ class ExtruderManager(QObject): ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self) -> None: global_stack = Application.getInstance().getGlobalContainerStack() + extruders_changed = False + if global_stack and global_stack.getBottom(): - self.addMachineExtruders(global_stack.getBottom(), global_stack.getId()) + container_registry = ContainerRegistry.getInstance() + machine_id = global_stack.getBottom().getId() + + # Gets the extruder trains that we just created as well as any that still existed. + extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) + for extruder_train in extruder_trains: + self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train + + # regardless of what the next stack is, we have to set it again, because of signal routing. + extruder_train.setNextStack(global_stack) + extruders_changed = True + + if extruders_changed: + self.extrudersChanged.emit(machine_id) ## Get all extruder values for a certain setting. # @@ -560,7 +582,7 @@ class ExtruderManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() result = [] - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getMachineExtruders(global_stack.getId()): # only include values from extruders that are "active" for the current machine instance if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value"): continue @@ -600,7 +622,7 @@ class ExtruderManager(QObject): } result = [] - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getMachineExtruders(global_stack.getId()): # only include values from extruders that are "active" for the current machine instance if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): continue @@ -624,7 +646,7 @@ class ExtruderManager(QObject): # # This is exposed to qml for display purposes # - # \param key The key of the setting to retieve values for. + # \param key The key of the setting to retrieve values for. # # \return String representing the extruder values @pyqtSlot(str, result="QVariant") diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index f2bb9f761c..996bf51138 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -66,7 +66,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self._update_extruder_timer = QTimer() self._update_extruder_timer.setInterval(100) self._update_extruder_timer.setSingleShot(True) - self._update_extruder_timer.connect(self.__updateExtruders) + self._update_extruder_timer.timeout.connect(self.__updateExtruders) self._add_global = False self._simple_names = False diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 26de5dba87..c4be25abd9 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1173,7 +1173,7 @@ class MachineManager(QObject): return containers[0].getBottom().getId() @staticmethod - def createMachineManager(engine=None, script_engine=None): + def createMachineManager(): return MachineManager() @deprecated("Use ExtruderStack.material = ... and it won't be necessary", "2.7") diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 9d7d913d5e..2e181c6031 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -22,47 +22,23 @@ class QualityAndUserProfilesModel(ProfilesModel): # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() - machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - else: - # if there is no active extruder, use the first one in the active extruder stacks - active_extruder = extruder_stacks[0] - extruder_stacks = new_extruder_stacks + extruder_stacks + extruder_stacks = self._getOrderedExtruderStacksList() - # Fetch the list of useable qualities across all extruders. + # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. - quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - - if multiple_extrusion: - # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is not None and - (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] - else: - # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return quality_list + filtered_quality_changes diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 8c9f5b20d6..00f637d34c 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -47,21 +47,20 @@ class SettingInheritanceManager(QObject): @pyqtSlot(str, str, result = "QStringList") def getOverridesForExtruder(self, key, extruder_index): - multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 - if not multi_extrusion: - return self._settings_with_inheritance_warning - extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) - if not extruder: - Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) - return [] + result = [] - definitions = self._global_container_stack.definition.findDefinitions(key=key) + extruder_stack = ExtruderManager.getInstance().getExtruderStack(extruder_index) + if not extruder_stack: + Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) + return result + + definitions = self._global_container_stack.definition.findDefinitions(key = key) if not definitions: Logger.log("w", "Could not find definition for key [%s] (2)", key) - return [] - result = [] + return result + for key in definitions[0].getAllKeys(): - if self._settingIsOverwritingInheritance(key, extruder): + if self._settingIsOverwritingInheritance(key, extruder_stack): result.append(key) return result From ee228155af1677f3f375fb0b28b53ecef744d4d2 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 27 Oct 2017 09:24:31 +0200 Subject: [PATCH 059/764] Remove unnecessary properties which after update triggered view rendering CURA-4062 --- resources/qml/Cura.qml | 3 --- 1 file changed, 3 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..934fc58017 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -344,9 +344,6 @@ UM.MainWindow { id: toolbar; - property int mouseX: base.mouseX - property int mouseY: base.mouseY - anchors { top: openFileButton.bottom; topMargin: UM.Theme.getSize("window_margin").height; From ff5b9eefea41363d1eb230431cf7eeee7532b9fc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 27 Oct 2017 09:33:09 +0200 Subject: [PATCH 060/764] Minor improvement to German translation of 'Check all' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks to @app-js. 'Alles auswählen' didn't fit. Fixes #2689. --- resources/i18n/de_DE/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 6bb71a5ae0..179994a4a6 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -2519,7 +2519,7 @@ msgstr "Sichtbarkeit einstellen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 msgctxt "@label:textbox" msgid "Check all" -msgstr "Alle prüfen" +msgstr "Alles wählen" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 msgctxt "@info:status" From fe70e1908977bea3dc2ed7e182585dc583cca0aa Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 27 Oct 2017 10:56:46 +0200 Subject: [PATCH 061/764] Reset extruder numbers whose values are no longer valid CURA-4176 After the user changes the number of extruders for a machine, some extruder number settings may not have valid values any more. These settings need to be reset.` --- .../MachineSettingsAction.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 4343c2c780..360dae7a2c 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -147,6 +147,7 @@ class MachineSettingsAction(MachineAction): for setting_instance in extruder_user_container.findInstances(): setting_key = setting_instance.definition.key settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") + if settable_per_extruder: limit_to_extruder = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") @@ -154,11 +155,16 @@ class MachineSettingsAction(MachineAction): global_user_container.setProperty(setting_key, "value", extruder_user_container.getProperty(setting_key, "value")) extruder_user_container.removeInstance(setting_key) - # Check to see if any features are set to print with an extruder that will no longer exist - for setting_key in ["adhesion_extruder_nr", "support_extruder_nr", "support_extruder_nr_layer_0", "support_infill_extruder_nr", "support_interface_extruder_nr"]: - if int(self._global_container_stack.getProperty(setting_key, "value")) > extruder_count - 1: - Logger.log("i", "Lowering %s setting to match number of extruders", setting_key) - self._global_container_stack.getTop().setProperty(setting_key, "value", extruder_count - 1) + # reset all extruder number settings whose value is no longer valid + for setting_instance in self._global_container_stack.userChanges.findInstances(): + setting_key = setting_instance.definition.key + if not self._global_container_stack.getProperty(setting_key, "type") in ("extruder", "optional_extruder"): + continue + + old_value = int(self._global_container_stack.userChanges.getProperty(setting_key, "value")) + if old_value >= extruder_count: + self._global_container_stack.userChanges.removeInstance(setting_key) + Logger.log("d", "Reset [%s] because its old value [%s] is no longer valid ", setting_key, old_value) # Check to see if any objects are set to print with an extruder that will no longer exist root_node = Application.getInstance().getController().getScene().getRoot() From 7e6e0e20211362e71d98b576f55d09abc26a707b Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 27 Oct 2017 11:18:46 +0200 Subject: [PATCH 062/764] Remove "not supported" quality files for "Builder premium" printer CURA-4436 --- .../bp_ABS_Coarse_Quality.inst.cfg | 14 ----------- .../bp_ABS_High_Quality.inst.cfg | 14 ----------- .../bp_ABS_Normal_Quality.inst.cfg | 14 ----------- .../bp_BVOH_Coarse_Quality.inst.cfg | 24 ------------------ .../bp_BVOH_High_Quality.inst.cfg | 25 ------------------- .../bp_BVOH_Normal_Quality.inst.cfg | 23 ----------------- .../bp_CPE_Coarse_Quality.inst.cfg | 14 ----------- .../bp_CPE_High_Quality.inst.cfg | 14 ----------- .../bp_CPE_Normal_Quality.inst.cfg | 14 ----------- .../bp_HIPS_Coarse_Quality.inst.cfg | 15 ----------- .../bp_HIPS_High_Quality.inst.cfg | 14 ----------- .../bp_HIPS_Normal_Quality.inst.cfg | 14 ----------- .../bp_Innoflex60_Coarse_Quality.inst.cfg | 24 ------------------ .../bp_Innoflex60_High_Quality.inst.cfg | 25 ------------------- .../bp_Innoflex60_Normal_Quality.inst.cfg | 23 ----------------- .../bp_Nylon_Coarse_Quality.inst.cfg | 14 ----------- .../bp_Nylon_High_Quality.inst.cfg | 14 ----------- .../bp_Nylon_Normal_Quality.inst.cfg | 14 ----------- .../bp_PC_Coarse_Quality.inst.cfg | 14 ----------- .../bp_PC_High_Quality.inst.cfg | 14 ----------- .../bp_PC_Normal_Quality.inst.cfg | 14 ----------- .../bp_PET_Coarse_Quality.inst.cfg | 24 ------------------ .../bp_PET_High_Quality.inst.cfg | 25 ------------------- .../bp_PET_Normal_Quality.inst.cfg | 23 ----------------- .../bp_PLA_Coarse_Quality.inst.cfg | 1 + .../bp_PLA_High_Quality.inst.cfg | 1 + .../bp_PLA_Normal_Quality.inst.cfg | 1 + .../bp_PVA_Coarse_Quality.inst.cfg | 24 ------------------ .../bp_PVA_High_Quality.inst.cfg | 25 ------------------- .../bp_PVA_Normal_Quality.inst.cfg | 23 ----------------- .../bp_global_Coarse_Quality.inst.cfg | 14 ----------- .../bp_global_High_Quality.inst.cfg | 14 ----------- .../bp_global_Normal_Quality.inst.cfg | 14 ----------- 33 files changed, 3 insertions(+), 541 deletions(-) delete mode 100644 resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_global_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg diff --git a/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg deleted file mode 100644 index 4e1294fdb6..0000000000 --- a/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_abs_175 -setting_version = 3 -weight = -1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg deleted file mode 100644 index e6ec6b2158..0000000000 --- a/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_abs_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg deleted file mode 100644 index c033dca279..0000000000 --- a/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_abs_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg deleted file mode 100644 index 80bc8adaa6..0000000000 --- a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = verbatim_bvoh_175 -setting_version = 3 -weight = -1 - -[values] -material_print_temperature = =default_material_print_temperature + 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.3 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 40 - diff --git a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg deleted file mode 100644 index 54ff19f0c6..0000000000 --- a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[general] -version = 2 -name = High Quality -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = verbatim_bvoh_175 -setting_version = 3 -weight = 1 - -[values] -acceleration_print = 2000 -material_print_temperature = =default_material_print_temperature + 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.1 -top_thickness = =layer_height * 7 -bottom_thickness = =layer_height * 5 -speed_print = 40 -layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg deleted file mode 100644 index 8d026391db..0000000000 --- a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[general] -version = 2 -name = Normal -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = verbatim_bvoh_175 -setting_version = 3 -weight = 0 - -[values] -material_print_temperature = =default_material_print_temperature + 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.2 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg deleted file mode 100644 index 4f5c56af04..0000000000 --- a/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_cpe_175 -setting_version = 3 -weight = -1 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg deleted file mode 100644 index dfa7302ee0..0000000000 --- a/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_cpe_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg deleted file mode 100644 index 8a72c81b16..0000000000 --- a/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg deleted file mode 100644 index 646f69cee1..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_hips_175 -setting_version = 3 -weight = -1 -supported = False - -[values] - diff --git a/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg deleted file mode 100644 index cb28b7c3d4..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_hips_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg deleted file mode 100644 index 49ae840c49..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_hips_175 -setting_version = 3 -weight = 0 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg deleted file mode 100644 index 32a3695148..0000000000 --- a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = innofill_innoflex60_175 -setting_version = 3 -weight = -1 - -[values] -material_print_temperature = =default_material_print_temperature -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.3 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 30 - diff --git a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg deleted file mode 100644 index 43d547436b..0000000000 --- a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[general] -version = 2 -name = High Quality -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = innofill_innoflex60_175 -setting_version = 3 -weight = 1 - -[values] -acceleration_print = 2000 -material_print_temperature = =default_material_print_temperature -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.1 -top_thickness = =layer_height * 7 -bottom_thickness = =layer_height * 5 -speed_print = 30 -layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg deleted file mode 100644 index 658e868a5f..0000000000 --- a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[general] -version = 2 -name = Normal -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = innofill_innoflex60_175 -setting_version = 3 -weight = 0 - -[values] -material_print_temperature = =default_material_print_temperature -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.2 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 30 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg deleted file mode 100644 index 14441b7c6c..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg deleted file mode 100644 index 90f9a2ed84..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg deleted file mode 100644 index b943f0bd02..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg deleted file mode 100644 index c7c5782d96..0000000000 --- a/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg deleted file mode 100644 index 01f5845748..0000000000 --- a/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg deleted file mode 100644 index 26a2183a91..0000000000 --- a/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg deleted file mode 100644 index fb56005655..0000000000 --- a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_petg_175 -setting_version = 3 -weight = -1 - -[values] -material_print_temperature = =default_material_print_temperature - 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.3 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 60 - diff --git a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg deleted file mode 100644 index f6e735deb0..0000000000 --- a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[general] -version = 2 -name = High Quality -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_petg_175 -setting_version = 3 -weight = 1 - -[values] -acceleration_print = 2000 -material_print_temperature = =default_material_print_temperature - 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.1 -top_thickness = =layer_height * 7 -bottom_thickness = =layer_height * 5 -speed_print = 40 -layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg deleted file mode 100644 index 13b1e90be6..0000000000 --- a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[general] -version = 2 -name = Normal -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_petg_175 -setting_version = 3 -weight = 0 - -[values] -material_print_temperature = =default_material_print_temperature - 5 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.2 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 50 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg index 88b1a899e9..2a7089f3fe 100644 --- a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg @@ -9,6 +9,7 @@ quality_type = coarse material = generic_pla_175 setting_version = 3 weight = -1 +global_quality = True [values] material_print_temperature = =default_material_print_temperature + 15 diff --git a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg index a61b4ee958..d2b0dae2bb 100644 --- a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg @@ -9,6 +9,7 @@ quality_type = high material = generic_pla_175 setting_version = 3 weight = 1 +global_quality = True [values] acceleration_print = 2000 diff --git a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg index 6b0648b4e4..ee5b771912 100644 --- a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg @@ -9,6 +9,7 @@ quality_type = normal material = generic_pla_175 setting_version = 3 weight = 0 +global_quality = True [values] material_print_temperature = =default_material_print_temperature + 15 diff --git a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg deleted file mode 100644 index fe0c1046b8..0000000000 --- a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_pva_175 -setting_version = 3 -weight = -1 - -[values] -material_print_temperature = =default_material_print_temperature + 10 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.3 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 40 - diff --git a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg deleted file mode 100644 index 13c6c7ef89..0000000000 --- a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[general] -version = 2 -name = High Quality -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_pva_175 -setting_version = 3 -weight = 1 - -[values] -acceleration_print = 2000 -material_print_temperature = =default_material_print_temperature + 10 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.1 -top_thickness = =layer_height * 7 -bottom_thickness = =layer_height * 5 -speed_print = 40 -layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg deleted file mode 100644 index 5b16476b4b..0000000000 --- a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg +++ /dev/null @@ -1,23 +0,0 @@ -[general] -version = 2 -name = Normal -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_pva_175 -setting_version = 3 -weight = 0 - -[values] -material_print_temperature = =default_material_print_temperature + 10 -material_standby_temperature = =material_print_temperature -material_initial_print_temperature= =material_print_temperature -material_final_print_temperature= =material_print_temperature -material_bed_temperature = 45 -material_bed_temperature_layer_0= =material_bed_temperature -layer_height = 0.2 -top_thickness = =layer_height * 5 -bottom_thickness = =layer_height * 3 -speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg deleted file mode 100644 index 0edca57629..0000000000 --- a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -setting_version = 3 -weight = -1 -global_quality = True - -[values] -layer_height = 0.3 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg deleted file mode 100644 index 193202cd6f..0000000000 --- a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = High Quality -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -setting_version = 3 -weight = 1 -global_quality = True - -[values] -layer_height = 0.1 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg deleted file mode 100644 index 60aa0a150c..0000000000 --- a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Normal -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -setting_version = 3 -weight = 0 -global_quality = True - -[values] -layer_height = 0.2 \ No newline at end of file From fb88dd6326ae91731bef2d4a75ca1f79c996c10a Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 27 Oct 2017 13:32:51 +0200 Subject: [PATCH 063/764] CURA-4492 Postponed signals are now emitted even if we need user interaction when changing quality profiles --- cura/Settings/MachineManager.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index bbeafc9a06..f85acc164d 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -897,16 +897,12 @@ class MachineManager(QObject): if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: # Show the keep/discard user settings dialog has_user_interaction = Application.getInstance().discardOrKeepProfileChanges() - else: - # If the user doesn't have any of adjusted settings then slicing will be triggered by emit() - # Send emits that are postponed in replaceContainer. - # Here the stacks are finished replacing and every value can be resolved based on the current state. - for setting_info in new_quality_settings_list: - setting_info["stack"].sendPostponedEmits() + # If there is no interaction with the user (it means the dialog showing "keep" or "discard" was not shown) + # because either there are not user changes or because the used already decided to always keep or discard, + # then the quality instance container is replaced, in which case, the activeQualityChanged signal is emitted. if not has_user_interaction: self._executeDelayedActiveContainerStackChanges() - self.activeQualityChanged.emit() ## Used to update material and variant in the active container stack with a delay. # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) @@ -929,6 +925,7 @@ class MachineManager(QObject): for new_quality in self._new_quality_containers: new_quality["stack"].nameChanged.connect(self._onQualityNameChanged) + new_quality["stack"].sendPostponedEmits() # Send the signals that were postponed in _replaceQualityOrQualityChangesInStack self._new_quality_containers.clear() From 6c04a8be5d625db9434174872d124ec24ff59bef Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 27 Oct 2017 13:48:55 +0200 Subject: [PATCH 064/764] same font for checkbox label and some layout anchors --- .../qml/AskOpenAsProjectOrModelsDialog.qml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index 450ec0ea26..de2ab29873 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -63,11 +63,11 @@ UM.Dialog anchors.fill: parent anchors.leftMargin: 20 * screenScaleFactor anchors.rightMargin: 20 * screenScaleFactor - anchors.bottomMargin: 20 * screenScaleFactor - spacing: 10 * screenScaleFactor + anchors.bottomMargin: 10 * screenScaleFactor Label { + id: questionText text: catalog.i18nc("@text:window", "This is a Cura project file. Would you like to open it as a project or import the models from it?") anchors.left: parent.left anchors.right: parent.right @@ -78,15 +78,28 @@ UM.Dialog CheckBox { id: rememberChoiceCheckBox - text: catalog.i18nc("@text:window", "Remember my choice") + anchors.bottom: buttonBar.top + anchors.bottomMargin: UM.Theme.getSize("default_margin").heigth checked: UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask" } + Label + { + id: checkboxTextWithNiceRendering + anchors.left: rememberChoiceCheckBox.right + anchors.bottom: rememberChoiceCheckBox.bottom + font: UM.Theme.getFont("default") + text: catalog.i18nc("@text:window", "Remember my choice") + } + + // Buttons Item { + id: buttonBar anchors.right: parent.right anchors.left: parent.left + anchors.bottom: parent.bottom height: childrenRect.height Button From 334283e893192306ddf820e91dd83e5621a9a9eb Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 27 Oct 2017 14:12:35 +0200 Subject: [PATCH 065/764] Found some more margins that wouldnt be fixed numbers and made the code more consistent --- plugins/LayerView/LayerSliderLabel.qml | 4 ++-- .../UM3NetworkPrinting/ClusterControlItem.qml | 3 +-- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 18 ++++++++---------- plugins/UM3NetworkPrinting/MonitorItem.qml | 8 ++++---- .../PrintCoreConfiguration.qml | 2 +- .../UM3NetworkPrinting/PrinterInfoBlock.qml | 12 ++++++------ .../UM3NetworkPrinting/PrinterVideoStream.qml | 2 +- resources/qml/JobSpecs.qml | 2 +- 8 files changed, 24 insertions(+), 27 deletions(-) diff --git a/plugins/LayerView/LayerSliderLabel.qml b/plugins/LayerView/LayerSliderLabel.qml index 892f1775ea..c989679285 100644 --- a/plugins/LayerView/LayerSliderLabel.qml +++ b/plugins/LayerView/LayerSliderLabel.qml @@ -48,7 +48,7 @@ UM.PointingRectangle { anchors { left: parent.left - leftMargin: UM.Theme.getSize("default_margin").width / 2 + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) verticalCenter: parent.verticalCenter } @@ -90,7 +90,7 @@ UM.PointingRectangle { anchors { left: parent.right - leftMargin: UM.Theme.getSize("default_margin").width / 2 + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) verticalCenter: parent.verticalCenter } diff --git a/plugins/UM3NetworkPrinting/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/ClusterControlItem.qml index 194337cca0..8ba7156da8 100644 --- a/plugins/UM3NetworkPrinting/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterControlItem.qml @@ -83,8 +83,7 @@ Component anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width - //TODO; It's probably nicer to do this with a dynamic data model instead of hardcoding this. - //But you know the drill; time constraints don't result in elegant code. + Item { width: parent.width diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index b20d17a6d4..eb1bf786b0 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -114,7 +114,7 @@ Cura.MachineAction Column { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) spacing: UM.Theme.getSize("default_margin").height ScrollView @@ -191,8 +191,6 @@ Cura.MachineAction anchors.left: parent.left anchors.right: parent.right wrapMode: Text.WordWrap - //: Tips label - //TODO: get actual link from webteam text: catalog.i18nc("@label", "If your printer is not listed, read the network printing troubleshooting guide").arg("https://ultimaker.com/en/troubleshooting"); onLinkActivated: Qt.openUrlExternally(link) } @@ -200,7 +198,7 @@ Cura.MachineAction } Column { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) visible: base.selectedPrinter ? true : false spacing: UM.Theme.getSize("default_margin").height Label @@ -218,13 +216,13 @@ Cura.MachineAction columns: 2 Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Type") } Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: { @@ -249,25 +247,25 @@ Cura.MachineAction } Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Firmware version") } Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: base.selectedPrinter ? base.selectedPrinter.firmwareVersion : "" } Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: catalog.i18nc("@label", "Address") } Label { - width: (parent.width * 0.5) | 0 + width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap text: base.selectedPrinter ? base.selectedPrinter.ipAddress : "" } diff --git a/plugins/UM3NetworkPrinting/MonitorItem.qml b/plugins/UM3NetworkPrinting/MonitorItem.qml index ffa2e8c85d..f69df41dd4 100644 --- a/plugins/UM3NetworkPrinting/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/MonitorItem.qml @@ -17,10 +17,10 @@ Component } return (sourceSize.width / sourceSize.height) > (maximumWidth / maximumHeight); } - property real _width: Math.min(maximumWidth, sourceSize.width) - property real _height: Math.min(maximumHeight, sourceSize.height) - width: proportionalHeight ? _width : sourceSize.width * _height / sourceSize.height - height: !proportionalHeight ? _height : sourceSize.height * _width / sourceSize.width + property real _width: Math.floor(Math.min(maximumWidth, sourceSize.width)) + property real _height: Math.floor(Math.min(maximumHeight, sourceSize.height)) + width: proportionalHeight ? _width : Math.floor(sourceSize.width * _height / sourceSize.height) + height: !proportionalHeight ? _height : Math.floor(sourceSize.height * _width / sourceSize.width) anchors.horizontalCenter: parent.horizontalCenter onVisibleChanged: diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index 624c02f735..03ff4542e1 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -10,7 +10,7 @@ Item id: extruderInfo property var printCoreConfiguration - width: parent.width / 2 + width: Math.floor(parent.width / 2) height: childrenRect.height Label { diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 1ced5e8233..7ae8520d19 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -86,7 +86,7 @@ Rectangle Rectangle { - width: parent.width / 3 + width: Math.floor(parent.width / 3) height: parent.height Label // Print job name @@ -131,7 +131,7 @@ Rectangle Rectangle { - width: parent.width / 3 * 2 + width: Math.floor(parent.width / 3 * 2) height: parent.height Label // Friendly machine name @@ -139,7 +139,7 @@ Rectangle id: printerNameLabel anchors.top: parent.top anchors.left: parent.left - width: parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width + width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width) text: printer.friendly_name font: UM.Theme.getFont("default_bold") elide: Text.ElideRight @@ -149,7 +149,7 @@ Rectangle { id: printerTypeLabel anchors.top: printerNameLabel.bottom - width: parent.width / 2 - UM.Theme.getSize("default_margin").width + width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width) text: printer.machine_variant anchors.left: parent.left elide: Text.ElideRight @@ -183,7 +183,7 @@ Rectangle id: extruderInfo anchors.bottom: parent.bottom - width: parent.width / 2 - UM.Theme.getSize("default_margin").width + width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width) height: childrenRect.height spacing: UM.Theme.getSize("default_margin").width @@ -217,7 +217,7 @@ Rectangle anchors.right: parent.right anchors.top: parent.top height: showExtended ? parent.height: printProgressTitleBar.height - width: parent.width / 2 - UM.Theme.getSize("default_margin").width + width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width) border.width: UM.Theme.getSize("default_lining").width border.color: lineColor radius: cornerRadius diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index fe60d30dd4..6793d74ac5 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -57,7 +57,7 @@ Item { id: cameraImage width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) - height: (sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width + height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) anchors.horizontalCenter: parent.horizontalCenter anchors.verticalCenter: parent.verticalCenter z: 1 diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 308316d3e9..426d9dd916 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -95,7 +95,7 @@ Item { { id: printJobTextfield anchors.right: printJobPencilIcon.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width/2 + anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width/2) height: UM.Theme.getSize("jobspecs_line").height width: Math.max(__contentWidth + UM.Theme.getSize("default_margin").width, 50) maximumLength: 120 From 7ac3c1446b416315f6e87dbf5bacecd5cf97db99 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 27 Oct 2017 16:25:52 +0200 Subject: [PATCH 066/764] Make ignored metadata keys a set It needs to be a set now for Uranium. Contributes to issue CURA-4243. --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 9c143f0057..0fffe693cc 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -95,7 +95,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): file_in_archive.compress_type = zipfile.ZIP_DEFLATED # Do not include the network authentication keys - ignore_keys = ["network_authentication_id", "network_authentication_key"] + ignore_keys = {"network_authentication_id", "network_authentication_key"} serialized_data = container.serialize(ignored_metadata_keys = ignore_keys) archive.writestr(file_in_archive, serialized_data) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 4dc955db42..dd07ec73e8 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -97,7 +97,7 @@ class XmlMaterialProfile(InstanceContainer): ## Overridden from InstanceContainer # base file: common settings + supported machines # machine / variant combination: only changes for itself. - def serialize(self, ignored_metadata_keys: Optional[List] = None): + def serialize(self, ignored_metadata_keys: Optional[set] = None): registry = ContainerRegistry.getInstance() base_file = self.getMetaDataEntry("base_file", "") @@ -119,8 +119,8 @@ class XmlMaterialProfile(InstanceContainer): metadata = copy.deepcopy(self.getMetaData()) # setting_version is derived from the "version" tag in the schema, so don't serialize it into a file if ignored_metadata_keys is None: - ignored_metadata_keys = [] - ignored_metadata_keys = ignored_metadata_keys + ["setting_version"] + ignored_metadata_keys = set() + ignored_metadata_keys |= {"setting_version"} # remove the keys that we want to ignore in the metadata for key in ignored_metadata_keys: if key in metadata: From fbdc9ed2236060cb46f4408633e20e46af195fc3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 27 Oct 2017 16:35:09 +0200 Subject: [PATCH 067/764] Added reload qml action --- resources/qml/Actions.qml | 10 ++++++++++ resources/qml/Cura.qml | 1 + 2 files changed, 11 insertions(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index cc27520a02..054a6bed09 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -244,6 +244,16 @@ Item onTriggered: CuraApplication.groupSelected(); } + Action + { + id: reloadQmlAction + onTriggered: + { + CuraApplication.reloadQML() + } + shortcut: "Shift+F5" + } + Action { id: unGroupObjectsAction diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..e25de60dae 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -46,6 +46,7 @@ UM.MainWindow // // This has been fixed for QtQuick Controls 2 since the Shortcut item has a context property. Cura.Actions.parent = backgroundItem + CuraApplication.purgeWindows() } Item From a31c39b2253630d9ce695ecb9ce7c34fa5f64b4f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 27 Oct 2017 16:35:58 +0200 Subject: [PATCH 068/764] Use setters and getters for name and ID Because their implementation changed, these would have been implemented in some other way. Instead I use the getters and setters which are inherited from the parent class and therefore are already updated. Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index dd07ec73e8..bce9a4139a 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -45,7 +45,7 @@ class XmlMaterialProfile(InstanceContainer): def setReadOnly(self, read_only): super().setReadOnly(read_only) - basefile = self.getMetaDataEntry("base_file", self._id) # if basefile is self.id, this is a basefile. + basefile = self.getMetaDataEntry("base_file", self.getId()) # if basefile is self.getId, this is a basefile. for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): container._read_only = read_only # prevent loop instead of calling setReadOnly @@ -57,7 +57,7 @@ class XmlMaterialProfile(InstanceContainer): super().setMetaDataEntry(key, value) - basefile = self.getMetaDataEntry("base_file", self._id) #if basefile is self.id, this is a basefile. + basefile = self.getMetaDataEntry("base_file", self.getId()) #if basefile is self.getId, this is a basefile. # Update all containers that share basefile for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): if container.getMetaDataEntry(key, None) != value: # Prevent recursion @@ -76,7 +76,7 @@ class XmlMaterialProfile(InstanceContainer): super().setName(new_name) - basefile = self.getMetaDataEntry("base_file", self._id) # if basefile is self.id, this is a basefile. + basefile = self.getMetaDataEntry("base_file", self.getId()) # if basefile is self.getId, this is a basefile. # Update the basefile as well, this is actually what we're trying to do # Update all containers that share GUID and basefile containers = ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile) @@ -87,7 +87,7 @@ class XmlMaterialProfile(InstanceContainer): def setDirty(self, dirty): super().setDirty(dirty) base_file = self.getMetaDataEntry("base_file", None) - if base_file is not None and base_file != self._id: + if base_file is not None and base_file != self.getId(): containers = ContainerRegistry.getInstance().findContainers(id=base_file) if containers: base_container = containers[0] @@ -101,7 +101,7 @@ class XmlMaterialProfile(InstanceContainer): registry = ContainerRegistry.getInstance() base_file = self.getMetaDataEntry("base_file", "") - if base_file and self.id != base_file: + if base_file and self.getId() != base_file: # Since we create an instance of XmlMaterialProfile for each machine and nozzle in the profile, # we should only serialize the "base" material definition, since that can then take care of # serializing the machine/nozzle specific profiles. @@ -150,7 +150,7 @@ class XmlMaterialProfile(InstanceContainer): builder.end("color") builder.start("label") - builder.data(self._name) + builder.data(self.getName()) builder.end("label") builder.end("name") @@ -182,16 +182,16 @@ class XmlMaterialProfile(InstanceContainer): ## Begin Settings Block builder.start("settings") - if self.getDefinition().id == "fdmprinter": + if self.getDefinition().getId() == "fdmprinter": for instance in self.findInstances(): self._addSettingElement(builder, instance) machine_container_map = {} machine_nozzle_map = {} - all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = self._id) + all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID"), base_file = self.getId()) for container in all_containers: - definition_id = container.getDefinition().id + definition_id = container.getDefinition().getId() if definition_id == "fdmprinter": continue @@ -229,7 +229,7 @@ class XmlMaterialProfile(InstanceContainer): builder.end("machine_identifier") for instance in container.findInstances(): - if self.getDefinition().id == "fdmprinter" and self.getInstance(instance.definition.key) and self.getProperty(instance.definition.key, "value") == instance.value: + if self.getDefinition().getId() == "fdmprinter" and self.getInstance(instance.definition.key) and self.getProperty(instance.definition.key, "value") == instance.value: # If the settings match that of the base profile, just skip since we inherit the base profile. continue @@ -385,7 +385,7 @@ class XmlMaterialProfile(InstanceContainer): def clearData(self): self._metadata = {} - self._name = "" + self.setName("") self._definition = None self._instances = {} self._read_only = False @@ -424,7 +424,7 @@ class XmlMaterialProfile(InstanceContainer): self.clearData() # Ensure any previous data is gone. meta_data = {} meta_data["type"] = "material" - meta_data["base_file"] = self.id + meta_data["base_file"] = self.getId() meta_data["status"] = "unknown" # TODO: Add material verification common_setting_values = {} @@ -451,9 +451,9 @@ class XmlMaterialProfile(InstanceContainer): label = entry.find("./um:label", self.__namespaces) if label is not None: - self._name = label.text + self.setName(label.text) else: - self._name = self._profile_name(material.text, color.text) + self.setName(self._profile_name(material.text, color.text)) meta_data["brand"] = brand.text meta_data["material"] = material.text meta_data["color_name"] = color.text @@ -545,7 +545,7 @@ class XmlMaterialProfile(InstanceContainer): machine_manufacturer = identifier.get("manufacturer", definition.getMetaDataEntry("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. if machine_compatibility: - new_material_id = self.id + "_" + machine_id + new_material_id = self.getId() + "_" + machine_id # The child or derived material container may already exist. This can happen when a material in a # project file and the a material in Cura have the same ID. @@ -560,7 +560,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True # Update the private directly, as we want to prevent the lookup that is done when using setName - new_material._name = self.getName() + new_material.setName(self.getName()) new_material.setMetaData(copy.deepcopy(self.getMetaData())) new_material.setDefinition(definition) # Don't use setMetadata, as that overrides it for all materials with same base file @@ -583,10 +583,9 @@ class XmlMaterialProfile(InstanceContainer): variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition.id, name = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition.getId(), name = hotend_id) if not variant_containers: - #Logger.log("d", "No variants found with ID or name %s for machine %s", hotend_id, definition.id) continue hotend_compatibility = machine_compatibility @@ -602,7 +601,7 @@ class XmlMaterialProfile(InstanceContainer): else: Logger.log("d", "Unsupported material setting %s", key) - new_hotend_id = self.id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") # Same as machine compatibility, keep the derived material containers consistent with the parent # material @@ -615,7 +614,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True # Update the private directly, as we want to prevent the lookup that is done when using setName - new_hotend_material._name = self.getName() + new_hotend_material.setName(self.getName()) new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) new_hotend_material.setDefinition(definition) new_hotend_material.addMetaDataEntry("variant", variant_containers[0]["id"]) From 8bbb6c1af53f96f71ee8cd6ab623712924cd5ba4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 27 Oct 2017 16:50:13 +0200 Subject: [PATCH 069/764] Load and serialize container ID and name properly: not in metadata We shouldn't write the name or ID, who are now in the metadata. Also we should load the name and ID properly from the file. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index bce9a4139a..4d828a4314 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -133,6 +133,8 @@ class XmlMaterialProfile(InstanceContainer): metadata.pop("type", "") metadata.pop("base_file", "") metadata.pop("approximate_diameter", "") + metadata.pop("id", "") + metadata.pop("container_type", "") ## Begin Name Block builder.start("name") @@ -417,15 +419,18 @@ class XmlMaterialProfile(InstanceContainer): try: data = ET.fromstring(serialized) except: - Logger.logException("e", "An exception occured while parsing the material profile") + Logger.logException("e", "An exception occurred while parsing the material profile") return # Reset previous metadata + old_id = self.getId() self.clearData() # Ensure any previous data is gone. meta_data = {} meta_data["type"] = "material" meta_data["base_file"] = self.getId() meta_data["status"] = "unknown" # TODO: Add material verification + meta_data["id"] = old_id + meta_data["container_type"] = XmlMaterialProfile common_setting_values = {} From 5db0fc7785ed731ca724efff5a3c35933935b93f Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 15:43:01 +0200 Subject: [PATCH 070/764] Add useragreement screen on first run of Cura CURA-4501 --- cura/CuraApplication.py | 1 + plugins/UserAgreementPlugin/UserAgreement.py | 50 +++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.qml | 61 +++++++++++++++++++ plugins/UserAgreementPlugin/__init__.py | 10 +++ plugins/UserAgreementPlugin/plugin.json | 8 +++ 5 files changed, 130 insertions(+) create mode 100644 plugins/UserAgreementPlugin/UserAgreement.py create mode 100644 plugins/UserAgreementPlugin/UserAgreement.qml create mode 100644 plugins/UserAgreementPlugin/__init__.py create mode 100644 plugins/UserAgreementPlugin/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2d1c35aca7..09dfe430d9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -215,6 +215,7 @@ class CuraApplication(QtApplication): self.setRequiredPlugins([ "CuraEngineBackend", + "UserAgreement", "SolidView", "LayerView", "STLReader", diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py new file mode 100644 index 0000000000..148b1adecc --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -0,0 +1,50 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Extension import Extension +from UM.Preferences import Preferences +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry +from UM.Logger import Logger + +from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import QUrl, QObject, pyqtSlot + +import os.path + +class UserAgreement(Extension, QObject): + def __init__(self, parent = None): + QObject.__init__(self, parent) + Extension.__init__(self) + self._user_agreement_window = None + self._user_agreement_context = None + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + Preferences.getInstance().addPreference("general/accepted_user_agreement", False) + + def _onEngineCreated(self): + if not Preferences.getInstance().getValue("general/accepted_user_agreement"): + self.showUserAgreement() + + def showUserAgreement(self): + if not self._user_agreement_window: + self.createUserAgreementWindow() + + self._user_agreement_window.show() + + @pyqtSlot() + def disagreed(self): + Logger.log("i", "User did NOT Accept the license") + + @pyqtSlot() + def agreed(self): + Logger.log("i", "User Accepted the license") + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + + def createUserAgreementWindow(self): + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) + + component = QQmlComponent(Application.getInstance()._engine, path) + self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._user_agreement_context.setContextProperty("manager", self) + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml new file mode 100644 index 0000000000..20b4350acf --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.1 as UM + +UM.Dialog +{ + id: baseDialog + minimumWidth: Math.floor(UM.Theme.getSize("modal_window_minimum").width * 0.75) + minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) + width: minimumWidth + height: minimumHeight + title: "User Agreement" + + TextArea + { + anchors.top: parent.top + width: parent.width + anchors.bottom: buttonRow.top + text: '

DISCLAIMER BY ULTIMAKER

+

PLEASE READ THIS DISCLAIMER CAREFULLY.

+

EXCEPT WHEN OTHERWISE STATED IN WRITING, ULTIMAKER PROVIDES ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE “AS IS” WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF ULTIMAKER SOFTWARE IS WITH YOU.

+

UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO EVENT WILL ULTIMAKER BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE.

+ ' + readOnly: true; + textFormat: TextEdit.RichText + } + + Item + { + id: buttonRow + anchors.bottom: parent.bottom + width: parent.width + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + + Button + { + anchors.right: parent.right + text: "I understand and agree" + onClicked: { + manager.agreed + } + } + + Button + { + anchors.left: parent.left + text: "I don't agree" + onClicked: { + manager.disagreed + } + } + + } + +} diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py new file mode 100644 index 0000000000..635f8a6bc9 --- /dev/null +++ b/plugins/UserAgreementPlugin/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import UserAgreement + +def getMetaData(): + return {} + +def register(app): + return {"extension": UserAgreement.UserAgreement()} diff --git a/plugins/UserAgreementPlugin/plugin.json b/plugins/UserAgreementPlugin/plugin.json new file mode 100644 index 0000000000..aa5dbb1258 --- /dev/null +++ b/plugins/UserAgreementPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UserAgreement", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Ask the user once if he/she agrees with our license", + "api": 4, + "i18n-catalog": "cura" +} From 910386eaf77b6936c3c2fce9f5682e9243db69cc Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 15:43:26 +0200 Subject: [PATCH 071/764] remove unused import --- plugins/ChangeLogPlugin/ChangeLog.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index 8d1e54f40c..a80779da50 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -8,7 +8,6 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Version import Version -from PyQt5.QtQuick import QQuickView from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, pyqtSlot, QObject From 8bfd10f9aad877d157b6e98654a1b64379c5d12d Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 20:29:26 +0200 Subject: [PATCH 072/764] Refactor and cleanup CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 22 +++++++++++-------- plugins/UserAgreementPlugin/UserAgreement.qml | 15 ++++++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 148b1adecc..c565399735 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -7,6 +7,8 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger +from cura.CuraApplication import CuraApplication + from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, QObject, pyqtSlot @@ -31,15 +33,17 @@ class UserAgreement(Extension, QObject): self._user_agreement_window.show() - @pyqtSlot() - def disagreed(self): - Logger.log("i", "User did NOT Accept the license") + @pyqtSlot(bool) + def didAgree(self, userChoice): + if userChoice: + Logger.log("i", 'User agreed to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + else: + Logger.log("i", 'User did NOT agree to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", False) + CuraApplication.getInstance().quit() - @pyqtSlot() - def agreed(self): - Logger.log("i", "User Accepted the license") - Preferences.getInstance().setValue("general/accepted_user_agreement", True) - self._user_agreement_window.hide() def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -47,4 +51,4 @@ class UserAgreement(Extension, QObject): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) + self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 20b4350acf..a2dd34e23f 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,12 +1,10 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 +import QtQuick 2.2 import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 -import UM 1.1 as UM +import UM 1.3 as UM UM.Dialog { @@ -43,7 +41,7 @@ UM.Dialog anchors.right: parent.right text: "I understand and agree" onClicked: { - manager.agreed + manager.didAgree(true) } } @@ -52,10 +50,15 @@ UM.Dialog anchors.left: parent.left text: "I don't agree" onClicked: { - manager.disagreed + manager.didAgree(false) } } } + onClosing: { + manager.didAgree(false) + } + + } From 0bdc1aad006a10cc764a9bd10e160e422b5f6c83 Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 29 Oct 2017 09:04:23 +0100 Subject: [PATCH 073/764] Fixed code comments CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 11 +++++------ plugins/UserAgreementPlugin/UserAgreement.qml | 14 +++++++------- plugins/UserAgreementPlugin/__init__.py | 2 +- resources/i18n/cura.pot | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index c565399735..5b6b266444 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Extension import Extension @@ -14,10 +14,9 @@ from PyQt5.QtCore import QUrl, QObject, pyqtSlot import os.path -class UserAgreement(Extension, QObject): +class UserAgreement(QObject, Extension): def __init__(self, parent = None): - QObject.__init__(self, parent) - Extension.__init__(self) + super(UserAgreement, self).__init__() self._user_agreement_window = None self._user_agreement_context = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) @@ -36,11 +35,11 @@ class UserAgreement(Extension, QObject): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log("i", 'User agreed to the user agreement') + Logger.log('i', 'User agreed to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log("i", 'User did NOT agree to the user agreement') + Logger.log('i', 'User did NOT agree to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index a2dd34e23f..52d35a4f44 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,8 +1,8 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 -import QtQuick.Controls 1.3 +import QtQuick.Controls 1.4 import UM 1.3 as UM @@ -13,7 +13,7 @@ UM.Dialog minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) width: minimumWidth height: minimumHeight - title: "User Agreement" + title: catalog.i18nc("@title:window", "User Agreement") TextArea { @@ -36,10 +36,12 @@ UM.Dialog width: parent.width anchors.bottomMargin: UM.Theme.getSize("default_margin").height + UM.I18nCatalog { id: catalog; name:"cura" } + Button { anchors.right: parent.right - text: "I understand and agree" + text: catalog.i18nc("@action:button", "I understand and agree") onClicked: { manager.didAgree(true) } @@ -48,7 +50,7 @@ UM.Dialog Button { anchors.left: parent.left - text: "I don't agree" + text: catalog.i18nc("@action:button", "I don't agree") onClicked: { manager.didAgree(false) } @@ -59,6 +61,4 @@ UM.Dialog onClosing: { manager.didAgree(false) } - - } diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py index 635f8a6bc9..88cb151f9e 100644 --- a/plugins/UserAgreementPlugin/__init__.py +++ b/plugins/UserAgreementPlugin/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import UserAgreement diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index fb4b9ed0d6..99ccd7a459 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -18,6 +18,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I understand and agree" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I don't agree" +msgstr "" + #: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml msgctxt "@label:status" msgid "Print aborted" From 177295999b3e81e116442d0cc17eea8a76046a38 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 29 Oct 2017 09:19:50 +0100 Subject: [PATCH 074/764] Allow richer markup in tooltips --- resources/qml/SidebarTooltip.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml index 60d01dd6f6..07b95777b5 100644 --- a/resources/qml/SidebarTooltip.qml +++ b/resources/qml/SidebarTooltip.qml @@ -54,6 +54,7 @@ UM.PointingRectangle { rightMargin: UM.Theme.getSize("tooltip_margins").width; } wrapMode: Text.Wrap; + textFormat: Text.RichText font: UM.Theme.getFont("default"); color: UM.Theme.getColor("tooltip_text"); } From 208d365d51b61b077a0f6a627ddca91f524a5707 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 29 Oct 2017 09:20:59 +0100 Subject: [PATCH 075/764] Make sure saveRow does not extend sidebar --- resources/qml/SaveButton.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index acc97ebf11..63c44a6720 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -18,6 +18,8 @@ Item { property var backend: CuraApplication.getBackend(); property bool activity: CuraApplication.platformActivity; + property alias buttonRowWidth: saveRow.width + property string fileBaseName property string statusText: { @@ -89,11 +91,12 @@ Item { Item { id: saveRow - width: base.width + width: Math.min(childrenRect.width + UM.Theme.getSize("sidebar_margin").width, base.width - UM.Theme.getSize("sidebar_margin").width) height: saveToButton.height anchors.bottom: parent.bottom anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height - anchors.left: parent.left + anchors.right: parent.right + clip: true Row { id: additionalComponentsRow From 6a0ba435084d9b5a2007183828fae1c70dfdf07f Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 29 Oct 2017 10:07:42 +0100 Subject: [PATCH 076/764] Make sure monitor buttons do not extend sidebar --- resources/qml/MonitorButton.qml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 29b00f50e6..7a620c42ea 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -185,17 +185,20 @@ Item anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width; } - Row { + Item { id: buttonsRow height: abortButton.height + width: Math.min(childrenRect.width, base.width - 2 * UM.Theme.getSize("sidebar_margin").width) anchors.top: progressBar.bottom anchors.topMargin: UM.Theme.getSize("sidebar_margin").height anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - spacing: UM.Theme.getSize("default_margin").width + clip: true Row { id: additionalComponentsRow + anchors.right: pauseResumeButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width } @@ -215,6 +218,8 @@ Item { id: pauseResumeButton + anchors.right: abortButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width height: UM.Theme.getSize("save_button_save_to_button").height property bool userClicked: false @@ -261,6 +266,8 @@ Item { id: abortButton + anchors.right: parent.right + visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canAbort enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) From 03724755604a31f2adc6e9293645ea9586bbe149 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 29 Oct 2017 10:09:52 +0100 Subject: [PATCH 077/764] Rearrange print specs area * remove superfluous "Print time" label * format print time tooltip * add elide to cost spec * add (empty) cost spec tooltip --- resources/qml/Sidebar.qml | 64 +++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 403c18a4ff..ed6b07cc4e 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -313,31 +313,32 @@ Rectangle anchors.bottomMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2 + UM.Theme.getSize("progressbar").height + UM.Theme.getFont("default_bold").pixelSize) } - Rectangle + Item { id: printSpecs anchors.left: parent.left anchors.bottom: parent.bottom anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height - height: timeDetails.height + timeSpecDescription.height + lengthSpec.height + height: timeDetails.height + costSpec.height + width: base.width - (saveButton.buttonRowWidth + UM.Theme.getSize("sidebar_margin").width) visible: !monitoringPrint + clip: true Label { id: timeDetails anchors.left: parent.left - anchors.bottom: timeSpecDescription.top + anchors.bottom: costSpec.top font: UM.Theme.getFont("large") color: UM.Theme.getColor("text_subtext") text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label Hours and minutes", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) MouseArea { - id: infillMouseArea + id: timeDetailsMouseArea anchors.fill: parent hoverEnabled: true - //enabled: base.settingsEnabled onEntered: { @@ -345,19 +346,24 @@ Rectangle if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) { // All the time information for the different features is achieved - var print_time = PrintInformation.getFeaturePrintTimes() + var print_time = PrintInformation.getFeaturePrintTimes(); + var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) // A message is created and displayed when the user hover the time label - var content = catalog.i18nc("@tooltip", "Time information") + var content = catalog.i18nc("@tooltip", "Time specification
"); for(var feature in print_time) { if(!print_time[feature].isTotalDurationZero) { - content += "
" + feature + ": " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + content += ""; } } + content += "
" + feature + + "  " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + + "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + + "
"; - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content) + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content); } } onExited: @@ -369,20 +375,13 @@ Rectangle Label { - id: timeSpecDescription - anchors.left: parent.left - anchors.bottom: lengthSpec.top - font: UM.Theme.getFont("very_small") - color: UM.Theme.getColor("text_subtext") - text: catalog.i18nc("@description", "Print time") - } - Label - { - id: lengthSpec + id: costSpec anchors.left: parent.left anchors.bottom: parent.bottom font: UM.Theme.getFont("very_small") color: UM.Theme.getColor("text_subtext") + elide: Text.ElideMiddle + width: parent.width text: { var lengths = []; @@ -421,6 +420,33 @@ Rectangle return catalog.i18nc("@label Print estimates: m for meters, g for grams", "%1m / ~ %2g").arg(lengths.join(" + ")).arg(weights.join(" + ")); } } + MouseArea + { + id: costSpecMouseArea + anchors.fill: parent + hoverEnabled: true + + onEntered: + { + + if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) + { + // All the time information for the different features is achieved + var print_time = PrintInformation.getFeaturePrintTimes(); + var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) + + // A message is created and displayed when the user hover the time label + var content = catalog.i18nc("@tooltip", "Cost specification
"); + content += "
"; + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content); + } + } + onExited: + { + base.hideTooltip(); + } + } } } From 6d4ea381f0b9420b2ae89805915a985b743eb4c9 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 29 Oct 2017 11:44:36 +0100 Subject: [PATCH 078/764] Create cost specification tooltip --- resources/qml/Sidebar.qml | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ed6b07cc4e..582fb346c5 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -355,7 +355,7 @@ Rectangle { if(!print_time[feature].isTotalDurationZero) { - content += "" + feature + + content += "" + feature + ":" + "  " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + ""; @@ -382,12 +382,16 @@ Rectangle color: UM.Theme.getColor("text_subtext") elide: Text.ElideMiddle width: parent.width + property string tooltipText: "test" text: { var lengths = []; + var total_length = 0; var weights = []; + var total_weight = 0; var costs = []; - var someCostsKnown = false; + var total_cost = 0; + var some_costs_known = false; if(base.printMaterialLengths) { for(var index = 0; index < base.printMaterialLengths.length; index++) { @@ -399,8 +403,12 @@ Rectangle costs.push(cost); if(cost > 0) { - someCostsKnown = true; + some_costs_known = true; } + + total_length += base.printMaterialLengths[index]; + total_weight += base.printMaterialWeights[index]; + total_cost += base.printMaterialCosts[index]; } } } @@ -410,10 +418,21 @@ Rectangle weights = ["0"]; costs = ["0.00"]; } - if(someCostsKnown) + + tooltipText = catalog.i18nc("@tooltip", "Cost specification
"); + for(var index = 0; index < lengths.length; index++) + { + tooltipText += catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "").arg(index + 1).arg(lengths[index]) + .arg(weights[index]).arg(costs[index]).arg(UM.Preferences.getValue("cura/currency")); + } + tooltipText += catalog.i18nc("@label Print totals: m for meters, g for grams, %4 is currency and %3 is print cost", "").arg(total_length.toFixed(2)) + .arg(Math.round(total_weight)).arg(total_cost.toFixed(2)).arg(UM.Preferences.getValue("cura/currency")); + tooltipText += "
Extruder %0:  %1m  %2g  %4 %3
Total:  %1m  %2g  %4 %3
"; + + if(some_costs_known) { return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) - .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); + .arg(Math.round(total_weight)).arg(total_cost.toFixed(2)).arg(UM.Preferences.getValue("cura/currency")); } else { @@ -431,15 +450,7 @@ Rectangle if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) { - // All the time information for the different features is achieved - var print_time = PrintInformation.getFeaturePrintTimes(); - var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) - - // A message is created and displayed when the user hover the time label - var content = catalog.i18nc("@tooltip", "Cost specification
"); - content += "
"; - - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content); + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), costSpec.tooltipText); } } onExited: From 85f7b1ac03786cd86838ac7020f15ce4ccdb00c5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:32:45 +0100 Subject: [PATCH 079/764] Fix code style CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 5b6b266444..cfad13dfae 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -35,11 +35,11 @@ class UserAgreement(QObject, Extension): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log('i', 'User agreed to the user agreement') + Logger.log("i", "User agreed to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log('i', 'User did NOT agree to the user agreement') + Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() From c0f1af94ab6486def6030e7169f2948a0dda8312 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:33:49 +0100 Subject: [PATCH 080/764] Show Add Machine dialog after User Agreement dialog is closed CURA-4501 --- cura/CuraApplication.py | 19 +++++++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- resources/qml/Cura.qml | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 09dfe430d9..9da820c8a2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -305,6 +305,9 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) + self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") + self._has_user_agreement_shown = False + for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", @@ -377,6 +380,22 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) + onHasUserAgreementShownChanged = pyqtSignal() + + @pyqtProperty(bool) + def needToShowUserAgreement(self): + return self._need_to_show_user_agreement + + @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) + def hasUserAgreementShown(self): + return self._has_user_agreement_shown + + def setHasShownUserAgreement(self, shown = True): + emit_signal = self._has_user_agreement_shown != shown + self._has_user_agreement_shown = shown + if emit_signal: + self.onHasUserAgreementShownChanged.emit() + ## The "Quit" button click event handler. @pyqtSlot() def closeApplication(self): diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index cfad13dfae..01788f7b57 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - + CuraApplication.getInstance().setHasShownUserAgreement(True) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -50,4 +50,4 @@ class UserAgreement(QObject, Extension): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..8439d79d21 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -894,6 +894,11 @@ UM.MainWindow if(!base.visible) { base.visible = true; + } + + // check later if the user agreement dialog has been closed + if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + { restart(); } else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "") From 839c8ccc52563811234bbd754dd2cbc4dd76a734 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 30 Oct 2017 11:15:41 +0100 Subject: [PATCH 081/764] Fix 'Could not get metadata of container ' Turns out that the side bar header was requesting the metadata before the active material was set. Now I'm just saying that if the active material was not set, it should not be compatible. Contributes to issue CURA-4243, side-ways. --- cura/Settings/MachineManager.py | 2 +- resources/qml/Preferences/MaterialView.qml | 2 +- resources/qml/SidebarHeader.qml | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c5dec6b6cc..2a77032a33 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -151,7 +151,7 @@ class MachineManager(QObject): if not self._global_container_stack: return - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="variant", definition=self._global_container_stack.getBottom().getId(), name=hotend_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self._global_container_stack.getBottom().getId(), name = hotend_id) if containers: # New material ID is known extruder_manager = ExtruderManager.getInstance() machine_id = self.activeMachineId diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 143f29c86e..311150c6b9 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -41,7 +41,7 @@ TabView Tab { - title: catalog.i18nc("@title","Information") + title: catalog.i18nc("@title", "Information") anchors.margins: UM.Theme.getSize("default_margin").width diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f3887e2885..551d85ac13 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -252,6 +252,10 @@ Column visible: Cura.MachineManager.hasMaterials property var valueError: { + if(Cura.MachineManager.activeMaterialId === "") + { + return false + } var data = Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") if(data == "False") { From 84002a70d0462ff44d98b90fd9144b98a2e7e8f1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 11:50:57 +0100 Subject: [PATCH 082/764] Remove binding loop by cleaning up tooltipText creation --- resources/qml/Sidebar.qml | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 582fb346c5..14179d388d 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -382,7 +382,7 @@ Rectangle color: UM.Theme.getColor("text_subtext") elide: Text.ElideMiddle width: parent.width - property string tooltipText: "test" + property string tooltipText text: { var lengths = []; @@ -419,15 +419,32 @@ Rectangle costs = ["0.00"]; } - tooltipText = catalog.i18nc("@tooltip", "Cost specification
"); + var tooltip_html = "%1
".arg(catalog.i18nc("@label", "Cost specification")); for(var index = 0; index < lengths.length; index++) { - tooltipText += catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "").arg(index + 1).arg(lengths[index]) - .arg(weights[index]).arg(costs[index]).arg(UM.Preferences.getValue("cura/currency")); + var item_strings = [ + catalog.i18nc("@label", "Extruder %1:").arg(index + 1), + catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), + catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), + ]; + tooltip_html += ""; + for(var item = 0; item < item_strings.length; item++) { + tooltip_html += "".arg(item_strings[item]); + } } - tooltipText += catalog.i18nc("@label Print totals: m for meters, g for grams, %4 is currency and %3 is print cost", "").arg(total_length.toFixed(2)) - .arg(Math.round(total_weight)).arg(total_cost.toFixed(2)).arg(UM.Preferences.getValue("cura/currency")); - tooltipText += "
Extruder %0:  %1m  %2g  %4 %3
%1  
Total:  %1m  %2g  %4 %3
"; + var item_strings = [ + catalog.i18nc("@label", "Total:"), + catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), + catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), + ]; + tooltip_html += ""; + for(var item = 0; item < item_strings.length; item++) { + tooltip_html += "%1  ".arg(item_strings[item]); + } + tooltip_html += ""; + tooltipText = tooltip_html; if(some_costs_known) { From 6fa4dd0a977634f5693c759ea87ae8411399c629 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 12:26:02 +0100 Subject: [PATCH 083/764] Fix qml binding loops --- resources/qml/MonitorButton.qml | 6 +++++- resources/qml/SaveButton.qml | 16 ++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 7a620c42ea..67ca2e708e 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -188,7 +188,11 @@ Item Item { id: buttonsRow height: abortButton.height - width: Math.min(childrenRect.width, base.width - 2 * UM.Theme.getSize("sidebar_margin").width) + width: { + // using childrenRect.width directly causes a binding loop, because setting the width affects the childrenRect + var children_width = additionalComponentsRow.width + pauseResumeButton.width + abortButton.width + 3 * UM.Theme.getSize("default_margin").width; + return Math.min(children_width, base.width - 2 * UM.Theme.getSize("sidebar_margin").width); + } anchors.top: progressBar.bottom anchors.topMargin: UM.Theme.getSize("sidebar_margin").height anchors.right: parent.right diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 63c44a6720..e2890a6b49 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -91,7 +91,19 @@ Item { Item { id: saveRow - width: Math.min(childrenRect.width + UM.Theme.getSize("sidebar_margin").width, base.width - UM.Theme.getSize("sidebar_margin").width) + width: { + // using childrenRect.width directly causes a binding loop, because setting the width affects the childrenRect + var children_width = UM.Theme.getSize("default_margin").width; + for (var index in children) + { + var child = children[index]; + if(child.visible) + { + children_width += child.width + child.anchors.rightMargin; + } + } + return Math.min(children_width, base.width - UM.Theme.getSize("sidebar_margin").width); + } height: saveToButton.height anchors.bottom: parent.bottom anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height @@ -102,7 +114,7 @@ Item { id: additionalComponentsRow anchors.top: parent.top anchors.right: saveToButton.visible ? saveToButton.left : parent.right - anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width } From fc7d1210cf660147a4650a69df884e844f5f3fc8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 12:31:46 +0100 Subject: [PATCH 084/764] Fix qml binding loop --- resources/qml/JobSpecs.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 308316d3e9..5e892a34bc 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -18,7 +18,6 @@ Item { UM.I18nCatalog { id: catalog; name:"cura"} height: childrenRect.height - width: childrenRect.width Connections { From 2d109090bc29ab79af81322c3ac9f2fd92c4fa3a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 12:40:41 +0100 Subject: [PATCH 085/764] Show material name instead of extruder number --- cura/PrintInformation.py | 10 ++++++++++ resources/qml/Sidebar.qml | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index f3b178c356..c709bec20a 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -56,6 +56,7 @@ class PrintInformation(QObject): self._material_lengths = [] self._material_weights = [] self._material_costs = [] + self._material_names = [] self._pre_sliced = False @@ -139,6 +140,12 @@ class PrintInformation(QObject): def materialCosts(self): return self._material_costs + materialNamesChanged = pyqtSignal() + + @pyqtProperty("QVariantList", notify = materialNamesChanged) + def materialNames(self): + return self._material_names + def _onPrintDurationMessage(self, print_time, material_amounts): self._updateTotalPrintTimePerFeature(print_time) @@ -170,6 +177,7 @@ class PrintInformation(QObject): self._material_lengths = [] self._material_weights = [] self._material_costs = [] + self._material_names = [] material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings")) @@ -208,10 +216,12 @@ class PrintInformation(QObject): self._material_weights.append(weight) self._material_lengths.append(length) self._material_costs.append(cost) + self._material_names.append(material.getName()) self.materialLengthsChanged.emit() self.materialWeightsChanged.emit() self.materialCostsChanged.emit() + self.materialNamesChanged.emit() def _onPreferencesChanged(self, preference): if preference != "cura/material_settings": diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 14179d388d..32dceb6078 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -30,6 +30,7 @@ Rectangle property variant printMaterialLengths: PrintInformation.materialLengths property variant printMaterialWeights: PrintInformation.materialWeights property variant printMaterialCosts: PrintInformation.materialCosts + property variant printMaterialNames: PrintInformation.materialNames color: UM.Theme.getColor("sidebar") UM.I18nCatalog { id: catalog; name:"cura"} @@ -392,11 +393,13 @@ Rectangle var costs = []; var total_cost = 0; var some_costs_known = false; + var names = []; if(base.printMaterialLengths) { for(var index = 0; index < base.printMaterialLengths.length; index++) { if(base.printMaterialLengths[index] > 0) { + names.push(base.printMaterialNames[index]); lengths.push(base.printMaterialLengths[index].toFixed(2)); weights.push(String(Math.floor(base.printMaterialWeights[index]))); var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); @@ -423,7 +426,7 @@ Rectangle for(var index = 0; index < lengths.length; index++) { var item_strings = [ - catalog.i18nc("@label", "Extruder %1:").arg(index + 1), + "%1:".arg(names[index]), catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), From b6dd87081cb143ca8101c7cf290ceb2989012555 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 12:45:25 +0100 Subject: [PATCH 086/764] Add upgrade script for 3.0 to 3.1 CURA-4451 - Add upgrade script for 3.0. to 3.1 - Upgrade old stack files so they will use "empty_quality" as the "Not Supported" quality profile. - Increase SettingVersion to 4 --- cura/CuraApplication.py | 2 +- .../VersionUpgrade30to31.py | 141 ++++++++++++++++++ .../VersionUpgrade30to31/__init__.py | 56 +++++++ .../VersionUpgrade30to31/plugin.json | 8 + .../XmlMaterialProfile/XmlMaterialProfile.py | 2 +- .../quality/abax_pri3/apri3_pla_fast.inst.cfg | 2 +- .../quality/abax_pri3/apri3_pla_high.inst.cfg | 2 +- .../abax_pri3/apri3_pla_normal.inst.cfg | 2 +- .../quality/abax_pri5/apri5_pla_fast.inst.cfg | 2 +- .../quality/abax_pri5/apri5_pla_high.inst.cfg | 2 +- .../abax_pri5/apri5_pla_normal.inst.cfg | 2 +- .../abax_titan/atitan_pla_fast.inst.cfg | 2 +- .../abax_titan/atitan_pla_high.inst.cfg | 2 +- .../abax_titan/atitan_pla_normal.inst.cfg | 2 +- .../bp_PLA_Coarse_Quality.inst.cfg | 2 +- .../bp_PLA_High_Quality.inst.cfg | 2 +- .../bp_PLA_Normal_Quality.inst.cfg | 2 +- .../abs/cartesio_0.25_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.25_abs_normal.inst.cfg | 2 +- .../abs/cartesio_0.4_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.4_abs_normal.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_coarse.inst.cfg | 2 +- .../cartesio_0.8_abs_extra_coarse.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_high.inst.cfg | 2 +- .../abs/cartesio_0.8_abs_normal.inst.cfg | 2 +- .../cartesio_0.4_arnitel2045_high.inst.cfg | 2 +- .../cartesio_0.4_arnitel2045_normal.inst.cfg | 2 +- .../cartesio_global_Coarse_Quality.inst.cfg | 2 +- ...tesio_global_Extra_Coarse_Quality.inst.cfg | 2 +- .../cartesio_global_High_Quality.inst.cfg | 2 +- .../cartesio_global_Normal_Quality.inst.cfg | 2 +- .../hips/cartesio_0.25_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.25_hips_normal.inst.cfg | 2 +- .../hips/cartesio_0.4_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.4_hips_normal.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_coarse.inst.cfg | 2 +- .../cartesio_0.8_hips_extra_coarse.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_high.inst.cfg | 2 +- .../hips/cartesio_0.8_hips_normal.inst.cfg | 2 +- .../nylon/cartesio_0.25_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.25_nylon_normal.inst.cfg | 2 +- .../nylon/cartesio_0.4_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.4_nylon_normal.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_coarse.inst.cfg | 2 +- .../cartesio_0.8_nylon_extra_coarse.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_high.inst.cfg | 2 +- .../nylon/cartesio_0.8_nylon_normal.inst.cfg | 2 +- .../pc/cartesio_0.25_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.25_pc_normal.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.4_pc_normal.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_coarse.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_extra_coarse.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_normal.inst.cfg | 2 +- .../petg/cartesio_0.25_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.25_petg_normal.inst.cfg | 2 +- .../petg/cartesio_0.4_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.4_petg_normal.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_coarse.inst.cfg | 2 +- .../cartesio_0.8_petg_extra_coarse.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_high.inst.cfg | 2 +- .../petg/cartesio_0.8_petg_normal.inst.cfg | 2 +- .../pla/cartesio_0.25_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.25_pla_normal.inst.cfg | 2 +- .../pla/cartesio_0.4_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.4_pla_normal.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_coarse.inst.cfg | 2 +- .../cartesio_0.8_pla_extra_coarse.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_high.inst.cfg | 2 +- .../pla/cartesio_0.8_pla_normal.inst.cfg | 2 +- .../pva/cartesio_0.25_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.25_pva_normal.inst.cfg | 2 +- .../pva/cartesio_0.4_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.4_pva_normal.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_coarse.inst.cfg | 2 +- .../cartesio_0.8_pva_extra_coarse.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_high.inst.cfg | 2 +- .../pva/cartesio_0.8_pva_normal.inst.cfg | 2 +- resources/quality/coarse.inst.cfg | 2 +- resources/quality/draft.inst.cfg | 2 +- resources/quality/extra_coarse.inst.cfg | 2 +- .../fabtotum/fabtotum_abs_fast.inst.cfg | 2 +- .../fabtotum/fabtotum_abs_high.inst.cfg | 2 +- .../fabtotum/fabtotum_abs_normal.inst.cfg | 2 +- .../fabtotum/fabtotum_nylon_fast.inst.cfg | 2 +- .../fabtotum/fabtotum_nylon_high.inst.cfg | 2 +- .../fabtotum/fabtotum_nylon_normal.inst.cfg | 2 +- .../fabtotum/fabtotum_pla_fast.inst.cfg | 2 +- .../fabtotum/fabtotum_pla_high.inst.cfg | 2 +- .../fabtotum/fabtotum_pla_normal.inst.cfg | 2 +- resources/quality/high.inst.cfg | 2 +- .../generic_petg_0.4_coarse.inst.cfg | 2 +- .../generic_petg_0.4_coarse_2-fans.inst.cfg | 2 +- .../generic_petg_0.4_medium.inst.cfg | 2 +- .../generic_petg_0.4_medium_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_coarse.inst.cfg | 2 +- .../generic_pla_0.4_coarse_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_fine.inst.cfg | 2 +- .../generic_pla_0.4_fine_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_medium.inst.cfg | 2 +- .../generic_pla_0.4_medium_2-fans.inst.cfg | 2 +- .../generic_pla_0.4_ultrafine.inst.cfg | 2 +- .../generic_pla_0.4_ultrafine_2-fans.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_abs_draft.inst.cfg | 2 +- .../kemiq_q2_beta_abs_extra_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_abs_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_abs_low.inst.cfg | 2 +- .../kemiq_q2_beta_abs_normal.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg | 2 +- .../kemiq_q2_beta_pla_extra_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg | 2 +- .../kemiq_q2_beta_pla_normal.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg | 2 +- .../kemiq_q2_gama_pla_extra_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_gama_pla_fine.inst.cfg | 2 +- .../kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg | 2 +- .../kemiq_q2_gama_pla_normal.inst.cfg | 2 +- resources/quality/low.inst.cfg | 2 +- resources/quality/normal.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_high.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_max.inst.cfg | 2 +- .../peopoly_moai/peopoly_moai_normal.inst.cfg | 2 +- .../quality/ultimaker2/um2_draft.inst.cfg | 2 +- .../quality/ultimaker2/um2_high.inst.cfg | 2 +- resources/quality/ultimaker2/um2_low.inst.cfg | 2 +- .../quality/ultimaker2/um2_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_fast.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_high.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.6_normal.inst.cfg | 2 +- .../ultimaker2_plus/pla_0.8_normal.inst.cfg | 2 +- .../um2p_abs_0.25_normal.inst.cfg | 2 +- .../um2p_abs_0.4_fast.inst.cfg | 2 +- .../um2p_abs_0.4_high.inst.cfg | 2 +- .../um2p_abs_0.4_normal.inst.cfg | 2 +- .../um2p_abs_0.6_normal.inst.cfg | 2 +- .../um2p_abs_0.8_normal.inst.cfg | 2 +- .../um2p_cpe_0.25_normal.inst.cfg | 2 +- .../um2p_cpe_0.4_fast.inst.cfg | 2 +- .../um2p_cpe_0.4_high.inst.cfg | 2 +- .../um2p_cpe_0.4_normal.inst.cfg | 2 +- .../um2p_cpe_0.6_normal.inst.cfg | 2 +- .../um2p_cpe_0.8_normal.inst.cfg | 2 +- .../um2p_cpep_0.4_draft.inst.cfg | 2 +- .../um2p_cpep_0.4_normal.inst.cfg | 2 +- .../um2p_cpep_0.6_draft.inst.cfg | 2 +- .../um2p_cpep_0.6_normal.inst.cfg | 2 +- .../um2p_cpep_0.8_draft.inst.cfg | 2 +- .../um2p_cpep_0.8_normal.inst.cfg | 2 +- .../um2p_nylon_0.25_high.inst.cfg | 2 +- .../um2p_nylon_0.25_normal.inst.cfg | 2 +- .../um2p_nylon_0.4_fast.inst.cfg | 2 +- .../um2p_nylon_0.4_normal.inst.cfg | 2 +- .../um2p_nylon_0.6_fast.inst.cfg | 2 +- .../um2p_nylon_0.6_normal.inst.cfg | 2 +- .../um2p_nylon_0.8_draft.inst.cfg | 2 +- .../um2p_nylon_0.8_normal.inst.cfg | 2 +- .../um2p_pc_0.25_high.inst.cfg | 2 +- .../um2p_pc_0.25_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg | 2 +- .../um2p_pc_0.4_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg | 2 +- .../um2p_pc_0.6_normal.inst.cfg | 2 +- .../um2p_pc_0.8_draft.inst.cfg | 2 +- .../um2p_pc_0.8_normal.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg | 2 +- .../um2p_pp_0.4_normal.inst.cfg | 2 +- .../um2p_pp_0.6_draft.inst.cfg | 2 +- .../ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg | 2 +- .../um2p_pp_0.8_draft.inst.cfg | 2 +- .../um2p_pp_0.8_verydraft.inst.cfg | 2 +- .../um2p_tpu_0.25_high.inst.cfg | 2 +- .../um2p_tpu_0.4_normal.inst.cfg | 2 +- .../um2p_tpu_0.6_fast.inst.cfg | 2 +- .../um3_aa0.4_ABS_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_ABS_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_ABS_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_ABS_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_CPEP_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPEP_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPE_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_CPE_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_CPE_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_CPE_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_Nylon_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_Nylon_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PC_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_PC_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_PC_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_PC_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PLA_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_PLA_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_PLA_High_Quality.inst.cfg | 2 +- .../um3_aa0.4_PLA_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_PP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_PP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_PP_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.4_TPU_Draft_Print.inst.cfg | 2 +- .../um3_aa0.4_TPU_Fast_Print.inst.cfg | 2 +- .../um3_aa0.4_TPU_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.8_ABS_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_ABS_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_ABS_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Fast_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_CPE_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_Nylon_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Fast_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PC_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PLA_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_PP_Verydraft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Draft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 2 +- .../um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_Draft_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_Fast_Print.inst.cfg | 2 +- .../um3_bb0.4_PVA_High_Quality.inst.cfg | 2 +- .../um3_bb0.4_PVA_Normal_Quality.inst.cfg | 2 +- .../um3_bb0.8_PVA_Draft_Print.inst.cfg | 2 +- .../um3_bb0.8_PVA_Superdraft_Print.inst.cfg | 2 +- .../um3_bb0.8_PVA_Verydraft_Print.inst.cfg | 2 +- .../um3_global_Draft_Quality.inst.cfg | 2 +- .../um3_global_Fast_Quality.inst.cfg | 2 +- .../um3_global_High_Quality.inst.cfg | 2 +- .../um3_global_Normal_Quality.inst.cfg | 2 +- .../um3_global_Superdraft_Quality.inst.cfg | 2 +- .../um3_global_Verydraft_Quality.inst.cfg | 2 +- resources/variants/cartesio_0.25.inst.cfg | 2 +- resources/variants/cartesio_0.4.inst.cfg | 2 +- resources/variants/cartesio_0.8.inst.cfg | 2 +- resources/variants/fabtotum_hyb35.inst.cfg | 2 +- resources/variants/fabtotum_lite04.inst.cfg | 2 +- resources/variants/fabtotum_lite06.inst.cfg | 2 +- resources/variants/fabtotum_pro02.inst.cfg | 2 +- resources/variants/fabtotum_pro04.inst.cfg | 2 +- resources/variants/fabtotum_pro06.inst.cfg | 2 +- resources/variants/fabtotum_pro08.inst.cfg | 2 +- .../variants/imade3d_jellybox_0.4.inst.cfg | 2 +- .../imade3d_jellybox_0.4_2-fans.inst.cfg | 2 +- resources/variants/ultimaker2_0.25.inst.cfg | 2 +- resources/variants/ultimaker2_0.4.inst.cfg | 2 +- resources/variants/ultimaker2_0.6.inst.cfg | 2 +- resources/variants/ultimaker2_0.8.inst.cfg | 2 +- .../ultimaker2_extended_0.25.inst.cfg | 2 +- .../variants/ultimaker2_extended_0.4.inst.cfg | 2 +- .../variants/ultimaker2_extended_0.6.inst.cfg | 2 +- .../variants/ultimaker2_extended_0.8.inst.cfg | 2 +- .../ultimaker2_extended_plus_0.25.inst.cfg | 2 +- .../ultimaker2_extended_plus_0.4.inst.cfg | 2 +- .../ultimaker2_extended_plus_0.6.inst.cfg | 2 +- .../ultimaker2_extended_plus_0.8.inst.cfg | 2 +- .../variants/ultimaker2_plus_0.25.inst.cfg | 2 +- .../variants/ultimaker2_plus_0.4.inst.cfg | 2 +- .../variants/ultimaker2_plus_0.6.inst.cfg | 2 +- .../variants/ultimaker2_plus_0.8.inst.cfg | 2 +- resources/variants/ultimaker3_aa0.8.inst.cfg | 2 +- resources/variants/ultimaker3_aa04.inst.cfg | 2 +- resources/variants/ultimaker3_bb0.8.inst.cfg | 2 +- resources/variants/ultimaker3_bb04.inst.cfg | 2 +- .../ultimaker3_extended_aa0.8.inst.cfg | 2 +- .../ultimaker3_extended_aa04.inst.cfg | 2 +- .../ultimaker3_extended_bb0.8.inst.cfg | 2 +- .../ultimaker3_extended_bb04.inst.cfg | 2 +- 280 files changed, 482 insertions(+), 277 deletions(-) create mode 100644 plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade30to31/__init__.py create mode 100644 plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2d1c35aca7..eb802cf6f8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -105,7 +105,7 @@ class CuraApplication(QtApplication): # SettingVersion represents the set of settings available in the machine/extruder definitions. # You need to make sure that this version number needs to be increased if there is any non-backwards-compatible # changes of the settings. - SettingVersion = 3 + SettingVersion = 4 class ResourceTypes: QmlFiles = Resources.UserType + 1 diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py new file mode 100644 index 0000000000..d328b14367 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -0,0 +1,141 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import configparser #To parse preference files. +import io #To serialise the preference files afterwards. + +from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this. + + +# a list of all legacy "Not Supported" quality profiles +_OLD_NOT_SUPPORTED_PROFILES = [ + "um2p_pp_0.25_normal.inst.cfg", + "um2p_tpu_0.8_normal.inst.cfg", + "um3_bb0.4_ABS_Fast_Print.inst.cfg", + "um3_bb0.4_ABS_Superdraft_Print.inst.cfg", + "um3_bb0.4_CPEP_Fast_Print.inst.cfg", + "um3_bb0.4_CPEP_Superdraft_Print.inst.cfg", + "um3_bb0.4_CPE_Fast_Print.inst.cfg", + "um3_bb0.4_CPE_Superdraft_Print.inst.cfg", + "um3_bb0.4_Nylon_Fast_Print.inst.cfg", + "um3_bb0.4_Nylon_Superdraft_Print.inst.cfg", + "um3_bb0.4_PC_Fast_Print.inst.cfg", + "um3_bb0.4_PLA_Fast_Print.inst.cfg", + "um3_bb0.4_PLA_Superdraft_Print.inst.cfg", + "um3_bb0.4_PP_Fast_Print.inst.cfg", + "um3_bb0.4_PP_Superdraft_Print.inst.cfg", + "um3_bb0.4_TPU_Fast_Print.inst.cfg", + "um3_bb0.4_TPU_Superdraft_Print.inst.cfg", + "um3_bb0.8_ABS_Fast_Print.inst.cfg", + "um3_bb0.8_ABS_Superdraft_Print.inst.cfg", + "um3_bb0.8_CPEP_Fast_Print.inst.cfg", + "um3_bb0.8_CPEP_Superdraft_Print.inst.cfg", + "um3_bb0.8_CPE_Fast_Print.inst.cfg", + "um3_bb0.8_CPE_Superdraft_Print.inst.cfg", + "um3_bb0.8_Nylon_Fast_Print.inst.cfg", + "um3_bb0.8_Nylon_Superdraft_Print.inst.cfg", + "um3_bb0.8_PC_Fast_Print.inst.cfg", + "um3_bb0.8_PC_Superdraft_Print.inst.cfg", + "um3_bb0.8_PLA_Fast_Print.inst.cfg", + "um3_bb0.8_PLA_Superdraft_Print.inst.cfg", + "um3_bb0.8_PP_Fast_Print.inst.cfg", + "um3_bb0.8_PP_Superdraft_Print.inst.cfg", + "um3_bb0.8_TPU_Fast_print.inst.cfg", + "um3_bb0.8_TPU_Superdraft_Print.inst.cfg", +] + + +class VersionUpgrade30to31(VersionUpgrade): + ## Gets the version number from a CFG file in Uranium's 3.0 format. + # + # Since the format may change, this is implemented for the 3.0 format only + # and needs to be included in the version upgrade system rather than + # globally in Uranium. + # + # \param serialised The serialised form of a CFG file. + # \return The version number stored in the CFG file. + # \raises ValueError The format of the version number in the file is + # incorrect. + # \raises KeyError The format of the file is incorrect. + def getCfgVersion(self, serialised): + parser = configparser.ConfigParser(interpolation = None) + parser.read_string(serialised) + format_version = int(parser.get("general", "version")) #Explicitly give an exception when this fails. That means that the file format is not recognised. + setting_version = int(parser.get("metadata", "setting_version", fallback = 0)) + return format_version * 1000000 + setting_version + + ## Upgrades a preferences file from version 3.0 to 3.1. + # + # \param serialised The serialised form of a preferences file. + # \param filename The name of the file to upgrade. + def upgradePreferences(self, serialised, filename): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialised) + + # Update version numbers + if "general" not in parser: + parser["general"] = {} + parser["general"]["version"] = "5" + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "4" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] + + ## Upgrades the given instance container file from version 3.0 to 3.1. + # + # \param serialised The serialised form of the container file. + # \param filename The name of the file to upgrade. + def upgradeInstanceContainer(self, serialised, filename): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialised) + + for each_section in ("general", "metadata"): + if not parser.has_section(each_section): + parser.add_section(each_section) + + # Update version numbers + parser["general"]["version"] = "2" + parser["metadata"]["setting_version"] = "4" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] + + + ## Upgrades a container stack from version 3.0 to 3.1. + # + # \param serialised The serialised form of a container stack. + # \param filename The name of the file to upgrade. + def upgradeStack(self, serialised, filename): + parser = configparser.ConfigParser(interpolation=None) + parser.read_string(serialised) + + for each_section in ("general", "metadata"): + if not parser.has_section(each_section): + parser.add_section(each_section) + + # change "not supported" quality profiles to empty because they no longer exist + if parser.has_section("containers"): + if parser.has_option("containers", "2"): + quality_profile_id = parser["containers"]["2"] + if quality_profile_id in _OLD_NOT_SUPPORTED_PROFILES: + parser["containers"]["2"] = "empty_quality" + + # Update version numbers + if "general" not in parser: + parser["general"] = {} + parser["general"]["version"] = "3" + + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "4" + + # Re-serialise the file. + output = io.StringIO() + parser.write(output) + return [filename], [output.getvalue()] diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/__init__.py b/plugins/VersionUpgrade/VersionUpgrade30to31/__init__.py new file mode 100644 index 0000000000..b4b75dddf7 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/__init__.py @@ -0,0 +1,56 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import VersionUpgrade30to31 + +upgrade = VersionUpgrade30to31.VersionUpgrade30to31() + +def getMetaData(): + return { + "version_upgrade": { + # From To Upgrade function + ("preferences", 5000003): ("preferences", 5000004, upgrade.upgradePreferences), + + ("machine_stack", 3000003): ("machine_stack", 3000004, upgrade.upgradeStack), + ("extruder_train", 3000003): ("extruder_train", 3000004, upgrade.upgradeStack), + + ("quality_changes", 2000003): ("quality_changes", 2000004, upgrade.upgradeInstanceContainer), + ("user", 2000003): ("user", 2000004, upgrade.upgradeInstanceContainer), + ("quality", 2000003): ("quality", 2000004, upgrade.upgradeInstanceContainer), + ("definition_changes", 2000003): ("definition_changes", 2000004, upgrade.upgradeInstanceContainer), + ("variant", 2000003): ("variant", 2000004, upgrade.upgradeInstanceContainer) + }, + "sources": { + "preferences": { + "get_version": upgrade.getCfgVersion, + "location": {"."} + }, + "machine_stack": { + "get_version": upgrade.getCfgVersion, + "location": {"./machine_instances"} + }, + "extruder_train": { + "get_version": upgrade.getCfgVersion, + "location": {"./extruders"} + }, + "quality_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./quality"} + }, + "user": { + "get_version": upgrade.getCfgVersion, + "location": {"./user"} + }, + "definition_changes": { + "get_version": upgrade.getCfgVersion, + "location": {"./definition_changes"} + }, + "variant": { + "get_version": upgrade.getCfgVersion, + "location": {"./variants"} + } + } + } + +def register(app): + return { "version_upgrade": upgrade } diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json b/plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json new file mode 100644 index 0000000000..d80b820976 --- /dev/null +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json @@ -0,0 +1,8 @@ + { + "name": "Version Upgrade 3.0 to 3.1", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Upgrades configurations from Cura 3.0 to Cura 3.1.", + "api": 4, + "i18n-catalog": "cura" +} diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 86f3c87bb5..51a3c51a8b 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -35,7 +35,7 @@ class XmlMaterialProfile(InstanceContainer): # \return The corresponding setting_version. def xmlVersionToSettingVersion(self, xml_version: str) -> int: if xml_version == "1.3": - return 3 + return 4 return 0 #Older than 1.3. def getInheritedFiles(self): diff --git a/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg b/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg index 6be4578649..32550d86a5 100644 --- a/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = -1 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/abax_pri3/apri3_pla_high.inst.cfg b/resources/quality/abax_pri3/apri3_pla_high.inst.cfg index d3df991d53..2007785719 100644 --- a/resources/quality/abax_pri3/apri3_pla_high.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg b/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg index 326e35e251..dba0a0460f 100644 --- a/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg +++ b/resources/quality/abax_pri3/apri3_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg b/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg index 140a59db3b..11892a6223 100644 --- a/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = -1 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/abax_pri5/apri5_pla_high.inst.cfg b/resources/quality/abax_pri5/apri5_pla_high.inst.cfg index dfa265d360..852efe699e 100644 --- a/resources/quality/abax_pri5/apri5_pla_high.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg b/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg index 81fbf2a42d..244d544c80 100644 --- a/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg +++ b/resources/quality/abax_pri5/apri5_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/abax_titan/atitan_pla_fast.inst.cfg b/resources/quality/abax_titan/atitan_pla_fast.inst.cfg index b8d8f019cd..a2d802a3ba 100644 --- a/resources/quality/abax_titan/atitan_pla_fast.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = -1 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/abax_titan/atitan_pla_high.inst.cfg b/resources/quality/abax_titan/atitan_pla_high.inst.cfg index 2cffe3ce8a..7ee8c35133 100644 --- a/resources/quality/abax_titan/atitan_pla_high.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_high.inst.cfg @@ -7,7 +7,7 @@ type = quality material = generic_pla weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/abax_titan/atitan_pla_normal.inst.cfg b/resources/quality/abax_titan/atitan_pla_normal.inst.cfg index f1b6237e07..6c40914566 100644 --- a/resources/quality/abax_titan/atitan_pla_normal.inst.cfg +++ b/resources/quality/abax_titan/atitan_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg index 2a7089f3fe..3454f8b3ad 100644 --- a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = -1 global_quality = True diff --git a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg index d2b0dae2bb..b5ac4cb6a1 100644 --- a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = 1 global_quality = True diff --git a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg index ee5b771912..c5a93e65c1 100644 --- a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = 0 global_quality = True diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg index 3abcc16f39..418855a9ba 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg index a47fc2b8bf..e95ef08e22 100644 --- a/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.25_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg index c37b5c677c..524f5ba12a 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg index ec0fdfa07b..24ffb19d6f 100644 --- a/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.4_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg index 211e78357b..1281a3afdd 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_abs_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg index 319c0748af..a8d19deef7 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_abs_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg index fc3b1e49f0..87cc855f44 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg index 0c453ed6b0..4ca2598051 100644 --- a/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg +++ b/resources/quality/cartesio/abs/cartesio_0.8_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg index 4052520597..42eb705f11 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = dsm_arnitel2045_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg index a8a5e22a3b..538fe91b76 100644 --- a/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg +++ b/resources/quality/cartesio/arnitel/cartesio_0.4_arnitel2045_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = dsm_arnitel2045_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg index 29c99bda49..11760b139f 100644 --- a/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Coarse_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse global_quality = True weight = -3 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.4 diff --git a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg index e5cb9712d2..c654dba598 100644 --- a/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Extra_Coarse_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse global_quality = True weight = -4 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.6 diff --git a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg index 16570b97bf..393a5f3b39 100644 --- a/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 1 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg index 182ae137e7..c09493ba10 100644 --- a/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg +++ b/resources/quality/cartesio/cartesio_global_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg index 1a51725339..eae4e82cd3 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg index fa845592fa..0c47b18196 100644 --- a/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.25_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg index 56b5e7ef38..14f1ea4662 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg index cad4b5255f..bd13b358ff 100644 --- a/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.4_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg index b52f4df1fa..ca864692c3 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_hips_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg index 7eba4c99c4..3cadef4fdd 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_hips_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg index 06ddcc0959..07839c8a9a 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_hips_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg index 534d63115b..acc9db0891 100644 --- a/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg +++ b/resources/quality/cartesio/hips/cartesio_0.8_hips_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_hips_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg index ba2c95043c..b1f2f17d41 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg index fb9393577f..bcfa1c2e30 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.25_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg index 92c00bc5df..2cd50efeb2 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg index 389a01fcb4..7a7d767ea3 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.4_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg index f8ed2fbf41..5684c89e23 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_nylon_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg index 607069e4db..8d97e9ac5f 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_nylon_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg index 3c1bbffa83..946f8de34d 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg index e964ab95b2..80f390c254 100644 --- a/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg +++ b/resources/quality/cartesio/nylon/cartesio_0.8_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 86f2dbf91f..2f401556d4 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg index f24f3caed0..225b0ec5cf 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index 3d44cfd39f..53e61a81a2 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg index fe873f537a..e7b179dfe1 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg index 4e802a4e9b..baa3a1fdce 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pc_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg index 21153fce38..81f939f800 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pc_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index a8cc757fbb..41b2cc70f0 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg index 9574471b1c..e5ae6aff1d 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg index 2efa3ca0da..c5c4be6f4a 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg index 377520f471..6d12bdc402 100644 --- a/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.25_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg index c31c18b192..43dda5007c 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg index 1bf8c4a4d6..094dc33263 100644 --- a/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.4_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg index 599ba08eaa..da9e4ad3dd 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_petg_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg index 2f1a138115..607ba778a1 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_petg_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg index 1a804307c9..3010d95dab 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_petg_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg index 6eca142191..fbf8fac67f 100644 --- a/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg +++ b/resources/quality/cartesio/petg/cartesio_0.8_petg_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_petg_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg index 9cfa09aee7..9d8130602e 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg index 359ca15f96..98401dbf42 100644 --- a/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.25_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.25_mm weight = 0 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg index 3d97fdbae8..2eda5103d7 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg index fef8bb53d3..f3d3820ff7 100644 --- a/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.4_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.4_mm weight = 0 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg index 06cd974d26..d2cf708336 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pla_175_cartesio_0.8_mm weight = -3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg index d161befcc1..888d8f91a7 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pla_175_cartesio_0.8_mm weight = -4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg index b017fb9d5d..558514db98 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg index 6075c2651f..9c508e4a1f 100644 --- a/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg +++ b/resources/quality/cartesio/pla/cartesio_0.8_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_175_cartesio_0.8_mm weight = 0 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg index bd170cfccc..fcbf4913de 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.25_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg index 23ba53078b..3893421df0 100644 --- a/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.25_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.25_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.3 diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg index de12e2987d..5876db1e2e 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.4_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg index 3418cce66c..c977e79a5c 100644 --- a/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.4_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.4_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.5 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg index 17c9f81d2d..8c36d8e7ed 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse material = generic_pva_175_cartesio_0.8_mm weight = 3 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg index ffd4e34204..c2b19868f6 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = extra coarse material = generic_pva_175_cartesio_0.8_mm weight = 4 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg index bd32e91b20..5bd285285a 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pva_175_cartesio_0.8_mm weight = 1 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg index 6d309464a6..a11bff95e1 100644 --- a/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg +++ b/resources/quality/cartesio/pva/cartesio_0.8_pva_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pva_175_cartesio_0.8_mm weight = 2 -setting_version = 3 +setting_version = 4 [values] infill_line_width = 0.9 diff --git a/resources/quality/coarse.inst.cfg b/resources/quality/coarse.inst.cfg index 3f197bb50c..133ffc8951 100644 --- a/resources/quality/coarse.inst.cfg +++ b/resources/quality/coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = coarse global_quality = True weight = -3 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.4 diff --git a/resources/quality/draft.inst.cfg b/resources/quality/draft.inst.cfg index 00932feb68..a155c8f2e1 100644 --- a/resources/quality/draft.inst.cfg +++ b/resources/quality/draft.inst.cfg @@ -9,7 +9,7 @@ type = quality quality_type = draft global_quality = True weight = -2 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/extra_coarse.inst.cfg b/resources/quality/extra_coarse.inst.cfg index 183fa825e8..ce28e54721 100644 --- a/resources/quality/extra_coarse.inst.cfg +++ b/resources/quality/extra_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = Extra coarse global_quality = True weight = -4 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.6 diff --git a/resources/quality/fabtotum/fabtotum_abs_fast.inst.cfg b/resources/quality/fabtotum/fabtotum_abs_fast.inst.cfg index d38323a180..245997a27e 100644 --- a/resources/quality/fabtotum/fabtotum_abs_fast.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_abs_fast.inst.cfg @@ -5,7 +5,7 @@ name = Fast Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_abs quality_type = fast weight = -1 diff --git a/resources/quality/fabtotum/fabtotum_abs_high.inst.cfg b/resources/quality/fabtotum/fabtotum_abs_high.inst.cfg index 5333512e4c..26300eec7d 100644 --- a/resources/quality/fabtotum/fabtotum_abs_high.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_abs_high.inst.cfg @@ -5,7 +5,7 @@ name = High Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_abs quality_type = high weight = 1 diff --git a/resources/quality/fabtotum/fabtotum_abs_normal.inst.cfg b/resources/quality/fabtotum/fabtotum_abs_normal.inst.cfg index fd0fca7887..53d20c8cbc 100644 --- a/resources/quality/fabtotum/fabtotum_abs_normal.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_abs_normal.inst.cfg @@ -5,7 +5,7 @@ name = Normal Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_abs quality_type = normal weight = 0 diff --git a/resources/quality/fabtotum/fabtotum_nylon_fast.inst.cfg b/resources/quality/fabtotum/fabtotum_nylon_fast.inst.cfg index 1c9e384e77..22bbcbeaeb 100644 --- a/resources/quality/fabtotum/fabtotum_nylon_fast.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_nylon_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = fabtotum_nylon quality_type = fast weight = -1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/fabtotum/fabtotum_nylon_high.inst.cfg b/resources/quality/fabtotum/fabtotum_nylon_high.inst.cfg index cffa1f0e86..a625bd715f 100644 --- a/resources/quality/fabtotum/fabtotum_nylon_high.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = fabtotum_nylon quality_type = high weight = 1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/fabtotum/fabtotum_nylon_normal.inst.cfg b/resources/quality/fabtotum/fabtotum_nylon_normal.inst.cfg index c2bec3396e..b05d30c5c6 100644 --- a/resources/quality/fabtotum/fabtotum_nylon_normal.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = fabtotum_nylon quality_type = normal weight = 0 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/fabtotum/fabtotum_pla_fast.inst.cfg b/resources/quality/fabtotum/fabtotum_pla_fast.inst.cfg index 4adda21b5a..1f1c93961b 100644 --- a/resources/quality/fabtotum/fabtotum_pla_fast.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_pla_fast.inst.cfg @@ -5,7 +5,7 @@ name = Fast Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_pla quality_type = fast weight = -1 diff --git a/resources/quality/fabtotum/fabtotum_pla_high.inst.cfg b/resources/quality/fabtotum/fabtotum_pla_high.inst.cfg index e3aed0ab0e..9cd067703c 100644 --- a/resources/quality/fabtotum/fabtotum_pla_high.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_pla_high.inst.cfg @@ -5,7 +5,7 @@ name = High Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_pla quality_type = high weight = 1 diff --git a/resources/quality/fabtotum/fabtotum_pla_normal.inst.cfg b/resources/quality/fabtotum/fabtotum_pla_normal.inst.cfg index 81a75283a5..5b5125c4e5 100644 --- a/resources/quality/fabtotum/fabtotum_pla_normal.inst.cfg +++ b/resources/quality/fabtotum/fabtotum_pla_normal.inst.cfg @@ -5,7 +5,7 @@ name = Normal Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = fabtotum_pla quality_type = normal weight = 0 diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg index 846dc58827..d4333c90da 100644 --- a/resources/quality/high.inst.cfg +++ b/resources/quality/high.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 1 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg index ad22aacc18..e36286c6ae 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg index 35268229b3..3240bad98b 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_coarse_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm_2-fans weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg index ca5f8b5a28..2790a5a742 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg index a2b540dc7f..14f141f0bf 100644 --- a/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_petg_0.4_medium_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_petg_imade3d_jellybox_0.4_mm_2-fans weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg index b3472a0cf5..842ec618e0 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg index c7dd462a74..17e085d84d 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_coarse_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg index 7035deab6e..a4b44f47f6 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg index 73e33a74fb..962b3c9ad4 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_fine_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg index 8a14eab5c6..952b16ecf8 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg index 64917bc37d..bd70d105a4 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_medium_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg index 15be25bb1b..a9d0679612 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm weight = 2 quality_type = ultrahigh -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg index b4f0db9cb6..097e1fc76a 100644 --- a/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg +++ b/resources/quality/imade3d_jellybox/generic_pla_0.4_ultrafine_2-fans.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_imade3d_jellybox_0.4_mm_2-fans weight = 2 quality_type = ultrahigh -setting_version = 3 +setting_version = 4 [values] adhesion_type = skirt diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_draft.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_draft.inst.cfg index 5d3bf86b90..5401ec7bd6 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_draft.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -3 material = generic_abs quality_type = coarse -setting_version = 3 +setting_version = 4 [values] layer_height = 0.35 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_extra_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_extra_fine.inst.cfg index e29c38f225..aea8fc9535 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_extra_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_extra_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = 1 material = generic_abs quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_fine.inst.cfg index 552ad8901e..24adbd9f6c 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = 0 material = generic_abs quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_low.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_low.inst.cfg index a63f9065ef..98d2475633 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_low.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_low.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -2 material = generic_abs quality_type = draft -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_normal.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_normal.inst.cfg index 1449961b6c..ab2e9dabbc 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_abs_normal.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_abs_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -1 material = generic_abs quality_type = low -setting_version = 3 +setting_version = 4 [values] layer_height = 0.15 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg index 2b3e64c67b..f868ab40fc 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -3 material = generic_pla quality_type = coarse -setting_version = 3 +setting_version = 4 [values] layer_height = 0.35 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg index 2c14044484..e907f7ccaf 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg index 48617d23df..841023d532 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = 0 material = generic_pla quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg index 724c52b40d..ca874c6bce 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -2 material = generic_pla quality_type = draft -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg index 7c6f7d5e05..fcfbe72b24 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -1 material = generic_pla quality_type = low -setting_version = 3 +setting_version = 4 [values] layer_height = 0.15 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg index 105cf0b199..009af9b87b 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -3 material = generic_pla quality_type = coarse -setting_version = 3 +setting_version = 4 [values] layer_height = 0.35 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_extra_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_extra_fine.inst.cfg index 35aef2e19e..447e3b012d 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_extra_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_extra_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_fine.inst.cfg index 06ec265152..80b2375108 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_fine.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = 0 material = generic_pla quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg index db47c47fc4..e30c52f4e6 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -2 material = generic_pla quality_type = draft -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_normal.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_normal.inst.cfg index 1ad63191a4..31bdaa51bc 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_normal.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -1 material = generic_pla quality_type = low -setting_version = 3 +setting_version = 4 [values] layer_height = 0.15 diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg index 21e4d0d404..e92490722d 100644 --- a/resources/quality/low.inst.cfg +++ b/resources/quality/low.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = low global_quality = True weight = -1 -setting_version = 3 +setting_version = 4 [values] infill_sparse_density = 10 diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg index acbdf1033e..9fb7b238cd 100644 --- a/resources/quality/normal.inst.cfg +++ b/resources/quality/normal.inst.cfg @@ -8,6 +8,6 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 3 +setting_version = 4 [values] diff --git a/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg index deefea63dd..ae8a377116 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_high.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] infill_sparse_density = 70 diff --git a/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg index f9ed09afca..07ab7e364b 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_max.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 2 quality_type = extra_high -setting_version = 3 +setting_version = 4 [values] infill_sparse_density = 70 diff --git a/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg b/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg index 7cbd9a84fe..e0d2f7d818 100644 --- a/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg +++ b/resources/quality/peopoly_moai/peopoly_moai_normal.inst.cfg @@ -7,7 +7,7 @@ definition = peopoly_moai type = quality weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] infill_sparse_density = 70 diff --git a/resources/quality/ultimaker2/um2_draft.inst.cfg b/resources/quality/ultimaker2/um2_draft.inst.cfg index 11bdf03e92..4fe3f51e20 100644 --- a/resources/quality/ultimaker2/um2_draft.inst.cfg +++ b/resources/quality/ultimaker2/um2_draft.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker2 type = quality quality_type = draft weight = -2 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker2/um2_high.inst.cfg b/resources/quality/ultimaker2/um2_high.inst.cfg index 63b820479a..96941beed2 100644 --- a/resources/quality/ultimaker2/um2_high.inst.cfg +++ b/resources/quality/ultimaker2/um2_high.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker2 type = quality quality_type = high weight = 1 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker2/um2_low.inst.cfg b/resources/quality/ultimaker2/um2_low.inst.cfg index bb8ef2fa87..832962984c 100644 --- a/resources/quality/ultimaker2/um2_low.inst.cfg +++ b/resources/quality/ultimaker2/um2_low.inst.cfg @@ -7,7 +7,7 @@ definition = ultimaker2 type = quality quality_type = low weight = -1 -setting_version = 3 +setting_version = 4 [values] infill_sparse_density = 10 diff --git a/resources/quality/ultimaker2/um2_normal.inst.cfg b/resources/quality/ultimaker2/um2_normal.inst.cfg index 0673ba9eb4..ea804feb80 100644 --- a/resources/quality/ultimaker2/um2_normal.inst.cfg +++ b/resources/quality/ultimaker2/um2_normal.inst.cfg @@ -7,6 +7,6 @@ definition = ultimaker2 type = quality quality_type = normal weight = 0 -setting_version = 3 +setting_version = 4 [values] diff --git a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg index ba94d1a008..638a1a9384 100644 --- a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg index fa91cb12e5..9f4dfc0b5d 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg index 97253fb753..7bf51b0211 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg index 2b63b8e8be..3c6f40e0bc 100644 --- a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pla_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg index 6d4dc257bf..ef79e30b74 100644 --- a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ material = generic_pla_ultimaker2_plus_0.6_mm type = quality weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg index 88d95ebc3f..42418ea392 100644 --- a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ material = generic_pla_ultimaker2_plus_0.8_mm type = quality weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_min_layer_time = 5 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg index e2b7f34549..50a4076de2 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg index aa4918b0c7..9d1bcf6ff5 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg index 0c8b8233fb..84a5557434 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg index de5ddb9726..efc749ad8c 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg index bff307740a..eb706c5762 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.5 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg index 510494c0c6..2dba5a9304 100644 --- a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_abs_ultimaker2_plus_0.8_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.5 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg index f47437eb58..8e87e0e7b6 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.25_mm weight = -1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.2 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg index 7e3dc1a39e..e311df00a8 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.8 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg index 4be015ce35..685b7798fc 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.8 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg index 9b5ac3c163..aadb4195f3 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.8 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg index acac263691..332033368f 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.8 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg index a3b15628dd..e4fcae8aa1 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_ultimaker2_plus_0.8_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] cool_fan_speed_min = =cool_fan_speed * 0.8 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg index 4c81178592..55af936a89 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.4_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg index 216c8568d1..eb0ca5e81f 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg index b718af40d9..b324d867bc 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg index 4e8de61ad6..c8c7576d30 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg index 1e9f1029c6..28353f729d 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg index f64cd2cf1a..f74db21b91 100644 --- a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_cpe_plus_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg index e136dad3b8..b8924423e2 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg index e963f8b438..323fa51a8d 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.25_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg index 134c1d033b..7628cd0be1 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg index 04469385a0..a97a4c4e8f 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg index 20662c3e21..0cd7bbdbfd 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg index b8cd3a1a3a..d5e0025913 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg index c615480917..f653a90f95 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg index af20b564e4..144c8e74ac 100644 --- a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg index 0498e5a81f..d38f2af4d3 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg index e4a08a5bb1..aa176f67a2 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.25_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg index c3d3626380..0408ead05e 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg index 705dfb175a..ed430f10c0 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg index 5eb29eba57..b6c3a66c0b 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg index 82a3e56013..0dfb533f56 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.6_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg index 890a08608c..3eee23006f 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.8_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg index 0456166d70..40da82e6bf 100644 --- a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pc_ultimaker2_plus_0.8_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg index d471e39853..6f4e366209 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.4_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg index e313b04ac2..c7224f475f 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg index 901a23ba08..203db9883e 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.6_mm weight = -2 quality_type = draft -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg index 3adebf1fc6..64dfbc9281 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg index 55567d2c4e..f6d56242dd 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_draft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.8_mm weight = -2 quality_type = fast -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg index 8653faea13..ecb3e3da4a 100644 --- a/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_pp_0.8_verydraft.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_pp_ultimaker2_plus_0.8_mm weight = -3 quality_type = draft -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg index bbb4002d0b..b1cb56a543 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.25_mm weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg index 22fe2566f9..80cc92fe64 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.4_mm weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg index 12a8f6521b..9796adada9 100644 --- a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_tpu_ultimaker2_plus_0.6_mm weight = -1 quality_type = fast -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg index ea95ac161b..13dca72c27 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_abs_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg index 6db50fe270..10fa10c726 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_abs_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] cool_min_speed = 7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg index 305de52ea6..02f2327468 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_abs_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] cool_min_speed = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg index fc23b25e3e..fccb6a35f5 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_ABS_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_abs_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg index bbbfd3b6a1..dfdb1ca8a7 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_plus_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg index f39da90dc6..93b371a627 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_cpe_plus_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg index 6641e0f4ed..93647f9f44 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_cpe_plus_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg index c22d6eda31..2886ef2229 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_cpe_plus_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg index 96065673d6..5e3daf5a9e 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg index e866877b0e..e48f83994d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_cpe_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] cool_min_speed = 7 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg index 971c222ef7..fd0a8cd18d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_cpe_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] cool_min_speed = 12 diff --git a/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg index d77b673721..56c997eb15 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_CPE_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_cpe_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] machine_nozzle_cool_down_speed = 0.85 diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg index 5f3680c391..15283a3242 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_nylon_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg index c5dc2c37f9..c063725e82 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_nylon_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg index cb39a20918..218e1e50e1 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_nylon_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg index 0e3467d901..3b96939ac9 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_Nylon_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_nylon_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] adhesion_type = brim diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg index 2a2e7a1010..f8b4dd067c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pc_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg index 8887895e46..1db3935180 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_pc_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg index 07c372f9dc..0f9e9b15b0 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pc_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg index 9a7daeed93..26a3136069 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pc_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg index f2d76753b0..8c6e7bd782 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pla_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg index b78d1598cd..db441015a8 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_pla_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg index 0fa518546f..61807490e9 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high material = generic_pla_ultimaker3_AA_0.4 weight = 1 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg index ca4a3bf27b..d7254b854d 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PLA_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pla_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg index 7be9425947..3fe25e563a 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pp_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg index 132a4e6303..4c92c7a14b 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_pp_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg index 780ad8b2a1..db55956497 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PP_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_pp_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg index f1825240cf..6116dc1bda 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_tpu_ultimaker3_AA_0.4 weight = -2 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg index d223a83554..1da5d0fec8 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast material = generic_tpu_ultimaker3_AA_0.4 weight = -1 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg index c0b5065f53..1938e1c26c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal material = generic_tpu_ultimaker3_AA_0.4 weight = 0 -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg index b55678643d..7c16e6e8ee 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_abs_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] line_width = =machine_nozzle_size * 0.875 diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg index 3c21c74d8e..728b4c868f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_abs_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg index 9c4352043b..98ae70c568 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_ABS_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_abs_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.3 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg index 795d224a65..0a05e9aafd 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 58723d05fe..82efb6a57b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg index e125ec9f0b..ff375b6e49 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_cpe_plus_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg index 3c303fc9c2..b4d7035b8d 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_cpe_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg index 6525e0452f..b5ccc38534 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_cpe_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg index 195598e0f9..33ae223526 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_cpe_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] brim_width = 15 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg index fec8232b59..43ec77453c 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_nylon_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg index 8a0004309d..5b8626e8c2 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_nylon_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg index d3729b22d9..0b115ada4b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_Nylon_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_nylon_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] brim_width = 5.6 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg index dfc3d3ce72..0b666d2e0b 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pc_ultimaker3_AA_0.8 weight = 0 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg index 3f9864b72e..de212df4af 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pc_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg index 2fe51a392e..3e0c669eeb 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pc_ultimaker3_AA_0.8 weight = -1 -setting_version = 3 +setting_version = 4 [values] brim_width = 14 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg index eebe1a8e38..3c4303e017 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pla_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg index c35bf05908..5509f42aae 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pla_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg index 984a825085..645c3fe3ef 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PLA_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pla_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] cool_fan_full_at_height = =layer_height_0 + 2 * layer_height diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg index 0eb264a9db..f46c3cfb8f 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_pp_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg index cb12f4aedc..ac8087d0c4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_pp_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg index 3ceb547378..daf60f24e6 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_pp_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] brim_width = 25 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 0514a22b95..726ab82867 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft material = generic_tpu_ultimaker3_AA_0.8 weight = -2 -setting_version = 3 +setting_version = 4 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 805f12ef81..269725daa9 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft material = generic_tpu_ultimaker3_AA_0.8 weight = -4 -setting_version = 3 +setting_version = 4 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 3d1f29ee21..dd1737433a 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft material = generic_tpu_ultimaker3_AA_0.8 weight = -3 -setting_version = 3 +setting_version = 4 [values] brim_width = 8.75 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg index ee57d2b177..c87f744932 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft weight = -2 material = generic_pva_ultimaker3_BB_0.4 -setting_version = 3 +setting_version = 4 [values] material_print_temperature = =default_material_print_temperature + 10 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg index 90280ed2ee..23fa6d61d8 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Fast_Print.inst.cfg @@ -8,7 +8,7 @@ weight = -1 type = quality quality_type = fast material = generic_pva_ultimaker3_BB_0.4 -setting_version = 3 +setting_version = 4 [values] material_print_temperature = =default_material_print_temperature + 5 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg index b8d7dd3ada..3ba82d65c6 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_High_Quality.inst.cfg @@ -8,7 +8,7 @@ weight = 1 type = quality quality_type = high material = generic_pva_ultimaker3_BB_0.4 -setting_version = 3 +setting_version = 4 [values] material_standby_temperature = 100 diff --git a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg index 32591a38b7..a709d5613b 100644 --- a/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.4_PVA_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ weight = 0 type = quality quality_type = normal material = generic_pva_ultimaker3_BB_0.4 -setting_version = 3 +setting_version = 4 [values] material_standby_temperature = 100 diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg index a46218f31f..4cb296b4c7 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Draft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft weight = -2 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 3 +setting_version = 4 [values] material_print_temperature = =default_material_print_temperature + 5 diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg index 4e2f13af07..5249517844 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Superdraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft weight = -4 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg index c2d66f59bb..c34e19b134 100644 --- a/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft weight = -3 material = generic_pva_ultimaker3_BB_0.8 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.3 diff --git a/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg index f9976d0fbc..b56775a987 100644 --- a/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Draft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = draft global_quality = True weight = -2 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2 diff --git a/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg index 0a30227322..12f1183364 100644 --- a/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Fast_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = fast global_quality = True weight = -1 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.15 diff --git a/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg index a7028590af..cf6e6c45e0 100644 --- a/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_High_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = high global_quality = True weight = 0 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.06 diff --git a/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg index c8bf165b55..fef2328923 100644 --- a/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Normal_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = normal global_quality = True weight = 0 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.1 diff --git a/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg index f3ab433e92..be9acd4394 100644 --- a/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Superdraft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = superdraft global_quality = True weight = -4 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.4 diff --git a/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg index 46199fcece..e2c828fc2d 100644 --- a/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_global_Verydraft_Quality.inst.cfg @@ -8,7 +8,7 @@ type = quality quality_type = verydraft global_quality = True weight = -3 -setting_version = 3 +setting_version = 4 [values] layer_height = 0.3 diff --git a/resources/variants/cartesio_0.25.inst.cfg b/resources/variants/cartesio_0.25.inst.cfg index a266b10b24..0e082e5afa 100644 --- a/resources/variants/cartesio_0.25.inst.cfg +++ b/resources/variants/cartesio_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/cartesio_0.4.inst.cfg b/resources/variants/cartesio_0.4.inst.cfg index fe52e83622..27d07c0328 100644 --- a/resources/variants/cartesio_0.4.inst.cfg +++ b/resources/variants/cartesio_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/cartesio_0.8.inst.cfg b/resources/variants/cartesio_0.8.inst.cfg index 8a260c1e17..e96c78d922 100644 --- a/resources/variants/cartesio_0.8.inst.cfg +++ b/resources/variants/cartesio_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = cartesio [metadata] author = Cartesio type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/fabtotum_hyb35.inst.cfg b/resources/variants/fabtotum_hyb35.inst.cfg index 9d46205941..01e94728da 100644 --- a/resources/variants/fabtotum_hyb35.inst.cfg +++ b/resources/variants/fabtotum_hyb35.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.35 diff --git a/resources/variants/fabtotum_lite04.inst.cfg b/resources/variants/fabtotum_lite04.inst.cfg index 9209b2fffc..ee270a9ead 100644 --- a/resources/variants/fabtotum_lite04.inst.cfg +++ b/resources/variants/fabtotum_lite04.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/fabtotum_lite06.inst.cfg b/resources/variants/fabtotum_lite06.inst.cfg index 8c03f33794..49722a50d1 100644 --- a/resources/variants/fabtotum_lite06.inst.cfg +++ b/resources/variants/fabtotum_lite06.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/fabtotum_pro02.inst.cfg b/resources/variants/fabtotum_pro02.inst.cfg index 84e1583701..376588fe71 100644 --- a/resources/variants/fabtotum_pro02.inst.cfg +++ b/resources/variants/fabtotum_pro02.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.2 diff --git a/resources/variants/fabtotum_pro04.inst.cfg b/resources/variants/fabtotum_pro04.inst.cfg index 3e136e951a..54294c572c 100644 --- a/resources/variants/fabtotum_pro04.inst.cfg +++ b/resources/variants/fabtotum_pro04.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/fabtotum_pro06.inst.cfg b/resources/variants/fabtotum_pro06.inst.cfg index 7aa789fd17..f1055b6ade 100644 --- a/resources/variants/fabtotum_pro06.inst.cfg +++ b/resources/variants/fabtotum_pro06.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/fabtotum_pro08.inst.cfg b/resources/variants/fabtotum_pro08.inst.cfg index f1b9d195e7..ef7eb172be 100644 --- a/resources/variants/fabtotum_pro08.inst.cfg +++ b/resources/variants/fabtotum_pro08.inst.cfg @@ -6,7 +6,7 @@ definition = fabtotum [metadata] author = FABtotum type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/imade3d_jellybox_0.4.inst.cfg b/resources/variants/imade3d_jellybox_0.4.inst.cfg index e487b6abdc..ce9e82e59a 100644 --- a/resources/variants/imade3d_jellybox_0.4.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = imade3d_jellybox [metadata] author = IMADE3D type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg b/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg index 2db00fa0e3..60f9793b2a 100644 --- a/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg +++ b/resources/variants/imade3d_jellybox_0.4_2-fans.inst.cfg @@ -6,7 +6,7 @@ definition = imade3d_jellybox [metadata] author = IMADE3D type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_0.25.inst.cfg b/resources/variants/ultimaker2_0.25.inst.cfg index 1637f0ceaa..04084867dd 100644 --- a/resources/variants/ultimaker2_0.25.inst.cfg +++ b/resources/variants/ultimaker2_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_0.4.inst.cfg b/resources/variants/ultimaker2_0.4.inst.cfg index b074214138..f21d85e258 100644 --- a/resources/variants/ultimaker2_0.4.inst.cfg +++ b/resources/variants/ultimaker2_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_0.6.inst.cfg b/resources/variants/ultimaker2_0.6.inst.cfg index 6bd3b06d22..04128cc297 100644 --- a/resources/variants/ultimaker2_0.6.inst.cfg +++ b/resources/variants/ultimaker2_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_0.8.inst.cfg b/resources/variants/ultimaker2_0.8.inst.cfg index 66d05219b1..400069d60b 100644 --- a/resources/variants/ultimaker2_0.8.inst.cfg +++ b/resources/variants/ultimaker2_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2 [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_extended_0.25.inst.cfg b/resources/variants/ultimaker2_extended_0.25.inst.cfg index 6496025820..bdff9a5795 100644 --- a/resources/variants/ultimaker2_extended_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_extended_0.4.inst.cfg b/resources/variants/ultimaker2_extended_0.4.inst.cfg index 47be42efd7..2af9a75024 100644 --- a/resources/variants/ultimaker2_extended_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_extended_0.6.inst.cfg b/resources/variants/ultimaker2_extended_0.6.inst.cfg index cac05731e8..e0753f1c28 100644 --- a/resources/variants/ultimaker2_extended_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_extended_0.8.inst.cfg b/resources/variants/ultimaker2_extended_0.8.inst.cfg index 5baaf53163..43c033b799 100644 --- a/resources/variants/ultimaker2_extended_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg index 173e69d893..7f1bff4b0c 100644 --- a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.25 diff --git a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg index 88e3d291d6..f6747d059d 100644 --- a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg index 54b6b90b62..706e4b8aa6 100644 --- a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg index 5616f01699..287c3155b8 100644 --- a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_extended_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker2_plus_0.25.inst.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg index 4394090fa4..1d4617c86b 100644 --- a/resources/variants/ultimaker2_plus_0.25.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.25.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] coasting_min_volume = 0.17 diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg index ab3dd807ab..75a665ad95 100644 --- a/resources/variants/ultimaker2_plus_0.4.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.4.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.4 diff --git a/resources/variants/ultimaker2_plus_0.6.inst.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg index c3324bd7a8..60bbbaa049 100644 --- a/resources/variants/ultimaker2_plus_0.6.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.6.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.6 diff --git a/resources/variants/ultimaker2_plus_0.8.inst.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg index d0cd2424bd..339b320af3 100644 --- a/resources/variants/ultimaker2_plus_0.8.inst.cfg +++ b/resources/variants/ultimaker2_plus_0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker2_plus [metadata] author = Ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] machine_nozzle_size = 0.8 diff --git a/resources/variants/ultimaker3_aa0.8.inst.cfg b/resources/variants/ultimaker3_aa0.8.inst.cfg index 980cfd1a59..de7dfcc364 100644 --- a/resources/variants/ultimaker3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_aa0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_aa04.inst.cfg b/resources/variants/ultimaker3_aa04.inst.cfg index 01299f0853..289ae185b0 100644 --- a/resources/variants/ultimaker3_aa04.inst.cfg +++ b/resources/variants/ultimaker3_aa04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index 24c175c2b8..2cb3103dcf 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index 39d33b10f8..5dc0b2832a 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3 [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) diff --git a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg index 6bd491032e..b2ad86ff01 100644 --- a/resources/variants/ultimaker3_extended_aa0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_aa04.inst.cfg b/resources/variants/ultimaker3_extended_aa04.inst.cfg index 15c53b5930..fdea4de08c 100644 --- a/resources/variants/ultimaker3_extended_aa04.inst.cfg +++ b/resources/variants/ultimaker3_extended_aa04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] brim_width = 7 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index e75545b7f9..6ab16c4f10 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_enabled = True diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index a62480bd75..ee2f138754 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -6,7 +6,7 @@ definition = ultimaker3_extended [metadata] author = ultimaker type = variant -setting_version = 3 +setting_version = 4 [values] acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) From 0096fe0de3960238be4de56699e429e9b327ed21 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 12:54:21 +0100 Subject: [PATCH 087/764] Fix project loading to handle "Not Supported" quality profiles CURA-4451 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 28 ++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 5b1e084262..28d12bf2d5 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -21,6 +21,8 @@ from cura.Settings.CuraStackBuilder import CuraStackBuilder from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.ExtruderStack import ExtruderStack from cura.Settings.GlobalStack import GlobalStack +from cura.Settings.CuraContainerStack import _ContainerIndexes +from cura.QualityManager import QualityManager from configparser import ConfigParser import zipfile @@ -757,13 +759,37 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return + # Check quality profiles to make sure that if one stack has the "not supported" quality profile, + # all others should have the same. + # + # This block code tries to fix the following problems in Cura 3.0 and earlier: + # 1. The upgrade script can rename all "Not Supported" quality profiles to "empty_quality", but it cannot fix + # the problem that the global stack the extruder stacks may have different quality profiles. The code + # below loops over all stacks and make sure that if there is one stack with "Not Supported" profile, the + # rest should also use the "Not Supported" profile. + # 2. In earlier versions (at least 2.7 and 3.0), a wrong quality profile could be assigned to a stack. For + # example, a UM3 can have a BB 0.8 variant with "aa04_pla_fast" quality profile enabled. To fix this, + # in the code below we also check the actual available quality profiles for the machine. + # + has_not_supported = False + for stack in [global_stack] + extruder_stacks: + if stack.quality.getId() == "empty_quality": + has_not_supported = True + break + if not has_not_supported: + available_quality = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_stack, extruder_stacks) + has_not_supported = not available_quality + if has_not_supported: + empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + for stack in [global_stack] + extruder_stacks: + stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) + # # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those # MUST get updated too. # if self._resolve_strategies["machine"] == "new": - # A new machine was made, but it was serialized with the wrong user container. Fix that now. for container in user_instance_containers: # replacing the container ID for user instance containers for the extruders From 69cd00d1c730784e3e1c03db73e2b093b865a4f1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 13:13:54 +0100 Subject: [PATCH 088/764] Do not take into account the active materials when importing a quality profile CURA-4451 When importing a quality profile, it should not fail/succeed based on which materials are activated at the moment. The imported quality profile will be available when the user switches to a compatible settings. --- cura/Settings/CuraContainerRegistry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 12f27e8156..e623bd860b 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -303,6 +303,9 @@ class CuraContainerRegistry(ContainerRegistry): if "material" in quality_type_criteria: materials = ContainerRegistry.getInstance().findInstanceContainers(id = quality_type_criteria["material"]) del quality_type_criteria["material"] + # Do not filter quality containers here with materials because we are trying to import a profile, so it should + # NOT be restricted by the active materials on the current machine. + materials = None # Check to make sure the imported profile actually makes sense in context of the current configuration. # This prevents issues where importing a "draft" profile for a machine without "draft" qualities would report as From 22aaf64b637d44f108f66c01837b35880cd02c68 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 30 Oct 2017 14:42:46 +0100 Subject: [PATCH 089/764] Simplified version for validation need to show user agreement CURA-4501 --- cura/CuraApplication.py | 13 ++----------- plugins/UserAgreementPlugin/UserAgreement.py | 2 +- resources/qml/Cura.qml | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9da820c8a2..161660c0a4 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -306,7 +306,6 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") - self._has_user_agreement_shown = False for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin @@ -380,21 +379,13 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) - onHasUserAgreementShownChanged = pyqtSignal() - @pyqtProperty(bool) def needToShowUserAgreement(self): return self._need_to_show_user_agreement - @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) - def hasUserAgreementShown(self): - return self._has_user_agreement_shown - def setHasShownUserAgreement(self, shown = True): - emit_signal = self._has_user_agreement_shown != shown - self._has_user_agreement_shown = shown - if emit_signal: - self.onHasUserAgreementShownChanged.emit() + def setNeedToShowUserAgreement(self, set_value = True): + self._need_to_show_user_agreement = set_value ## The "Quit" button click event handler. @pyqtSlot() diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 01788f7b57..f472b6fb13 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - CuraApplication.getInstance().setHasShownUserAgreement(True) + CuraApplication.getInstance().setNeedToShowUserAgreement(False) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 8439d79d21..2fd19a8a03 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -897,7 +897,7 @@ UM.MainWindow } // check later if the user agreement dialog has been closed - if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + if (CuraApplication.needToShowUserAgreement) { restart(); } From 7a9dda4022eb82acf4b100b46ad13839e396235d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 14:46:31 +0100 Subject: [PATCH 090/764] Disable jogging for UM3 NetworkPrinterOutputDevice does not have the API to control jogging --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 9dedc87df4..d8dd780ed5 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -102,6 +102,8 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._target_bed_temperature = 0 self._processing_preheat_requests = True + self._can_control_manually = False + self.setPriority(3) # Make sure the output device gets selected above local file output self.setName(key) self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) From 3a9c8d16a21b2ffa25ff902429f1a6c647398d4d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 30 Oct 2017 15:07:46 +0100 Subject: [PATCH 091/764] Fix remaining references to instance_container._id These must've slipped through the cracks. Contributes to issue CURA-4243. --- cura/Settings/GlobalStack.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 88218c2f1e..5e1be36d67 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -74,7 +74,7 @@ class GlobalStack(CuraContainerStack): return if any(item.getId() == extruder.id for item in self._extruders.values()): - Logger.log("w", "Extruder [%s] has already been added to this stack [%s]", extruder.id, self._id) + Logger.log("w", "Extruder [%s] has already been added to this stack [%s]", extruder.id, self.getId()) return self._extruders[position] = extruder diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index f12c02fe8d..15ee48164d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -567,7 +567,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if old_extruder_id: new_extruder_id = extruder_stack_id_map[old_extruder_id] new_id = new_extruder_id + "_current_settings" - instance_container._id = new_id + instance_container.setMetaDataEntry("id", new_id) instance_container.setName(new_id) instance_container.setMetaDataEntry("extruder", new_extruder_id) containers_to_add.append(instance_container) @@ -576,7 +576,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if machine_id: new_machine_id = self.getNewId(machine_id) new_id = new_machine_id + "_current_settings" - instance_container._id = new_id + instance_container.setMetadataEntry("id", new_id) instance_container.setName(new_id) instance_container.setMetaDataEntry("machine", new_machine_id) containers_to_add.append(instance_container) From 8dfba9a31841b349d27f5c8eb892ec179c03b0e9 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 30 Oct 2017 15:31:14 +0100 Subject: [PATCH 092/764] Stop SettingTextField from setting values when getting/losing the focus Fixes #2694 --- resources/qml/Settings/SettingTextField.qml | 22 +++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 7c2317af63..cdc0588940 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -11,6 +11,14 @@ SettingItem id: base property var focusItem: input + property string textBeforeEdit + property bool textHasChanged + onFocusReceived: + { + textHasChanged = false; + textBeforeEdit = focusItem.text; + } + contents: Rectangle { id: control @@ -115,12 +123,22 @@ SettingItem Keys.onReleased: { - propertyProvider.setPropertyValue("value", text) + if (text != textBeforeEdit) + { + textHasChanged = true; + } + if (textHasChanged) + { + propertyProvider.setPropertyValue("value", text) + } } onEditingFinished: { - propertyProvider.setPropertyValue("value", text) + if (textHasChanged) + { + propertyProvider.setPropertyValue("value", text) + } } onActiveFocusChanged: From b45e44b3880c9cbc085eaa224fd620970f345966 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 15:43:01 +0200 Subject: [PATCH 093/764] Add useragreement screen on first run of Cura CURA-4501 --- cura/CuraApplication.py | 1 + plugins/UserAgreementPlugin/UserAgreement.py | 50 +++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.qml | 61 +++++++++++++++++++ plugins/UserAgreementPlugin/__init__.py | 10 +++ plugins/UserAgreementPlugin/plugin.json | 8 +++ 5 files changed, 130 insertions(+) create mode 100644 plugins/UserAgreementPlugin/UserAgreement.py create mode 100644 plugins/UserAgreementPlugin/UserAgreement.qml create mode 100644 plugins/UserAgreementPlugin/__init__.py create mode 100644 plugins/UserAgreementPlugin/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7d3e851b70..4a54f5b0ba 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -211,6 +211,7 @@ class CuraApplication(QtApplication): self.setRequiredPlugins([ "CuraEngineBackend", + "UserAgreement", "SolidView", "LayerView", "STLReader", diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py new file mode 100644 index 0000000000..148b1adecc --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -0,0 +1,50 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Extension import Extension +from UM.Preferences import Preferences +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry +from UM.Logger import Logger + +from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import QUrl, QObject, pyqtSlot + +import os.path + +class UserAgreement(Extension, QObject): + def __init__(self, parent = None): + QObject.__init__(self, parent) + Extension.__init__(self) + self._user_agreement_window = None + self._user_agreement_context = None + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + Preferences.getInstance().addPreference("general/accepted_user_agreement", False) + + def _onEngineCreated(self): + if not Preferences.getInstance().getValue("general/accepted_user_agreement"): + self.showUserAgreement() + + def showUserAgreement(self): + if not self._user_agreement_window: + self.createUserAgreementWindow() + + self._user_agreement_window.show() + + @pyqtSlot() + def disagreed(self): + Logger.log("i", "User did NOT Accept the license") + + @pyqtSlot() + def agreed(self): + Logger.log("i", "User Accepted the license") + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + + def createUserAgreementWindow(self): + path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) + + component = QQmlComponent(Application.getInstance()._engine, path) + self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) + self._user_agreement_context.setContextProperty("manager", self) + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml new file mode 100644 index 0000000000..20b4350acf --- /dev/null +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -0,0 +1,61 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.3 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import UM 1.1 as UM + +UM.Dialog +{ + id: baseDialog + minimumWidth: Math.floor(UM.Theme.getSize("modal_window_minimum").width * 0.75) + minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) + width: minimumWidth + height: minimumHeight + title: "User Agreement" + + TextArea + { + anchors.top: parent.top + width: parent.width + anchors.bottom: buttonRow.top + text: '

DISCLAIMER BY ULTIMAKER

+

PLEASE READ THIS DISCLAIMER CAREFULLY.

+

EXCEPT WHEN OTHERWISE STATED IN WRITING, ULTIMAKER PROVIDES ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE “AS IS” WITHOUT WARRANTY OF ANY KIND. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF ULTIMAKER SOFTWARE IS WITH YOU.

+

UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, IN NO EVENT WILL ULTIMAKER BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE ANY ULTIMAKER SOFTWARE OR THIRD PARTY SOFTWARE.

+ ' + readOnly: true; + textFormat: TextEdit.RichText + } + + Item + { + id: buttonRow + anchors.bottom: parent.bottom + width: parent.width + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + + Button + { + anchors.right: parent.right + text: "I understand and agree" + onClicked: { + manager.agreed + } + } + + Button + { + anchors.left: parent.left + text: "I don't agree" + onClicked: { + manager.disagreed + } + } + + } + +} diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py new file mode 100644 index 0000000000..635f8a6bc9 --- /dev/null +++ b/plugins/UserAgreementPlugin/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import UserAgreement + +def getMetaData(): + return {} + +def register(app): + return {"extension": UserAgreement.UserAgreement()} diff --git a/plugins/UserAgreementPlugin/plugin.json b/plugins/UserAgreementPlugin/plugin.json new file mode 100644 index 0000000000..aa5dbb1258 --- /dev/null +++ b/plugins/UserAgreementPlugin/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "UserAgreement", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Ask the user once if he/she agrees with our license", + "api": 4, + "i18n-catalog": "cura" +} From 9aebb395ab60ae41a870ab71cbf71b7a4f7f4f93 Mon Sep 17 00:00:00 2001 From: Mark Date: Sat, 28 Oct 2017 20:29:26 +0200 Subject: [PATCH 094/764] Refactor and cleanup CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 22 +++++++++++-------- plugins/UserAgreementPlugin/UserAgreement.qml | 15 ++++++++----- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 148b1adecc..c565399735 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -7,6 +7,8 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger +from cura.CuraApplication import CuraApplication + from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, QObject, pyqtSlot @@ -31,15 +33,17 @@ class UserAgreement(Extension, QObject): self._user_agreement_window.show() - @pyqtSlot() - def disagreed(self): - Logger.log("i", "User did NOT Accept the license") + @pyqtSlot(bool) + def didAgree(self, userChoice): + if userChoice: + Logger.log("i", 'User agreed to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", True) + self._user_agreement_window.hide() + else: + Logger.log("i", 'User did NOT agree to the user agreement') + Preferences.getInstance().setValue("general/accepted_user_agreement", False) + CuraApplication.getInstance().quit() - @pyqtSlot() - def agreed(self): - Logger.log("i", "User Accepted the license") - Preferences.getInstance().setValue("general/accepted_user_agreement", True) - self._user_agreement_window.hide() def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -47,4 +51,4 @@ class UserAgreement(Extension, QObject): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) + self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 20b4350acf..a2dd34e23f 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,12 +1,10 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 +import QtQuick 2.2 import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 -import UM 1.1 as UM +import UM 1.3 as UM UM.Dialog { @@ -43,7 +41,7 @@ UM.Dialog anchors.right: parent.right text: "I understand and agree" onClicked: { - manager.agreed + manager.didAgree(true) } } @@ -52,10 +50,15 @@ UM.Dialog anchors.left: parent.left text: "I don't agree" onClicked: { - manager.disagreed + manager.didAgree(false) } } } + onClosing: { + manager.didAgree(false) + } + + } From ca8127c047205fd3ed6fc4d3bc214cfc5ed81151 Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 29 Oct 2017 09:04:23 +0100 Subject: [PATCH 095/764] Fixed code comments CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 11 +++++------ plugins/UserAgreementPlugin/UserAgreement.qml | 14 +++++++------- plugins/UserAgreementPlugin/__init__.py | 2 +- resources/i18n/cura.pot | 15 +++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index c565399735..5b6b266444 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Extension import Extension @@ -14,10 +14,9 @@ from PyQt5.QtCore import QUrl, QObject, pyqtSlot import os.path -class UserAgreement(Extension, QObject): +class UserAgreement(QObject, Extension): def __init__(self, parent = None): - QObject.__init__(self, parent) - Extension.__init__(self) + super(UserAgreement, self).__init__() self._user_agreement_window = None self._user_agreement_context = None Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) @@ -36,11 +35,11 @@ class UserAgreement(Extension, QObject): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log("i", 'User agreed to the user agreement') + Logger.log('i', 'User agreed to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log("i", 'User did NOT agree to the user agreement') + Logger.log('i', 'User did NOT agree to the user agreement') Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index a2dd34e23f..52d35a4f44 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -1,8 +1,8 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 -import QtQuick.Controls 1.3 +import QtQuick.Controls 1.4 import UM 1.3 as UM @@ -13,7 +13,7 @@ UM.Dialog minimumHeight: Math.floor(UM.Theme.getSize("modal_window_minimum").height * 0.5) width: minimumWidth height: minimumHeight - title: "User Agreement" + title: catalog.i18nc("@title:window", "User Agreement") TextArea { @@ -36,10 +36,12 @@ UM.Dialog width: parent.width anchors.bottomMargin: UM.Theme.getSize("default_margin").height + UM.I18nCatalog { id: catalog; name:"cura" } + Button { anchors.right: parent.right - text: "I understand and agree" + text: catalog.i18nc("@action:button", "I understand and agree") onClicked: { manager.didAgree(true) } @@ -48,7 +50,7 @@ UM.Dialog Button { anchors.left: parent.left - text: "I don't agree" + text: catalog.i18nc("@action:button", "I don't agree") onClicked: { manager.didAgree(false) } @@ -59,6 +61,4 @@ UM.Dialog onClosing: { manager.didAgree(false) } - - } diff --git a/plugins/UserAgreementPlugin/__init__.py b/plugins/UserAgreementPlugin/__init__.py index 635f8a6bc9..88cb151f9e 100644 --- a/plugins/UserAgreementPlugin/__init__.py +++ b/plugins/UserAgreementPlugin/__init__.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import UserAgreement diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index fb4b9ed0d6..99ccd7a459 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -18,6 +18,21 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I understand and agree" +msgstr "" + +#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml +msgctxt "@action:button" +msgid "I don't agree" +msgstr "" + #: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml msgctxt "@label:status" msgid "Print aborted" From b5904cd2396e698dcd318c33d63db759bb111c35 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:32:45 +0100 Subject: [PATCH 096/764] Fix code style CURA-4501 --- plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 5b6b266444..cfad13dfae 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -35,11 +35,11 @@ class UserAgreement(QObject, Extension): @pyqtSlot(bool) def didAgree(self, userChoice): if userChoice: - Logger.log('i', 'User agreed to the user agreement') + Logger.log("i", "User agreed to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() else: - Logger.log('i', 'User did NOT agree to the user agreement') + Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() From aab601927c605b15c61beaf3c377ed19360f1d2b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 30 Oct 2017 10:33:49 +0100 Subject: [PATCH 097/764] Show Add Machine dialog after User Agreement dialog is closed CURA-4501 --- cura/CuraApplication.py | 19 +++++++++++++++++++ plugins/UserAgreementPlugin/UserAgreement.py | 4 ++-- resources/qml/Cura.qml | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4a54f5b0ba..96d8ced7a6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -300,6 +300,9 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) + self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") + self._has_user_agreement_shown = False + for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", @@ -372,6 +375,22 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) + onHasUserAgreementShownChanged = pyqtSignal() + + @pyqtProperty(bool) + def needToShowUserAgreement(self): + return self._need_to_show_user_agreement + + @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) + def hasUserAgreementShown(self): + return self._has_user_agreement_shown + + def setHasShownUserAgreement(self, shown = True): + emit_signal = self._has_user_agreement_shown != shown + self._has_user_agreement_shown = shown + if emit_signal: + self.onHasUserAgreementShownChanged.emit() + ## The "Quit" button click event handler. @pyqtSlot() def closeApplication(self): diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index cfad13dfae..01788f7b57 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - + CuraApplication.getInstance().setHasShownUserAgreement(True) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) @@ -50,4 +50,4 @@ class UserAgreement(QObject, Extension): component = QQmlComponent(Application.getInstance()._engine, path) self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) \ No newline at end of file + self._user_agreement_window = component.create(self._user_agreement_context) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..8439d79d21 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -894,6 +894,11 @@ UM.MainWindow if(!base.visible) { base.visible = true; + } + + // check later if the user agreement dialog has been closed + if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + { restart(); } else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "") From 7f02ddd6e9bab1e1db3230eaafc75ca484bf8883 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 30 Oct 2017 14:42:46 +0100 Subject: [PATCH 098/764] Simplified version for validation need to show user agreement CURA-4501 --- cura/CuraApplication.py | 13 ++----------- plugins/UserAgreementPlugin/UserAgreement.py | 2 +- resources/qml/Cura.qml | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 96d8ced7a6..6c90e704e9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -301,7 +301,6 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") - self._has_user_agreement_shown = False for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin @@ -375,21 +374,13 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) - onHasUserAgreementShownChanged = pyqtSignal() - @pyqtProperty(bool) def needToShowUserAgreement(self): return self._need_to_show_user_agreement - @pyqtProperty(bool, notify = onHasUserAgreementShownChanged) - def hasUserAgreementShown(self): - return self._has_user_agreement_shown - def setHasShownUserAgreement(self, shown = True): - emit_signal = self._has_user_agreement_shown != shown - self._has_user_agreement_shown = shown - if emit_signal: - self.onHasUserAgreementShownChanged.emit() + def setNeedToShowUserAgreement(self, set_value = True): + self._need_to_show_user_agreement = set_value ## The "Quit" button click event handler. @pyqtSlot() diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index 01788f7b57..f472b6fb13 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -42,7 +42,7 @@ class UserAgreement(QObject, Extension): Logger.log("i", "User did NOT agree to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", False) CuraApplication.getInstance().quit() - CuraApplication.getInstance().setHasShownUserAgreement(True) + CuraApplication.getInstance().setNeedToShowUserAgreement(False) def createUserAgreementWindow(self): path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 8439d79d21..2fd19a8a03 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -897,7 +897,7 @@ UM.MainWindow } // check later if the user agreement dialog has been closed - if (CuraApplication.needToShowUserAgreement && !CuraApplication.hasUserAgreementShown) + if (CuraApplication.needToShowUserAgreement) { restart(); } From 8eaec149fad8c2d592c0f133d798a5da7b92ac14 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 30 Oct 2017 15:54:26 +0100 Subject: [PATCH 099/764] Make sure the ID stays in the metadata when clearing it Previously the ID was also exempted from the clear. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 4d828a4314..651f2906ff 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -386,7 +386,7 @@ class XmlMaterialProfile(InstanceContainer): first.append(element) def clearData(self): - self._metadata = {} + self._metadata = {"id": self.getId()} self.setName("") self._definition = None self._instances = {} From 93e746b1b3fcbe7f8c12e17908a475b86e67ae14 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Tue, 31 Oct 2017 00:23:05 +0100 Subject: [PATCH 100/764] Warm up to layer_0 temperatures in start g-code Thanks to nounours2099 for the correction. Fixes #2631. --- resources/definitions/prusa_i3_mk2.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json index ef3ef8159e..c8c2cc1363 100644 --- a/resources/definitions/prusa_i3_mk2.def.json +++ b/resources/definitions/prusa_i3_mk2.def.json @@ -5,7 +5,7 @@ "inherits": "fdmprinter", "metadata": { "visible": true, - "author": "Apsu", + "author": "Apsu, Nounours2099", "manufacturer": "Prusa Research", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", @@ -41,7 +41,7 @@ "machine_max_jerk_e": { "default_value": 2.5 }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nM104 S{material_print_temperature} ; set extruder temp\nM140 S{material_bed_temperature} ; set bed temp\nM190 S{material_bed_temperature} ; wait for bed temp\nM109 S{material_print_temperature} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG92 E0.0 ; reset extruder distance position\nG1 Y-3.0 F1000.0 ; go outside print area\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E21.5 F1000.0 ; intro line\nG92 E0.0 ; reset extruder distance position" + "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG92 E0.0 ; reset extruder distance position\nG1 Y-3.0 F1000.0 ; go outside print area\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E21.5 F1000.0 ; intro line\nG92 E0.0 ; reset extruder distance position" }, "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y210; home X axis and push Y forward\nM84 ; disable motors" From d24fa3bc3bc7448c56076933e7643ad040e4f12f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 31 Oct 2017 08:23:57 +0100 Subject: [PATCH 101/764] Set name directly in metadata when clearing Because the setName function checks if the name is equal to the previous name, but at that point the previous name doesn't exist. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 651f2906ff..74d7cc93ee 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -386,8 +386,10 @@ class XmlMaterialProfile(InstanceContainer): first.append(element) def clearData(self): - self._metadata = {"id": self.getId()} - self.setName("") + self._metadata = { + "id": self.getId(), + "name": "" + } self._definition = None self._instances = {} self._read_only = False From d718e6e36c3b44c9a4e81618a031bc7f727bfc18 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 09:08:20 +0100 Subject: [PATCH 102/764] Create extruder stack for single extruder machines on start - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 60 +++- cura/Settings/CuraStackBuilder.py | 2 +- cura/Settings/ExtruderManager.py | 334 ++++++++++----------- cura/Settings/ExtrudersModel.py | 4 +- cura/Settings/MachineManager.py | 15 +- cura/Settings/SettingInheritanceManager.py | 4 +- cura/Settings/SettingOverrideDecorator.py | 6 +- resources/definitions/101Hero.def.json | 4 - resources/definitions/3dator.def.json | 7 +- resources/qml/Cura.qml | 2 +- resources/qml/ExtruderButton.qml | 2 +- resources/qml/Menus/ContextMenu.qml | 2 +- resources/qml/Menus/MaterialMenu.qml | 16 +- resources/qml/Menus/NozzleMenu.qml | 14 +- resources/qml/Preferences/ProfilesPage.qml | 2 +- resources/qml/PrintMonitor.qml | 2 +- resources/qml/Settings/SettingItem.qml | 2 +- resources/qml/Settings/SettingView.qml | 8 +- resources/qml/SidebarHeader.qml | 4 +- resources/qml/SidebarSimple.qml | 2 +- 20 files changed, 268 insertions(+), 224 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 12f27e8156..26dc8b775e 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -12,6 +12,7 @@ from PyQt5.QtWidgets import QMessageBox from UM.Decorators import override from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.InstanceContainer import InstanceContainer from UM.Application import Application from UM.Logger import Logger @@ -42,12 +43,13 @@ class CuraContainerRegistry(ContainerRegistry): # Global stack based on metadata information. @override(ContainerRegistry) def addContainer(self, container): + # Note: Intentional check with type() because we want to ignore subclasses if type(container) == ContainerStack: container = self._convertContainerStack(container) if isinstance(container, InstanceContainer) and type(container) != type(self.getEmptyInstanceContainer()): - #Check against setting version of the definition. + # Check against setting version of the definition. required_setting_version = CuraApplication.SettingVersion actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0)) if required_setting_version != actual_setting_version: @@ -256,7 +258,8 @@ class CuraContainerRegistry(ContainerRegistry): @override(ContainerRegistry) def load(self): super().load() - self._fixupExtruders() + self._registerSingleExtrusionMachinesExtruderStacks() + self._connectUpgradedExtruderStacksToMachines() ## Update an imported profile to match the current machine configuration. # @@ -357,8 +360,8 @@ class CuraContainerRegistry(ContainerRegistry): return global_container_stack.material.getId() return "" - ## Returns true if the current machien requires its own quality profiles - # \return true if the current machien requires its own quality profiles + ## Returns true if the current machine requires its own quality profiles + # \return true if the current machine requires its own quality profiles def _machineHasOwnQualities(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: @@ -391,12 +394,59 @@ class CuraContainerRegistry(ContainerRegistry): return new_stack + def _registerSingleExtrusionMachinesExtruderStacks(self): + machines = ContainerRegistry.getInstance().findContainerStacks(machine_extruder_trains = {"0": "fdmextruder"}) + for machine in machines: + self._addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + + def _addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): + new_extruder_id = extruder_id + + if machine.extruders and len(machine.extruders) > 0: + new_extruder_id = machine.extruders["0"].getId() + + extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) + + if not extruder_definitions: + Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) + return + + extruder_definition = extruder_definitions[0] + unique_name = self.uniqueName(machine.getId() + " " + new_extruder_id) + + extruder_stack = ExtruderStack.ExtruderStack(unique_name) + extruder_stack.setName(extruder_definition.getName()) + extruder_stack.setDefinition(extruder_definition) + extruder_stack.addMetaDataEntry("machine", machine.getId()) + extruder_stack.addMetaDataEntry("position", "0") + extruder_stack.setNextStack(machine) + + # if machine.userChanges: + # # set existing user changes if found + # extruder_stack.setUserChanges(machine.userChanges) + # else: + # # create empty user changes container otherwise + # user_container = InstanceContainer(extruder_stack.getId() + "_user") + # user_container.addMetaDataEntry("type", "user") + # user_container.addMetaDataEntry("machine", extruder_stack.getId()) + # from cura.CuraApplication import CuraApplication + # user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + # user_container.setDefinition(extruder_definition) + # extruder_stack.setUserChanges(user_container) + # self.addContainer(user_container) + + # extruder_stack.setVariantById("default") + # extruder_stack.setMaterialById("default") + # extruder_stack.setQualityById("default") + + self.addContainer(extruder_stack) + # Fix the extruders that were upgraded to ExtruderStack instances during addContainer. # The stacks are now responsible for setting the next stack on deserialize. However, # due to problems with loading order, some stacks may not have the proper next stack # set after upgrading, because the proper global stack was not yet loaded. This method # makes sure those extruders also get the right stack set. - def _fixupExtruders(self): + def _connectUpgradedExtruderStacksToMachines(self): extruder_stacks = self.findContainers(ExtruderStack.ExtruderStack) for extruder_stack in extruder_stacks: if extruder_stack.getNextStack(): diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index e3774b0153..368fd9847d 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -62,7 +62,7 @@ class CuraStackBuilder: variant = "default", next_stack = new_global_stack ) - new_global_stack.addExtruder(new_extruder) + # new_global_stack.addExtruder(new_extruder) return new_global_stack diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index a32b333326..97b622132a 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -1,21 +1,18 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant #For communicating data and events to Qt. +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant # For communicating data and events to Qt. from UM.FlameProfiler import pyqtSlot -from UM.Application import Application #To get the global container stack to find the current machine. +from UM.Application import Application # To get the global container stack to find the current machine. from UM.Logger import Logger -from UM.Decorators import deprecated from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator -from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers by ID. -from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID. from UM.Settings.SettingFunction import SettingFunction from UM.Settings.ContainerStack import ContainerStack -from UM.Settings.Interfaces import DefinitionContainerInterface from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext from typing import Optional, List, TYPE_CHECKING, Union @@ -214,39 +211,39 @@ class ExtruderManager(QObject): result.append(self.getExtruderStack(i)) return result - ## Adds all extruders of a specific machine definition to the extruder - # manager. + # ## Adds all extruders of a specific machine definition to the extruder + # # manager. + # # + # # \param machine_definition The machine definition to add the extruders for. + # # \param machine_id The machine_id to add the extruders for. + # @deprecated("Use CuraStackBuilder", "2.6") + # def addMachineExtruders(self, machine_definition: DefinitionContainerInterface, machine_id: str) -> None: + # changed = False + # machine_definition_id = machine_definition.getId() + # if machine_id not in self._extruder_trains: + # self._extruder_trains[machine_id] = { } + # changed = True + # container_registry = ContainerRegistry.getInstance() + # if container_registry: + # # Add the extruder trains that don't exist yet. + # for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition_id): + # position = extruder_definition.getMetaDataEntry("position", None) + # if not position: + # Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) + # if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. + # self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) + # changed = True # - # \param machine_definition The machine definition to add the extruders for. - # \param machine_id The machine_id to add the extruders for. - @deprecated("Use CuraStackBuilder", "2.6") - def addMachineExtruders(self, machine_definition: DefinitionContainerInterface, machine_id: str) -> None: - changed = False - machine_definition_id = machine_definition.getId() - if machine_id not in self._extruder_trains: - self._extruder_trains[machine_id] = { } - changed = True - container_registry = ContainerRegistry.getInstance() - if container_registry: - # Add the extruder trains that don't exist yet. - for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition_id): - position = extruder_definition.getMetaDataEntry("position", None) - if not position: - Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) - if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. - self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) - changed = True - - # Gets the extruder trains that we just created as well as any that still existed. - extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) - for extruder_train in extruder_trains: - self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train - - # regardless of what the next stack is, we have to set it again, because of signal routing. - extruder_train.setNextStack(Application.getInstance().getGlobalContainerStack()) - changed = True - if changed: - self.extrudersChanged.emit(machine_id) + # # Gets the extruder trains that we just created as well as any that still existed. + # extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) + # for extruder_train in extruder_trains: + # self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train + # + # # regardless of what the next stack is, we have to set it again, because of signal routing. + # extruder_train.setNextStack(Application.getInstance().getGlobalContainerStack()) + # changed = True + # if changed: + # self.extrudersChanged.emit(machine_id) def registerExtruder(self, extruder_train, machine_id): changed = False @@ -267,137 +264,137 @@ class ExtruderManager(QObject): if changed: self.extrudersChanged.emit(machine_id) - ## Creates a container stack for an extruder train. + # ## Creates a container stack for an extruder train. + # # + # # The container stack has an extruder definition at the bottom, which is + # # linked to a machine definition. Then it has a variant profile, a material + # # profile, a quality profile and a user profile, in that order. + # # + # # The resulting container stack is added to the registry. + # # + # # \param extruder_definition The extruder to create the extruder train for. + # # \param machine_definition The machine that the extruder train belongs to. + # # \param position The position of this extruder train in the extruder slots of the machine. + # # \param machine_id The id of the "global" stack this extruder is linked to. + # @deprecated("Use CuraStackBuilder::createExtruderStack", "2.6") + # def createExtruderTrain(self, extruder_definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, + # position, machine_id: str) -> None: + # # Cache some things. + # container_registry = ContainerRegistry.getInstance() + # machine_definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_definition) # - # The container stack has an extruder definition at the bottom, which is - # linked to a machine definition. Then it has a variant profile, a material - # profile, a quality profile and a user profile, in that order. + # # Create a container stack for this extruder. + # extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) + # container_stack = ContainerStack(extruder_stack_id) + # container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with. + # container_stack.addMetaDataEntry("type", "extruder_train") + # container_stack.addMetaDataEntry("machine", machine_id) + # container_stack.addMetaDataEntry("position", position) + # container_stack.addContainer(extruder_definition) # - # The resulting container stack is added to the registry. + # # Find the variant to use for this extruder. + # variant = container_registry.findInstanceContainers(id = "empty_variant")[0] + # if machine_definition.getMetaDataEntry("has_variants"): + # # First add any variant. Later, overwrite with preference if the preference is valid. + # variants = container_registry.findInstanceContainers(definition = machine_definition_id, type = "variant") + # if len(variants) >= 1: + # variant = variants[0] + # preferred_variant_id = machine_definition.getMetaDataEntry("preferred_variant") + # if preferred_variant_id: + # preferred_variants = container_registry.findInstanceContainers(id = preferred_variant_id, definition = machine_definition_id, type = "variant") + # if len(preferred_variants) >= 1: + # variant = preferred_variants[0] + # else: + # Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id) + # # And leave it at the default variant. + # container_stack.addContainer(variant) # - # \param extruder_definition The extruder to create the extruder train for. - # \param machine_definition The machine that the extruder train belongs to. - # \param position The position of this extruder train in the extruder slots of the machine. - # \param machine_id The id of the "global" stack this extruder is linked to. - @deprecated("Use CuraStackBuilder::createExtruderStack", "2.6") - def createExtruderTrain(self, extruder_definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, - position, machine_id: str) -> None: - # Cache some things. - container_registry = ContainerRegistry.getInstance() - machine_definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_definition) - - # Create a container stack for this extruder. - extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) - container_stack = ContainerStack(extruder_stack_id) - container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with. - container_stack.addMetaDataEntry("type", "extruder_train") - container_stack.addMetaDataEntry("machine", machine_id) - container_stack.addMetaDataEntry("position", position) - container_stack.addContainer(extruder_definition) - - # Find the variant to use for this extruder. - variant = container_registry.findInstanceContainers(id = "empty_variant")[0] - if machine_definition.getMetaDataEntry("has_variants"): - # First add any variant. Later, overwrite with preference if the preference is valid. - variants = container_registry.findInstanceContainers(definition = machine_definition_id, type = "variant") - if len(variants) >= 1: - variant = variants[0] - preferred_variant_id = machine_definition.getMetaDataEntry("preferred_variant") - if preferred_variant_id: - preferred_variants = container_registry.findInstanceContainers(id = preferred_variant_id, definition = machine_definition_id, type = "variant") - if len(preferred_variants) >= 1: - variant = preferred_variants[0] - else: - Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id) - # And leave it at the default variant. - container_stack.addContainer(variant) - - # Find a material to use for this variant. - material = container_registry.findInstanceContainers(id = "empty_material")[0] - if machine_definition.getMetaDataEntry("has_materials"): - # First add any material. Later, overwrite with preference if the preference is valid. - machine_has_variant_materials = machine_definition.getMetaDataEntry("has_variant_materials", default = False) - if machine_has_variant_materials or machine_has_variant_materials == "True": - materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id, variant = variant.getId()) - else: - materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id) - if len(materials) >= 1: - material = materials[0] - preferred_material_id = machine_definition.getMetaDataEntry("preferred_material") - if preferred_material_id: - global_stack = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - if global_stack: - approximate_material_diameter = str(round(global_stack[0].getProperty("material_diameter", "value"))) - else: - approximate_material_diameter = str(round(machine_definition.getProperty("material_diameter", "value"))) - - search_criteria = { "type": "material", "id": preferred_material_id, "approximate_diameter": approximate_material_diameter} - if machine_definition.getMetaDataEntry("has_machine_materials"): - search_criteria["definition"] = machine_definition_id - - if machine_definition.getMetaDataEntry("has_variants") and variant: - search_criteria["variant"] = variant.id - else: - search_criteria["definition"] = "fdmprinter" - - preferred_materials = container_registry.findInstanceContainers(**search_criteria) - if len(preferred_materials) >= 1: - # In some cases we get multiple materials. In that case, prefer materials that are marked as read only. - read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if preferred_material.isReadOnly()] - if len(read_only_preferred_materials) >= 1: - material = read_only_preferred_materials[0] - else: - material = preferred_materials[0] - else: - Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) - # And leave it at the default material. - container_stack.addContainer(material) - - # Find a quality to use for this extruder. - quality = container_registry.getEmptyInstanceContainer() - - search_criteria = { "type": "quality" } - if machine_definition.getMetaDataEntry("has_machine_quality"): - search_criteria["definition"] = machine_definition_id - if machine_definition.getMetaDataEntry("has_materials") and material: - search_criteria["material"] = material.id - else: - search_criteria["definition"] = "fdmprinter" - - preferred_quality = machine_definition.getMetaDataEntry("preferred_quality") - if preferred_quality: - search_criteria["id"] = preferred_quality - - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if not containers and preferred_quality: - Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) - search_criteria.pop("id", None) - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if containers: - quality = containers[0] - - container_stack.addContainer(quality) - - empty_quality_changes = container_registry.findInstanceContainers(id = "empty_quality_changes")[0] - container_stack.addContainer(empty_quality_changes) - - user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) - if user_profile: # There was already a user profile, loaded from settings. - user_profile = user_profile[0] - else: - user_profile = InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile. - user_profile.addMetaDataEntry("type", "user") - user_profile.addMetaDataEntry("extruder", extruder_stack_id) - from cura.CuraApplication import CuraApplication - user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_profile.setDefinition(machine_definition) - container_registry.addContainer(user_profile) - container_stack.addContainer(user_profile) - - # regardless of what the next stack is, we have to set it again, because of signal routing. - container_stack.setNextStack(Application.getInstance().getGlobalContainerStack()) - - container_registry.addContainer(container_stack) + # # Find a material to use for this variant. + # material = container_registry.findInstanceContainers(id = "empty_material")[0] + # if machine_definition.getMetaDataEntry("has_materials"): + # # First add any material. Later, overwrite with preference if the preference is valid. + # machine_has_variant_materials = machine_definition.getMetaDataEntry("has_variant_materials", default = False) + # if machine_has_variant_materials or machine_has_variant_materials == "True": + # materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id, variant = variant.getId()) + # else: + # materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id) + # if len(materials) >= 1: + # material = materials[0] + # preferred_material_id = machine_definition.getMetaDataEntry("preferred_material") + # if preferred_material_id: + # global_stack = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) + # if global_stack: + # approximate_material_diameter = str(round(global_stack[0].getProperty("material_diameter", "value"))) + # else: + # approximate_material_diameter = str(round(machine_definition.getProperty("material_diameter", "value"))) + # + # search_criteria = { "type": "material", "id": preferred_material_id, "approximate_diameter": approximate_material_diameter} + # if machine_definition.getMetaDataEntry("has_machine_materials"): + # search_criteria["definition"] = machine_definition_id + # + # if machine_definition.getMetaDataEntry("has_variants") and variant: + # search_criteria["variant"] = variant.id + # else: + # search_criteria["definition"] = "fdmprinter" + # + # preferred_materials = container_registry.findInstanceContainers(**search_criteria) + # if len(preferred_materials) >= 1: + # # In some cases we get multiple materials. In that case, prefer materials that are marked as read only. + # read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if preferred_material.isReadOnly()] + # if len(read_only_preferred_materials) >= 1: + # material = read_only_preferred_materials[0] + # else: + # material = preferred_materials[0] + # else: + # Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) + # # And leave it at the default material. + # container_stack.addContainer(material) + # + # # Find a quality to use for this extruder. + # quality = container_registry.getEmptyInstanceContainer() + # + # search_criteria = { "type": "quality" } + # if machine_definition.getMetaDataEntry("has_machine_quality"): + # search_criteria["definition"] = machine_definition_id + # if machine_definition.getMetaDataEntry("has_materials") and material: + # search_criteria["material"] = material.id + # else: + # search_criteria["definition"] = "fdmprinter" + # + # preferred_quality = machine_definition.getMetaDataEntry("preferred_quality") + # if preferred_quality: + # search_criteria["id"] = preferred_quality + # + # containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + # if not containers and preferred_quality: + # Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) + # search_criteria.pop("id", None) + # containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + # if containers: + # quality = containers[0] + # + # container_stack.addContainer(quality) + # + # empty_quality_changes = container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + # container_stack.addContainer(empty_quality_changes) + # + # user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) + # if user_profile: # There was already a user profile, loaded from settings. + # user_profile = user_profile[0] + # else: + # user_profile = InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile. + # user_profile.addMetaDataEntry("type", "user") + # user_profile.addMetaDataEntry("extruder", extruder_stack_id) + # from cura.CuraApplication import CuraApplication + # user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + # user_profile.setDefinition(machine_definition) + # container_registry.addContainer(user_profile) + # container_stack.addContainer(user_profile) + # + # # regardless of what the next stack is, we have to set it again, because of signal routing. + # container_stack.setNextStack(Application.getInstance().getGlobalContainerStack()) + # + # container_registry.addContainer(container_stack) def getAllExtruderValues(self, setting_key): return self.getAllExtruderSettings(setting_key, "value") @@ -545,7 +542,6 @@ class ExtruderManager(QObject): if self._active_extruder_index == -1: self.setActiveExtruderIndex(0) - self.activeExtruderChanged.emit() self.resetSelectedObjectExtruders() ## Adds the extruders of the currently active machine. @@ -562,7 +558,7 @@ class ExtruderManager(QObject): for extruder_train in extruder_trains: self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train - # regardless of what the next stack is, we have to set it again, because of signal routing. + # regardless of what the next stack is, we have to set it again, because of signal routing. ??? extruder_train.setNextStack(global_stack) extruders_changed = True @@ -582,7 +578,7 @@ class ExtruderManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() result = [] - for extruder in ExtruderManager.getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): # only include values from extruders that are "active" for the current machine instance if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value"): continue diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 996bf51138..40d13461cc 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -201,7 +201,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): continue default_color = self.defaultColors[position] if 0 <= position < len(self.defaultColors) else self.defaultColors[0] - color = extruder.material.getMetaDataEntry("color_code", default = default_color) if material else default_color + color = extruder.material.getMetaDataEntry("color_code", default = default_color) if extruder.material else default_color # construct an item with only the relevant information item = { @@ -210,7 +210,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "color": color, "index": position, "definition": extruder.getBottom().getId(), - "material": extruder.material.getName() if material else "", + "material": extruder.material.getName() if extruder.material else "", "variant": extruder.variant.getName() if extruder.variant else "", # e.g. print core } diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c4be25abd9..bcc64fdefb 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -300,6 +300,17 @@ class MachineManager(QObject): if global_material != self._empty_material_container: self._global_container_stack.setMaterial(self._empty_material_container) + # TODO: update stack builder since this is not always a user created stack + # if len(self._global_container_stack.extruders) == 0: + # extruder_stack = CuraStackBuilder.createExtruderStack( + # self._global_container_stack.getId(), + # definition = self._global_container_stack.definition, + # machine_definition = self._global_container_stack.definition, + # ) + # extruder_stack.setNextStack(self._global_container_stack) + # extruder_stack.propertyChanged.connect(self._onPropertyChanged) + # extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) + # Listen for changes on all extruder stacks for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): extruder_stack.propertyChanged.connect(self._onPropertyChanged) @@ -320,8 +331,8 @@ class MachineManager(QObject): old_active_container_stack = self._active_container_stack self._active_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if not self._active_container_stack: - self._active_container_stack = self._global_container_stack + # if not self._active_container_stack: + # self._active_container_stack = self._global_container_stack self._error_check_timer.start() diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 00f637d34c..0d4cd02cdb 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -77,8 +77,8 @@ class SettingInheritanceManager(QObject): def _onActiveExtruderChanged(self): new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if not new_active_stack: - new_active_stack = self._global_container_stack + # if not new_active_stack: + # new_active_stack = self._global_container_stack if new_active_stack != self._active_container_stack: # Check if changed if self._active_container_stack: # Disconnect signal from old container (if any) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 4e0893a35f..5026f9760d 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -27,11 +27,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._stack = PerObjectContainerStack(stack_id = id(self)) self._stack.setDirty(False) # This stack does not need to be saved. self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) - - if ExtruderManager.getInstance().extruderCount > 1: - self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() - else: - self._extruder_stack = None + self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() self._stack.propertyChanged.connect(self._onSettingChanged) diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json index 3d19aef626..aaea743b47 100644 --- a/resources/definitions/101Hero.def.json +++ b/resources/definitions/101Hero.def.json @@ -7,10 +7,6 @@ "visible": true, "author": "rikky", "manufacturer": "101Hero", - "machine_extruder_trains": - { - "0": "fdmextruder" - }, "file_formats": "text/x-gcode", "platform": "101hero-platform.stl", "supports_usb_connection": true diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index b72a49a35b..513ee8f0e1 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -10,11 +10,7 @@ "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "supports_usb_connection": true, - "platform": "3dator_platform.stl", - "machine_extruder_trains": - { - "0": "fdmextruder" - } + "platform": "3dator_platform.stl" }, "overrides": { @@ -29,7 +25,6 @@ "layer_height": { "default_value": 0.2 }, "speed_print": { "default_value": 50 }, "speed_infill": { "default_value": 60 }, - "machine_extruder_count": { "default_value": 1 }, "machine_heated_bed": { "default_value": true }, "machine_center_is_zero": { "default_value": false }, "machine_height": { "default_value": 260 }, diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index cb0211f29f..325902e1be 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -177,7 +177,7 @@ UM.MainWindow MenuSeparator { } - MenuItem { text: catalog.i18nc("@action:inmenu", "Set as Active Extruder"); onTriggered: ExtruderManager.setActiveExtruderIndex(model.index) } + MenuItem { text: catalog.i18nc("@action:inmenu", "Set as Active Extruder"); onTriggered: Cura.ExtruderManager.setActiveExtruderIndex(model.index) } } onObjectAdded: settingsMenu.insertItem(index, object) onObjectRemoved: settingsMenu.removeItem(object) diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml index 99196b0c9f..9212c705f7 100644 --- a/resources/qml/ExtruderButton.qml +++ b/resources/qml/ExtruderButton.qml @@ -18,7 +18,7 @@ Button style: UM.Theme.styles.tool_button; iconSource: UM.Theme.getIcon("extruder_button") - checked: ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 + checked: Cura.ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 enabled: UM.Selection.hasSelection property color customColor: base.hovered ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("button"); diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 39d497722f..b2c95ebcd8 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -31,7 +31,7 @@ Menu visible: base.shouldShowExtruders enabled: UM.Selection.hasSelection checkable: true - checked: ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 + checked: Cura.ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 onTriggered: CuraActions.setExtruderForSelection(model.id) shortcut: "Ctrl+" + (model.index + 1) } diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 359f4f41d0..1feb351bb1 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -72,16 +72,16 @@ Menu { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveMaterialIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { // This workaround is done because of the application menus for materials and variants for multiextrusion printers. // The extruder menu would always act on the correspoding extruder only, instead of acting on the extruder selected in the UI. - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: menu.insertItem(index, object) @@ -115,16 +115,16 @@ Menu { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveMaterialIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { // This workaround is done because of the application menus for materials and variants for multiextrusion printers. // The extruder menu would always act on the correspoding extruder only, instead of acting on the extruder selected in the UI. - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: brandMaterialsMenu.insertItem(index, object) diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index 1c75a346f3..9dead66499 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -38,15 +38,15 @@ Menu visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter onTriggered: { - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); var hotendId = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; var itemIndex = nozzleInstantiator.model.find("name", hotendId); if(itemIndex > -1) { Cura.MachineManager.setActiveVariant(nozzleInstantiator.model.getItem(itemIndex).id); } - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } @@ -69,14 +69,14 @@ Menu MenuItem { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveVariantIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveVariantIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveVariant(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: menu.insertItem(index, object) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index c7b6b3e933..e3ba9b23a4 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -208,7 +208,7 @@ UM.ManagementPage anchors.right: parent.right anchors.bottom: parent.bottom - currentIndex: ExtruderManager.extruderCount > 0 ? ExtruderManager.activeExtruderIndex + 1 : 0 + currentIndex: Cura.ExtruderManager.extruderCount > 0 ? Cura.ExtruderManager.activeExtruderIndex + 1 : 0 ProfileTab { diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index a2626e53de..34e68148b8 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -87,7 +87,7 @@ Column Label //Extruder name. { - text: ExtruderManager.getExtruderName(index) != "" ? ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") + text: Cura.ExtruderManager.getExtruderName(index) != "" ? Cura.ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") color: UM.Theme.getColor("text") font: UM.Theme.getFont("default") anchors.left: parent.left diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 2bf2c17273..6234e5f1f7 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -157,7 +157,7 @@ Item { var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. - tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; + tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + Cura.ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; } base.showTooltip(tooltipText); } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 56fd789564..93bb52de79 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -268,7 +268,7 @@ Item Behavior on opacity { NumberAnimation { duration: 100 } } enabled: { - if(!ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1) + if (!Cura.ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1) { // disable all controls on the global tab, except categories return model.type == "category" @@ -338,12 +338,12 @@ Item if(inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0) { //We have limit_to_extruder, so pick that stack. - return ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; + return Cura.ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; } - if(ExtruderManager.activeExtruderStackId) + if(Cura.ExtruderManager.activeExtruderStackId) { //We're on an extruder tab. Pick the current extruder. - return ExtruderManager.activeExtruderStackId; + return Cura.ExtruderManager.activeExtruderStackId; } //No extruder tab is selected. Pick the global stack. Shouldn't happen any more since we removed the global tab. return activeMachineId; diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index f3887e2885..2ea5b0b3d2 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -14,7 +14,7 @@ Column { id: base; - property int currentExtruderIndex: ExtruderManager.activeExtruderIndex; + property int currentExtruderIndex: Cura.ExtruderManager.activeExtruderIndex; property bool currentExtruderVisible: extrudersList.visible; spacing: Math.floor(UM.Theme.getSize("sidebar_margin").width * 0.9) @@ -93,7 +93,7 @@ Column onClicked: { forceActiveFocus() // Changing focus applies the currently-being-typed values so it can change the displayed setting values. - ExtruderManager.setActiveExtruderIndex(index); + Cura.ExtruderManager.setActiveExtruderIndex(index); } style: ButtonStyle diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 65a3d612dc..34780d2219 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -19,7 +19,7 @@ Item property Action configureSettings; property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime; - property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 + property bool settingsEnabled: Cura.ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false From 67c11b8cdf257b6c523e45f70ed67b51ea0a32bd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 31 Oct 2017 09:24:32 +0100 Subject: [PATCH 103/764] Fix code style CURA-4503 --- resources/qml/AskOpenAsProjectOrModelsDialog.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index de2ab29873..954e1a5433 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -85,11 +85,11 @@ UM.Dialog Label { - id: checkboxTextWithNiceRendering - anchors.left: rememberChoiceCheckBox.right - anchors.bottom: rememberChoiceCheckBox.bottom - font: UM.Theme.getFont("default") - text: catalog.i18nc("@text:window", "Remember my choice") + id: checkboxTextWithNiceRendering + anchors.left: rememberChoiceCheckBox.right + anchors.bottom: rememberChoiceCheckBox.bottom + font: UM.Theme.getFont("default") + text: catalog.i18nc("@text:window", "Remember my choice") } From f36c9ffbc0d7100ba11cbd56b9aeb0a5ee4854bc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 09:49:24 +0100 Subject: [PATCH 104/764] Create extruder stack for single extrusion machines when adding new machine - CURA-4482 --- cura/BuildVolume.py | 9 ++----- cura/Settings/CuraStackBuilder.py | 42 ++++++++++++++++++++++--------- cura/Settings/ExtruderManager.py | 5 ++++ cura/Settings/MachineManager.py | 2 -- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index ba9314477d..7362a5aff2 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -919,13 +919,8 @@ class BuildVolume(SceneNode): # \return The property of the specified setting in the specified extruder. def _getSettingFromExtruder(self, setting_key, extruder_setting_key, prop = "value"): extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") - - # TODO: remove this - CURA-4482 - if str(extruder_index) == "-1": # If extruder index is -1 use global instead - extruder_stack = self._global_container_stack - else: - extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] value = extruder_stack.getProperty(setting_key, prop) setting_type = extruder_stack.getProperty(setting_key, "type") diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 368fd9847d..b9fbbc43f0 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -47,22 +47,40 @@ class CuraStackBuilder: new_global_stack.setName(generated_name) - for extruder_definition in registry.findDefinitionContainers(machine = machine_definition.id): - position = extruder_definition.getMetaDataEntry("position", None) - if not position: - Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.id) + extruder_definition = registry.findDefinitionContainers(machine = machine_definition.getId()) - new_extruder_id = registry.uniqueName(extruder_definition.id) + if not extruder_definition: + # create extruder stack for single extrusion machines that have no separate extruder definition files + extruder_definition = registry.findDefinitionContainers(id = "fdmextruder") + new_extruder_id = registry.uniqueName(machine_definition.getId() + " " + "fdmextruder") new_extruder = cls.createExtruderStack( new_extruder_id, - definition = extruder_definition, - machine_definition = machine_definition, - quality = "default", - material = "default", - variant = "default", - next_stack = new_global_stack + definition=extruder_definition, + machine_definition=machine_definition, + quality="default", + material="default", + variant="default", + next_stack=new_global_stack ) - # new_global_stack.addExtruder(new_extruder) + new_global_stack.addExtruder(new_extruder) + else: + # create extruder stack for each found extruder definition + for extruder_definition in registry.findDefinitionContainers(machine = machine_definition.id): + position = extruder_definition.getMetaDataEntry("position", None) + if not position: + Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.id) + + new_extruder_id = registry.uniqueName(extruder_definition.id) + new_extruder = cls.createExtruderStack( + new_extruder_id, + definition = extruder_definition, + machine_definition = machine_definition, + quality = "default", + material = "default", + variant = "default", + next_stack = new_global_stack + ) + new_global_stack.addExtruder(new_extruder) return new_global_stack diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 97b622132a..38bc41813b 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -193,6 +193,7 @@ class ExtruderManager(QObject): if global_container_stack.getId() in self._extruder_trains: if str(self._active_extruder_index) in self._extruder_trains[global_container_stack.getId()]: return self._extruder_trains[global_container_stack.getId()][str(self._active_extruder_index)] + return None ## Get an extruder stack by index @@ -435,6 +436,10 @@ class ExtruderManager(QObject): scene_root = Application.getInstance().getController().getScene().getRoot() + # If no extruders are registered in the extruder manager yet, return an empty array + if len(self.extruderIds) == 0: + return [] + # Get the extruders of all printable meshes in the scene meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] for mesh in meshes: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 13751794f0..0f3a690967 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -340,8 +340,6 @@ class MachineManager(QObject): old_active_container_stack = self._active_container_stack self._active_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() - # if not self._active_container_stack: - # self._active_container_stack = self._global_container_stack self._error_check_timer.start() From d7b05836403ac79f890f0c3525d3089dd51631c8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Tue, 31 Oct 2017 09:52:30 +0100 Subject: [PATCH 105/764] Update changelog to the current 3.0.4 version --- plugins/ChangeLogPlugin/ChangeLog.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 25880a66e4..63d9b83495 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,3 +1,12 @@ +[3.0.4] +*Bug fixes +- Fixed OpenGL issue that prevent Cura from starting. + +*License agreement on the first startup has been added + +[3.0.3] +*Bug fixes for the MakePrintable plugin. + [3.0.0] *Faster start-up Start-up speed has been cut in half compared to the previous version. From 4701518404a5243a28b9f342d6613c15ab8e705d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 10:23:30 +0100 Subject: [PATCH 106/764] Add default position to fdm extruder definition - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 30 +++++++++++----------- cura/Settings/CuraStackBuilder.py | 2 +- resources/definitions/fdmextruder.def.json | 3 ++- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 11c4cf2d4a..6ce87aafea 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -424,23 +424,23 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.addMetaDataEntry("position", "0") extruder_stack.setNextStack(machine) - # if machine.userChanges: - # # set existing user changes if found - # extruder_stack.setUserChanges(machine.userChanges) - # else: - # # create empty user changes container otherwise - # user_container = InstanceContainer(extruder_stack.getId() + "_user") - # user_container.addMetaDataEntry("type", "user") - # user_container.addMetaDataEntry("machine", extruder_stack.getId()) - # from cura.CuraApplication import CuraApplication - # user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - # user_container.setDefinition(extruder_definition) - # extruder_stack.setUserChanges(user_container) - # self.addContainer(user_container) + if machine.userChanges: + # set existing user changes if found + extruder_stack.setUserChanges(machine.userChanges) + else: + # create empty user changes container otherwise + user_container = InstanceContainer(extruder_stack.getId() + "_user") + user_container.addMetaDataEntry("type", "user") + user_container.addMetaDataEntry("machine", extruder_stack.getId()) + from cura.CuraApplication import CuraApplication + user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + user_container.setDefinition(extruder_definition) + extruder_stack.setUserChanges(user_container) + self.addContainer(user_container) # extruder_stack.setVariantById("default") - # extruder_stack.setMaterialById("default") - # extruder_stack.setQualityById("default") + extruder_stack.setMaterialById("default") + extruder_stack.setQualityById("default") self.addContainer(extruder_stack) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index b9fbbc43f0..57eefa0397 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -51,7 +51,7 @@ class CuraStackBuilder: if not extruder_definition: # create extruder stack for single extrusion machines that have no separate extruder definition files - extruder_definition = registry.findDefinitionContainers(id = "fdmextruder") + extruder_definition = registry.findDefinitionContainers(id = "fdmextruder")[0] new_extruder_id = registry.uniqueName(machine_definition.getId() + " " + "fdmextruder") new_extruder = cls.createExtruderStack( new_extruder_id, diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 8ed194fc2d..ada35fafe0 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -8,7 +8,8 @@ "author": "Ultimaker", "manufacturer": "Unknown", "setting_version": 1, - "visible": false + "visible": false, + "position": "0" }, "settings": { From e0c1afe01fd2cee9206797dae4733b9979f101e1 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 31 Oct 2017 10:26:42 +0100 Subject: [PATCH 107/764] Added Request package information to AboutDialog.qml CURA-4415 --- resources/qml/AboutDialog.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml index 534f0d016c..36cebe594a 100644 --- a/resources/qml/AboutDialog.qml +++ b/resources/qml/AboutDialog.qml @@ -132,6 +132,7 @@ UM.Dialog projectsModel.append({ name:"PySerial", description: catalog.i18nc("@label", "Serial communication library"), license: "Python", url: "http://pyserial.sourceforge.net/" }); projectsModel.append({ name:"python-zeroconf", description: catalog.i18nc("@label", "ZeroConf discovery library"), license: "LGPL", url: "https://github.com/jstasiak/python-zeroconf" }); projectsModel.append({ name:"Clipper", description: catalog.i18nc("@label", "Polygon clipping library"), license: "Boost", url: "http://www.angusj.com/delphi/clipper.php" }); + projectsModel.append({ name:"Requests", description: catalog.i18nc("@Label", "Python HTTP library"), license: "GPL", url: "http://docs.python-requests.org" }); projectsModel.append({ name:"Open Sans", description: catalog.i18nc("@label", "Font"), license: "Apache 2.0", url: "https://fonts.google.com/specimen/Open+Sans" }); projectsModel.append({ name:"Font-Awesome-SVG-PNG", description: catalog.i18nc("@label", "SVG icons"), license: "SIL OFL 1.1", url: "https://github.com/encharm/Font-Awesome-SVG-PNG" }); From e36cefedf6b44c6da76f743aba3e0c6f1c6ef3e4 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Tue, 31 Oct 2017 10:47:57 +0100 Subject: [PATCH 108/764] Update ChangeLog.txt --- plugins/ChangeLogPlugin/ChangeLog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 63d9b83495..13b735794b 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,6 @@ [3.0.4] *Bug fixes -- Fixed OpenGL issue that prevent Cura from starting. +- Fixed OpenGL issue that prevents Cura from starting. *License agreement on the first startup has been added From f1db8ed00163811664170dee768e94d5f2668281 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 31 Oct 2017 11:07:45 +0100 Subject: [PATCH 109/764] Show message (hover slieder) if user selected custom quality profile in recomended mode CURA-4466 --- resources/qml/SidebarSimple.qml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 65a3d612dc..549d203c4d 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -310,6 +310,24 @@ Item } } } + + MouseArea + { + id: speedSliderMouseArea + anchors.fill: parent + hoverEnabled: true + enabled: Cura.SimpleModeSettingsManager.isProfileUserCreated + + onEntered: + { + var content = catalog.i18nc("@tooltip","A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab") + base.showTooltip(qualityRow, Qt.point(-UM.Theme.getSize("sidebar_margin").width, customisedSettings.height), content) + } + onExited: + { + base.hideTooltip(); + } + } } Label From a08875c5ebbc98ce23556ae231b9ea20e0957ccf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 31 Oct 2017 11:11:56 +0100 Subject: [PATCH 110/764] Remove redundant setting of name It's just copied along with the rest of the metadata now. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 74d7cc93ee..df148c19f1 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -566,8 +566,6 @@ class XmlMaterialProfile(InstanceContainer): new_material = XmlMaterialProfile(new_material_id) is_new_material = True - # Update the private directly, as we want to prevent the lookup that is done when using setName - new_material.setName(self.getName()) new_material.setMetaData(copy.deepcopy(self.getMetaData())) new_material.setDefinition(definition) # Don't use setMetadata, as that overrides it for all materials with same base file From 22e36ff3af4cd5c8db27d9e05487af9754450f7d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 31 Oct 2017 11:20:39 +0100 Subject: [PATCH 111/764] Fix not supported quality profile list CURA-4451 --- .../VersionUpgrade30to31.py | 66 +++++++++---------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index d328b14367..4672cb1488 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -9,39 +9,39 @@ from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this. # a list of all legacy "Not Supported" quality profiles _OLD_NOT_SUPPORTED_PROFILES = [ - "um2p_pp_0.25_normal.inst.cfg", - "um2p_tpu_0.8_normal.inst.cfg", - "um3_bb0.4_ABS_Fast_Print.inst.cfg", - "um3_bb0.4_ABS_Superdraft_Print.inst.cfg", - "um3_bb0.4_CPEP_Fast_Print.inst.cfg", - "um3_bb0.4_CPEP_Superdraft_Print.inst.cfg", - "um3_bb0.4_CPE_Fast_Print.inst.cfg", - "um3_bb0.4_CPE_Superdraft_Print.inst.cfg", - "um3_bb0.4_Nylon_Fast_Print.inst.cfg", - "um3_bb0.4_Nylon_Superdraft_Print.inst.cfg", - "um3_bb0.4_PC_Fast_Print.inst.cfg", - "um3_bb0.4_PLA_Fast_Print.inst.cfg", - "um3_bb0.4_PLA_Superdraft_Print.inst.cfg", - "um3_bb0.4_PP_Fast_Print.inst.cfg", - "um3_bb0.4_PP_Superdraft_Print.inst.cfg", - "um3_bb0.4_TPU_Fast_Print.inst.cfg", - "um3_bb0.4_TPU_Superdraft_Print.inst.cfg", - "um3_bb0.8_ABS_Fast_Print.inst.cfg", - "um3_bb0.8_ABS_Superdraft_Print.inst.cfg", - "um3_bb0.8_CPEP_Fast_Print.inst.cfg", - "um3_bb0.8_CPEP_Superdraft_Print.inst.cfg", - "um3_bb0.8_CPE_Fast_Print.inst.cfg", - "um3_bb0.8_CPE_Superdraft_Print.inst.cfg", - "um3_bb0.8_Nylon_Fast_Print.inst.cfg", - "um3_bb0.8_Nylon_Superdraft_Print.inst.cfg", - "um3_bb0.8_PC_Fast_Print.inst.cfg", - "um3_bb0.8_PC_Superdraft_Print.inst.cfg", - "um3_bb0.8_PLA_Fast_Print.inst.cfg", - "um3_bb0.8_PLA_Superdraft_Print.inst.cfg", - "um3_bb0.8_PP_Fast_Print.inst.cfg", - "um3_bb0.8_PP_Superdraft_Print.inst.cfg", - "um3_bb0.8_TPU_Fast_print.inst.cfg", - "um3_bb0.8_TPU_Superdraft_Print.inst.cfg", + "um2p_pp_0.25_normal", + "um2p_tpu_0.8_normal", + "um3_bb0.4_ABS_Fast_Print", + "um3_bb0.4_ABS_Superdraft_Print", + "um3_bb0.4_CPEP_Fast_Print", + "um3_bb0.4_CPEP_Superdraft_Print", + "um3_bb0.4_CPE_Fast_Print", + "um3_bb0.4_CPE_Superdraft_Print", + "um3_bb0.4_Nylon_Fast_Print", + "um3_bb0.4_Nylon_Superdraft_Print", + "um3_bb0.4_PC_Fast_Print", + "um3_bb0.4_PLA_Fast_Print", + "um3_bb0.4_PLA_Superdraft_Print", + "um3_bb0.4_PP_Fast_Print", + "um3_bb0.4_PP_Superdraft_Print", + "um3_bb0.4_TPU_Fast_Print", + "um3_bb0.4_TPU_Superdraft_Print", + "um3_bb0.8_ABS_Fast_Print", + "um3_bb0.8_ABS_Superdraft_Print", + "um3_bb0.8_CPEP_Fast_Print", + "um3_bb0.8_CPEP_Superdraft_Print", + "um3_bb0.8_CPE_Fast_Print", + "um3_bb0.8_CPE_Superdraft_Print", + "um3_bb0.8_Nylon_Fast_Print", + "um3_bb0.8_Nylon_Superdraft_Print", + "um3_bb0.8_PC_Fast_Print", + "um3_bb0.8_PC_Superdraft_Print", + "um3_bb0.8_PLA_Fast_Print", + "um3_bb0.8_PLA_Superdraft_Print", + "um3_bb0.8_PP_Fast_Print", + "um3_bb0.8_PP_Superdraft_Print", + "um3_bb0.8_TPU_Fast_print", + "um3_bb0.8_TPU_Superdraft_Print", ] From d7b75cab2e9410df47f2ab5be035797a37d38a3f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 31 Oct 2017 11:42:46 +0100 Subject: [PATCH 112/764] CURA-4502 Minor changes --- plugins/ChangeLogPlugin/ChangeLog.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 13b735794b..d7d68e04a2 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -5,7 +5,8 @@ *License agreement on the first startup has been added [3.0.3] -*Bug fixes for the MakePrintable plugin. +*Bug fixes +- Add missing libraries for the MakePrintable plugin. [3.0.0] *Faster start-up From bc6984a0edacf5948c73c23ce2f694ac1c6c031a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:19:28 +0100 Subject: [PATCH 113/764] Fixes for selecting active variant, material and quality - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 10 ++-- cura/Settings/CuraStackBuilder.py | 2 +- cura/Settings/ExtruderManager.py | 23 +++++---- cura/Settings/MachineManager.py | 65 +++++++++++++++----------- 4 files changed, 58 insertions(+), 42 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 6ce87aafea..4923a343a0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -405,6 +405,7 @@ class CuraContainerRegistry(ContainerRegistry): def _addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id + # if extruders are defined in the machine definition use those instead if machine.extruders and len(machine.extruders) > 0: new_extruder_id = machine.extruders["0"].getId() @@ -415,13 +416,12 @@ class CuraContainerRegistry(ContainerRegistry): return extruder_definition = extruder_definitions[0] - unique_name = self.uniqueName(machine.getId() + " " + new_extruder_id) + unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) extruder_stack = ExtruderStack.ExtruderStack(unique_name) extruder_stack.setName(extruder_definition.getName()) extruder_stack.setDefinition(extruder_definition) - extruder_stack.addMetaDataEntry("machine", machine.getId()) - extruder_stack.addMetaDataEntry("position", "0") + extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) extruder_stack.setNextStack(machine) if machine.userChanges: @@ -429,7 +429,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setUserChanges(machine.userChanges) else: # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.getId() + "_user") + user_container = InstanceContainer(extruder_stack.id + "_user") user_container.addMetaDataEntry("type", "user") user_container.addMetaDataEntry("machine", extruder_stack.getId()) from cura.CuraApplication import CuraApplication @@ -438,7 +438,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setUserChanges(user_container) self.addContainer(user_container) - # extruder_stack.setVariantById("default") + extruder_stack.setVariantById("default") extruder_stack.setMaterialById("default") extruder_stack.setQualityById("default") diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 57eefa0397..a661237722 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -52,7 +52,7 @@ class CuraStackBuilder: if not extruder_definition: # create extruder stack for single extrusion machines that have no separate extruder definition files extruder_definition = registry.findDefinitionContainers(id = "fdmextruder")[0] - new_extruder_id = registry.uniqueName(machine_definition.getId() + " " + "fdmextruder") + new_extruder_id = registry.uniqueName(machine_definition.getName() + " " + extruder_definition.id) new_extruder = cls.createExtruderStack( new_extruder_id, definition=extruder_definition, diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 38bc41813b..40ac2f1c63 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -543,9 +543,8 @@ class ExtruderManager(QObject): self._global_container_stack_definition_id = global_container_stack.getBottom().getId() self.globalContainerStackDefinitionChanged.emit() - # If the global container changed, the number of extruders could be changed and so the active_extruder_index is updated - if self._active_extruder_index == -1: - self.setActiveExtruderIndex(0) + # If the global container changed, the machine changed and might have extruders that were not registered yet + self._addCurrentMachineExtruders() self.resetSelectedObjectExtruders() @@ -554,21 +553,29 @@ class ExtruderManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() extruders_changed = False - if global_stack and global_stack.getBottom(): + if global_stack: container_registry = ContainerRegistry.getInstance() - machine_id = global_stack.getBottom().getId() + global_stack_id = global_stack.getId() # Gets the extruder trains that we just created as well as any that still existed. - extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) + extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = global_stack_id) + + # Make sure the extruder trains for the new machine can be placed in the set of sets + if global_stack_id not in self._extruder_trains: + self._extruder_trains[global_stack_id] = {} + extruders_changed = True + + # Register the extruder trains by position for extruder_train in extruder_trains: - self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train + self._extruder_trains[global_stack_id][extruder_train.getMetaDataEntry("position")] = extruder_train # regardless of what the next stack is, we have to set it again, because of signal routing. ??? extruder_train.setNextStack(global_stack) extruders_changed = True if extruders_changed: - self.extrudersChanged.emit(machine_id) + self.extrudersChanged.emit(global_stack_id) + self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. # diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0f3a690967..69435b7077 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -161,7 +161,7 @@ class MachineManager(QObject): @pyqtProperty(int, constant=True) def totalNumberOfSettings(self) -> int: - return len(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0].getAllKeys()) + return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) def _onHotendIdChanged(self, index: Union[str, int], hotend_id: str) -> None: if not self._global_container_stack: @@ -386,15 +386,6 @@ class MachineManager(QObject): else: Logger.log("w", "Failed creating a new machine!") - ## Create a name that is not empty and unique - # \param container_type \type{string} Type of the container (machine, quality, ...) - # \param current_name \type{} Current name of the container, which may be an acceptable option - # \param new_name \type{string} Base name, which may not be unique - # \param fallback_name \type{string} Name to use when (stripped) new_name is empty - # \return \type{string} Name that is unique for the specified type and name/id - def _createUniqueName(self, container_type: str, current_name: str, new_name: str, fallback_name: str) -> str: - return ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name) - def _checkStacksHaveErrors(self) -> bool: if self._global_container_stack is None: #No active machine. return False @@ -950,15 +941,12 @@ class MachineManager(QObject): global_container_stack = self._global_container_stack if not global_container_stack: return [] + global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - if extruder_stacks: - stacks = extruder_stacks - else: - stacks = [global_container_stack] - for stack in stacks: + # find qualities for extruders + for stack in extruder_stacks: material = stack.material # TODO: fix this @@ -966,19 +954,33 @@ class MachineManager(QObject): material = self._new_material_container quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) + if not quality: # No quality profile is found for this quality type. quality = self._empty_quality_container - result.append({"stack": stack, "quality": quality, "quality_changes": empty_quality_changes}) - if extruder_stacks: - # Add an extra entry for the global stack. - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True") + result.append({ + "stack": stack, + "quality": quality, + "quality_changes": empty_quality_changes + }) - if not global_quality: - global_quality = self._empty_quality_container + # also find a global quality for the machine + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = True) - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": empty_quality_changes}) + # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 + if not global_quality and len(extruder_stacks) == 1: + global_quality = result[0]["quality"] + + # if there is still no global quality, set it to empty (not supported) + if not global_quality: + global_quality = self._empty_quality_container + + result.append({ + "stack": global_container_stack, + "quality": global_quality, + "quality_changes": empty_quality_changes + }) return result @@ -1030,7 +1032,7 @@ class MachineManager(QObject): material = extruder_stack.material - if self._new_material_container and self._active_container_stack.getId() == stack.getId(): + if self._new_material_container and self._active_container_stack.getId() == extruder_stack.getId(): material = self._new_material_container quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) @@ -1047,6 +1049,12 @@ class MachineManager(QObject): # append the global quality changes global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = True) + + # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 + if not global_quality and len(extruder_stacks) == 1: + global_quality = result[0]["quality_changes"] + + # if still no global quality changes are found we set it to empty (not supported) if not global_quality: global_quality = self._empty_quality_container @@ -1163,10 +1171,11 @@ class MachineManager(QObject): @pyqtSlot(str, str) def renameMachine(self, machine_id: str, new_name: str): - containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - if containers: - new_name = self._createUniqueName("machine", containers[0].getName(), new_name, containers[0].getBottom().getName()) - containers[0].setName(new_name) + container_registry = ContainerRegistry.getInstance() + machine_stack = container_registry.findContainerStacks(id = machine_id) + if machine_stack: + new_name = container_registry.createUniqueName("machine", machine_stack[0].getName(), new_name, machine_stack[0].getBottom().getName()) + machine_stack[0].setName(new_name) self.globalContainerChanged.emit() @pyqtSlot(str) From 6ac81635897d338f79270997c38d772a42114a55 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:43:01 +0100 Subject: [PATCH 114/764] Cleanup CuraApplication.py - CURA-4482 --- cura/CuraApplication.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 292ad93121..a3bf4bf462 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -786,7 +786,6 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") - qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel") @@ -796,15 +795,12 @@ class CuraApplication(QtApplication): qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") - qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions") - # engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.getInstance()) - for path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.QmlFiles): type_name = os.path.splitext(os.path.basename(path))[0] if type_name in ("Cura", "Actions"): From dfe0212a413df932ceb5d9eb615155a49c45a208 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:48:08 +0100 Subject: [PATCH 115/764] Comment out unneeded materials fetching --- cura/Settings/CuraContainerRegistry.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 4923a343a0..986792c6bb 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -302,10 +302,13 @@ class CuraContainerRegistry(ContainerRegistry): machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() del quality_type_criteria["definition"] - materials = None + + # materials = None + if "material" in quality_type_criteria: - materials = ContainerRegistry.getInstance().findInstanceContainers(id = quality_type_criteria["material"]) + # materials = ContainerRegistry.getInstance().findInstanceContainers(id = quality_type_criteria["material"]) del quality_type_criteria["material"] + # Do not filter quality containers here with materials because we are trying to import a profile, so it should # NOT be restricted by the active materials on the current machine. materials = None From 359514e08b4a243be8d8228b00f28da1bb7f0427 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:49:04 +0100 Subject: [PATCH 116/764] Cleanup CuraContainerRegistry.py - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 986792c6bb..d69a97c92f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -12,13 +12,12 @@ from PyQt5.QtWidgets import QMessageBox from UM.Decorators import override from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack -from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.InstanceContainer import InstanceContainer from UM.Application import Application from UM.Logger import Logger from UM.Message import Message from UM.Platform import Platform -from UM.PluginRegistry import PluginRegistry #For getting the possible profile writers to write with. +from UM.PluginRegistry import PluginRegistry # For getting the possible profile writers to write with. from UM.Util import parseBool from . import ExtruderStack From 569047693e2f5a7ac38d051a59a44c12c2bddb1d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:55:47 +0100 Subject: [PATCH 117/764] Rename loop variable to be more explicit - CURA-4482 --- cura/Settings/MachineManager.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 69435b7077..a858f15cfc 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -946,11 +946,11 @@ class MachineManager(QObject): extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() # find qualities for extruders - for stack in extruder_stacks: - material = stack.material + for extruder_stack in extruder_stacks: + material = extruder_stack.material # TODO: fix this - if self._new_material_container and stack.getId() == self._active_container_stack.getId(): + if self._new_material_container and extruder_stack.getId() == self._active_container_stack.getId(): material = self._new_material_container quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) @@ -960,7 +960,7 @@ class MachineManager(QObject): quality = self._empty_quality_container result.append({ - "stack": stack, + "stack": extruder_stack, "quality": quality, "quality_changes": empty_quality_changes }) @@ -1003,7 +1003,6 @@ class MachineManager(QObject): Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) return None - # TODO: remove this - CURA-4482 material = global_container_stack.material # find a quality type that matches both machine and materials @@ -1024,7 +1023,6 @@ class MachineManager(QObject): if quality_changes_list: quality_changes = quality_changes_list[0] - # TODO: remove this - CURA-4482 else: quality_changes = global_quality_changes if not quality_changes: From e7f1900f71cc2e292a734e1629d9498b75ca07bf Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 14:01:15 +0100 Subject: [PATCH 118/764] Remove layer height from custom profiles in dropdown as it might have changed - CURA-4482 --- cura/Settings/MachineManager.py | 3 --- resources/qml/Menus/ProfileMenu.qml | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a858f15cfc..b2baf433dd 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -728,9 +728,6 @@ class MachineManager(QObject): new_value = self._active_container_stack.getProperty(key, "value") extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] - # TODO: remove this - CURA-4482 - extruder_stacks.append(self._global_container_stack) - # check in which stack the value has to be replaced for extruder_stack in extruder_stacks: if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index fecea5ef99..edce2641af 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -41,7 +41,7 @@ Menu MenuItem { - text: model.name + " - " + model.layer_height + text: model.name checkable: true checked: Cura.MachineManager.activeQualityChangesId == model.id exclusiveGroup: group From f20ba4a118b9102e9486f79a1040865e0d29934c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 14:37:58 +0100 Subject: [PATCH 119/764] Only create new extruder stack for single extrusion machine if it does not exist yet - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 61 ++++++++++++++------------ 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index d69a97c92f..0c0386ade1 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -406,45 +406,48 @@ class CuraContainerRegistry(ContainerRegistry): def _addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id + extruder_stack = None # if extruders are defined in the machine definition use those instead if machine.extruders and len(machine.extruders) > 0: new_extruder_id = machine.extruders["0"].getId() + extruder_stack = machine.extruders["0"] - extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) + # if the extruder stack doesn't exist yet we create and add it + if not extruder_stack: + extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) + if not extruder_definitions: + Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) + return - if not extruder_definitions: - Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) - return + extruder_definition = extruder_definitions[0] + unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) - extruder_definition = extruder_definitions[0] - unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) + extruder_stack = ExtruderStack.ExtruderStack(unique_name) + extruder_stack.setName(extruder_definition.getName()) + extruder_stack.setDefinition(extruder_definition) + extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) + extruder_stack.setNextStack(machine) - extruder_stack = ExtruderStack.ExtruderStack(unique_name) - extruder_stack.setName(extruder_definition.getName()) - extruder_stack.setDefinition(extruder_definition) - extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) - extruder_stack.setNextStack(machine) + if machine.userChanges: + # set existing user changes if found + extruder_stack.setUserChanges(machine.userChanges) + else: + # create empty user changes container otherwise + user_container = InstanceContainer(extruder_stack.id + "_user") + user_container.addMetaDataEntry("type", "user") + user_container.addMetaDataEntry("machine", extruder_stack.getId()) + from cura.CuraApplication import CuraApplication + user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + user_container.setDefinition(extruder_definition) + extruder_stack.setUserChanges(user_container) + self.addContainer(user_container) - if machine.userChanges: - # set existing user changes if found - extruder_stack.setUserChanges(machine.userChanges) - else: - # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.id + "_user") - user_container.addMetaDataEntry("type", "user") - user_container.addMetaDataEntry("machine", extruder_stack.getId()) - from cura.CuraApplication import CuraApplication - user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(extruder_definition) - extruder_stack.setUserChanges(user_container) - self.addContainer(user_container) + extruder_stack.setVariantById("default") + extruder_stack.setMaterialById("default") + extruder_stack.setQualityById("default") - extruder_stack.setVariantById("default") - extruder_stack.setMaterialById("default") - extruder_stack.setQualityById("default") - - self.addContainer(extruder_stack) + self.addContainer(extruder_stack) # Fix the extruders that were upgraded to ExtruderStack instances during addContainer. # The stacks are now responsible for setting the next stack on deserialize. However, From 911f619000d505a8916cf25a5e0c62fc95dc021f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 14:43:48 +0100 Subject: [PATCH 120/764] Fix for getting machine extruders from manager instance - CURA-4482 --- cura/Settings/ExtruderManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 40ac2f1c63..295b10e6db 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -630,7 +630,7 @@ class ExtruderManager(QObject): } result = [] - for extruder in ExtruderManager.getMachineExtruders(global_stack.getId()): + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): # only include values from extruders that are "active" for the current machine instance if int(extruder.getMetaDataEntry("position")) >= global_stack.getProperty("machine_extruder_count", "value", context = context): continue From cc267646e7475800679423aca5ac909efb432598 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 14:48:52 +0100 Subject: [PATCH 121/764] Always use extruder stacks when building slicer message and deprecate otherwise - CURA-4482 --- plugins/CuraEngineBackend/StartSliceJob.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index a53daa4e63..49dfc71769 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -9,6 +9,7 @@ import time from UM.Job import Job from UM.Application import Application from UM.Logger import Logger +from UM.Decorators import deprecated from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -158,13 +159,9 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) - # Only add extruder stacks if there are multiple extruders - # Single extruder machines only use the global stack to store setting values - if stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): - self._buildExtruderMessage(extruder_stack) - else: - self._buildExtruderMessageFromGlobalStack(stack) + # Build messages for extruder stacks + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + self._buildExtruderMessage(extruder_stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") @@ -251,6 +248,7 @@ class StartSliceJob(Job): Job.yieldThread() ## Create extruder message from global stack + @deprecated("Extruder stack is always used since version 3.1, even with single extrusion machines", "3.1") def _buildExtruderMessageFromGlobalStack(self, stack): message = self._slice_message.addRepeatedMessage("extruders") From c23c031152fd67f5d5e87c9918cc858143327b85 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 14:51:31 +0100 Subject: [PATCH 122/764] Always use extruder stacks in slice info - CURA-4482 --- plugins/SliceInfoPlugin/SliceInfo.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 0514c4dacf..6ba34e04c8 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -87,15 +87,10 @@ class SliceInfo(Extension): data["active_machine"] = {"definition_id": global_container_stack.definition.getId(), "manufacturer": global_container_stack.definition.getMetaData().get("manufacturer","")} + # add extruder specific data to slice info data["extruders"] = [] - extruder_count = len(global_container_stack.extruders) - extruders = [] - if extruder_count > 1: - extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) - extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) - - if not extruders: - extruders = [global_container_stack] + extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) + extruders = sorted(extruders, key=lambda extruder: extruder.getMetaDataEntry("position")) for extruder in extruders: extruder_dict = dict() From 77cd10374c3aa6211c40d791a19c7564d12200b4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:00:22 +0100 Subject: [PATCH 123/764] Always set the active extruder stack when loading project file settings - CURA-4482 --- plugins/3MFReader/ThreeMFReader.py | 17 +++++------------ plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index a34bf771d7..786226ae61 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -107,20 +107,13 @@ class ThreeMFReader(MeshReader): um_node.addDecorator(SettingOverrideDecorator()) global_container_stack = Application.getInstance().getGlobalContainerStack() + # Ensure the correct next container for the SettingOverride decorator is set. if global_container_stack: - multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 + default_stack = ExtruderManager.getInstance().getExtruderStack(0) - # Ensure that all extruder data is reset - if not multi_extrusion: - default_stack_id = global_container_stack.getId() - else: - default_stack = ExtruderManager.getInstance().getExtruderStack(0) - if default_stack: - default_stack_id = default_stack.getId() - else: - default_stack_id = global_container_stack.getId() - um_node.callDecoration("setActiveExtruder", default_stack_id) + if default_stack: + um_node.callDecoration("setActiveExtruder", default_stack.getId()) # Get the definition & set it definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom()) @@ -139,7 +132,7 @@ class ThreeMFReader(MeshReader): else: Logger.log("w", "Unable to find extruder in position %s", setting_value) continue - setting_container.setProperty(key,"value", setting_value) + setting_container.setProperty(key, "value", setting_value) if len(um_node.getChildren()) > 0: group_decorator = GroupDecorator() diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 6ba34e04c8..79963a4740 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -90,7 +90,7 @@ class SliceInfo(Extension): # add extruder specific data to slice info data["extruders"] = [] extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) - extruders = sorted(extruders, key=lambda extruder: extruder.getMetaDataEntry("position")) + extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) for extruder in extruders: extruder_dict = dict() From a7383b42d5645ab64a0eac14482454a09b3d2356 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:04:06 +0100 Subject: [PATCH 124/764] Always use extruder stack when adding settings per object - CURA-4482 --- .../PerObjectSettingsTool.py | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index d0cb53c4f8..dc6efafa13 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -78,31 +78,26 @@ class PerObjectSettingsTool(Tool): def _onGlobalContainerChanged(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: + + # used for enabling or disabling per extruder settings per object self._multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Ensure that all extruder data is reset - if not self._multi_extrusion: - default_stack_id = global_container_stack.getId() - else: - default_stack = ExtruderManager.getInstance().getExtruderStack(0) - if default_stack: - default_stack_id = default_stack.getId() - else: - default_stack_id = global_container_stack.getId() + extruder_stack = ExtruderManager.getInstance().getExtruderStack(0) - root_node = Application.getInstance().getController().getScene().getRoot() - for node in DepthFirstIterator(root_node): - new_stack_id = default_stack_id - # Get position of old extruder stack for this node - old_extruder_pos = node.callDecoration("getActiveExtruderPosition") - if old_extruder_pos is not None: - # Fetch current (new) extruder stack at position - new_stack = ExtruderManager.getInstance().getExtruderStack(old_extruder_pos) - if new_stack: - new_stack_id = new_stack.getId() - node.callDecoration("setActiveExtruder", new_stack_id) + if extruder_stack: + root_node = Application.getInstance().getController().getScene().getRoot() + for node in DepthFirstIterator(root_node): + new_stack_id = extruder_stack.getId() + # Get position of old extruder stack for this node + old_extruder_pos = node.callDecoration("getActiveExtruderPosition") + if old_extruder_pos is not None: + # Fetch current (new) extruder stack at position + new_stack = ExtruderManager.getInstance().getExtruderStack(old_extruder_pos) + if new_stack: + new_stack_id = new_stack.getId() + node.callDecoration("setActiveExtruder", new_stack_id) - self._updateEnabled() + self._updateEnabled() def _updateEnabled(self): selected_objects = Selection.getAllSelectedObjects() From 52782b8d13b5886a8df9aeed43338ca2d18e6d34 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:08:59 +0100 Subject: [PATCH 125/764] Always use the extruder stacks to determine model color in solid view - CURA-4482 --- plugins/SolidView/SolidView.py | 46 +++++++++++----------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8f0c9a4dc1..bc1b08cc5e 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -46,19 +46,10 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*theme.getColor("model_unslicable_alt").getRgb())) self._disabled_shader.setUniformValue("u_width", 50.0) - multi_extrusion = False - global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - - if multi_extrusion: - support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") - support_angle_stack = ExtruderManager.getInstance().getExtruderStack(support_extruder_nr) - if not support_angle_stack: - support_angle_stack = global_container_stack - else: - support_angle_stack = global_container_stack + support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") + support_angle_stack = ExtruderManager.getInstance().getExtruderStack(support_extruder_nr) if Preferences.getInstance().getValue("view/show_overhang"): angle = support_angle_stack.getProperty("support_angle", "value") @@ -71,33 +62,26 @@ class SolidView(View): else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): if node.getMeshData() and node.isVisible(): uniforms = {} shade_factor = 1.0 - if not multi_extrusion: - if global_container_stack: - material = global_container_stack.findContainer({ "type": "material" }) - material_color = material.getMetaDataEntry("color_code", default = self._extruders_model.defaultColors[0]) if material else self._extruders_model.defaultColors[0] - else: - material_color = self._extruders_model.defaultColors[0] - else: - # Get color to render this mesh in from ExtrudersModel - extruder_index = 0 - extruder_id = node.callDecoration("getActiveExtruder") - if extruder_id: - extruder_index = max(0, self._extruders_model.find("id", extruder_id)) - try: - material_color = self._extruders_model.getItem(extruder_index)["color"] - except KeyError: - material_color = self._extruders_model.defaultColors[0] + # Get color to render this mesh in from ExtrudersModel + extruder_index = 0 + extruder_id = node.callDecoration("getActiveExtruder") + if extruder_id: + extruder_index = max(0, self._extruders_model.find("id", extruder_id)) + try: + material_color = self._extruders_model.getItem(extruder_index)["color"] + except KeyError: + material_color = self._extruders_model.defaultColors[0] + + if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: + # Shade objects that are printed with the non-active extruder 25% darker + shade_factor = 0.6 - if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: - # Shade objects that are printed with the non-active extruder 25% darker - shade_factor = 0.6 try: # Colors are passed as rgb hex strings (eg "#ffffff"), and the shader needs # an rgba list of floats (eg [1.0, 1.0, 1.0, 1.0]) From f421166b182a407bbbb3f89d3fdd9ba8b4e74c8b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:11:27 +0100 Subject: [PATCH 126/764] Clarify 3mf saving multi extrusion setting - CURA-4482 --- plugins/3MFWriter/ThreeMFWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index a764d30fac..6254bef03a 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -87,7 +87,7 @@ class ThreeMFWriter(MeshWriter): if stack is not None: changed_setting_keys = set(stack.getTop().getAllKeys()) - # Ensure that we save the extruder used for this object. + # Ensure that we save the extruder used for this object in a multi-extrusion setup if stack.getProperty("machine_extruder_count", "value") > 1: changed_setting_keys.add("extruder_nr") From b8757b46b350d03b4085b9712b909ec62a774447 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:16:51 +0100 Subject: [PATCH 127/764] Always use extruder stack in machine settings action plugin, keep support for older project files - CURA-4482 --- .../MachineSettingsAction.py | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index d4d6c430a8..d7fdc216f4 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -116,7 +116,7 @@ class MachineSettingsAction(MachineAction): @pyqtSlot(int) def setMachineExtruderCount(self, extruder_count): - machine_manager = Application.getInstance().getMachineManager() + # machine_manager = Application.getInstance().getMachineManager() extruder_manager = ExtruderManager.getInstance() definition_changes_container = self._global_container_stack.definitionChanges @@ -127,33 +127,34 @@ class MachineSettingsAction(MachineAction): if extruder_count == previous_extruder_count: return - extruder_material_id = None - extruder_variant_id = None - if extruder_count == 1: - # Get the material and variant of the first extruder before setting the number extruders to 1 - if machine_manager.hasMaterials: - extruder_material_id = machine_manager.allActiveMaterialIds[extruder_manager.extruderIds["0"]] - if machine_manager.hasVariants: - extruder_variant_id = machine_manager.allActiveVariantIds[extruder_manager.extruderIds["0"]] + # extruder_material_id = None + # extruder_variant_id = None - # Copy any settable_per_extruder setting value from the extruders to the global stack - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - extruder_stacks.reverse() # make sure the first extruder is done last, so its settings override any higher extruder settings - - global_user_container = self._global_container_stack.getTop() - for extruder_stack in extruder_stacks: - extruder_index = extruder_stack.getMetaDataEntry("position") - extruder_user_container = extruder_stack.getTop() - for setting_instance in extruder_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - - if settable_per_extruder: - limit_to_extruder = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") - - if limit_to_extruder == "-1" or limit_to_extruder == extruder_index: - global_user_container.setProperty(setting_key, "value", extruder_user_container.getProperty(setting_key, "value")) - extruder_user_container.removeInstance(setting_key) + # if extruder_count == 1: + # # Get the material and variant of the first extruder before setting the number extruders to 1 + # if machine_manager.hasMaterials: + # extruder_material_id = machine_manager.allActiveMaterialIds[extruder_manager.extruderIds["0"]] + # if machine_manager.hasVariants: + # extruder_variant_id = machine_manager.allActiveVariantIds[extruder_manager.extruderIds["0"]] + # + # # Copy any settable_per_extruder setting value from the extruders to the global stack + # extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + # extruder_stacks.reverse() # make sure the first extruder is done last, so its settings override any higher extruder settings + # + # global_user_container = self._global_container_stack.getTop() + # for extruder_stack in extruder_stacks: + # extruder_index = extruder_stack.getMetaDataEntry("position") + # extruder_user_container = extruder_stack.getTop() + # for setting_instance in extruder_user_container.findInstances(): + # setting_key = setting_instance.definition.key + # settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") + # + # if settable_per_extruder: + # limit_to_extruder = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") + # + # if limit_to_extruder == "-1" or limit_to_extruder == extruder_index: + # global_user_container.setProperty(setting_key, "value", extruder_user_container.getProperty(setting_key, "value")) + # extruder_user_container.removeInstance(setting_key) # reset all extruder number settings whose value is no longer valid for setting_instance in self._global_container_stack.userChanges.findInstances(): @@ -185,50 +186,52 @@ class MachineSettingsAction(MachineAction): # extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStack() global_user_container = self._global_container_stack.getTop() - if extruder_count > 1: - # Multi extrusion - # Make sure one of the extruder stacks is active - if extruder_manager.activeExtruderIndex == -1: - extruder_manager.setActiveExtruderIndex(0) + # if extruder_count > 1: - # Move settable_per_extruder values out of the global container - if previous_extruder_count == 1: - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - global_user_container = self._global_container_stack.getTop() - for setting_instance in global_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - if settable_per_extruder: - limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) - extruder_stack = extruder_stacks[max(0, limit_to_extruder)] - extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) - global_user_container.removeInstance(setting_key) - else: - # Single extrusion + # Make sure one of the extruder stacks is active + extruder_manager.setActiveExtruderIndex(0) - # Make sure the machine stack is active - if extruder_manager.activeExtruderIndex > -1: - extruder_manager.setActiveExtruderIndex(-1) + # Move settable_per_extruder values out of the global container + # After CURA-4482 this should not be the case anymore, but we still want to support older project files. + if previous_extruder_count == 1: + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + global_user_container = self._global_container_stack.getTop() - # Restore material and variant on global stack - # MachineManager._onGlobalContainerChanged removes the global material and variant of multiextruder machines - if extruder_material_id or extruder_variant_id: - # Prevent the DiscardOrKeepProfileChangesDialog from popping up (twice) if there are user changes - # The dialog is not relevant here, since we're restoring the previous situation as good as possible - preferences = Preferences.getInstance() - choice_on_profile_override = preferences.getValue("cura/choice_on_profile_override") - preferences.setValue("cura/choice_on_profile_override", "always_keep") + for setting_instance in global_user_container.findInstances(): + setting_key = setting_instance.definition.key + settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - if extruder_material_id: - machine_manager.setActiveMaterial(extruder_material_id) - if extruder_variant_id: - machine_manager.setActiveVariant(extruder_variant_id) + if settable_per_extruder: + limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) + extruder_stack = extruder_stacks[max(0, limit_to_extruder)] + extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) + global_user_container.removeInstance(setting_key) - preferences.setValue("cura/choice_on_profile_override", choice_on_profile_override) + # else: + # # Single extrusion + # + # # Make sure the machine stack is active + # if extruder_manager.activeExtruderIndex > -1: + # extruder_manager.setActiveExtruderIndex(-1) + # + # # Restore material and variant on global stack + # # MachineManager._onGlobalContainerChanged removes the global material and variant of multiextruder machines + # if extruder_material_id or extruder_variant_id: + # # Prevent the DiscardOrKeepProfileChangesDialog from popping up (twice) if there are user changes + # # The dialog is not relevant here, since we're restoring the previous situation as good as possible + # preferences = Preferences.getInstance() + # choice_on_profile_override = preferences.getValue("cura/choice_on_profile_override") + # preferences.setValue("cura/choice_on_profile_override", "always_keep") + # + # if extruder_material_id: + # machine_manager.setActiveMaterial(extruder_material_id) + # if extruder_variant_id: + # machine_manager.setActiveVariant(extruder_variant_id) + # + # preferences.setValue("cura/choice_on_profile_override", choice_on_profile_override) self.forceUpdate() - @pyqtSlot() def forceUpdate(self): # Force rebuilding the build volume by reloading the global container stack. From cc6be48a7973b6a2ae35ab05d2feb75f1edc07cb Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:19:16 +0100 Subject: [PATCH 128/764] Always use extruder stack when updating material diameter - CURA-4482 --- .../MachineSettingsAction.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index d7fdc216f4..868e87ca7c 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -284,16 +284,13 @@ class MachineSettingsAction(MachineAction): if not self._global_container_stack.getMetaDataEntry("has_materials", False): return - machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") - if machine_extruder_count > 1: - material = ExtruderManager.getInstance().getActiveExtruderStack().material - else: - material = self._global_container_stack.material + material = ExtruderManager.getInstance().getActiveExtruderStack().material material_diameter = material.getProperty("material_diameter", "value") - if not material_diameter: # in case of "empty" material + if not material_diameter: + # in case of "empty" material material_diameter = 0 - material_approximate_diameter = str(round(material_diameter)) + material_approximate_diameter = str(round(material_diameter)) definition_changes = self._global_container_stack.definitionChanges machine_diameter = definition_changes.getProperty("material_diameter", "value") if not machine_diameter: @@ -303,10 +300,7 @@ class MachineSettingsAction(MachineAction): if material_approximate_diameter != machine_approximate_diameter: Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.") - if machine_extruder_count > 1: - stacks = ExtruderManager.getInstance().getExtruderStacks() - else: - stacks = [self._global_container_stack] + stacks = ExtruderManager.getInstance().getExtruderStacks() if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): materials_definition = self._global_container_stack.definition.getId() @@ -347,7 +341,7 @@ class MachineSettingsAction(MachineAction): search_criteria["id"] = stack.getMetaDataEntry("preferred_material") materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: - # Preferrd material with new diameter is not found, search for any material + # Preferred material with new diameter is not found, search for any material search_criteria.pop("id", None) materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: From 324b39fc39119f28a06e345cc83b27a3d1078fe3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 31 Oct 2017 16:19:17 +0100 Subject: [PATCH 129/764] Fix layout for open project dialog CURA-4503 --- resources/qml/AskOpenAsProjectOrModelsDialog.qml | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index 954e1a5433..affef33fb1 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -64,6 +64,7 @@ UM.Dialog anchors.leftMargin: 20 * screenScaleFactor anchors.rightMargin: 20 * screenScaleFactor anchors.bottomMargin: 10 * screenScaleFactor + spacing: 10 * screenScaleFactor Label { @@ -78,28 +79,16 @@ UM.Dialog CheckBox { id: rememberChoiceCheckBox - anchors.bottom: buttonBar.top - anchors.bottomMargin: UM.Theme.getSize("default_margin").heigth + text: catalog.i18nc("@text:window", "Remember my choice") checked: UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask" } - Label - { - id: checkboxTextWithNiceRendering - anchors.left: rememberChoiceCheckBox.right - anchors.bottom: rememberChoiceCheckBox.bottom - font: UM.Theme.getFont("default") - text: catalog.i18nc("@text:window", "Remember my choice") - } - - // Buttons Item { id: buttonBar anchors.right: parent.right anchors.left: parent.left - anchors.bottom: parent.bottom height: childrenRect.height Button From c59e4bb3e161179ab991beb3ac6c5941ecacfd96 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:20:25 +0100 Subject: [PATCH 130/764] Cleanup machine settings action - CURA-4482 --- .../MachineSettingsAction.py | 55 ------------------- 1 file changed, 55 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 868e87ca7c..44d0e05485 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -127,35 +127,6 @@ class MachineSettingsAction(MachineAction): if extruder_count == previous_extruder_count: return - # extruder_material_id = None - # extruder_variant_id = None - - # if extruder_count == 1: - # # Get the material and variant of the first extruder before setting the number extruders to 1 - # if machine_manager.hasMaterials: - # extruder_material_id = machine_manager.allActiveMaterialIds[extruder_manager.extruderIds["0"]] - # if machine_manager.hasVariants: - # extruder_variant_id = machine_manager.allActiveVariantIds[extruder_manager.extruderIds["0"]] - # - # # Copy any settable_per_extruder setting value from the extruders to the global stack - # extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - # extruder_stacks.reverse() # make sure the first extruder is done last, so its settings override any higher extruder settings - # - # global_user_container = self._global_container_stack.getTop() - # for extruder_stack in extruder_stacks: - # extruder_index = extruder_stack.getMetaDataEntry("position") - # extruder_user_container = extruder_stack.getTop() - # for setting_instance in extruder_user_container.findInstances(): - # setting_key = setting_instance.definition.key - # settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - # - # if settable_per_extruder: - # limit_to_extruder = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") - # - # if limit_to_extruder == "-1" or limit_to_extruder == extruder_index: - # global_user_container.setProperty(setting_key, "value", extruder_user_container.getProperty(setting_key, "value")) - # extruder_user_container.removeInstance(setting_key) - # reset all extruder number settings whose value is no longer valid for setting_instance in self._global_container_stack.userChanges.findInstances(): setting_key = setting_instance.definition.key @@ -183,11 +154,8 @@ class MachineSettingsAction(MachineAction): extruder_manager.setActiveExtruderIndex(0) # Move settable_per_extruder values out of the global container - # extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStack() global_user_container = self._global_container_stack.getTop() - # if extruder_count > 1: - # Make sure one of the extruder stacks is active extruder_manager.setActiveExtruderIndex(0) @@ -207,29 +175,6 @@ class MachineSettingsAction(MachineAction): extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) global_user_container.removeInstance(setting_key) - # else: - # # Single extrusion - # - # # Make sure the machine stack is active - # if extruder_manager.activeExtruderIndex > -1: - # extruder_manager.setActiveExtruderIndex(-1) - # - # # Restore material and variant on global stack - # # MachineManager._onGlobalContainerChanged removes the global material and variant of multiextruder machines - # if extruder_material_id or extruder_variant_id: - # # Prevent the DiscardOrKeepProfileChangesDialog from popping up (twice) if there are user changes - # # The dialog is not relevant here, since we're restoring the previous situation as good as possible - # preferences = Preferences.getInstance() - # choice_on_profile_override = preferences.getValue("cura/choice_on_profile_override") - # preferences.setValue("cura/choice_on_profile_override", "always_keep") - # - # if extruder_material_id: - # machine_manager.setActiveMaterial(extruder_material_id) - # if extruder_variant_id: - # machine_manager.setActiveVariant(extruder_variant_id) - # - # preferences.setValue("cura/choice_on_profile_override", choice_on_profile_override) - self.forceUpdate() @pyqtSlot() From 8676792ef8a7eee79dbc630f09d7ee948988dff1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:23:45 +0100 Subject: [PATCH 131/764] Disable annoying debug message about not found printer definition --- plugins/MachineSettingsAction/MachineSettingsAction.py | 9 ++------- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 44d0e05485..dacbe2efc5 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -149,18 +149,13 @@ class MachineSettingsAction(MachineAction): definition_changes_container.setProperty("machine_extruder_count", "value", extruder_count) - # Make sure one of the extruder stacks is active - if extruder_manager.activeExtruderIndex == -1: - extruder_manager.setActiveExtruderIndex(0) - - # Move settable_per_extruder values out of the global container - global_user_container = self._global_container_stack.getTop() - # Make sure one of the extruder stacks is active extruder_manager.setActiveExtruderIndex(0) # Move settable_per_extruder values out of the global container # After CURA-4482 this should not be the case anymore, but we still want to support older project files. + global_user_container = self._global_container_stack.getTop() + if previous_extruder_count == 1: extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() global_user_container = self._global_container_stack.getTop() diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 51a3c51a8b..7af011ee2e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -547,7 +547,7 @@ class XmlMaterialProfile(InstanceContainer): definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) if not definitions: - Logger.log("w", "No definition found for machine ID %s", machine_id) + # Logger.log("w", "No definition found for machine ID %s", machine_id) continue definition = definitions[0] From ce896177cb066f95ecf140e9c81c8603f74b7819 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:32:04 +0100 Subject: [PATCH 132/764] Cleanup 3mf workspace reader - CURA-4482 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 28d12bf2d5..170b616677 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -644,9 +644,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Get the stack(s) saved in the workspace. Logger.log("d", "Workspace loading is checking stacks containers...") - # -- # load global stack file try: + stack = None + if self._resolve_strategies["machine"] == "override": container_stacks = self._container_registry.findContainerStacks(id = global_stack_id_original) stack = container_stacks[0] @@ -682,12 +683,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.addContainer(stack) containers_added.append(stack) else: - Logger.log("e", "Resolve strategy of %s for machine is not supported", - self._resolve_strategies["machine"]) + Logger.log("e", "Resolve strategy of %s for machine is not supported", self._resolve_strategies["machine"]) # Create a new definition_changes container if it was empty if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer(): - stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings")) + stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack.getId() + "_settings")) global_stack = stack Job.yieldThread() except: @@ -697,16 +697,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return - # - # Use the number of extruders from the global stack instead of the number of extruder stacks this project file - # contains. The Custom FDM Printer can have multiple extruders, but the actual number of extruders in used is - # defined in the global stack. - # Because for single-extrusion machines, there won't be an extruder stack, so relying on the the extruder count - # in the global stack can avoid problems in those cases. - # - extruder_count_from_global_stack = global_stack.getProperty("machine_extruder_count", "value") - - # -- # load extruder stack files try: for extruder_stack_file in extruder_stack_files: From 2e1da5857083e8b0b9576c93a15e726e0e57b2f6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 17:06:34 +0100 Subject: [PATCH 133/764] Cleanup - CURA-4482 --- cura/Settings/MachineManager.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index b2baf433dd..62095945af 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -274,14 +274,6 @@ class MachineManager(QObject): except TypeError: pass - # TODO: remove this - CURA-4482 - material = self._global_container_stack.material - material.nameChanged.disconnect(self._onMaterialNameChanged) - - # TODO: remove this - CURA-4482 - quality = self._global_container_stack.quality - quality.nameChanged.disconnect(self._onQualityNameChanged) - for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) @@ -309,17 +301,6 @@ class MachineManager(QObject): if global_material != self._empty_material_container: self._global_container_stack.setMaterial(self._empty_material_container) - # TODO: update stack builder since this is not always a user created stack - # if len(self._global_container_stack.extruders) == 0: - # extruder_stack = CuraStackBuilder.createExtruderStack( - # self._global_container_stack.getId(), - # definition = self._global_container_stack.definition, - # machine_definition = self._global_container_stack.definition, - # ) - # extruder_stack.setNextStack(self._global_container_stack) - # extruder_stack.propertyChanged.connect(self._onPropertyChanged) - # extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) - # Listen for changes on all extruder stacks for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): extruder_stack.propertyChanged.connect(self._onPropertyChanged) From 8f41185f228eaf153bcc37bb6bf1eb1018a7d0e5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 17:18:19 +0100 Subject: [PATCH 134/764] Fix extruder manager single instance from qml - CURA-4482 --- cura/Settings/ExtruderManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 295b10e6db..e5eb00c4b4 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -106,7 +106,7 @@ class ExtruderManager(QObject): @staticmethod def createExtruderManager(): - return ExtruderManager() + return ExtruderManager().getInstance() ## Gets an instance of the extruder manager, or creates one if no instance # exists yet. From 957009a768d8fa8808dbf14ec06e8abfca04e120 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 17:32:21 +0100 Subject: [PATCH 135/764] Fix finding global quality for multi extrusion machines - CURA-4482 --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 62095945af..b345649052 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -944,7 +944,7 @@ class MachineManager(QObject): }) # also find a global quality for the machine - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = True) + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True") # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 if not global_quality and len(extruder_stacks) == 1: From 512541be08709488601f6771bb4361ec611c29f9 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 1 Nov 2017 10:44:46 +0100 Subject: [PATCH 136/764] Change the font of the checkbox CURA-4503 --- resources/qml/AskOpenAsProjectOrModelsDialog.qml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index affef33fb1..a53c711f9d 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -81,6 +81,12 @@ UM.Dialog id: rememberChoiceCheckBox text: catalog.i18nc("@text:window", "Remember my choice") checked: UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask" + style: CheckBoxStyle { + label: Label { + text: control.text + font: UM.Theme.getFont("default") + } + } } // Buttons From 1de61600a71e5dd04ed11716f88d5a96e7054840 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 1 Nov 2017 10:45:09 +0100 Subject: [PATCH 137/764] Checkbox position and warning in log file CURA-4503 --- .../qml/AskOpenAsProjectOrModelsDialog.qml | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/resources/qml/AskOpenAsProjectOrModelsDialog.qml b/resources/qml/AskOpenAsProjectOrModelsDialog.qml index affef33fb1..a6e818557f 100644 --- a/resources/qml/AskOpenAsProjectOrModelsDialog.qml +++ b/resources/qml/AskOpenAsProjectOrModelsDialog.qml @@ -1,5 +1,5 @@ // Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. +// Cura is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 1.1 @@ -58,13 +58,12 @@ UM.Dialog } } - Column + Item { anchors.fill: parent anchors.leftMargin: 20 * screenScaleFactor anchors.rightMargin: 20 * screenScaleFactor anchors.bottomMargin: 10 * screenScaleFactor - spacing: 10 * screenScaleFactor Label { @@ -76,11 +75,30 @@ UM.Dialog wrapMode: Text.WordWrap } - CheckBox + + + Item { - id: rememberChoiceCheckBox - text: catalog.i18nc("@text:window", "Remember my choice") - checked: UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask" + + anchors.left: parent.left + anchors.right: parent.right + anchors.top: questionText.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height * 2 + + CheckBox + { + id: rememberChoiceCheckBox + checked: UM.Preferences.getValue("cura/choice_on_open_project") != "always_ask" + } + + Label + { + id: checkboxTextWithNiceRendering + anchors.left: rememberChoiceCheckBox.right + anchors.bottom: rememberChoiceCheckBox.bottom + font: UM.Theme.getFont("default") + text: catalog.i18nc("@text:window", "Remember my choice") + } } // Buttons @@ -89,6 +107,7 @@ UM.Dialog id: buttonBar anchors.right: parent.right anchors.left: parent.left + anchors.bottom: parent.bottom height: childrenRect.height Button From c85e10f4c5b124767002fafd8666c3236437960f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 1 Nov 2017 13:31:17 +0100 Subject: [PATCH 138/764] CURA-4062 Minor changes --- plugins/LayerView/LayerView.py | 1 - plugins/XRayView/XRayView.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index a7dbb88209..04be97b747 100755 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -112,7 +112,6 @@ class LayerView(View): self._layer_pass = LayerPass.LayerPass(1, 1) self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) self._layer_pass.setLayerView(self) - #self.getRenderer().addRenderPass(self._layer_pass) return self._layer_pass def getCurrentLayer(self): diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index 2983772647..35509a9715 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -57,8 +57,7 @@ class XRayView(View): # This should be fixed in RenderPass's constructor. self._xray_pass = XRayPass.XRayPass(1, 1) - if self._xray_pass: - self.getRenderer().addRenderPass(self._xray_pass) + self.getRenderer().addRenderPass(self._xray_pass) if not self._xray_composite_shader: self._xray_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("XRayView"), "xray_composite.shader")) From 97421ecf5812cc055f7fbfff45f6bd271de7a462 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 1 Nov 2017 13:31:25 +0100 Subject: [PATCH 139/764] Create container stacks when loading older project file - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 4 ++-- plugins/3MFReader/ThreeMFWorkspaceReader.py | 13 +++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 0c0386ade1..526685465e 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -402,9 +402,9 @@ class CuraContainerRegistry(ContainerRegistry): def _registerSingleExtrusionMachinesExtruderStacks(self): machines = ContainerRegistry.getInstance().findContainerStacks(machine_extruder_trains = {"0": "fdmextruder"}) for machine in machines: - self._addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") - def _addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id extruder_stack = None diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 170b616677..a3aadc79b8 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -739,9 +739,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Create a new definition_changes container if it was empty if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer(): - stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings")) - if global_stack.getProperty("machine_extruder_count", "value") > 1: - extruder_stacks.append(stack) + stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack.getId() + "_settings")) + + extruder_stacks.append(stack) + + # If not extruder stacks were saved in the project file (pre 3.1) create one manually + # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this + if not extruder_stacks: + self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") # Something went really wrong. Try to remove any data that we added. @@ -774,7 +780,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for stack in [global_stack] + extruder_stacks: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) - # # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those # MUST get updated too. From e23e6cfa31e55e2de1e9bd8af31af7beb316ac3f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 1 Nov 2017 13:59:21 +0100 Subject: [PATCH 140/764] Fix for global quality in case of user created quality profile - CURA-4482 --- cura/Settings/MachineManager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index b345649052..7bbbd868f4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1024,11 +1024,11 @@ class MachineManager(QObject): }) # append the global quality changes - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = True) + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True") # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 if not global_quality and len(extruder_stacks) == 1: - global_quality = result[0]["quality_changes"] + global_quality = result[0]["quality"] # if still no global quality changes are found we set it to empty (not supported) if not global_quality: From e29fdbe76d77a47a57537b79736d7ee24714d87d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 1 Nov 2017 14:32:58 +0100 Subject: [PATCH 141/764] Cleanup - CURA-4482 --- cura/Settings/ExtruderManager.py | 174 +----------------- .../MachineSettingsAction.py | 3 +- 2 files changed, 3 insertions(+), 174 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index e5eb00c4b4..34b283107d 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -75,17 +75,12 @@ class ExtruderManager(QObject): return 0 ## Gets a dict with the extruder stack ids with the extruder number as the key. - # The key "-1" indicates the global stack id. - # @pyqtProperty("QVariantMap", notify = extrudersChanged) def extruderIds(self): extruder_stack_ids = {} global_stack_id = Application.getInstance().getGlobalContainerStack().getId() - # TODO: remove this? - CURA-4482 - # extruder_stack_ids["-1"] = global_stack_id - if global_stack_id in self._extruder_trains: for position in self._extruder_trains[global_stack_id]: extruder_stack_ids[position] = self._extruder_trains[global_stack_id][position].getId() @@ -212,40 +207,6 @@ class ExtruderManager(QObject): result.append(self.getExtruderStack(i)) return result - # ## Adds all extruders of a specific machine definition to the extruder - # # manager. - # # - # # \param machine_definition The machine definition to add the extruders for. - # # \param machine_id The machine_id to add the extruders for. - # @deprecated("Use CuraStackBuilder", "2.6") - # def addMachineExtruders(self, machine_definition: DefinitionContainerInterface, machine_id: str) -> None: - # changed = False - # machine_definition_id = machine_definition.getId() - # if machine_id not in self._extruder_trains: - # self._extruder_trains[machine_id] = { } - # changed = True - # container_registry = ContainerRegistry.getInstance() - # if container_registry: - # # Add the extruder trains that don't exist yet. - # for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition_id): - # position = extruder_definition.getMetaDataEntry("position", None) - # if not position: - # Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) - # if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. - # self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) - # changed = True - # - # # Gets the extruder trains that we just created as well as any that still existed. - # extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) - # for extruder_train in extruder_trains: - # self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train - # - # # regardless of what the next stack is, we have to set it again, because of signal routing. - # extruder_train.setNextStack(Application.getInstance().getGlobalContainerStack()) - # changed = True - # if changed: - # self.extrudersChanged.emit(machine_id) - def registerExtruder(self, extruder_train, machine_id): changed = False @@ -265,138 +226,6 @@ class ExtruderManager(QObject): if changed: self.extrudersChanged.emit(machine_id) - # ## Creates a container stack for an extruder train. - # # - # # The container stack has an extruder definition at the bottom, which is - # # linked to a machine definition. Then it has a variant profile, a material - # # profile, a quality profile and a user profile, in that order. - # # - # # The resulting container stack is added to the registry. - # # - # # \param extruder_definition The extruder to create the extruder train for. - # # \param machine_definition The machine that the extruder train belongs to. - # # \param position The position of this extruder train in the extruder slots of the machine. - # # \param machine_id The id of the "global" stack this extruder is linked to. - # @deprecated("Use CuraStackBuilder::createExtruderStack", "2.6") - # def createExtruderTrain(self, extruder_definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, - # position, machine_id: str) -> None: - # # Cache some things. - # container_registry = ContainerRegistry.getInstance() - # machine_definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_definition) - # - # # Create a container stack for this extruder. - # extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) - # container_stack = ContainerStack(extruder_stack_id) - # container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with. - # container_stack.addMetaDataEntry("type", "extruder_train") - # container_stack.addMetaDataEntry("machine", machine_id) - # container_stack.addMetaDataEntry("position", position) - # container_stack.addContainer(extruder_definition) - # - # # Find the variant to use for this extruder. - # variant = container_registry.findInstanceContainers(id = "empty_variant")[0] - # if machine_definition.getMetaDataEntry("has_variants"): - # # First add any variant. Later, overwrite with preference if the preference is valid. - # variants = container_registry.findInstanceContainers(definition = machine_definition_id, type = "variant") - # if len(variants) >= 1: - # variant = variants[0] - # preferred_variant_id = machine_definition.getMetaDataEntry("preferred_variant") - # if preferred_variant_id: - # preferred_variants = container_registry.findInstanceContainers(id = preferred_variant_id, definition = machine_definition_id, type = "variant") - # if len(preferred_variants) >= 1: - # variant = preferred_variants[0] - # else: - # Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id) - # # And leave it at the default variant. - # container_stack.addContainer(variant) - # - # # Find a material to use for this variant. - # material = container_registry.findInstanceContainers(id = "empty_material")[0] - # if machine_definition.getMetaDataEntry("has_materials"): - # # First add any material. Later, overwrite with preference if the preference is valid. - # machine_has_variant_materials = machine_definition.getMetaDataEntry("has_variant_materials", default = False) - # if machine_has_variant_materials or machine_has_variant_materials == "True": - # materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id, variant = variant.getId()) - # else: - # materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id) - # if len(materials) >= 1: - # material = materials[0] - # preferred_material_id = machine_definition.getMetaDataEntry("preferred_material") - # if preferred_material_id: - # global_stack = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - # if global_stack: - # approximate_material_diameter = str(round(global_stack[0].getProperty("material_diameter", "value"))) - # else: - # approximate_material_diameter = str(round(machine_definition.getProperty("material_diameter", "value"))) - # - # search_criteria = { "type": "material", "id": preferred_material_id, "approximate_diameter": approximate_material_diameter} - # if machine_definition.getMetaDataEntry("has_machine_materials"): - # search_criteria["definition"] = machine_definition_id - # - # if machine_definition.getMetaDataEntry("has_variants") and variant: - # search_criteria["variant"] = variant.id - # else: - # search_criteria["definition"] = "fdmprinter" - # - # preferred_materials = container_registry.findInstanceContainers(**search_criteria) - # if len(preferred_materials) >= 1: - # # In some cases we get multiple materials. In that case, prefer materials that are marked as read only. - # read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if preferred_material.isReadOnly()] - # if len(read_only_preferred_materials) >= 1: - # material = read_only_preferred_materials[0] - # else: - # material = preferred_materials[0] - # else: - # Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) - # # And leave it at the default material. - # container_stack.addContainer(material) - # - # # Find a quality to use for this extruder. - # quality = container_registry.getEmptyInstanceContainer() - # - # search_criteria = { "type": "quality" } - # if machine_definition.getMetaDataEntry("has_machine_quality"): - # search_criteria["definition"] = machine_definition_id - # if machine_definition.getMetaDataEntry("has_materials") and material: - # search_criteria["material"] = material.id - # else: - # search_criteria["definition"] = "fdmprinter" - # - # preferred_quality = machine_definition.getMetaDataEntry("preferred_quality") - # if preferred_quality: - # search_criteria["id"] = preferred_quality - # - # containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - # if not containers and preferred_quality: - # Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) - # search_criteria.pop("id", None) - # containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - # if containers: - # quality = containers[0] - # - # container_stack.addContainer(quality) - # - # empty_quality_changes = container_registry.findInstanceContainers(id = "empty_quality_changes")[0] - # container_stack.addContainer(empty_quality_changes) - # - # user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) - # if user_profile: # There was already a user profile, loaded from settings. - # user_profile = user_profile[0] - # else: - # user_profile = InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile. - # user_profile.addMetaDataEntry("type", "user") - # user_profile.addMetaDataEntry("extruder", extruder_stack_id) - # from cura.CuraApplication import CuraApplication - # user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - # user_profile.setDefinition(machine_definition) - # container_registry.addContainer(user_profile) - # container_stack.addContainer(user_profile) - # - # # regardless of what the next stack is, we have to set it again, because of signal routing. - # container_stack.setNextStack(Application.getInstance().getGlobalContainerStack()) - # - # container_registry.addContainer(container_stack) - def getAllExtruderValues(self, setting_key): return self.getAllExtruderSettings(setting_key, "value") @@ -678,7 +507,8 @@ class ExtruderManager(QObject): value = extruder.getRawProperty(key, "value") if isinstance(value, SettingFunction): value = value(extruder) - else: #Just a value from global. + else: + # Just a value from global. value = Application.getInstance().getGlobalContainerStack().getProperty(key, "value") return value diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index dacbe2efc5..2de5b6e9b8 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -116,8 +116,7 @@ class MachineSettingsAction(MachineAction): @pyqtSlot(int) def setMachineExtruderCount(self, extruder_count): - # machine_manager = Application.getInstance().getMachineManager() - extruder_manager = ExtruderManager.getInstance() + extruder_manager = Application.getInstance().getExtruderManager() definition_changes_container = self._global_container_stack.definitionChanges if not self._global_container_stack or definition_changes_container == self._empty_container: From 74bd527b03662b67e5f2d6a564aa07aada1b6e21 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Nov 2017 14:52:03 +0100 Subject: [PATCH 142/764] Load product_id_map from file For now this file is hard-coded. We should eventually try to generate this in the build system. Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 24 +++++++++++++------ plugins/XmlMaterialProfile/product_to_id.json | 12 ++++++++++ 2 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 plugins/XmlMaterialProfile/product_to_id.json diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index df148c19f1..dec988ad15 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -3,7 +3,10 @@ import copy import io -from typing import List, Optional +import json #To parse the product-to-id mapping file. +import os.path #To find the product-to-id mapping. +import sys +from typing import Dict, Optional import xml.etree.ElementTree as ET from UM.Resources import Resources @@ -11,6 +14,7 @@ from UM.Logger import Logger from cura.CuraApplication import CuraApplication import UM.Dictionary +from UM.PluginRegistry import PluginRegistry from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry @@ -211,9 +215,7 @@ class XmlMaterialProfile(InstanceContainer): machine_container_map[definition_id] = container # Map machine human-readable names to IDs - product_id_map = {} - for container in registry.findDefinitionContainersMetadata(type = "machine"): - product_id_map[container["name"]] = container["id"] + product_id_map = self.getProductIdMap() for definition_id, container in machine_container_map.items(): definition = container.getDefinition() @@ -513,9 +515,7 @@ class XmlMaterialProfile(InstanceContainer): self._dirty = False # Map machine human-readable names to IDs - product_id_map = {} - for container in ContainerRegistry.getInstance().findDefinitionContainersMetadata(type = "machine"): - product_id_map[container["name"]] = container["id"] + product_id_map = self.getProductIdMap() machines = data.iterfind("./um:settings/um:machine", self.__namespaces) for machine in machines: @@ -656,6 +656,16 @@ class XmlMaterialProfile(InstanceContainer): else: return material_name + ## Gets a mapping from product names in the XML files to their definition + # IDs. + # + # This loads the mapping from a file. + @classmethod + def getProductIdMap(cls) -> Dict[str, str]: + product_to_id_file = os.path.join(os.path.dirname(sys.modules[cls.__module__].__file__), "product_to_id.json") + with open(product_to_id_file) as f: + return json.load(f) + ## Parse the value of the "material compatible" property. def _parseCompatibleValue(self, value: str): return value in {"yes", "unknown"} diff --git a/plugins/XmlMaterialProfile/product_to_id.json b/plugins/XmlMaterialProfile/product_to_id.json new file mode 100644 index 0000000000..d6b8f3bade --- /dev/null +++ b/plugins/XmlMaterialProfile/product_to_id.json @@ -0,0 +1,12 @@ +{ + "Ultimaker 2": "ultimaker2", + "Ultimaker 2 Extended": "ultimaker2_extended", + "Ultimaker 2 Extended+": "ultimaker2_extended_plus", + "Ultimaker 2 Go": "ultimaker2_go", + "Ultimaker 2+": "ultimaker2_plus", + "Ultimaker 3": "ultimaker3", + "Ultimaker 3 Extended": "ultimaker3_extended", + "Ultimaker Original": "ultimaker_original", + "Ultimaker Original+": "ultimaker_original_plus", + "IMADE3D JellyBOX": "imade3d_jellybox" +} \ No newline at end of file From ddf5ab04944019e4f89ee2a5b334fa5f05cc9f72 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Nov 2017 14:52:57 +0100 Subject: [PATCH 143/764] Make _parseCompatibleValue a class method It might as well be static, since it doesn't need an instance. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index dec988ad15..1583ba9212 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -667,7 +667,8 @@ class XmlMaterialProfile(InstanceContainer): return json.load(f) ## Parse the value of the "material compatible" property. - def _parseCompatibleValue(self, value: str): + @classmethod + def _parseCompatibleValue(cls, value: str): return value in {"yes", "unknown"} # Map XML file setting names to internal names From 07947d5d2cbcfdf7daf8a8749eca87900f8271f0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Nov 2017 14:53:52 +0100 Subject: [PATCH 144/764] Override getIdsFromFile to load multiple IDs This should result in all IDs in the XML file, since there are multiple per file here. Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 1583ba9212..03120b4c3a 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -640,6 +640,51 @@ class XmlMaterialProfile(InstanceContainer): for container_to_add in containers_to_add: ContainerRegistry.getInstance().addContainer(container_to_add) + ## Override of getIdsFromFile because the XML files contain multiple IDs. + @classmethod + def getIdsFromFile(cls, file_name): + result_ids = super().getIdsFromFile(file_name) #The base file has the default ID, taken from the file name without extension. + base_id = result_ids[0] + + try: + data = ET.parse(file_name) + except: #IOError, PermissionError, or anything from the ElementTree library. + Logger.logException("e", "An exception occurred while parsing the material profile") + return + + common_compatibility = True + compatible_entries = data.iterfind("./um:settings/um:setting[@key='hardware compatible']", cls.__namespaces) + try: + common_compatibility = cls._parseCompatibleValue(next(compatible_entries).text) + except StopIteration: #No 'hardware compatible' setting. + pass + + #Get a mapping from the product names to the definition IDs. + product_id_map = cls.getProductIdMap() + + for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces): + machine_compatibility = common_compatibility + compatible_entries = data.iterfind("./um:setting[@key='hardware compatible']", cls.__namespaces) + try: + machine_compatibility = cls._parseCompatibleValue(next(compatible_entries).text) + except StopIteration: #No 'hardware compatible' setting. + pass + + for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces): #For all machines. + machine_id = product_id_map.get(identifier.get("product"), None) + if machine_id is None: + #Let's try again with some naive heuristics. + machine_id = identifier.get("product").replace(" ", "").lower() + if machine_compatibility: + result_ids.append(base_id + "_" + machine_id) + + for hotend in machine.iterfind("./um:hotend", cls.__namespaces): #For all hotends. + hotend_id = hotend.get("id") + if hotend_id is None: + continue + result_ids.append(base_id + "_" + machine_id + "_" + hotend_id) + return result_ids + def _addSettingElement(self, builder, instance): try: key = UM.Dictionary.findKey(self.__material_settings_setting_map, instance.definition.key) From e2c62a460902b2f32c7f9abcde95a90f740155c9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 1 Nov 2017 15:50:23 +0100 Subject: [PATCH 145/764] Revert "Remove unnecessary properties which after update triggered view rendering" This reverts commit ee228155af1677f3f375fb0b28b53ecef744d4d2. --- resources/qml/Cura.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index fdb1380950..2fd19a8a03 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -344,6 +344,9 @@ UM.MainWindow { id: toolbar; + property int mouseX: base.mouseX + property int mouseY: base.mouseY + anchors { top: openFileButton.bottom; topMargin: UM.Theme.getSize("window_margin").height; From 87a7bf72a8a7c4d9e3eaf5c93b91edb551cd8036 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 1 Nov 2017 15:57:30 +0100 Subject: [PATCH 146/764] Monitor view, "connect" button position CURA-4509 --- resources/qml/MonitorButton.qml | 15 +------ resources/qml/Sidebar.qml | 74 ++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 67ca2e708e..29b00f50e6 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -185,24 +185,17 @@ Item anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width; } - Item { + Row { id: buttonsRow height: abortButton.height - width: { - // using childrenRect.width directly causes a binding loop, because setting the width affects the childrenRect - var children_width = additionalComponentsRow.width + pauseResumeButton.width + abortButton.width + 3 * UM.Theme.getSize("default_margin").width; - return Math.min(children_width, base.width - 2 * UM.Theme.getSize("sidebar_margin").width); - } anchors.top: progressBar.bottom anchors.topMargin: UM.Theme.getSize("sidebar_margin").height anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - clip: true + spacing: UM.Theme.getSize("default_margin").width Row { id: additionalComponentsRow - anchors.right: pauseResumeButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width } @@ -222,8 +215,6 @@ Item { id: pauseResumeButton - anchors.right: abortButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width height: UM.Theme.getSize("save_button_save_to_button").height property bool userClicked: false @@ -270,8 +261,6 @@ Item { id: abortButton - anchors.right: parent.right - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canAbort enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 32dceb6078..383c599da8 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -356,7 +356,18 @@ Rectangle { if(!print_time[feature].isTotalDurationZero) { - content += "" + feature + ":" + + var feature_name = ""; + + if (feature.length <= 11) + { + feature_name = feature + } + else{ + feature_name = feature.substring(0, 8) + "..." + } + + + content += "" + feature_name + ":" + "  " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + ""; @@ -376,16 +387,9 @@ Rectangle Label { - id: costSpec - anchors.left: parent.left - anchors.bottom: parent.bottom - font: UM.Theme.getFont("very_small") - color: UM.Theme.getColor("text_subtext") - elide: Text.ElideMiddle - width: parent.width - property string tooltipText - text: - { + + function getSpecsData(){ + var lengths = []; var total_length = 0; var weights = []; @@ -449,10 +453,50 @@ Rectangle tooltip_html += ""; tooltipText = tooltip_html; - if(some_costs_known) + + return tooltipText + } + + id: costSpec + anchors.left: parent.left + anchors.bottom: parent.bottom + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text_subtext") + elide: Text.ElideMiddle + width: parent.width + property string tooltipText + text: + { + var lengths = []; + var weights = []; + var costs = []; + var someCostsKnown = false; + if(base.printMaterialLengths) { + for(var index = 0; index < base.printMaterialLengths.length; index++) + { + if(base.printMaterialLengths[index] > 0) + { + lengths.push(base.printMaterialLengths[index].toFixed(2)); + weights.push(String(Math.floor(base.printMaterialWeights[index]))); + var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); + costs.push(cost); + if(cost > 0) + { + someCostsKnown = true; + } + } + } + } + if(lengths.length == 0) + { + lengths = ["0.00"]; + weights = ["0"]; + costs = ["0.00"]; + } + if(someCostsKnown) { return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) - .arg(Math.round(total_weight)).arg(total_cost.toFixed(2)).arg(UM.Preferences.getValue("cura/currency")); + .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); } else { @@ -470,7 +514,9 @@ Rectangle if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) { - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), costSpec.tooltipText); + var show_data = costSpec.getSpecsData() + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), show_data); } } onExited: From e48b151d40d3a57ab3bfc5f4ed6b0b4f60fe0f91 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Nov 2017 16:17:26 +0100 Subject: [PATCH 147/764] Express getConfigurationTypeFromSerialized as function of its parent This prevents code duplication a bit and allows us to make it a classmethod. Contributes to issue CURA-4243. --- cura/Settings/GlobalStack.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 5e1be36d67..863e6b16f2 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -43,15 +43,11 @@ class GlobalStack(CuraContainerStack): def getLoadingPriority(cls) -> int: return 2 - def getConfigurationTypeFromSerialized(self, serialized: str) -> Optional[str]: - configuration_type = None - try: - parser = self._readAndValidateSerialized(serialized) - configuration_type = parser["metadata"].get("type") - if configuration_type == "machine": - configuration_type = "machine_stack" - except Exception as e: - Logger.log("e", "Could not get configuration type: %s", e) + @classmethod + def getConfigurationTypeFromSerialized(cls, serialized: str) -> Optional[str]: + configuration_type = super().getConfigurationTypeFromSerialized(serialized) + if configuration_type == "machine": + return "machine_stack" return configuration_type ## Add an extruder to the list of extruders of this stack. From d369f92020c6906034b3f17ebee382ffe52806ef Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 1 Nov 2017 16:18:08 +0100 Subject: [PATCH 148/764] Make get[ConfigurationType|Version]FromSerialized class methods This way we can call them before an instance has been created, in order to upgrade the serialized forms. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 03120b4c3a..506670d5ee 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -14,7 +14,6 @@ from UM.Logger import Logger from cura.CuraApplication import CuraApplication import UM.Dictionary -from UM.PluginRegistry import PluginRegistry from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry @@ -37,7 +36,8 @@ class XmlMaterialProfile(InstanceContainer): # # \param xml_version: The version number found in an XML file. # \return The corresponding setting_version. - def xmlVersionToSettingVersion(self, xml_version: str) -> int: + @classmethod + def xmlVersionToSettingVersion(cls, xml_version: str) -> int: if xml_version == "1.3": return 3 return 0 #Older than 1.3. @@ -398,18 +398,20 @@ class XmlMaterialProfile(InstanceContainer): self._dirty = False self._path = "" - def getConfigurationTypeFromSerialized(self, serialized: str) -> Optional[str]: + @classmethod + def getConfigurationTypeFromSerialized(cls, serialized: str) -> Optional[str]: return "materials" - def getVersionFromSerialized(self, serialized: str) -> Optional[int]: + @classmethod + def getVersionFromSerialized(cls, serialized: str) -> Optional[int]: data = ET.fromstring(serialized) version = 1 # get setting version if "version" in data.attrib: - setting_version = self.xmlVersionToSettingVersion(data.attrib["version"]) + setting_version = cls.xmlVersionToSettingVersion(data.attrib["version"]) else: - setting_version = self.xmlVersionToSettingVersion("1.2") + setting_version = cls.xmlVersionToSettingVersion("1.2") return version * 1000000 + setting_version From d503283089d44e2a1c9a6798b8399e750f87edc5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 2 Nov 2017 09:51:57 +0100 Subject: [PATCH 149/764] CURA-4509 Minor fix that avoids crashes when there is no specified material (such as in UM2) --- cura/PrintInformation.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index c709bec20a..d3bcc10781 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -196,8 +196,10 @@ class PrintInformation(QObject): weight = float(amount) * float(density) / 1000 cost = 0 + material_name = catalog.i18nc("@label unknown material", "Unknown") if material: material_guid = material.getMetaDataEntry("GUID") + material_name = material.getName() if material_guid in material_preference_values: material_values = material_preference_values[material_guid] @@ -216,7 +218,7 @@ class PrintInformation(QObject): self._material_weights.append(weight) self._material_lengths.append(length) self._material_costs.append(cost) - self._material_names.append(material.getName()) + self._material_names.append(material_name) self.materialLengthsChanged.emit() self.materialWeightsChanged.emit() From cf7bad1bbb4c5984ff0a404dc9e525ea70f1e492 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 2 Nov 2017 10:18:52 +0100 Subject: [PATCH 150/764] Make _profile_name a class method This way we can execute it statically while getting the metadata. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 506670d5ee..cb93d51b63 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -697,7 +697,8 @@ class XmlMaterialProfile(InstanceContainer): builder.data(str(instance.value)) builder.end("setting") - def _profile_name(self, material_name, color_name): + @classmethod + def _profile_name(cls, material_name, color_name): if color_name != "Generic": return "%s %s" % (color_name, material_name) else: From 202f7f87f883cb3b57f33ba4b4a3c76ac16b951e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 2 Nov 2017 12:53:06 +0100 Subject: [PATCH 151/764] Remove ID from definition files Sometimes it's out of sync. Sometimes even missing. Let's just not use that any more. Contributes to issue CURA-4243. --- resources/definitions/101Hero.def.json | 1 - resources/definitions/3dator.def.json | 1 - resources/definitions/abax_pri3.def.json | 1 - resources/definitions/abax_pri5.def.json | 1 - resources/definitions/abax_titan.def.json | 1 - resources/definitions/alya3dp.def.json | 1 - resources/definitions/bfb.def.json | 1 - resources/definitions/bq_hephestos.def.json | 1 - resources/definitions/bq_hephestos_2.def.json | 1 - resources/definitions/bq_hephestos_xl.def.json | 1 - resources/definitions/bq_witbox.def.json | 1 - resources/definitions/bq_witbox_2.def.json | 1 - resources/definitions/cartesio.def.json | 1 - resources/definitions/creality_cr10.def.json | 1 - resources/definitions/creality_cr10s4.def.json | 1 - resources/definitions/creality_cr10s5.def.json | 1 - resources/definitions/custom.def.json | 1 - resources/definitions/dagoma_discoeasy200.def.json | 1 - resources/definitions/delta_go.def.json | 1 - resources/definitions/deltabot.def.json | 1 - resources/definitions/easyarts_ares.def.json | 1 - resources/definitions/fabtotum.def.json | 1 - resources/definitions/fdmextruder.def.json | 1 - resources/definitions/fdmprinter.def.json | 1 - resources/definitions/grr_neo.def.json | 1 - resources/definitions/helloBEEprusa.def.json | 1 - resources/definitions/imade3d_jellybox.def.json | 1 - resources/definitions/innovo_inventor.def.json | 1 - resources/definitions/julia.def.json | 1 - resources/definitions/kemiq_q2_beta.def.json | 1 - resources/definitions/kemiq_q2_gama.def.json | 1 - resources/definitions/kossel_mini.def.json | 1 - resources/definitions/kossel_pro.def.json | 1 - resources/definitions/kupido.def.json | 1 - resources/definitions/m180.def.json | 1 - resources/definitions/makeR_pegasus.def.json | 1 - resources/definitions/makeR_prusa_tairona_i3.def.json | 1 - resources/definitions/makeit_pro_l.def.json | 1 - resources/definitions/makeit_pro_m.def.json | 1 - resources/definitions/maker_starter.def.json | 1 - resources/definitions/makerbotreplicator.def.json | 1 - resources/definitions/mankati_fullscale_xt_plus.def.json | 1 - resources/definitions/mendel90.def.json | 1 - resources/definitions/ord.def.json | 1 - resources/definitions/peopoly_moai.def.json | 1 - resources/definitions/printrbot_play.def.json | 1 - resources/definitions/printrbot_play_heated.def.json | 1 - resources/definitions/printrbot_simple.def.json | 1 - resources/definitions/printrbot_simple_extended.def.json | 1 - resources/definitions/prusa_i3.def.json | 1 - resources/definitions/prusa_i3_mk2.def.json | 1 - resources/definitions/prusa_i3_xl.def.json | 1 - resources/definitions/punchtec_connect_xl.def.json | 1 - resources/definitions/raise3D_N2_dual.def.json | 6 +----- resources/definitions/raise3D_N2_plus_dual.def.json | 4 ---- resources/definitions/raise3D_N2_plus_single.def.json | 4 ---- resources/definitions/raise3D_N2_single.def.json | 4 ---- resources/definitions/renkforce_rf100.def.json | 1 - resources/definitions/rigid3d.def.json | 1 - resources/definitions/rigid3d_3rdgen.def.json | 1 - resources/definitions/rigid3d_hobby.def.json | 1 - resources/definitions/rigid3d_zero.def.json | 1 - resources/definitions/rigid3d_zero2.def.json | 1 - resources/definitions/rigidbot.def.json | 1 - resources/definitions/rigidbot_big.def.json | 1 - resources/definitions/robo_3d_r1.def.json | 1 - resources/definitions/tam.def.json | 1 - resources/definitions/tevo_tarantula.def.json | 1 - resources/definitions/ultimaker.def.json | 1 - resources/definitions/ultimaker2.def.json | 1 - resources/definitions/ultimaker2_extended.def.json | 1 - resources/definitions/ultimaker2_extended_plus.def.json | 1 - resources/definitions/ultimaker2_go.def.json | 1 - resources/definitions/ultimaker2_plus.def.json | 1 - resources/definitions/ultimaker3.def.json | 1 - resources/definitions/ultimaker3_extended.def.json | 1 - resources/definitions/ultimaker_original.def.json | 1 - resources/definitions/ultimaker_original_dual.def.json | 1 - resources/definitions/ultimaker_original_plus.def.json | 1 - resources/definitions/uniqbot_one.def.json | 1 - resources/definitions/vertex_delta_k8800.def.json | 1 - resources/definitions/vertex_k8400.def.json | 1 - resources/definitions/vertex_k8400_dual.def.json | 1 - resources/definitions/zone3d_printer.def.json | 1 - 84 files changed, 1 insertion(+), 97 deletions(-) diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json index 3d19aef626..824c9da32b 100644 --- a/resources/definitions/101Hero.def.json +++ b/resources/definitions/101Hero.def.json @@ -1,5 +1,4 @@ { - "id": "101Hero", "version": 2, "name": "101Hero", "inherits": "fdmprinter", diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index b72a49a35b..069d2d9d95 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -1,5 +1,4 @@ { - "id": "3Dator", "version": 2, "name": "3Dator", "inherits": "fdmprinter", diff --git a/resources/definitions/abax_pri3.def.json b/resources/definitions/abax_pri3.def.json index fa826e6f94..2fa648096f 100644 --- a/resources/definitions/abax_pri3.def.json +++ b/resources/definitions/abax_pri3.def.json @@ -1,5 +1,4 @@ { - "id": "PRi3", "name": "ABAX PRi3", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/abax_pri5.def.json b/resources/definitions/abax_pri5.def.json index b5588e5c96..cbebb576b0 100644 --- a/resources/definitions/abax_pri5.def.json +++ b/resources/definitions/abax_pri5.def.json @@ -1,5 +1,4 @@ { - "id": "PRi5", "name": "ABAX PRi5", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/abax_titan.def.json b/resources/definitions/abax_titan.def.json index 53b768c93f..5f7a99d64d 100644 --- a/resources/definitions/abax_titan.def.json +++ b/resources/definitions/abax_titan.def.json @@ -1,5 +1,4 @@ { - "id": "Titan", "name": "ABAX Titan", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 5fa6630f51..2fda102249 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -1,5 +1,4 @@ { - "id": "alya3dp", "name": "ALYA", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/bfb.def.json b/resources/definitions/bfb.def.json index fddec169c5..7a76e231a8 100644 --- a/resources/definitions/bfb.def.json +++ b/resources/definitions/bfb.def.json @@ -1,5 +1,4 @@ { - "id": "bfb", "name": "BFB", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 91eeecb500..0fb40a4741 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -1,5 +1,4 @@ { - "id": "bq_hephestos", "name": "BQ Prusa i3 Hephestos", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 272e547af0..a3493334b6 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -1,5 +1,4 @@ { - "id": "bq_hephestos_2", "version": 2, "name": "BQ Hephestos 2", "inherits": "fdmprinter", diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index a5a183b1e9..75b756c71e 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -1,5 +1,4 @@ { - "id": "bq_hephestos_xl", "version": 2, "name": "BQ Prusa i3 Hephestos XL", "inherits": "fdmprinter", diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index ca14151e7a..ef4e12b704 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -1,5 +1,4 @@ { - "id": "bq_witbox", "version": 2, "name": "BQ Witbox", "inherits": "fdmprinter", diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index f634d9c9c8..ab3786ad1f 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -1,5 +1,4 @@ { - "id": "bq_witbox_2", "version": 2, "name": "BQ Witbox 2", "inherits": "fdmprinter", diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index 45b0111209..f544d7644b 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -1,5 +1,4 @@ { - "id": "cartesio", "name": "Cartesio", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/creality_cr10.def.json b/resources/definitions/creality_cr10.def.json index ced6f32b7b..bc9c16bbf9 100644 --- a/resources/definitions/creality_cr10.def.json +++ b/resources/definitions/creality_cr10.def.json @@ -1,5 +1,4 @@ { - "id": "creality_cr10", "name": "Creality CR-10", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/creality_cr10s4.def.json b/resources/definitions/creality_cr10s4.def.json index 13c2e53391..cebe255705 100644 --- a/resources/definitions/creality_cr10s4.def.json +++ b/resources/definitions/creality_cr10s4.def.json @@ -1,5 +1,4 @@ { - "id": "creality_cr10s4", "name": "Creality CR-10 S4", "version": 2, "inherits": "creality_cr10", diff --git a/resources/definitions/creality_cr10s5.def.json b/resources/definitions/creality_cr10s5.def.json index 15cf0b93d9..e6aaa88b04 100644 --- a/resources/definitions/creality_cr10s5.def.json +++ b/resources/definitions/creality_cr10s5.def.json @@ -1,5 +1,4 @@ { - "id": "creality_cr10s5", "name": "Creality CR-10 S5", "version": 2, "inherits": "creality_cr10", diff --git a/resources/definitions/custom.def.json b/resources/definitions/custom.def.json index 8f15f00a0f..e973a75bbf 100644 --- a/resources/definitions/custom.def.json +++ b/resources/definitions/custom.def.json @@ -1,5 +1,4 @@ { - "id": "custom", "version": 2, "name": "Custom FDM printer", "inherits": "fdmprinter", diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 8f1a792bc0..32f4a8b297 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -1,5 +1,4 @@ { - "id": "Dagoma_discoeasy200", "name": "Dagoma DiscoEasy200", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/delta_go.def.json b/resources/definitions/delta_go.def.json index 36e0787039..a6d75b2983 100644 --- a/resources/definitions/delta_go.def.json +++ b/resources/definitions/delta_go.def.json @@ -1,5 +1,4 @@ { -"id": "Delta_Go", "name": "Delta Go", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/deltabot.def.json b/resources/definitions/deltabot.def.json index cee5ab1be1..e3b676d0ec 100644 --- a/resources/definitions/deltabot.def.json +++ b/resources/definitions/deltabot.def.json @@ -1,5 +1,4 @@ { - "id": "deltabot", "name": "DeltaBot", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 8d3e5338b6..982496de4c 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -1,5 +1,4 @@ { - "id": "easyarts_ares", "name": "EasyArts Ares", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/fabtotum.def.json b/resources/definitions/fabtotum.def.json index eb33280401..87ce11a35c 100644 --- a/resources/definitions/fabtotum.def.json +++ b/resources/definitions/fabtotum.def.json @@ -1,5 +1,4 @@ { - "id": "fabtotum", "version": 2, "name": "FABtotum Personal Fabricator", "inherits": "fdmprinter", diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 8ed194fc2d..13f3cbd7af 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -1,5 +1,4 @@ { - "id": "fdmextruder", "name": "Extruder", "version": 2, "metadata": diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e2176a8009..6a71effd09 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1,5 +1,4 @@ { - "id": "fdmprinter", "name": "FDM Printer Base Description", "version": 2, "metadata": diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index 42c2e75319..847f638fbd 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -1,5 +1,4 @@ { - "id": "grr_neo", "version": 2, "name": "German RepRap Neo", "inherits": "fdmprinter", diff --git a/resources/definitions/helloBEEprusa.def.json b/resources/definitions/helloBEEprusa.def.json index 660e182187..2699a6c7d7 100644 --- a/resources/definitions/helloBEEprusa.def.json +++ b/resources/definitions/helloBEEprusa.def.json @@ -1,5 +1,4 @@ { - "id": "BEEVERYCREATIVE-helloBEEprusa", "version": 2, "name": "Hello BEE Prusa", "inherits": "fdmprinter", diff --git a/resources/definitions/imade3d_jellybox.def.json b/resources/definitions/imade3d_jellybox.def.json index 0c0f29c070..11df730408 100644 --- a/resources/definitions/imade3d_jellybox.def.json +++ b/resources/definitions/imade3d_jellybox.def.json @@ -1,5 +1,4 @@ { - "id": "imade3d_jellybox", "version": 2, "name": "IMADE3D JellyBOX", "inherits": "fdmprinter", diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 5fc6c83ca2..84b6697d34 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -1,5 +1,4 @@ { - "id": "innovo-inventor", "version": 2, "name": "Innovo INVENTOR", "inherits": "fdmprinter", diff --git a/resources/definitions/julia.def.json b/resources/definitions/julia.def.json index fe10473596..7fdee30272 100644 --- a/resources/definitions/julia.def.json +++ b/resources/definitions/julia.def.json @@ -1,5 +1,4 @@ { - "id": "julia", "name": "Julia", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/kemiq_q2_beta.def.json b/resources/definitions/kemiq_q2_beta.def.json index d5bb8a895e..7946fbfad2 100644 --- a/resources/definitions/kemiq_q2_beta.def.json +++ b/resources/definitions/kemiq_q2_beta.def.json @@ -1,5 +1,4 @@ { - "id": "kemiq_q2_beta", "version": 2, "name": "Kemiq Q2 Beta", "inherits": "fdmprinter", diff --git a/resources/definitions/kemiq_q2_gama.def.json b/resources/definitions/kemiq_q2_gama.def.json index 1cb1b45c21..64051606f2 100644 --- a/resources/definitions/kemiq_q2_gama.def.json +++ b/resources/definitions/kemiq_q2_gama.def.json @@ -1,5 +1,4 @@ { - "id": "kemiq_q2_gama", "version": 2, "name": "Kemiq Q2 Gama", "inherits": "fdmprinter", diff --git a/resources/definitions/kossel_mini.def.json b/resources/definitions/kossel_mini.def.json index d915c148a3..df9c29b548 100644 --- a/resources/definitions/kossel_mini.def.json +++ b/resources/definitions/kossel_mini.def.json @@ -1,5 +1,4 @@ { - "id": "kossel_mini", "version": 2, "name": "Kossel Mini", "inherits": "fdmprinter", diff --git a/resources/definitions/kossel_pro.def.json b/resources/definitions/kossel_pro.def.json index 58f1c7f94e..fa0cb571fa 100644 --- a/resources/definitions/kossel_pro.def.json +++ b/resources/definitions/kossel_pro.def.json @@ -1,5 +1,4 @@ { - "id": "kossel_pro", "version": 2, "name": "Kossel Pro", "inherits": "fdmprinter", diff --git a/resources/definitions/kupido.def.json b/resources/definitions/kupido.def.json index 8dec63f6ec..b16ba62ccc 100644 --- a/resources/definitions/kupido.def.json +++ b/resources/definitions/kupido.def.json @@ -1,5 +1,4 @@ { - "id": "kupido", "name": "Kupido", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json index 1e8ac1767b..71aa729b7e 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/m180.def.json @@ -1,5 +1,4 @@ { - "id": "m180", "version": 2, "name": "Malyan M180", "inherits": "fdmprinter", diff --git a/resources/definitions/makeR_pegasus.def.json b/resources/definitions/makeR_pegasus.def.json index b164b2983f..fb5a7dce75 100644 --- a/resources/definitions/makeR_pegasus.def.json +++ b/resources/definitions/makeR_pegasus.def.json @@ -1,5 +1,4 @@ { - "id": "makeR_pegasus", "version": 2, "name": "makeR Pegasus", "inherits": "fdmprinter", diff --git a/resources/definitions/makeR_prusa_tairona_i3.def.json b/resources/definitions/makeR_prusa_tairona_i3.def.json index caccb2ebe6..a82fffd254 100644 --- a/resources/definitions/makeR_prusa_tairona_i3.def.json +++ b/resources/definitions/makeR_prusa_tairona_i3.def.json @@ -1,5 +1,4 @@ { - "id": "makeR_prusa_tairona_i3", "version": 2, "name": "makeR Prusa Tairona i3", "inherits": "fdmprinter", diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json index 36f7354b64..2a64a6729c 100644 --- a/resources/definitions/makeit_pro_l.def.json +++ b/resources/definitions/makeit_pro_l.def.json @@ -1,5 +1,4 @@ { - "id": "makeit_pro_l", "version": 2, "name": "MAKEiT Pro-L", "inherits": "fdmprinter", diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json index f45e0b6635..43a5440165 100644 --- a/resources/definitions/makeit_pro_m.def.json +++ b/resources/definitions/makeit_pro_m.def.json @@ -1,5 +1,4 @@ { - "id": "makeit_pro_m", "version": 2, "name": "MAKEiT Pro-M", "inherits": "fdmprinter", diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index 8358ba0064..e7e6cb5dcd 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -1,5 +1,4 @@ { - "id": "maker_starter", "version": 2, "name": "3DMaker Starter", "inherits": "fdmprinter", diff --git a/resources/definitions/makerbotreplicator.def.json b/resources/definitions/makerbotreplicator.def.json index 7844976912..3d690990ce 100644 --- a/resources/definitions/makerbotreplicator.def.json +++ b/resources/definitions/makerbotreplicator.def.json @@ -1,5 +1,4 @@ { - "id": "makerbotreplicator", "name": "MakerBotReplicator", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json index 6c3115b1dc..15ba889efc 100644 --- a/resources/definitions/mankati_fullscale_xt_plus.def.json +++ b/resources/definitions/mankati_fullscale_xt_plus.def.json @@ -1,5 +1,4 @@ { - "id": "mankati_fullscale_xt_plus", "version": 2, "name": "Mankati Fullscale XT Plus", "inherits": "fdmprinter", diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json index 60f3307758..95f47d7aac 100644 --- a/resources/definitions/mendel90.def.json +++ b/resources/definitions/mendel90.def.json @@ -1,5 +1,4 @@ { - "id": "mendel90", "name": "Mendel90", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/ord.def.json b/resources/definitions/ord.def.json index d9909c4f1f..3238583ceb 100644 --- a/resources/definitions/ord.def.json +++ b/resources/definitions/ord.def.json @@ -1,5 +1,4 @@ { - "id": "ord", "name": "RoVa3D", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index 6b0e0ae547..78aca31dae 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -1,5 +1,4 @@ { - "id": "peopoly_moai", "version": 2, "name": "Peopoly Moai", "inherits": "fdmprinter", diff --git a/resources/definitions/printrbot_play.def.json b/resources/definitions/printrbot_play.def.json index 452b5e131f..36ef93e60c 100644 --- a/resources/definitions/printrbot_play.def.json +++ b/resources/definitions/printrbot_play.def.json @@ -1,5 +1,4 @@ { - "id": "printrbot_play", "version": 2, "name": "Printrbot Play", "inherits": "fdmprinter", diff --git a/resources/definitions/printrbot_play_heated.def.json b/resources/definitions/printrbot_play_heated.def.json index 02157a0913..9ca365a5c0 100644 --- a/resources/definitions/printrbot_play_heated.def.json +++ b/resources/definitions/printrbot_play_heated.def.json @@ -1,5 +1,4 @@ { - "id": "printrbot_play_heated", "version": 2, "name": "Printrbot Play (Heated Bed)", "inherits": "printrbot_play", diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json index eba47c88ae..7c86617ce5 100644 --- a/resources/definitions/printrbot_simple.def.json +++ b/resources/definitions/printrbot_simple.def.json @@ -1,5 +1,4 @@ { - "id": "printrbot_simple", "version": 2, "name": "Printrbot Simple", "inherits": "fdmprinter", diff --git a/resources/definitions/printrbot_simple_extended.def.json b/resources/definitions/printrbot_simple_extended.def.json index b08e0c7d5d..95395efb23 100644 --- a/resources/definitions/printrbot_simple_extended.def.json +++ b/resources/definitions/printrbot_simple_extended.def.json @@ -1,5 +1,4 @@ { - "id": "printrbot_simple_extended", "version": 2, "name": "Printrbot Simple Metal Extended", "inherits": "fdmprinter", diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json index 4f0f5b13d7..4599763397 100644 --- a/resources/definitions/prusa_i3.def.json +++ b/resources/definitions/prusa_i3.def.json @@ -1,5 +1,4 @@ { - "id": "prusa_i3", "version": 2, "name": "Prusa i3", "inherits": "fdmprinter", diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json index ef3ef8159e..b72cc70d54 100644 --- a/resources/definitions/prusa_i3_mk2.def.json +++ b/resources/definitions/prusa_i3_mk2.def.json @@ -1,5 +1,4 @@ { - "id": "prusa_i3_mk2", "version": 2, "name": "Prusa i3 Mk2", "inherits": "fdmprinter", diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index e49838c95f..b27c460554 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -1,5 +1,4 @@ { - "id": "prusa_i3_xl", "version": 2, "name": "Prusa i3 xl", "inherits": "fdmprinter", diff --git a/resources/definitions/punchtec_connect_xl.def.json b/resources/definitions/punchtec_connect_xl.def.json index 16ba59dcb7..02d3562b41 100644 --- a/resources/definitions/punchtec_connect_xl.def.json +++ b/resources/definitions/punchtec_connect_xl.def.json @@ -1,5 +1,4 @@ { - "id": "punchtec_connect_xl", "name": "Punchtec Connect XL", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/raise3D_N2_dual.def.json b/resources/definitions/raise3D_N2_dual.def.json index d3d8f0e651..fe0a2bf3b8 100644 --- a/resources/definitions/raise3D_N2_dual.def.json +++ b/resources/definitions/raise3D_N2_dual.def.json @@ -1,5 +1,4 @@ { - "id": "raise3D_N2_dual", "version": 2, "name": "Raise3D N2 Dual", "inherits": "fdmprinter", @@ -33,7 +32,7 @@ }, "machine_heated_bed": { "default_value": true - }, + }, "machine_nozzle_size": { "default_value": 0.4 }, @@ -55,9 +54,6 @@ "machine_min_cool_heat_time_window": { "default_value": 3600 }, - "machine_nozzle_size": { - "default_value": 0.4 - }, "material_diameter": { "default_value": 1.75 }, diff --git a/resources/definitions/raise3D_N2_plus_dual.def.json b/resources/definitions/raise3D_N2_plus_dual.def.json index f49af40355..bddb2587e2 100644 --- a/resources/definitions/raise3D_N2_plus_dual.def.json +++ b/resources/definitions/raise3D_N2_plus_dual.def.json @@ -1,5 +1,4 @@ { - "id": "raise3D_N2_plus_dual", "version": 2, "name": "Raise3D N2 Plus Dual", "inherits": "fdmprinter", @@ -55,9 +54,6 @@ "machine_min_cool_heat_time_window": { "default_value": 3600 }, - "machine_nozzle_size": { - "default_value": 0.4 - }, "material_diameter": { "default_value": 1.75 }, diff --git a/resources/definitions/raise3D_N2_plus_single.def.json b/resources/definitions/raise3D_N2_plus_single.def.json index 5f10666528..ffcb723a27 100644 --- a/resources/definitions/raise3D_N2_plus_single.def.json +++ b/resources/definitions/raise3D_N2_plus_single.def.json @@ -1,5 +1,4 @@ { - "id": "raise3D_N2_plus_single", "version": 2, "name": "Raise3D N2 Plus Single", "inherits": "fdmprinter", @@ -50,9 +49,6 @@ "machine_min_cool_heat_time_window": { "default_value": 3600 }, - "machine_nozzle_size": { - "default_value": 0.4 - }, "material_diameter": { "default_value": 1.75 }, diff --git a/resources/definitions/raise3D_N2_single.def.json b/resources/definitions/raise3D_N2_single.def.json index 225794130c..1d01e479b1 100644 --- a/resources/definitions/raise3D_N2_single.def.json +++ b/resources/definitions/raise3D_N2_single.def.json @@ -1,5 +1,4 @@ { - "id": "raise3D_N2_single", "version": 2, "name": "Raise3D N2 Single", "inherits": "fdmprinter", @@ -50,9 +49,6 @@ "machine_min_cool_heat_time_window": { "default_value": 3600 }, - "machine_nozzle_size": { - "default_value": 0.4 - }, "material_diameter": { "default_value": 1.75 }, diff --git a/resources/definitions/renkforce_rf100.def.json b/resources/definitions/renkforce_rf100.def.json index 55e764800a..6f6de81643 100644 --- a/resources/definitions/renkforce_rf100.def.json +++ b/resources/definitions/renkforce_rf100.def.json @@ -1,5 +1,4 @@ { - "id": "RF100", "version": 2, "name": "Renkforce RF100", "inherits": "fdmprinter", diff --git a/resources/definitions/rigid3d.def.json b/resources/definitions/rigid3d.def.json index 75e435f880..97b0ebd276 100644 --- a/resources/definitions/rigid3d.def.json +++ b/resources/definitions/rigid3d.def.json @@ -1,5 +1,4 @@ { - "id": "rigid3d", "name": "Rigid3D", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/rigid3d_3rdgen.def.json b/resources/definitions/rigid3d_3rdgen.def.json index 3191817ecd..46c22bfa57 100644 --- a/resources/definitions/rigid3d_3rdgen.def.json +++ b/resources/definitions/rigid3d_3rdgen.def.json @@ -1,5 +1,4 @@ { - "id": "rigid3d_3rdgen", "name": "Rigid3D 3rdGen", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/rigid3d_hobby.def.json b/resources/definitions/rigid3d_hobby.def.json index 02e3cc514c..872cc3e6f4 100644 --- a/resources/definitions/rigid3d_hobby.def.json +++ b/resources/definitions/rigid3d_hobby.def.json @@ -1,5 +1,4 @@ { - "id": "rigid3d_hobby", "name": "Rigid3D Hobby", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/rigid3d_zero.def.json b/resources/definitions/rigid3d_zero.def.json index 7e99112621..56fb8284c0 100644 --- a/resources/definitions/rigid3d_zero.def.json +++ b/resources/definitions/rigid3d_zero.def.json @@ -1,5 +1,4 @@ { - "id": "rigid3d_zero", "name": "Rigid3D Zero", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/rigid3d_zero2.def.json b/resources/definitions/rigid3d_zero2.def.json index e2a77db895..27ceb87c29 100644 --- a/resources/definitions/rigid3d_zero2.def.json +++ b/resources/definitions/rigid3d_zero2.def.json @@ -1,5 +1,4 @@ { - "id": "rigid3d_zero2", "name": "Rigid3D Zero2", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index d183554947..bed10025d7 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -1,5 +1,4 @@ { - "id": "rigidbot", "version": 2, "name": "RigidBot", "inherits": "fdmprinter", diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index 33c4fd3d27..08cf3b2ab8 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -1,5 +1,4 @@ { - "id": "rigidbotbig", "version": 2, "name": "RigidBotBig", "inherits": "fdmprinter", diff --git a/resources/definitions/robo_3d_r1.def.json b/resources/definitions/robo_3d_r1.def.json index 88b3fba01f..b179779c59 100644 --- a/resources/definitions/robo_3d_r1.def.json +++ b/resources/definitions/robo_3d_r1.def.json @@ -1,5 +1,4 @@ { - "id": "robo_3d_r1", "name": "Robo 3D R1", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/tam.def.json b/resources/definitions/tam.def.json index 93ebe43ea6..20bc96358d 100644 --- a/resources/definitions/tam.def.json +++ b/resources/definitions/tam.def.json @@ -1,5 +1,4 @@ { - "id": "typeamachines", "version": 2, "name": "Type A Machines Series 1 2014", "inherits": "fdmprinter", diff --git a/resources/definitions/tevo_tarantula.def.json b/resources/definitions/tevo_tarantula.def.json index 29bfae77a4..097281aaeb 100644 --- a/resources/definitions/tevo_tarantula.def.json +++ b/resources/definitions/tevo_tarantula.def.json @@ -1,5 +1,4 @@ { - "id": "tevo_tarantula", "version": 2, "name": "Tevo Tarantula", "inherits": "fdmprinter", diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index 797a05e324..1ca7444d04 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker_base", "version": 2, "name": "Ultimaker", "inherits": "fdmprinter", diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index 6974e61938..038071574f 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker2", "version": 2, "name": "Ultimaker 2", "inherits": "ultimaker", diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index 16f9e6f25e..94667b154d 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker2_extended", "version": 2, "name": "Ultimaker 2 Extended", "inherits": "ultimaker2", diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index 525aaf5b72..adde89d858 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker2_extended_plus", "version": 2, "name": "Ultimaker 2 Extended+", "inherits": "ultimaker2_plus", diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index 9fb94022ce..e98381a7d7 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker2_go", "version": 2, "name": "Ultimaker 2 Go", "inherits": "ultimaker2", diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index 7214e6b7fe..58833904d2 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker2_plus", "version": 2, "name": "Ultimaker 2+", "inherits": "ultimaker2", diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 21f80e18fd..b15358df32 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker3", "version": 2, "name": "Ultimaker 3", "inherits": "ultimaker", diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index e47ccf4ba3..385199f4f1 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker3_extended", "version": 2, "name": "Ultimaker 3 Extended", "inherits": "ultimaker3", diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index ef2f5fae5c..a0a486429b 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker_original", "version": 2, "name": "Ultimaker Original", "inherits": "ultimaker", diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index 8745434360..a1dbea6b6d 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker_original_dual", "version": 2, "name": "Ultimaker Original Dual Extrusion", "inherits": "ultimaker", diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 8e401d550c..115e1e2752 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -1,5 +1,4 @@ { - "id": "ultimaker_original_plus", "version": 2, "name": "Ultimaker Original+", "inherits": "ultimaker_original", diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json index 410f7e57a6..ad14728269 100644 --- a/resources/definitions/uniqbot_one.def.json +++ b/resources/definitions/uniqbot_one.def.json @@ -1,5 +1,4 @@ { - "id": "uniqbot_one", "version": 2, "name": "Uniqbot", "inherits": "fdmprinter", diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index b832620942..9cdc06865e 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -1,5 +1,4 @@ { - "id": "K8800", "name": "Vertex Delta K8800", "version": 2, "inherits": "fdmprinter", diff --git a/resources/definitions/vertex_k8400.def.json b/resources/definitions/vertex_k8400.def.json index a23e1fc893..8abf9acd7f 100644 --- a/resources/definitions/vertex_k8400.def.json +++ b/resources/definitions/vertex_k8400.def.json @@ -1,5 +1,4 @@ { - "id": "vertex_k8400", "version": 2, "name": "Vertex K8400", "inherits": "fdmprinter", diff --git a/resources/definitions/vertex_k8400_dual.def.json b/resources/definitions/vertex_k8400_dual.def.json index 9e24bab5d3..fc006a1d5f 100644 --- a/resources/definitions/vertex_k8400_dual.def.json +++ b/resources/definitions/vertex_k8400_dual.def.json @@ -1,5 +1,4 @@ { - "id": "vertex_k8400_dual", "version": 2, "name": "Vertex K8400 Dual", "inherits": "fdmprinter", diff --git a/resources/definitions/zone3d_printer.def.json b/resources/definitions/zone3d_printer.def.json index a1ed56c7ef..bac8968951 100644 --- a/resources/definitions/zone3d_printer.def.json +++ b/resources/definitions/zone3d_printer.def.json @@ -1,5 +1,4 @@ { - "id": "zone3d_printer", "name": "Zone3d Printer", "version": 2, "inherits": "fdmprinter", From 25c41062e10a4871afe29ddbf69151222aa9e5e6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 2 Nov 2017 12:58:52 +0100 Subject: [PATCH 152/764] Fix material upgrade and version checking CURA-4519 Less duplicated code, but it's still one of the worst parts... --- .../XmlMaterialProfile/XmlMaterialProfile.py | 14 ++++++++------ .../XmlMaterialProfile/XmlMaterialUpgrader.py | 18 +++++------------- plugins/XmlMaterialProfile/__init__.py | 2 +- 3 files changed, 14 insertions(+), 20 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 51a3c51a8b..86f90e8970 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -33,9 +33,10 @@ class XmlMaterialProfile(InstanceContainer): # # \param xml_version: The version number found in an XML file. # \return The corresponding setting_version. - def xmlVersionToSettingVersion(self, xml_version: str) -> int: + @classmethod + def xmlVersionToSettingVersion(cls, xml_version: str) -> int: if xml_version == "1.3": - return 4 + return CuraApplication.SettingVersion return 0 #Older than 1.3. def getInheritedFiles(self): @@ -407,15 +408,16 @@ class XmlMaterialProfile(InstanceContainer): def getConfigurationTypeFromSerialized(self, serialized: str) -> Optional[str]: return "materials" - def getVersionFromSerialized(self, serialized: str) -> Optional[int]: + @classmethod + def getVersionFromSerialized(cls, serialized: str) -> Optional[int]: data = ET.fromstring(serialized) - version = 1 + version = XmlMaterialProfile.Version # get setting version if "version" in data.attrib: - setting_version = self.xmlVersionToSettingVersion(data.attrib["version"]) + setting_version = XmlMaterialProfile.xmlVersionToSettingVersion(data.attrib["version"]) else: - setting_version = self.xmlVersionToSettingVersion("1.2") + setting_version = XmlMaterialProfile.xmlVersionToSettingVersion("1.2") return version * 1000000 + setting_version diff --git a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py index c882239dba..167a9f2849 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py +++ b/plugins/XmlMaterialProfile/XmlMaterialUpgrader.py @@ -5,24 +5,16 @@ import xml.etree.ElementTree as ET from UM.VersionUpgrade import VersionUpgrade +from cura.CuraApplication import CuraApplication +from .XmlMaterialProfile import XmlMaterialProfile + class XmlMaterialUpgrader(VersionUpgrade): def getXmlVersion(self, serialized): - data = ET.fromstring(serialized) - - version = 1 - # get setting version - if "version" in data.attrib: - setting_version = self._xmlVersionToSettingVersion(data.attrib["version"]) - else: - setting_version = self._xmlVersionToSettingVersion("1.2") - - return version * 1000000 + setting_version + return XmlMaterialProfile.getVersionFromSerialized(serialized) def _xmlVersionToSettingVersion(self, xml_version: str) -> int: - if xml_version == "1.3": - return 2 - return 0 #Older than 1.3. + return XmlMaterialProfile.xmlVersionToSettingVersion(xml_version) def upgradeMaterial(self, serialised, filename): data = ET.fromstring(serialised) diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py index 8173e9dd04..70a359ee76 100644 --- a/plugins/XmlMaterialProfile/__init__.py +++ b/plugins/XmlMaterialProfile/__init__.py @@ -19,7 +19,7 @@ def getMetaData(): "mimetype": "application/x-ultimaker-material-profile" }, "version_upgrade": { - ("materials", 1000000): ("materials", 1000003, upgrader.upgradeMaterial), + ("materials", 1000000): ("materials", 1000004, upgrader.upgradeMaterial), }, "sources": { "materials": { From a4441e2bdbe2b6d86c46e17efd23a7f373b28fd1 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 2 Nov 2017 13:20:25 +0100 Subject: [PATCH 153/764] CURA-4481 Setting description improved --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4afc184e18..cffaa1df3d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3978,7 +3978,7 @@ "remove_empty_first_layers": { "label": "Remove Empty First Layers", - "description": "Remove empty layers beneath the first printed layer if they are present.", + "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", "type": "bool", "default_value": true, "enabled": "not support_enable", From 1d5d8c5ac07f07f406bb99695ba2da55637775a5 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Fri, 3 Nov 2017 15:02:03 +0100 Subject: [PATCH 154/764] Add_tri-hexagon_and_cross_to_pattern_description --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cffaa1df3d..0a0bb5546b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1394,7 +1394,7 @@ "infill_pattern": { "label": "Infill Pattern", - "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.", + "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction.", "type": "enum", "options": { From fb8bde6f76e4812968d8ffe4a7031c8ce2223705 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Nov 2017 15:29:33 +0100 Subject: [PATCH 155/764] Added view rotation for each click CURA-4527 --- resources/qml/Cura.qml | 83 ++++++++++++++++++++ resources/themes/cura-light/styles.qml | 103 +++++++++++++++++++++++++ 2 files changed, 186 insertions(+) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 2fd19a8a03..e6b30e8f5c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -403,6 +403,89 @@ UM.MainWindow } } + + //View orientation Item + Item + { + height: 90 + width: 90 + + anchors.top: topbar.bottom; + anchors.topMargin: - UM.Theme.getSize("default_margin").height * 2; + anchors.right: sidebar.left + anchors.rightMargin: 250 + + //Rotate_top + Button + { + id: orientation_rotate_top; + iconSource: UM.Theme.getIcon("arrow_top") + style: UM.Theme.styles.orientation_button + anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: 30 + + + } + + //Rotate_right + Button + { + id: orientation_rotate_right; + iconSource: UM.Theme.getIcon("arrow_right") + style: UM.Theme.styles.orientation_button + anchors.bottom: parent.bottom + anchors.bottomMargin: 30 + anchors.right: parent.right + onClicked:{ + UM.Controller.rotateView("x", -90); + } + } + + //Rotate_bottom + Button + { + id: orientation_rotate_bottom; + iconSource: UM.Theme.getIcon("arrow_bottom") + style: UM.Theme.styles.orientation_button + anchors.bottom: parent.bottom + anchors.left: parent.left + anchors.leftMargin: 30 + } + + //Rotate_left + Button + { + id: orientation_rotate_left; + iconSource: UM.Theme.getIcon("arrow_left") + style: UM.Theme.styles.orientation_button + anchors.bottom: parent.bottom + anchors.bottomMargin: 30 + anchors.left: parent.left + onClicked:{ + UM.Controller.rotateView("x", 90); + } + + } + + //Rotate_front + Button + { + id: orientation_rotate_front; + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.bottom: parent.bottom + anchors.bottomMargin: 30 + anchors.left: parent.left + anchors.leftMargin: 30 + + onClicked:{ + UM.Controller.rotateView("home" , 0); + } + } + } + + Loader { sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 6d991c5541..160b41b1ab 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -380,6 +380,109 @@ QtObject { } } + property Component orientation_button: Component { + ButtonStyle { + background: Item { + implicitWidth: 30; + implicitHeight: 30; + + Rectangle { + id: buttonFace2; + + anchors.fill: parent; + property bool down: control.pressed || (control.checkable && control.checked); + + color: { + if(control.customColor !== undefined && control.customColor !== null) { + return control.customColor + } else if(control.checkable && control.checked && control.hovered) { + return Theme.getColor("button_active_hover"); + } else if(control.pressed || (control.checkable && control.checked)) { + return Theme.getColor("button_active"); + } else if(control.hovered) { + return Theme.getColor("button_hover"); + } else { + //return Theme.getColor("button"); + return "red" + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + border.width: (control.hasOwnProperty("needBorder") && control.needBorder) ? 2 * screenScaleFactor : 0 + border.color: Theme.getColor("tool_button_border") + + UM.RecolorImage { + id: tool_button_arrow2 + //anchors.right: parent.right; + //anchors.rightMargin: (Theme.getSize("button").width - Theme.getSize("button_icon").width) / 4 + //anchors.bottom: parent.bottom; + //anchors.bottomMargin: (Theme.getSize("button").height - Theme.getSize("button_icon").height) / 4 + //width: Theme.getSize("standard_arrow").width + //height: Theme.getSize("standard_arrow").height + + width: 5 + height: 5 + + sourceSize.width: 5 + sourceSize.height: 5 + visible: control.menu != null; + color: + { + if(control.checkable && control.checked && control.hovered) + { + return Theme.getColor("button_text_active_hover"); + } + else if(control.pressed || (control.checkable && control.checked)) + { + return Theme.getColor("button_text_active"); + } + else if(control.hovered) + { + return Theme.getColor("button_text_hover"); + } + else + { + return Theme.getColor("button_text"); + } + } + source: Theme.getIcon("arrow_bottom") + } + } + } + + label: Item { + UM.RecolorImage { + anchors.centerIn: parent; + opacity: !control.enabled ? 0.2 : 1.0 + source: control.iconSource; + width: 20; + height: 20; + color: + { + if(control.checkable && control.checked && control.hovered) + { + return Theme.getColor("button_text_active_hover"); + } + else if(control.pressed || (control.checkable && control.checked)) + { + return Theme.getColor("button_text_active"); + } + else if(control.hovered) + { + return Theme.getColor("button_text_hover"); + } + else + { + return Theme.getColor("button_text"); + } + } + + sourceSize: Theme.getSize("button_icon") + } + } + } + } + property Component progressbar: Component{ ProgressBarStyle { background: Rectangle { From 97fd92665440297c9e24698a1a67e1be079f50a9 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 3 Nov 2017 17:46:12 +0100 Subject: [PATCH 156/764] CURA-4526 Add to SimulationView the same behavior than LayerView --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 914aa1dee0..cfbc1f429f 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -588,7 +588,7 @@ class CuraEngineBackend(QObject, Backend): def _onActiveViewChanged(self): if Application.getInstance().getController().getActiveView(): view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": # If switching to layer view, we should process the layers if that hasn't been done yet. + if view.getPluginId() in ("LayerView", "SimulationView"): # If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index a352564bc2..639ea27135 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -61,7 +61,7 @@ class ProcessSlicedLayersJob(Job): def run(self): start_time = time() - if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + if Application.getInstance().getController().getActiveView().getPluginId() in ("LayerView", "SimulationView"): self._progress_message.show() Job.yieldThread() if self._abort_requested: @@ -219,7 +219,7 @@ class ProcessSlicedLayersJob(Job): self._progress_message.setProgress(100) view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": + if view.getPluginId() in ("LayerView", "SimulationView"): view.resetLayerData() if self._progress_message: @@ -232,7 +232,7 @@ class ProcessSlicedLayersJob(Job): def _onActiveViewChanged(self): if self.isRunning(): - if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + if Application.getInstance().getController().getActiveView().getPluginId() in ("LayerView", "SimulationView"): if not self._progress_message: self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0, catalog.i18nc("@info:title", "Information")) if self._progress_message.getProgress() != 100: From 0d71443bd29ba43290f11eec3e0443f0711413e0 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 5 Nov 2017 23:24:07 +0100 Subject: [PATCH 157/764] Move 'Remove Empty First Layers' setting to mesh fixes category It used to be in 'support' since it's something you may want to decide on depending on whether you have support or not. It could also go in 'Special Modes', but I think this is more specified. --- resources/definitions/fdmprinter.def.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cffaa1df3d..88e02fc1c6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3974,16 +3974,6 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true - }, - "remove_empty_first_layers": - { - "label": "Remove Empty First Layers", - "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", - "type": "bool", - "default_value": true, - "enabled": "not support_enable", - "settable_per_mesh": false, - "settable_per_extruder": false } } }, @@ -4894,6 +4884,16 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": true + }, + "remove_empty_first_layers": + { + "label": "Remove Empty First Layers", + "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", + "type": "bool", + "default_value": true, + "enabled": "not support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false } } }, From c61b9c41ab03e7b0a723cd1f70a4cfd5bbf88b81 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Mon, 6 Nov 2017 03:55:49 +0100 Subject: [PATCH 158/764] Fix translation of Unable to slice message Previously the {0} would be filled in at runtime, causing the translation to no longer be found in the catalogue. Contributes to issue CURA-4091. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 914aa1dee0..0c1fc6f4ad 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -293,7 +293,7 @@ class CuraEngineBackend(QObject, Backend): error_labels.add(definitions[0].label) error_labels = ", ".join(error_labels) - self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. The following settings have errors: {0}".format(error_labels)), + self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. The following settings have errors: {0}").format(error_labels), title = catalog.i18nc("@info:title", "Unable to slice")) self._error_message.show() self.backendStateChange.emit(BackendState.Error) From 28ce2b1dc6d3382a5d146fa2aa928af18541ce68 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 6 Nov 2017 09:49:13 +0100 Subject: [PATCH 159/764] Ignore VariSlice plugin --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 570c932d28..ac1e8eba92 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ plugins/ProfileFlattener plugins/cura-god-mode-plugin plugins/cura-big-flame-graph plugins/cura-siemensnx-plugin +plugins/CuraVariSlicePlugin #Build stuff CMakeCache.txt From 5008d63cfef2c643bfe7631779f6e99d0013d79d Mon Sep 17 00:00:00 2001 From: kaleidoscopeit Date: Mon, 6 Nov 2017 10:01:57 +0100 Subject: [PATCH 160/764] New machine definition : Deltacomb 3D --- resources/definitions/deltacomb.def.json | 66 ++++++++++++++++++ resources/meshes/deltacomb.stl | Bin 0 -> 1352284 bytes .../deltacomb/deltacomb_abs_fast.inst.cfg | 25 +++++++ .../deltacomb/deltacomb_abs_high.inst.cfg | 25 +++++++ .../deltacomb/deltacomb_abs_normal.inst.cfg | 24 +++++++ .../deltacomb/deltacomb_nylon_fast.inst.cfg | 57 +++++++++++++++ .../deltacomb/deltacomb_nylon_high.inst.cfg | 57 +++++++++++++++ .../deltacomb/deltacomb_nylon_normal.inst.cfg | 58 +++++++++++++++ .../deltacomb/deltacomb_pla_fast.inst.cfg | 24 +++++++ .../deltacomb/deltacomb_pla_high.inst.cfg | 25 +++++++ .../deltacomb/deltacomb_pla_normal.inst.cfg | 23 ++++++ 11 files changed, 384 insertions(+) create mode 100644 resources/definitions/deltacomb.def.json create mode 100644 resources/meshes/deltacomb.stl create mode 100644 resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_abs_high.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_pla_high.inst.cfg create mode 100644 resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg diff --git a/resources/definitions/deltacomb.def.json b/resources/definitions/deltacomb.def.json new file mode 100644 index 0000000000..031bd12156 --- /dev/null +++ b/resources/definitions/deltacomb.def.json @@ -0,0 +1,66 @@ +{ + "id": "deltacomb", + "version": 2, + "name": "Deltacomb 3D", + "inherits": "fdmprinter", + "metadata": { + "author": "Gabriele Rossetti", + "visible": true, + "manufacturer": "Deltacomb 3D", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "deltacomb.stl", + "has_machine_quality": true + }, + + "overrides": { + "machine_heated_bed": { "default_value": false }, + "machine_width": { "default_value": 190 }, + "machine_height": { "default_value": 250 }, + "machine_depth": { "default_value": 190 }, + "machine_center_is_zero": { "default_value": true }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 ;Home all axes (max endstops)\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..."}, + "machine_end_gcode": { "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG28 ;Home all axes (max endstops)\nM84 ;steppers off\nG90 ;absolute positioning" }, + "machine_shape": { "default_value": "elliptic" }, + "machine_max_feedrate_x": { "default_value": 250 }, + "machine_max_feedrate_y": { "default_value": 250 }, + "machine_max_feedrate_z": { "default_value": 15 }, + "machine_max_acceleration_x": { "default_value": 10000 }, + "machine_max_acceleration_y": { "default_value": 10000 }, + "machine_max_acceleration_z": { "default_value": 50 }, + "machine_max_acceleration_e": { "default_value": 100 }, + "machine_acceleration": { "default_value": 4000 }, + "machine_max_jerk_xy": { "default_value": 25.0 }, + "machine_max_jerk_z": { "default_value": 0.4 }, + "machine_max_jerk_e": { "default_value": 1.0 }, + "retraction_hop_enabled": { "default_value": false }, + "retraction_amount" : { "default_value": 4.5 }, + "retraction_speed" : { "default_value": 40 }, + "material_diameter": { "default_value": 1.75 }, + "material_final_print_temperature": { "value": "material_print_temperature - 5" }, + "material_initial_print_temperature": { "value": "material_print_temperature" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "travel_avoid_distance": { "default_value": 1, "value": 1 }, + "speed_print" : { "default_value": 70 }, + "speed_travel": { "default_value": 80, "value": 80 }, + "speed_infill": { "value": "round(speed_print * 1.05, 0)" }, + "speed_topbottom": { "value": "round(speed_print * 0.95, 0)" }, + "speed_wall": { "value": "speed_print" }, + "speed_wall_0": { "value": "round(speed_print * 0.9, 0)" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_layer_0": { "value": "min(round(speed_print * 0.75, 0), 45.0)" }, + "speed_travel_layer_0": { "value": "round(speed_travel * 0.7, 0)" }, + "skirt_brim_speed": { "value": "speed_layer_0" }, + "skirt_line_count": { "default_value": 3 }, + "skirt_brim_minimal_length": { "default_value": 150 }, + "infill_sparse_density": { "default_value": 24 }, + "top_bottom_thickness": { "default_value": 0.6 }, + "support_z_distance": { "default_value": 0.2, "value": "min(2 * layer_height, machine_nozzle_size * 0.75)" }, + "infill_before_walls" : { "default_value": false }, + "support_use_towers" : { "default_value": false } + } +} diff --git a/resources/meshes/deltacomb.stl b/resources/meshes/deltacomb.stl new file mode 100644 index 0000000000000000000000000000000000000000..7be5c33fd7a927a511028e46509238e637a929ae GIT binary patch literal 1352284 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 KOVh>IYX1-6!5XFj literal 0 HcmV?d00001 diff --git a/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg new file mode 100644 index 0000000000..a44ad8c271 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +definition = deltacomb +name = Fast Quality (beta) + +[metadata] +type = quality +setting_version = 3 +material = generic_abs_175 +quality_type = fast +weight = -1 + +[values] +adhesion_type = raft +layer_height = 0.2 +layer_height_0 = 0.2 +cool_fan_enabled = True +cool_fan_full_at_height = 0.4 +cool_fan_speed = 50 +cool_fan_speed_max = 50 +cool_fan_speed_min = 50 +cool_min_layer_time = 3 +cool_min_speed = 20 +material_bed_temperature = 80 + diff --git a/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg new file mode 100644 index 0000000000..7a21407d1b --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +definition = deltacomb +name = High Quality (beta) + +[metadata] +type = quality +setting_version = 3 +material = generic_abs_175 +quality_type = high +weight = 1 + +[values] +adhesion_type = raft +layer_height = 0.1 +layer_height_0 = 0.1 +cool_fan_enabled = True +cool_fan_full_at_height = 0.2 +cool_fan_speed = 50 +cool_fan_speed_max = 50 +cool_fan_speed_min = 50 +cool_min_layer_time = 3 +cool_min_speed = 20 +material_bed_temperature = 80 + diff --git a/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg new file mode 100644 index 0000000000..e1889c008f --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +definition = deltacomb +name = Normal Quality (beta) + +[metadata] +type = quality +setting_version = 3 +material = generic_abs_175 +quality_type = normal +weight = 0 + +[values] +adhesion_type = raft +layer_height = 0.15 +layer_height_0 = 0.15 +cool_fan_enabled = True +cool_fan_full_at_height = 0.3 +cool_fan_speed = 50 +cool_fan_speed_max = 50 +cool_fan_speed_min = 50 +cool_min_layer_time = 3 +cool_min_speed = 20 +material_bed_temperature = 80 diff --git a/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg new file mode 100644 index 0000000000..ec10bfc510 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg @@ -0,0 +1,57 @@ +[general] +version = 2 +name = Fast Quality (beta) +definition = deltacomb + +[metadata] +type = quality +material = generic_nylon_175 +quality_type = fast +weight = -1 +setting_version = 3 + +[values] +adhesion_type = raft +brim_width = 4 +cool_fan_enabled = False +cool_fan_full_at_height = 0.45 +cool_fan_speed = 0 +cool_fan_speed_max = 0 +cool_fan_speed_min = 0 +cool_min_layer_time = 5 +cool_min_speed = 0 +infill_overlap = 15 +infill_sparse_density = 24 +layer_height = 0.20 +layer_height_0 = 0.15 +line_width = =machine_nozzle_size +material_flow = 100 +raft_airgap = 0.22 +raft_base_line_width= =line_width * 2 +raft_base_thickness = =layer_height_0 * 2 +raft_interface_line_width = =line_width +raft_interface_thickness = =layer_height +raft_margin = 5 +raft_surface_layers = 2 +raft_surface_line_width = =line_width +raft_surface_thickness = =layer_height +retraction_hop = 0.5 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 10 +skirt_brim_minimal_length = 75 +skirt_gap = 1.5 +skirt_line_count = 5 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 40 +speed_travel = 200 +speed_wall_0 = 40 +speed_wall_x = =speed_print +support_angle = 70 +support_type = buildplate +support_z_distance = 0.15 +top_bottom_thickness = 0.8 +wall_thickness = 0.8 +z_seam_type = random diff --git a/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg new file mode 100644 index 0000000000..db2a31c468 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg @@ -0,0 +1,57 @@ +[general] +version = 2 +name = High Quality (beta) +definition = deltacomb + +[metadata] +type = quality +material = generic_nylon_175 +quality_type = high +weight = 1 +setting_version = 3 + +[values] +adhesion_type = raft +brim_width = 4 +cool_fan_enabled = False +cool_fan_full_at_height = 0.45 +cool_fan_speed = 0 +cool_fan_speed_max = 0 +cool_fan_speed_min = 0 +cool_min_layer_time = 5 +cool_min_speed = 0 +infill_overlap = 15 +infill_sparse_density = 24 +layer_height = 0.10 +layer_height_0 = 0.10 +line_width = =machine_nozzle_size +material_flow = 100 +raft_airgap = 0.22 +raft_base_line_width= =line_width * 2 +raft_base_thickness = =layer_height_0 * 2 +raft_interface_line_width = =line_width +raft_interface_thickness = =layer_height +raft_margin = 5 +raft_surface_layers = 2 +raft_surface_line_width = =line_width +raft_surface_thickness = =layer_height +retraction_hop = 0.5 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 10 +skirt_brim_minimal_length = 75 +skirt_gap = 1.5 +skirt_line_count = 5 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 40 +speed_travel = 200 +speed_wall_0 = 40 +speed_wall_x = =speed_print +support_angle = 70 +support_type = buildplate +support_z_distance = 0.15 +top_bottom_thickness = 0.8 +wall_thickness = 0.8 +z_seam_type = random diff --git a/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg new file mode 100644 index 0000000000..a0504adfd8 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg @@ -0,0 +1,58 @@ +[general] +version = 2 +name = Normal Quality (beta) +definition = deltacomb + +[metadata] +type = quality +material = generic_nylon_175 +quality_type = normal +weight = 0 +setting_version = 3 + +[values] +adhesion_type = raft +brim_width = 4 +cool_fan_enabled = False +cool_fan_full_at_height = 0.45 +cool_fan_speed = 0 +cool_fan_speed_max = 0 +cool_fan_speed_min = 0 +cool_min_layer_time = 5 +cool_min_speed = 0 +infill_overlap = 15 +infill_sparse_density = 24 +layer_height = 0.15 +layer_height_0 = 0.10 +line_width = =machine_nozzle_size +material_flow = 100 +raft_airgap = 0.22 +raft_base_line_width= =line_width * 2 +raft_base_thickness = =layer_height_0 * 2 +raft_interface_line_width = =line_width +raft_interface_thickness = =layer_height +raft_margin = 5 +raft_surface_layers = 2 +raft_surface_line_width = =line_width +raft_surface_thickness = =layer_height +retraction_hop = 0.5 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 10 +skirt_brim_minimal_length = 75 +skirt_gap = 1.5 +skirt_line_count = 5 +speed_infill = =speed_print +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 40 +speed_travel = 200 +speed_wall_0 = 40 +speed_wall_x = =speed_print +support_angle = 70 +support_type = buildplate +support_z_distance = 0.15 +top_bottom_thickness = 0.8 +wall_thickness = 0.8 +z_seam_type = random + diff --git a/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg new file mode 100644 index 0000000000..a91e009353 --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +definition = deltacomb +name = Fast Quality + +[metadata] +type = quality +setting_version = 3 +material = generic_pla_175 +quality_type = fast +weight = -1 + +[values] +adhesion_type = skirt +layer_height = 0.2 +layer_height_0 = 0.2 +cool_fan_enabled = True +cool_fan_full_at_height = 0.4 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 100 +cool_min_layer_time = 5 +cool_min_speed = 20 + diff --git a/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg new file mode 100644 index 0000000000..c42a18d8eb --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +definition = deltacomb +name = High Quality + +[metadata] +type = quality +setting_version = 3 +material = generic_pla_175 +quality_type = high +weight = 1 + +[values] +adhesion_type = skirt +layer_height = 0.1 +layer_height_0 = 0.1 +cool_fan_enabled = True +cool_fan_full_at_height = 0.2 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 100 +cool_min_layer_time = 5 +cool_min_speed = 20 +material_print_temperature_layer_0 = =default_material_print_temperature + 5 + diff --git a/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg new file mode 100644 index 0000000000..a433f2d0dd --- /dev/null +++ b/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +definition = deltacomb +name = Normal Quality + +[metadata] +type = quality +setting_version = 3 +material = generic_pla_175 +quality_type = normal +weight = 0 + +[values] +adhesion_type = skirt +layer_height = 0.15 +layer_height_0 = 0.15 +cool_fan_enabled = True +cool_fan_full_at_height = 0.3 +cool_fan_speed = 100 +cool_fan_speed_max = 100 +cool_fan_speed_min = 100 +cool_min_layer_time = 5 +cool_min_speed = 20 From 7722e438c9d774430aa01598eb879a33dcc6fb2d Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 6 Nov 2017 10:28:07 +0100 Subject: [PATCH 161/764] Changed orientation button location, adjusted call functins CURA-4527 --- resources/qml/Cura.qml | 83 -------------------------- resources/qml/Topbar.qml | 70 ++++++++++++++++++++++ resources/themes/cura-light/styles.qml | 12 ++-- 3 files changed, 77 insertions(+), 88 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e6b30e8f5c..2fd19a8a03 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -403,89 +403,6 @@ UM.MainWindow } } - - //View orientation Item - Item - { - height: 90 - width: 90 - - anchors.top: topbar.bottom; - anchors.topMargin: - UM.Theme.getSize("default_margin").height * 2; - anchors.right: sidebar.left - anchors.rightMargin: 250 - - //Rotate_top - Button - { - id: orientation_rotate_top; - iconSource: UM.Theme.getIcon("arrow_top") - style: UM.Theme.styles.orientation_button - anchors.top: parent.top - anchors.left: parent.left - anchors.leftMargin: 30 - - - } - - //Rotate_right - Button - { - id: orientation_rotate_right; - iconSource: UM.Theme.getIcon("arrow_right") - style: UM.Theme.styles.orientation_button - anchors.bottom: parent.bottom - anchors.bottomMargin: 30 - anchors.right: parent.right - onClicked:{ - UM.Controller.rotateView("x", -90); - } - } - - //Rotate_bottom - Button - { - id: orientation_rotate_bottom; - iconSource: UM.Theme.getIcon("arrow_bottom") - style: UM.Theme.styles.orientation_button - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.leftMargin: 30 - } - - //Rotate_left - Button - { - id: orientation_rotate_left; - iconSource: UM.Theme.getIcon("arrow_left") - style: UM.Theme.styles.orientation_button - anchors.bottom: parent.bottom - anchors.bottomMargin: 30 - anchors.left: parent.left - onClicked:{ - UM.Controller.rotateView("x", 90); - } - - } - - //Rotate_front - Button - { - id: orientation_rotate_front; - iconSource: UM.Theme.getIcon("category_machine") - style: UM.Theme.styles.orientation_button - anchors.bottom: parent.bottom - anchors.bottomMargin: 30 - anchors.left: parent.left - anchors.leftMargin: 30 - - onClicked:{ - UM.Controller.rotateView("home" , 0); - } - } - } - - Loader { sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index c69c786d5a..7e1bfeb808 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -220,6 +220,76 @@ Rectangle menu: PrinterMenu { } } + //View orientation Item + Row + { + id: viewOrientationControl + height: 30 + width: 155 + spacing: 2 + + anchors { + verticalCenter: base.verticalCenter + right: viewModeButton.right + rightMargin: UM.Theme.getSize("default_margin").width + viewModeButton.width + } + + // #1 3d view + Button + { + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.verticalCenter: viewOrientationControl.verticalCenter + onClicked:{ + UM.Controller.rotateView("3d", 0); + } + } + + // #2 Front view + Button + { + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.verticalCenter: viewOrientationControl.verticalCenter + onClicked:{ + UM.Controller.rotateView("home", 0); + } + } + + // #3 Top view + Button + { + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.verticalCenter: viewOrientationControl.verticalCenter + onClicked:{ + UM.Controller.rotateView("y", 90); + } + } + + // #4 Left view + Button + { + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.verticalCenter: viewOrientationControl.verticalCenter + onClicked:{ + UM.Controller.rotateView("x", 90); + } + } + + // #5 Left view + Button + { + iconSource: UM.Theme.getIcon("category_machine") + style: UM.Theme.styles.orientation_button + anchors.verticalCenter: viewOrientationControl.verticalCenter + onClicked:{ + UM.Controller.rotateView("x", -90); + } + } + } + ComboBox { id: viewModeButton diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 160b41b1ab..36a3ddffbe 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -383,8 +383,8 @@ QtObject { property Component orientation_button: Component { ButtonStyle { background: Item { - implicitWidth: 30; - implicitHeight: 30; + implicitWidth: 25; + implicitHeight: 25; Rectangle { id: buttonFace2; @@ -403,7 +403,7 @@ QtObject { return Theme.getColor("button_hover"); } else { //return Theme.getColor("button"); - return "red" + return "transparent" } } Behavior on color { ColorAnimation { duration: 50; } } @@ -469,11 +469,13 @@ QtObject { } else if(control.hovered) { - return Theme.getColor("button_text_hover"); + //return Theme.getColor("button_text_hover"); + return "white" } else { - return Theme.getColor("button_text"); + //return Theme.getColor("button_text"); + return "black" } } From 5b368fbfd5e8c588b6679c62fb81f20a47052489 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 6 Nov 2017 09:25:42 +0100 Subject: [PATCH 162/764] CURA-4104 added first sucky build plate selection options --- cura/BuildPlateModel.py | 2 + cura/CuraActions.py | 43 +++++++++++++++++++ cura/CuraApplication.py | 36 +++++++++++++++- .../SetBuildPlateNumberOperation.py | 27 ++++++++++++ cura/Scene/BuildPlateDecorator.py | 34 +++++++++++++++ resources/qml/Menus/ContextMenu.qml | 20 +++++++++ resources/qml/Menus/ViewMenu.qml | 19 ++++++++ 7 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 cura/BuildPlateModel.py create mode 100644 cura/Operations/SetBuildPlateNumberOperation.py create mode 100644 cura/Scene/BuildPlateDecorator.py diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/cura/BuildPlateModel.py @@ -0,0 +1,2 @@ + + diff --git a/cura/CuraActions.py b/cura/CuraActions.py index b51728f028..663da3ec09 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -19,6 +19,11 @@ from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation from cura.Settings.ExtruderManager import ExtruderManager +from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation + +from UM.Logger import Logger + + class CuraActions(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -124,5 +129,43 @@ class CuraActions(QObject): operation.addOperation(SetObjectExtruderOperation(node, extruder_id)) operation.push() + @pyqtSlot(int) + def setBuildPlateForSelection(self, build_plate_nr: int) -> None: + Logger.log("d", "Setting build plate number... %d" % build_plate_nr) + operation = GroupedOperation() + + nodes_to_change = [] + for node in Selection.getAllSelectedObjects(): + # Do not change any nodes that already have the right extruder set. + if node.callDecoration("getBuildPlateNumber") == build_plate_nr: + continue + + # If the node is a group, apply the active extruder to all children of the group. + if node.callDecoration("isGroup"): + for grouped_node in BreadthFirstIterator(node): + if grouped_node.callDecoration("getBuildPlateNumber") == build_plate_nr: + continue + + if grouped_node.callDecoration("isGroup"): + continue + + nodes_to_change.append(grouped_node) + continue + + nodes_to_change.append(node) + + if not nodes_to_change: + Logger.log("d", "Nothing to change.") + # If there are no changes to make, we still need to reset the selected extruders. + # This is a workaround for checked menu items being deselected while still being + # selected. + #ExtruderManager.getInstance().resetSelectedObjectExtruders() + return + + Logger.log("d", "Yes: %s", nodes_to_change) + for node in nodes_to_change: + operation.addOperation(SetBuildPlateNumberOperation(node, build_plate_nr)) + operation.push() + def _openUrl(self, url): QDesktopServices.openUrl(url) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b09371ae0d..ff8dfd021a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1,4 +1,5 @@ # Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtNetwork import QLocalServer @@ -53,6 +54,9 @@ from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager +# research +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator + from . import PlatformPhysics from . import BuildVolume from . import CameraAnimation @@ -376,6 +380,10 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") + # research + self._num_build_plates = 1 # default + self._active_build_plate = 1 + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -855,6 +863,8 @@ class CuraApplication(QtApplication): activityChanged = pyqtSignal() sceneBoundingBoxChanged = pyqtSignal() preferredOutputMimetypeChanged = pyqtSignal() + numBuildPlatesChanged = pyqtSignal() + activeBuildPlateChanged = pyqtSignal() @pyqtProperty(bool, notify = activityChanged) def platformActivity(self): @@ -1025,7 +1035,7 @@ class CuraApplication(QtApplication): op.push() Selection.clear() - ## Reset all translation on nodes with mesh data. + ## Reset all translation on nodes with mesh data. @pyqtSlot() def resetAllTranslation(self): Logger.log("i", "Resetting all scene translations") @@ -1150,7 +1160,7 @@ class CuraApplication(QtApplication): job.start() else: Logger.log("w", "Unable to reload data because we don't have a filename.") - + ## Get logging data of the backend engine # \returns \type{string} Logging data @pyqtSlot(result = str) @@ -1373,6 +1383,7 @@ class CuraApplication(QtApplication): for node in nodes: node.setSelectable(True) node.setName(os.path.basename(filename)) + node.addDecorator(BuildPlateDecorator()) extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: @@ -1445,3 +1456,24 @@ class CuraApplication(QtApplication): node = node.getParent() Selection.add(node) + + #### research - hacky place for these kind of thing + @pyqtSlot(int) + def setActiveBuildPlate(self, nr): + Logger.log("d", "Select build plate: %s" % nr) + self._active_build_plate = nr + self.activeBuildPlateChanged.emit() + + @pyqtSlot() + def newBuildPlate(self): + Logger.log("d", "New build plate") + self._num_build_plates += 1 + self.numBuildPlatesChanged.emit() + + @pyqtProperty(int, notify = numBuildPlatesChanged) + def numBuildPlates(self): + return self._num_build_plates + + @pyqtProperty(int, notify = activeBuildPlateChanged) + def activeBuildPlate(self): + return self._active_build_plate diff --git a/cura/Operations/SetBuildPlateNumberOperation.py b/cura/Operations/SetBuildPlateNumberOperation.py new file mode 100644 index 0000000000..bbef4caf84 --- /dev/null +++ b/cura/Operations/SetBuildPlateNumberOperation.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Scene.SceneNode import SceneNode +from UM.Operations.Operation import Operation + +from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator + +## Simple operation to set the extruder a certain object should be printed with. +class SetBuildPlateNumberOperation(Operation): + def __init__(self, node: SceneNode, build_plate_nr: int) -> None: + self._node = node + self._build_plate_nr = build_plate_nr + self._previous_build_plate_nr = None + self._decorator_added = False + + def undo(self): + if self._previous_build_plate_nr: + self._node.callDecoration("setBuildPlateNumber", self._previous_build_plate_nr) + + def redo(self): + stack = self._node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + self._node.addDecorator(SettingOverrideDecorator()) + + self._previous_build_plate_nr = self._node.callDecoration("getBuildPlateNumber") + self._node.callDecoration("setBuildPlateNumber", self._build_plate_nr) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py new file mode 100644 index 0000000000..8d91f9e90a --- /dev/null +++ b/cura/Scene/BuildPlateDecorator.py @@ -0,0 +1,34 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator +from UM.Scene.Selection import Selection + + +class BuildPlateDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + self._build_plate_number = -1 + + def setBuildPlateNumber(self, nr): + self._build_plate_number = nr + # self.getNode().childrenChanged.connect(self._onChildrenChanged) + + def getBuildPlateNumber(self): + return self._build_plate_number + + # def setNode(self, node): + # super().setNode(node) + # self.getNode().childrenChanged.connect(self._onChildrenChanged) + + # def _onChildrenChanged(self, node): + # if not self.getNode().hasChildren(): + # # A group that no longer has children may remove itself from the scene + # self._old_parent = self.getNode().getParent() + # self.getNode().setParent(None) + # Selection.remove(self.getNode()) + # else: + # # A group that has removed itself from the scene because it had no children may add itself back to the scene when a child is added to it + # if not self.getNode().getParent() and self._old_parent: + # self.getNode().setParent(self._old_parent) + # self._old_parent = None + + def __deepcopy__(self, memo): + return BuildPlateDecorator() diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 39d497722f..175410773e 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -39,6 +39,26 @@ Menu onObjectRemoved: base.removeItem(object) } + MenuSeparator {} + MenuItem { + text: "build plate 0"; + onTriggered: CuraActions.setBuildPlateForSelection(0); + checkable: true + checked: false + } + MenuItem { + text: "build plate 1"; + onTriggered: CuraActions.setBuildPlateForSelection(1); + checkable: true + checked: false + } + MenuItem { + text: "build plate 2"; + onTriggered: CuraActions.setBuildPlateForSelection(2); + checkable: true + checked: false + } + // Global actions MenuSeparator {} MenuItem { action: Cura.Actions.selectAll; } diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index bb5999edb9..3c5485da32 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -28,6 +28,25 @@ Menu } ExclusiveGroup { id: group; } + MenuSeparator {} + MenuItem { + text: "build plate 0"; + onTriggered: CuraApplication.setActiveBuildPlate(0); + } + MenuItem { + text: "build plate 1"; + onTriggered: CuraApplication.setActiveBuildPlate(1); + } + MenuItem { + text: "build plate 2"; + onTriggered: CuraApplication.setActiveBuildPlate(2); + } + ExclusiveGroup { id: buildPlateGroup; } + + MenuItem { + text: "New build plate"; + onTriggered: CuraApplication.newBuildPlate(); + } MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; } } From 5050124699fa50501916fe7319417e480efd3a94 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 6 Nov 2017 14:02:22 +0100 Subject: [PATCH 163/764] CURA-4525 wip objects menu --- cura/CuraApplication.py | 4 + plugins/CuraEngineBackend/StartSliceJob.py | 10 ++- plugins/SolidView/SolidView.py | 3 +- resources/qml/Cura.qml | 41 +++++++++- resources/qml/ObjectsList.qml | 88 ++++++++++++++++++++++ resources/themes/cura-light/theme.json | 4 +- 6 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 resources/qml/ObjectsList.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ff8dfd021a..5111b9b52a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -292,6 +292,8 @@ class CuraApplication(QtApplication): preferences.addPreference("metadata/setting_version", 0) preferences.setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. + preferences.addPreference("view/build_plate_number", 0) + preferences.addPreference("cura/active_mode", "simple") preferences.addPreference("cura/categories_expanded", "") @@ -1462,6 +1464,8 @@ class CuraApplication(QtApplication): def setActiveBuildPlate(self, nr): Logger.log("d", "Select build plate: %s" % nr) self._active_build_plate = nr + Preferences.setValue("view/build_plate_number", self._active_build_plate) + self.activeBuildPlateChanged.emit() @pyqtSlot() diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index a53daa4e63..607914f5c5 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -140,9 +140,13 @@ class StartSliceJob(Job): temp_list = [] for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - if not getattr(node, "_outside_buildarea", False)\ - or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): - temp_list.append(node) + + # temp hack to filter on build plate 0 + if (node.callDecoration("getBuildPlateNumber") == 0): + + if not getattr(node, "_outside_buildarea", False)\ + or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): + temp_list.append(node) Job.yieldThread() if temp_list: diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8f0c9a4dc1..625223a097 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -71,10 +71,11 @@ class SolidView(View): else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) + activeBuildPlateNumber = Preferences.getInstance().getValue("view/build_plate_number") or 0 for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): - if node.getMeshData() and node.isVisible(): + if node.getMeshData() and node.isVisible() and (node.callDecoration("getBuildPlateNumber") == activeBuildPlateNumber): uniforms = {} shade_factor = 1.0 diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 2fd19a8a03..03d0ce9ecd 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -340,6 +340,22 @@ UM.MainWindow action: Cura.Actions.open; } + Button + { + id: objectsButton; + text: catalog.i18nc("@action:button","Objects"); + iconSource: UM.Theme.getIcon("load") + style: UM.Theme.styles.tool_button + tooltip: ''; + anchors + { + top: openFileButton.bottom; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + } + action: triggerObjectsList; + } + Toolbar { id: toolbar; @@ -348,7 +364,7 @@ UM.MainWindow property int mouseY: base.mouseY anchors { - top: openFileButton.bottom; + top: objectsButton.bottom; topMargin: UM.Theme.getSize("window_margin").height; left: parent.left; } @@ -380,6 +396,29 @@ UM.MainWindow monitoringPrint: base.showPrintMonitor } + Action + { + id: triggerObjectsList; + text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)..."); + iconName: "document-open"; + shortcut: StandardKey.Open; + onTriggered: objectsList.visible = !objectsList.visible; + } + + ObjectsList + { + id: objectsList; + visible: false; + anchors + { + top: objectsButton.top; + left: objectsButton.right; + leftMargin: UM.Theme.getSize("default_margin").width; + rightMargin: UM.Theme.getSize("default_margin").width; + } + + } + Rectangle { id: viewportOverlay diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml new file mode 100644 index 0000000000..105bdb957b --- /dev/null +++ b/resources/qml/ObjectsList.qml @@ -0,0 +1,88 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Dialogs 1.1 + +import UM 1.3 as UM +import Cura 1.0 as Cura + +import "Menus" + +Rectangle +{ + id: base; + + color: UM.Theme.getColor("tool_panel_background") + + width: UM.Theme.getSize("objects_menu_size").width + height: UM.Theme.getSize("objects_menu_size").height + + Button + { + id: openFileButton; + text: catalog.i18nc("@action:button","Open File"); + iconSource: UM.Theme.getIcon("load") + style: UM.Theme.styles.tool_button + tooltip: ''; + anchors + { + top: parent.top; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + } + action: Cura.Actions.open; + } + + ListModel + { + id: objectsListModel; + + ListElement { + name: "Apple" + cost: 2.45 + } + ListElement { + name: "Orange" + cost: 3.25 + } + ListElement { + name: "Banana" + cost: 1.95 + } + } + + Component { + id: objectDelegate + Rectangle { + height: 30 + + Text { + text: name + color: red + } + //Text { text: '$' + cost } + } + } + + ListView + { + model: objectsListModel; + anchors + { + top: openFileButton.bottom; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + } + width: parent.width - 2 * UM.Theme.getSize("default_margin").height + height: 100 + + delegate: objectDelegate + } + +} diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index b41ea96846..315b29bec0 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -374,6 +374,8 @@ "infill_button_margin": [0.5, 0.5], - "jobspecs_line": [2.0, 2.0] + "jobspecs_line": [2.0, 2.0], + + "objects_menu_size": [20, 30] } } From 6e7e859a0a879b38c850f2444d68eb9521ac0835 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 7 Nov 2017 10:59:23 +0100 Subject: [PATCH 164/764] Introduced Lock Position functionality CURA-4527 --- resources/themes/cura-light/styles.qml | 43 ++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 36a3ddffbe..eff4542bce 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -857,6 +857,49 @@ QtObject { } } + property Component partially_checkbox: Component { + CheckBoxStyle { + background: Item { } + indicator: Rectangle { + implicitWidth: Theme.getSize("checkbox").width; + implicitHeight: Theme.getSize("checkbox").height; + + color: (control.hovered || control._hovered) ? Theme.getColor("checkbox_hover") : Theme.getColor("checkbox"); + Behavior on color { ColorAnimation { duration: 50; } } + + radius: control.exclusiveGroup ? Theme.getSize("checkbox").width / 2 : 0 + + border.width: Theme.getSize("default_lining").width; + border.color: (control.hovered || control._hovered) ? Theme.getColor("checkbox_border_hover") : Theme.getColor("checkbox_border"); + + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width / 2.5 + height: parent.height / 2.5 + sourceSize.width: width + sourceSize.height: width + color: Theme.getColor("checkbox_mark") + source: { + if (control.checkbox_state == 2){ + return Theme.getIcon("solid") + } + else{ + return control.exclusiveGroup ? Theme.getIcon("dot") : Theme.getIcon("check") + } + } + opacity: control.checked + Behavior on opacity { NumberAnimation { duration: 100; } } + } + } + label: Label { + text: control.text; + color: Theme.getColor("checkbox_text"); + font: Theme.getFont("default"); + } + } + } + property Component slider: Component { SliderStyle { groove: Rectangle { From 2be529668e3c0c55485369d922758a92ab0c6cbd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Nov 2017 13:04:16 +0100 Subject: [PATCH 165/764] Fix download for firmware upgrade notification Same issue as the download for Cura version upgrade in CURA-4464. --- .../FirmwareUpdateChecker.py | 18 ++++++++++++++++- .../FirmwareUpdateCheckerJob.py | 20 ++++++------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py index 5ee3493549..458aca5787 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateChecker.py @@ -1,6 +1,9 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from PyQt5.QtCore import QUrl +from PyQt5.QtGui import QDesktopServices + from UM.Extension import Extension from UM.Preferences import Preferences from UM.Logger import Logger @@ -32,6 +35,17 @@ class FirmwareUpdateChecker(Extension): if Preferences.getInstance().getValue("info/automatic_update_check"): ContainerRegistry.getInstance().containerAdded.connect(self._onContainerAdded) + self._download_url = None + + ## Callback for the message that is spawned when there is a new version. + def _onActionTriggered(self, message, action): + if action == "download": + if self._download_url is not None: + QDesktopServices.openUrl(QUrl(self._download_url)) + + def _onSetDownloadUrl(self, download_url): + self._download_url = download_url + def _onContainerAdded(self, container): # Only take care when a new GlobalStack was added if isinstance(container, GlobalStack): @@ -45,5 +59,7 @@ class FirmwareUpdateChecker(Extension): # \param silent type(boolean) Suppresses messages other than "new version found" messages. # This is used when checking for a new firmware version at startup. def checkFirmwareVersion(self, container = None, silent = False): - job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.JEDI_VERSION_URL) + job = FirmwareUpdateCheckerJob(container = container, silent = silent, url = self.JEDI_VERSION_URL, + callback = self._onActionTriggered, + set_download_url_callback = self._onSetDownloadUrl) job.start() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 8f299761fc..5b8391463e 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -10,30 +10,21 @@ from UM.Job import Job import urllib.request import codecs -from PyQt5.QtCore import QUrl -from PyQt5.QtGui import QDesktopServices - from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") ## This job checks if there is an update available on the provided URL. class FirmwareUpdateCheckerJob(Job): - def __init__(self, container = None, silent = False, url = None): + def __init__(self, container = None, silent = False, url = None, callback = None, set_download_url_callback = None): super().__init__() self._container = container self.silent = silent self._url = url - self._download_url = None # If an update was found, the download_url will be set to the location of the new version. - - ## Callback for the message that is spawned when there is a new version. - def actionTriggered(self, message, action): - if action == "download": - if self._download_url is not None: - QDesktopServices.openUrl(QUrl(self._download_url)) + self._callback = callback + self._set_download_url_callback = set_download_url_callback def run(self): - self._download_url = None # Reset download ur. if not self._url: Logger.log("e", "Can not check for a new release. URL not set!") return @@ -75,8 +66,9 @@ class FirmwareUpdateCheckerJob(Job): message.addAction("download", i18n_catalog.i18nc("@action:button", "Download"), "[no_icon]", "[no_description]") # If we do this in a cool way, the download url should be available in the JSON file - self._download_url = "https://ultimaker.com/en/resources/20500-upgrade-firmware" - message.actionTriggered.connect(self.actionTriggered) + if self._set_download_url_callback: + self._set_download_url_callback("https://ultimaker.com/en/resources/20500-upgrade-firmware") + message.actionTriggered.connect(self._callback) message.show() except Exception as e: From 38670171f5063a0aa525117955da39135bca2a20 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 7 Nov 2017 14:52:22 +0100 Subject: [PATCH 166/764] CURA-4525 party working objects list and build plates --- cura/CuraActions.py | 5 - cura/CuraApplication.py | 17 ++- cura/ObjectManager.py | 68 ++++++++++ cura/Scene/BuildPlateDecorator.py | 17 --- plugins/SolidView/SolidView.py | 2 +- resources/qml/ObjectsList.qml | 201 +++++++++++++++++++++++++----- 6 files changed, 252 insertions(+), 58 deletions(-) create mode 100644 cura/ObjectManager.py diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 663da3ec09..c313488cac 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -156,13 +156,8 @@ class CuraActions(QObject): if not nodes_to_change: Logger.log("d", "Nothing to change.") - # If there are no changes to make, we still need to reset the selected extruders. - # This is a workaround for checked menu items being deselected while still being - # selected. - #ExtruderManager.getInstance().resetSelectedObjectExtruders() return - Logger.log("d", "Yes: %s", nodes_to_change) for node in nodes_to_change: operation.addOperation(SetBuildPlateNumberOperation(node, build_plate_nr)) operation.push() diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5111b9b52a..7a6994e83e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -79,6 +79,8 @@ from cura.Settings.ContainerManager import ContainerManager from cura.Settings.GlobalStack import GlobalStack from cura.Settings.ExtruderStack import ExtruderStack +from cura.ObjectManager import ObjectManager + from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from UM.FlameProfiler import pyqtSlot from PyQt5.QtGui import QColor, QIcon @@ -205,6 +207,7 @@ class CuraApplication(QtApplication): self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. self._material_manager = None + self._object_manager = None self._setting_inheritance_manager = None self._simple_mode_settings_manager = None @@ -292,8 +295,6 @@ class CuraApplication(QtApplication): preferences.addPreference("metadata/setting_version", 0) preferences.setValue("metadata/setting_version", self.SettingVersion) #Don't make it equal to the default so that the setting version always gets written to the file. - preferences.addPreference("view/build_plate_number", 0) - preferences.addPreference("cura/active_mode", "simple") preferences.addPreference("cura/categories_expanded", "") @@ -384,7 +385,7 @@ class CuraApplication(QtApplication): # research self._num_build_plates = 1 # default - self._active_build_plate = 1 + self._active_build_plate = 0 def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -717,6 +718,9 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) + Logger.log("d", " #### going to register object manager") + qmlRegisterSingletonType(ObjectManager, "Cura", 1, 2, "ObjectManager", self.getObjectManager) + qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) @@ -744,6 +748,11 @@ class CuraApplication(QtApplication): self._material_manager = MaterialManager.createMaterialManager() return self._material_manager + def getObjectManager(self, *args): + if self._object_manager is None: + self._object_manager = ObjectManager.createObjectManager() + return self._object_manager + def getSettingInheritanceManager(self, *args): if self._setting_inheritance_manager is None: self._setting_inheritance_manager = SettingInheritanceManager.createSettingInheritanceManager() @@ -799,6 +808,7 @@ class CuraApplication(QtApplication): qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") + # qmlRegisterSingletonType(ObjectManager, "Cura", 1, 0, "ObjectManager", ObjectManager.createObjectManager) qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) @@ -1464,7 +1474,6 @@ class CuraApplication(QtApplication): def setActiveBuildPlate(self, nr): Logger.log("d", "Select build plate: %s" % nr) self._active_build_plate = nr - Preferences.setValue("view/build_plate_number", self._active_build_plate) self.activeBuildPlateChanged.emit() diff --git a/cura/ObjectManager.py b/cura/ObjectManager.py new file mode 100644 index 0000000000..fc6d343252 --- /dev/null +++ b/cura/ObjectManager.py @@ -0,0 +1,68 @@ +from UM.Logger import Logger +from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot +from UM.Application import Application +from UM.Qt.ListModel import ListModel +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QApplication + + +class ObjectManager(ListModel): + def __init__(self): + super().__init__() + self._last_selected_index = 0 + Application.getInstance().getController().getScene().sceneChanged.connect(self._update) + + def _update(self, *args): + nodes = [] + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("getLayerData")): + continue + nodes.append({ + "name": node.getName(), + "isSelected": Selection.isSelected(node), + "buildPlateNumber": node.callDecoration("getBuildPlateNumber"), + "node": node + }) + nodes = sorted(nodes, key=lambda n: n["name"]) + self.setItems(nodes) + + self.itemsChanged.emit() + + ## Either select or deselect an item + @pyqtSlot(int) + def changeSelection(self, index): + modifiers = QApplication.keyboardModifiers() + ctrl_is_active = modifiers & Qt.ControlModifier + shift_is_active = modifiers & Qt.ShiftModifier + + if ctrl_is_active: + item = self.getItem(index) + node = item["node"] + if Selection.isSelected(node): + Selection.remove(node) + else: + Selection.add(node) + elif shift_is_active: + polarity = 1 if index + 1 > self._last_selected_index else -1 + for i in range(self._last_selected_index, index + polarity, polarity): + item = self.getItem(i) + node = item["node"] + Selection.add(node) + else: + # Single select + item = self.getItem(index) + node = item["node"] + Selection.clear() + Selection.add(node) + build_plate_number = node.callDecoration("getBuildPlateNumber") + if build_plate_number is not None and build_plate_number != -1: + Application.getInstance().setActiveBuildPlate(build_plate_number) + + self._last_selected_index = index + + @staticmethod + def createObjectManager(): + return ObjectManager() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 8d91f9e90a..2125d731de 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -9,26 +9,9 @@ class BuildPlateDecorator(SceneNodeDecorator): def setBuildPlateNumber(self, nr): self._build_plate_number = nr - # self.getNode().childrenChanged.connect(self._onChildrenChanged) def getBuildPlateNumber(self): return self._build_plate_number - # def setNode(self, node): - # super().setNode(node) - # self.getNode().childrenChanged.connect(self._onChildrenChanged) - - # def _onChildrenChanged(self, node): - # if not self.getNode().hasChildren(): - # # A group that no longer has children may remove itself from the scene - # self._old_parent = self.getNode().getParent() - # self.getNode().setParent(None) - # Selection.remove(self.getNode()) - # else: - # # A group that has removed itself from the scene because it had no children may add itself back to the scene when a child is added to it - # if not self.getNode().getParent() and self._old_parent: - # self.getNode().setParent(self._old_parent) - # self._old_parent = None - def __deepcopy__(self, memo): return BuildPlateDecorator() diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 625223a097..d37fbb7c9d 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -71,7 +71,7 @@ class SolidView(View): else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - activeBuildPlateNumber = Preferences.getInstance().getValue("view/build_plate_number") or 0 + activeBuildPlateNumber = Application.getInstance().activeBuildPlate for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 105bdb957b..758fa59488 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -8,7 +8,7 @@ import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.1 import UM 1.3 as UM -import Cura 1.0 as Cura +import Cura 1.2 as Cura import "Menus" @@ -21,6 +21,8 @@ Rectangle width: UM.Theme.getSize("objects_menu_size").width height: UM.Theme.getSize("objects_menu_size").height + SystemPalette { id: palette } + Button { id: openFileButton; @@ -38,51 +40,188 @@ Rectangle action: Cura.Actions.open; } - ListModel - { - id: objectsListModel; - - ListElement { - name: "Apple" - cost: 2.45 - } - ListElement { - name: "Orange" - cost: 3.25 - } - ListElement { - name: "Banana" - cost: 1.95 - } - } - Component { id: objectDelegate - Rectangle { - height: 30 + Rectangle + { + height: childrenRect.height + color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlight : index % 2 ? palette.base : palette.alternateBase + width: parent.width + Label + { + id: nodeNameLabel + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + //anchors.right: parent.right + width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 + text: Cura.ObjectManager.getItem(index).name; + color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text + elide: Text.ElideRight + } - Text { - text: name - color: red + Label + { + id: buildPlateNumberLabel + width: 20 + anchors.left: nodeNameLabel.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + text: Cura.ObjectManager.getItem(index).buildPlateNumber; + color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text + elide: Text.ElideRight + } + + MouseArea + { + anchors.fill: parent; + onClicked: + { + Cura.ObjectManager.changeSelection(index); + } + } } - //Text { text: '$' + cost } - } } - ListView + // list all the scene nodes + ScrollView { - model: objectsListModel; + id: objectsList + frameVisible: true + width: parent.width - 2 * UM.Theme.getSize("default_margin").height + anchors { top: openFileButton.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; + bottom: buildPlateSelection.top; + bottomMargin: UM.Theme.getSize("default_margin").height; } - width: parent.width - 2 * UM.Theme.getSize("default_margin").height - height: 100 - delegate: objectDelegate + Rectangle + { + parent: viewport + anchors.fill: parent + color: palette.light + } + + ListView + { + id: listview + model: Cura.ObjectManager + //model: objectsListModel + + onModelChanged: + { + //currentIndex = -1; + } + width: parent.width + currentIndex: -1 + onCurrentIndexChanged: + { + //base.selectedPrinter = listview.model[currentIndex]; + // Only allow connecting if the printer has responded to API query since the last refresh + //base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; + } + //Component.onCompleted: manager.startDiscovery() + delegate: objectDelegate + } + } + + ListModel + { + id: buildPlatesModel + + ListElement + { + name: "build plate 0" + buildPlateNumber: 0 + } + ListElement + { + name: "build plate 1" + buildPlateNumber: 1 + } + ListElement + { + name: "build plate 2" + buildPlateNumber: 2 + } + } + + Component { + id: buildPlateDelegate + Rectangle + { + height: childrenRect.height + color: CuraApplication.activeBuildPlate == buildPlateNumber ? palette.highlight : index % 2 ? palette.base : palette.alternateBase + width: parent.width + Label + { + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + text: name //Cura.ObjectManager.getItem(index).name; + color: CuraApplication.activeBuildPlate == buildPlateNumber ? palette.highlightedText : palette.text + elide: Text.ElideRight + } + + MouseArea + { + anchors.fill: parent; + onClicked: + { + CuraApplication.setActiveBuildPlate(buildPlateNumber); + } + } + } + } + + ScrollView + { + id: buildPlateSelection + frameVisible: true + height: 100 + width: parent.width - 2 * UM.Theme.getSize("default_margin").height + + anchors + { + // top: objectsList.bottom; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + bottom: parent.bottom; + bottomMargin: UM.Theme.getSize("default_margin").height; + } + + Rectangle + { + parent: viewport + anchors.fill: parent + color: palette.light + } + + ListView + { + id: buildPlateListView + model: buildPlatesModel + + onModelChanged: + { + //currentIndex = -1; + } + width: parent.width + currentIndex: -1 + onCurrentIndexChanged: + { + //base.selectedPrinter = listview.model[currentIndex]; + // Only allow connecting if the printer has responded to API query since the last refresh + //base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; + } + //Component.onCompleted: manager.startDiscovery() + delegate: buildPlateDelegate + } } } From 873862efd798414c0eb7690d56af47024c4dbc02 Mon Sep 17 00:00:00 2001 From: Brecht Nuyttens Date: Tue, 7 Nov 2017 16:54:18 +0100 Subject: [PATCH 167/764] Fixed Vertex Delta Definition --- resources/definitions/vertex_delta_k8800.def.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index b832620942..ddfa54f4c8 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -10,6 +10,9 @@ "author": "Velleman" }, "overrides": { + "material_diameter": { + "default_value": 1.75, + }, "machine_width": { "default_value": 200 }, @@ -40,7 +43,7 @@ "machine_head_shape_max_y": { "default_value": 0 }, - "machine_nozzle_gantry_distance": { + "gantry_height": { "default_value": 0 }, "machine_nozzle_offset_x_1": { From b7172ad9e36a9109592d8d8641f7c39de088c207 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 7 Nov 2017 17:43:27 +0100 Subject: [PATCH 168/764] Add return values to some functions that cause some crashes --- plugins/LayerView/LayerViewProxy.py | 39 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py index 4cf84117da..4cbff65040 100644 --- a/plugins/LayerView/LayerViewProxy.py +++ b/plugins/LayerView/LayerViewProxy.py @@ -23,64 +23,67 @@ class LayerViewProxy(QObject): @pyqtProperty(bool, notify=activityChanged) def layerActivity(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getActivity() + return False @pyqtProperty(int, notify=maxLayersChanged) def numLayers(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getMaxLayers() + return 0 @pyqtProperty(int, notify=currentLayerChanged) def currentLayer(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getCurrentLayer() + return 0 @pyqtProperty(int, notify=currentLayerChanged) def minimumLayer(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getMinimumLayer() + return 0 @pyqtProperty(bool, notify=busyChanged) def busy(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.isBusy() - return False @pyqtProperty(bool, notify=preferencesChanged) def compatibilityMode(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getCompatibilityMode() return False @pyqtSlot(int) def setCurrentLayer(self, layer_num): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setLayer(layer_num) @pyqtSlot(int) def setMinimumLayer(self, layer_num): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setMinimumLayer(layer_num) @pyqtSlot(int) def setLayerViewType(self, layer_view_type): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setLayerViewType(layer_view_type) @pyqtSlot(result=int) def getLayerViewType(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getLayerViewType() return 0 @@ -88,37 +91,37 @@ class LayerViewProxy(QObject): @pyqtSlot(int, float) def setExtruderOpacity(self, extruder_nr, opacity): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setExtruderOpacity(extruder_nr, opacity) @pyqtSlot(int) def setShowTravelMoves(self, show): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setShowTravelMoves(show) @pyqtSlot(int) def setShowHelpers(self, show): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setShowHelpers(show) @pyqtSlot(int) def setShowSkin(self, show): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setShowSkin(show) @pyqtSlot(int) def setShowInfill(self, show): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.setShowInfill(show) @pyqtProperty(int, notify=globalStackChanged) def extruderCount(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): return active_view.getExtruderCount() return 0 @@ -143,7 +146,7 @@ class LayerViewProxy(QObject): def _onActiveViewChanged(self): active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: + if isinstance(active_view, LayerView.LayerView.LayerView): active_view.currentLayerNumChanged.connect(self._onLayerChanged) active_view.maxLayersChanged.connect(self._onMaxLayersChanged) active_view.busyChanged.connect(self._onBusyChanged) From 303cf33de1f424e47082b00f6394a7464e6d092e Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 8 Nov 2017 10:23:19 +0100 Subject: [PATCH 169/764] Made the message more clear --- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 5b8391463e..6dd7338cfd 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -61,9 +61,9 @@ class FirmwareUpdateCheckerJob(Job): # notify the user when no new firmware version is available. if (checked_version != "") and (checked_version != current_version): Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE") - message = Message(i18n_catalog.i18nc("@info Don't translate {machine_name}, since it gets replaced by a printer name!", "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB.").format(machine_name = machine_name), + message = Message(i18n_catalog.i18nc("@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format(machine_name = machine_name), title = i18n_catalog.i18nc("@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) - message.addAction("download", i18n_catalog.i18nc("@action:button", "Download"), "[no_icon]", "[no_description]") + message.addAction("download", i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]") # If we do this in a cool way, the download url should be available in the JSON file if self._set_download_url_callback: From 41d5ec86a305d4fc0d5f85e159631d4936032b93 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 8 Nov 2017 14:07:40 +0100 Subject: [PATCH 170/764] CURA-4525 updated scene node menu and added multi buildplate arrange --- cura/Arrange.py | 20 ++- cura/ArrangeObjectsAllBuildPlatesJob.py | 159 ++++++++++++++++++++++++ cura/CuraActions.py | 23 ++-- cura/CuraApplication.py | 28 ++++- cura/MultiplyObjectsJob.py | 5 + cura/Scene/BuildPlateDecorator.py | 12 +- resources/qml/Actions.qml | 9 ++ resources/qml/ObjectsList.qml | 58 ++++++--- resources/themes/cura-light/theme.json | 2 +- 9 files changed, 272 insertions(+), 44 deletions(-) create mode 100644 cura/ArrangeObjectsAllBuildPlatesJob.py diff --git a/cura/Arrange.py b/cura/Arrange.py index 0d1f2e0c06..305729d763 100755 --- a/cura/Arrange.py +++ b/cura/Arrange.py @@ -30,6 +30,7 @@ class Arrange: self._offset_x = offset_x self._offset_y = offset_y self._last_priority = 0 + self._is_empty = True ## Helper to create an Arranger instance # @@ -38,8 +39,8 @@ class Arrange: # \param scene_root Root for finding all scene nodes # \param fixed_nodes Scene nodes to be placed @classmethod - def create(cls, scene_root = None, fixed_nodes = None, scale = 0.5): - arranger = Arrange(220, 220, 110, 110, scale = scale) + def create(cls, scene_root = None, fixed_nodes = None, scale = 0.5, x = 220, y = 220): + arranger = Arrange(x, y, x / 2, y / 2, scale = scale) arranger.centerFirst() if fixed_nodes is None: @@ -62,7 +63,7 @@ class Arrange: for area in disallowed_areas: points = copy.deepcopy(area._points) shape_arr = ShapeArray.fromPolygon(points, scale = scale) - arranger.place(0, 0, shape_arr) + arranger.place(0, 0, shape_arr, update_empty = False) return arranger ## Find placement for a node (using offset shape) and place it (using hull shape) @@ -166,7 +167,7 @@ class Arrange: # \param x x-coordinate # \param y y-coordinate # \param shape_arr ShapeArray object - def place(self, x, y, shape_arr): + def place(self, x, y, shape_arr, update_empty = True): x = int(self._scale * x) y = int(self._scale * y) offset_x = x + self._offset_x + shape_arr.offset_x @@ -179,10 +180,17 @@ class Arrange: max_y = min(max(offset_y + shape_arr.arr.shape[0], 0), shape_y - 1) occupied_slice = self._occupied[min_y:max_y, min_x:max_x] # we use a slice of shape because it can be out of bounds - occupied_slice[numpy.where(shape_arr.arr[ - min_y - offset_y:max_y - offset_y, min_x - offset_x:max_x - offset_x] == 1)] = 1 + new_occupied = numpy.where(shape_arr.arr[ + min_y - offset_y:max_y - offset_y, min_x - offset_x:max_x - offset_x] == 1) + if update_empty and new_occupied: + self._is_empty = False + occupied_slice[new_occupied] = 1 # Set priority to low (= high number), so it won't get picked at trying out. prio_slice = self._priority[min_y:max_y, min_x:max_x] prio_slice[numpy.where(shape_arr.arr[ min_y - offset_y:max_y - offset_y, min_x - offset_x:max_x - offset_x] == 1)] = 999 + + @property + def isEmpty(self): + return self._is_empty diff --git a/cura/ArrangeObjectsAllBuildPlatesJob.py b/cura/ArrangeObjectsAllBuildPlatesJob.py new file mode 100644 index 0000000000..eacd18d5ad --- /dev/null +++ b/cura/ArrangeObjectsAllBuildPlatesJob.py @@ -0,0 +1,159 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Job import Job +from UM.Scene.SceneNode import SceneNode +from UM.Math.Vector import Vector +from UM.Operations.SetTransformOperation import SetTransformOperation +from UM.Operations.TranslateOperation import TranslateOperation +from UM.Operations.GroupedOperation import GroupedOperation +from UM.Logger import Logger +from UM.Message import Message +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + +from cura.ZOffsetDecorator import ZOffsetDecorator +from cura.Arrange import Arrange +from cura.ShapeArray import ShapeArray + +from typing import List + + +class ArrangeArray: + def __init__(self, x, y, fixed_nodes): + self._x = x + self._y = y + self._fixed_nodes = fixed_nodes + self._count = 0 + self._first_empty = None + self._has_empty = False + self._arrange = [] + + def _update_first_empty(self): + for i, a in enumerate(self._arrange): + if a.isEmpty: + self._first_empty = i + self._has_empty = True + + Logger.log("d", "lala %s %s", self._first_empty, self._has_empty) + return + self._first_empty = None + self._has_empty = False + + def add(self): + new_arrange = Arrange.create(x = self._x, y = self._y, fixed_nodes = self._fixed_nodes) + self._arrange.append(new_arrange) + self._count += 1 + self._update_first_empty() + + def count(self): + return self._count + + def get(self, index): + return self._arrange[index] + + def getFirstEmpty(self): + if not self._is_empty: + self.add() + return self._arrange[self._first_empty] + + +class ArrangeObjectsAllBuildPlatesJob(Job): + def __init__(self, nodes: List[SceneNode], min_offset = 8): + super().__init__() + self._nodes = nodes + self._min_offset = min_offset + + def run(self): + status_message = Message(i18n_catalog.i18nc("@info:status", "Finding new location for objects"), + lifetime = 0, + dismissable=False, + progress = 0, + title = i18n_catalog.i18nc("@info:title", "Finding Location")) + status_message.show() + + + # Collect nodes to be placed + nodes_arr = [] # fill with (size, node, offset_shape_arr, hull_shape_arr) + for node in self._nodes: + offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = self._min_offset) + nodes_arr.append((offset_shape_arr.arr.shape[0] * offset_shape_arr.arr.shape[1], node, offset_shape_arr, hull_shape_arr)) + + # Sort the nodes with the biggest area first. + nodes_arr.sort(key=lambda item: item[0]) + nodes_arr.reverse() + + x, y = 200, 200 + + arrange_array = ArrangeArray(x = x, y = y, fixed_nodes = []) + arrange_array.add() + + # Place nodes one at a time + start_priority = 0 + grouped_operation = GroupedOperation() + found_solution_for_all = True + left_over_nodes = [] # nodes that do not fit on an empty build plate + + for idx, (size, node, offset_shape_arr, hull_shape_arr) in enumerate(nodes_arr): + # For performance reasons, we assume that when a location does not fit, + # it will also not fit for the next object (while what can be untrue). + # We also skip possibilities by slicing through the possibilities (step = 10) + + try_placement = True + + current_build_plate_number = 0 # always start with the first one + + # # Only for first build plate + # if last_size == size and last_build_plate_number == current_build_plate_number: + # # This optimization works if many of the objects have the same size + # # Continue with same build plate number + # start_priority = last_priority + # else: + # start_priority = 0 + + while try_placement: + Logger.log("d", "start_priority %s", start_priority) + # make sure that current_build_plate_number is not going crazy or you'll have a lot of arrange objects + while current_build_plate_number >= arrange_array.count(): + arrange_array.add() + arranger = arrange_array.get(current_build_plate_number) + + best_spot = arranger.bestSpot(offset_shape_arr, start_prio=start_priority, step=10) + x, y = best_spot.x, best_spot.y + node.removeDecorator(ZOffsetDecorator) + if node.getBoundingBox(): + center_y = node.getWorldPosition().y - node.getBoundingBox().bottom + else: + center_y = 0 + if x is not None: # We could find a place + arranger.place(x, y, hull_shape_arr) # place the object in the arranger + + node.callDecoration("setBuildPlateNumber", current_build_plate_number) + grouped_operation.addOperation(TranslateOperation(node, Vector(x, center_y, y), set_position = True)) + try_placement = False + else: + # very naive, because we skip to the next build plate if one model doesn't fit. + if arranger.isEmpty: + # apparently we can never place this object + left_over_nodes.append(node) + try_placement = False + else: + # try next build plate + current_build_plate_number += 1 + try_placement = True + + status_message.setProgress((idx + 1) / len(nodes_arr) * 100) + Job.yieldThread() + + for node in left_over_nodes: + node.callDecoration("setBuildPlateNumber", -1) # these are not on any build plate + found_solution_for_all = False + + grouped_operation.push() + + status_message.hide() + + if not found_solution_for_all: + no_full_solution_message = Message(i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"), + title = i18n_catalog.i18nc("@info:title", "Can't Find Location")) + no_full_solution_message.show() diff --git a/cura/CuraActions.py b/cura/CuraActions.py index c313488cac..dbcd31f646 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -134,25 +134,16 @@ class CuraActions(QObject): Logger.log("d", "Setting build plate number... %d" % build_plate_nr) operation = GroupedOperation() + root = Application.getInstance().getController().getScene().getRoot() + nodes_to_change = [] for node in Selection.getAllSelectedObjects(): - # Do not change any nodes that already have the right extruder set. - if node.callDecoration("getBuildPlateNumber") == build_plate_nr: - continue + parent_node = node # Find the parent node to change instead + while parent_node.getParent() != root: + parent_node = parent_node.getParent() - # If the node is a group, apply the active extruder to all children of the group. - if node.callDecoration("isGroup"): - for grouped_node in BreadthFirstIterator(node): - if grouped_node.callDecoration("getBuildPlateNumber") == build_plate_nr: - continue - - if grouped_node.callDecoration("isGroup"): - continue - - nodes_to_change.append(grouped_node) - continue - - nodes_to_change.append(node) + for single_node in BreadthFirstIterator(parent_node): + nodes_to_change.append(single_node) if not nodes_to_change: Logger.log("d", "Nothing to change.") diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7a6994e83e..39e4b38824 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -39,8 +39,11 @@ from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator +# research +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.ArrangeObjectsJob import ArrangeObjectsJob +from cura.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob from cura.MultiplyObjectsJob import MultiplyObjectsJob from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType @@ -54,8 +57,6 @@ from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager -# research -from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from . import PlatformPhysics from . import BuildVolume @@ -1105,7 +1106,7 @@ class CuraApplication(QtApplication): ## Arrange all objects. @pyqtSlot() - def arrangeAll(self): + def arrangeObjectsToAllBuildPlates(self): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: @@ -1119,6 +1120,26 @@ class CuraApplication(QtApplication): # Skip nodes that are too big if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: nodes.append(node) + job = ArrangeObjectsAllBuildPlatesJob(nodes) + job.start() + + # Single build plate + @pyqtSlot() + def arrangeAll(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if type(node) is not SceneNode: + continue + if not node.getMeshData() and not node.callDecoration("isGroup"): + continue # Node that doesnt have a mesh and is not a group. + if node.getParent() and node.getParent().callDecoration("isGroup"): + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) + if not node.isSelectable(): + continue # i.e. node with layer data + if node.callDecoration("getBuildPlateNumber") == self._active_build_plate: + # Skip nodes that are too big + if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: + nodes.append(node) self.arrange(nodes, fixed_nodes = []) ## Arrange Selection @@ -1250,6 +1271,7 @@ class CuraApplication(QtApplication): group_decorator = GroupDecorator() group_node.addDecorator(group_decorator) group_node.addDecorator(ConvexHullDecorator()) + group_node.addDecorator(BuildPlateDecorator(self.activeBuildPlate)) group_node.setParent(self.getController().getScene().getRoot()) group_node.setSelectable(True) center = Selection.getSelectionCenter() diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 721c0e4c07..63a38993a2 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -13,6 +13,7 @@ from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") from cura.ZOffsetDecorator import ZOffsetDecorator +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Arrange import Arrange from cura.ShapeArray import ShapeArray @@ -65,6 +66,10 @@ class MultiplyObjectsJob(Job): new_location = new_location.set(z = 100 - i * 20) node.setPosition(new_location) + # Same build plate + build_plate_number = current_node.callDecoration("getBuildPlateNumber") + node.callDecoration("setBuildPlateNumber", build_plate_number) + nodes.append(node) current_progress += 1 status_message.setProgress((current_progress / total_progress) * 100) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 2125d731de..b0a14e41f4 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -1,14 +1,20 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator -from UM.Scene.Selection import Selection +from UM.Application import Application +from UM.Logger import Logger class BuildPlateDecorator(SceneNodeDecorator): - def __init__(self): + def __init__(self, build_plate_number = -1): super().__init__() - self._build_plate_number = -1 + self.setBuildPlateNumber(build_plate_number) def setBuildPlateNumber(self, nr): + # Make sure that groups are set correctly + # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr + if self._node and self._node.callDecoration("isGroup"): + for child in self._node.getChildren(): + child.callDecoration("setBuildPlateNumber", nr) def getBuildPlateNumber(self): return self._build_plate_number diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index cc27520a02..89ec2cf70d 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -35,6 +35,7 @@ Item property alias selectAll: selectAllAction; property alias deleteAll: deleteAllAction; property alias reloadAll: reloadAllAction; + property alias arrangeAllBuildPlates: arrangeAllBuildPlatesAction; property alias arrangeAll: arrangeAllAction; property alias arrangeSelection: arrangeSelectionAction; property alias resetAllTranslation: resetAllTranslationAction; @@ -300,6 +301,14 @@ Item onTriggered: CuraApplication.reloadAll(); } + Action + { + id: arrangeAllBuildPlatesAction; + text: ""; + iconName: "document-open"; + onTriggered: CuraApplication.arrangeObjectsToAllBuildPlates(); + } + Action { id: arrangeAllAction; diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 758fa59488..4a7c84c41e 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -110,21 +110,7 @@ Rectangle { id: listview model: Cura.ObjectManager - //model: objectsListModel - - onModelChanged: - { - //currentIndex = -1; - } width: parent.width - currentIndex: -1 - onCurrentIndexChanged: - { - //base.selectedPrinter = listview.model[currentIndex]; - // Only allow connecting if the printer has responded to API query since the last refresh - //base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; - } - //Component.onCompleted: manager.startDiscovery() delegate: objectDelegate } } @@ -191,7 +177,7 @@ Rectangle topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; - bottom: parent.bottom; + bottom: arrangeAllBuildPlatesButton.top; bottomMargin: UM.Theme.getSize("default_margin").height; } @@ -224,4 +210,46 @@ Rectangle } } + Button + { + id: arrangeAllBuildPlatesButton; + text: catalog.i18nc("@action:button","Arrange to all build plates"); + //iconSource: UM.Theme.getIcon("load") + //style: UM.Theme.styles.tool_button + height: 25 + tooltip: ''; + anchors + { + //top: buildPlateSelection.bottom; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + right: parent.right; + rightMargin: UM.Theme.getSize("default_margin").height; + bottom: arrangeBuildPlateButton.top; + bottomMargin: UM.Theme.getSize("default_margin").height; + } + action: Cura.Actions.arrangeAllBuildPlates; + } + + Button + { + id: arrangeBuildPlateButton; + text: catalog.i18nc("@action:button","Arrange current build plate"); + height: 25 + tooltip: ''; + anchors + { + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + right: parent.right; + rightMargin: UM.Theme.getSize("default_margin").height; + bottom: parent.bottom; + bottomMargin: UM.Theme.getSize("default_margin").height; + } + action: Cura.Actions.arrangeAll; + } + + } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 315b29bec0..e78cd27cee 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -376,6 +376,6 @@ "jobspecs_line": [2.0, 2.0], - "objects_menu_size": [20, 30] + "objects_menu_size": [20, 40] } } From 06045f036e06fdb05ad38fd00a14e09a8715535f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 8 Nov 2017 15:27:50 +0100 Subject: [PATCH 171/764] Added previewPass --- cura/PreviewPass.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 cura/PreviewPass.py diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py new file mode 100644 index 0000000000..fd87754ae3 --- /dev/null +++ b/cura/PreviewPass.py @@ -0,0 +1,28 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Uranium is released under the terms of the LGPLv3 or higher. + +from UM.Application import Application +from UM.View.RenderPass import RenderPass +from UM.Scene.Camera import Camera + +## A render pass subclass that renders everything with default parameters, but can be used with a non-default camera +# +# This is useful to get a preview image of a scene taken from a different location as the active camera. +class PreviewPass(RenderPass): + def __init__(self, width, height): + super().__init__("preview", width, height, 0) + + self._camera = Application.getInstance().getController().getScene().getActiveCamera() + self._renderer = Application.getInstance().getRenderer() + + # Override the camera to be used for this render pass + def setCamera(self, camera: Camera): + self._camera = camera + + def render(self): + self.bind() + + for batch in self._renderer.getBatches(): + batch.render(self._camera) + + self.release() From d8d738be254831443cbc8a9ebeb1b0fba4a13a84 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Wed, 8 Nov 2017 17:02:49 +0100 Subject: [PATCH 172/764] Change_Color_UI_elements_CURA-4548 --- resources/themes/cura-light/theme.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index b41ea96846..50ee600e4e 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -78,13 +78,13 @@ "text_pressed": [12, 169, 227, 255], "text_subtext": [0, 0, 0, 255], "text_emphasis": [255, 255, 255, 255], - "text_scene": [24, 41, 77, 255], + "text_scene": [31, 36, 39, 255], "text_scene_hover": [70, 84, 113, 255], "error": [255, 140, 0, 255], "sidebar_header_bar": [31, 36, 39, 255], - "sidebar_header_active": [68, 72, 75, 255], - "sidebar_header_hover": [68, 72, 75, 255], + "sidebar_header_active": [31, 36, 39, 255], + "sidebar_header_hover": [31, 36, 39, 255], "sidebar_header_highlight": [68, 192, 255, 255], "sidebar_header_highlight_hover": [68, 192, 255, 255], "sidebar_header_text_inactive": [255, 255, 255, 255], @@ -176,7 +176,7 @@ "material_compatibility_warning": [0, 0, 0, 255], "progressbar_background": [245, 245, 245, 255], - "progressbar_control": [24, 41, 77, 255], + "progressbar_control": [31, 36, 39, 255], "slider_groove": [245, 245, 245, 255], "slider_groove_border": [127, 127, 127, 255], From fdcce1780e0dee817cc766f9f01746d078fc7925 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 8 Nov 2017 19:24:09 +0100 Subject: [PATCH 173/764] Also check if base.selectedPrinter is null --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index eb1bf786b0..65d33369aa 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -276,12 +276,12 @@ Cura.MachineAction width: parent.width wrapMode: Text.WordWrap text:{ - if (base.selectedPrinter == undefined) + if (base.selectedPrinter == undefined || base.selectedPrinter == null) { return ""; } // The property cluster size does not exist for older UM3 devices. - if(base.selectedPrinter != undefined && base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1) + if(base.selectedPrinter != undefined && (base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)) { return ""; } From 4a4772a3dad9b0b0678e578de53bec01c6649674 Mon Sep 17 00:00:00 2001 From: nickthetait Date: Wed, 8 Nov 2017 17:16:25 -0700 Subject: [PATCH 174/764] Merge an old changelog into the currently used file --- CHANGES | 173 ------------------------- plugins/ChangeLogPlugin/ChangeLog.txt | 175 ++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 173 deletions(-) delete mode 100644 CHANGES diff --git a/CHANGES b/CHANGES deleted file mode 100644 index bd9c26751c..0000000000 --- a/CHANGES +++ /dev/null @@ -1,173 +0,0 @@ -Cura 15.06 Beta -=============== - -This is the *Beta* version of Cura 15.06. - -Cura 15.06 is a new release built from the ground up on a completely new -framework called Uranium. This framework has been designed to make it easier to -extend Cura with additional functionality as well as provide a cleaner UI. - -Changes since 15.05.95 ----------------------- - -* Fixed: Selection ghost remains visible after deleting an object -* Fixed: Window does not show up immediately after starting application on OSX -* Fixed: Added display of rotation angle during rotation -* Fixed: Object changes position while rotating/scaling -* Fixed: Loading improvements in the layer view -* Fixed: Added application icons -* Fixed: Improved feedback when loading models -* Fixed: Eject device on MacOSX now provides proper feedback -* Fixed: Make it possible to show retraction settings for UM2 -* Fixed: Opening the machine preferences page will switch to the first available machine -* Fixed: Improved tool handle hit area size -* Fixed: Render lines with a thickness based on screen DPI - -Changes since 15.05.94 ----------------------- - -* Added Russian translations -* Fixed: Infill not displayed in layer view -* Fixed: Cannot select/scale/rotate when first activating the tool and then trying to select a model. -* Fixed: Improved font rendering on Windows -* Fixed: Help > Show Documentation crashes Cura on Windows -* Fixed: "There is no disk in the drive" repeating messages on Windows -* Fixed: Retraction settings not visible for Ultimaker2 -* Fixed: Display rotation angle when rotating an object -* Fixed: Time/Quality slider values are properly rounded -* Fixed: Improved clarity of buttons and text -* Fixed: No indication that anything is happening when loading a model -* Fixed: Eject device now works on Windows - -Changes since 15.05.93 ----------------------- - -* Fixed: No shortcuts for moving up/down layers in layer view. -* Fixed: Last view layers could not be scrolled through in layer view. -* Fixed: Files provided on command line would not actually show up on the build - platform. -* Fixed: Render a ghost of the selection in Layer view to make the actual object - position clear. -* Fixed: Showing a menu would clear the selection. -* Fixed: Size and scaling factor display for scale tool. -* Fixed: Missing background for additional tool controls. -* Fixed: Loading message times out when loading large files. -* Fixed: Show recent files in the file menu. -* Fixed: Windows installer will now install MSVC 2010 redistributable, to - prevent issues with missing DLL's. -* Fixed: Collapsed/expanded state of setting categories not stored. - -Changes since 15.05.91 ----------------------- - -* There is now a working MacOSX version. Currently it supports OSX 10.7 and - higher. -* Fixed: Need to deselect before selecting a different object. -* Fixed: Object can be moved on Z axis. -* Fixed: Error values should be considered invalid values and will not trigger a - slice. -* Fixed: Text fields used a locale-aware validator while the underlying code did - not. -* Fixed: Text fields will trigger a slice on text change, not only after focus - change/enter press. -* Fixed: Rotate Tool snaps to incorrect value. -* Fixed: Object Collision would only moved objects to the right. -* Fixed: Object Collision would move the selected object when it should not. -* Fixed: Camera panning now works correctly instead of doing nothing. -* Fixed: Camera would flip around center point at maximum rotation. -* Fixed: Build platform grid blocked view from below objects. -* Fixed: Viewport on MacOSX with high-DPI screens was only taking 1/4th of the -window - -Changes since 15.05.90 ----------------------- - -* Fixed: Additional UI elements for tools and views not loading. -* Fixed: Double click needed to change setting dialog page. -* Fixed: Context menu entries (reload, center object, etc.) not working. -* Fixed: "Open With" or passing files from command line not working. -* Fixed: "Reload All" would not reload files. - -In addition, a lot of work has gone into getting a usable Mac OSX version. - -New Features ------------- - -* Plugin based system - The Uranium framework provides us with a plugin-based system - that provides additional flexibility when extending Cura. Think - of new views, tools, file formats, etc. This is probably the - biggest new feature. -* Improved UI - The UI has received a complete overhaul. -* Time-Quality Slider - The 4 static quick print profiles have been replaced with - a slider that should make it easier to find the right spot - between print time and print quality. -* More Settings - The Advanced mode is now configurable and can show many - additional settings that were previously not available, while at - the same time not overwhelming new users with too many settings. - Custom set of visible settings can be created by the user. -* Support for high-DPI screens - The refreshed UI has been designed with high-DPI screens in - mind which should improve the experience of Cura on such - devices. -* Improved language support - (Not yet available for the Beta release.) -* Improved support structure generation - The new version of the CuraEngine now features improved - support generation algorithms and additional options for support - structure generation. -* Experimental Feature: Wire Printing - Wire Printing has been added as an experimental new feature. It - will print objects as a structure of lines. It can be enabled by - from Advanced Mode -> Fixes -> Wire Printing. -* Undo/Redo - It is now possible to undo and redo most scene operations, like - moving or rotating objects. - -Features from earlier versions not (yet) in this release --------------------------------------------------------- - -* The All-at-once/One-at-a-time toggle is not available. - We are working on an improved implementation of this mechanism - but it will not be available for this release. -* No dual extrusion features are available yet. - We are working on a completely new workflow for this but this - needs additional time. -* “Lay Flat” has been removed. - The existing implementation was unfortunately not salvageable. - We will be looking into an improved implementation for this - feature. -* "Split Object Into Parts" has been removed. - Due to the same reason as Lay Flat. -* Support for AMF and DAE file formats has been removed. - Both of these will be implemented as plugins in the future. -* Support for directly loading a GCode file is not yet available. - This will be implemented as a plugin in the future. -* Support for PNG, JPG and other image formats has been removed. - These can be supported by a plugin with an improved UI. -* Support for loading Minecraft levels has been removed. - This can be implemented as a plugin. -* Windows XP support has been dropped. - Microsoft is no longer supporting xp, so they no longer back - port certain features that we require. -* X-Ray view is missing. - Will be implemented as a (you might have guessed it) plugin. -* Fixes: Follow Mesh Surface - Has been removed from the engine, the same result can be - achieved using no infill or top/bottom layers. - -Known Issues ------------- - -For an up to date list of all known issues, please see -https://github.com/Ultimaker/Cura/issues and -https://github.com/Ultimaker/Uranium/issues . - -* Some OBJ files are rendered as black objects due to missing - normals. -* Disabling plugins does not work correctly yet. -* Unicorn occasionally still requires feeding. Do not feed it - after midnight. diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index d7d68e04a2..37676c6ce5 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -639,3 +639,178 @@ Prints the outer walls with a jittering motion to give your object a diffuse fin *Wire Printing The object is printed with a mid-air / net-like structure, following the mesh surface. The build plate will move up and down during diagonal segments. Though not visible in layer view, you can view the result in other software, such as Repetier Host or http://chilipeppr.com/tinyg. + + +Cura 15.06 Beta +=============== + +This is the *Beta* version of Cura 15.06. + +Cura 15.06 is a new release built from the ground up on a completely new +framework called Uranium. This framework has been designed to make it easier to +extend Cura with additional functionality as well as provide a cleaner UI. + +Changes since 15.05.95 +---------------------- + +* Fixed: Selection ghost remains visible after deleting an object +* Fixed: Window does not show up immediately after starting application on OSX +* Fixed: Added display of rotation angle during rotation +* Fixed: Object changes position while rotating/scaling +* Fixed: Loading improvements in the layer view +* Fixed: Added application icons +* Fixed: Improved feedback when loading models +* Fixed: Eject device on MacOSX now provides proper feedback +* Fixed: Make it possible to show retraction settings for UM2 +* Fixed: Opening the machine preferences page will switch to the first available machine +* Fixed: Improved tool handle hit area size +* Fixed: Render lines with a thickness based on screen DPI + +Changes since 15.05.94 +---------------------- + +* Added Russian translations +* Fixed: Infill not displayed in layer view +* Fixed: Cannot select/scale/rotate when first activating the tool and then trying to select a model. +* Fixed: Improved font rendering on Windows +* Fixed: Help > Show Documentation crashes Cura on Windows +* Fixed: "There is no disk in the drive" repeating messages on Windows +* Fixed: Retraction settings not visible for Ultimaker2 +* Fixed: Display rotation angle when rotating an object +* Fixed: Time/Quality slider values are properly rounded +* Fixed: Improved clarity of buttons and text +* Fixed: No indication that anything is happening when loading a model +* Fixed: Eject device now works on Windows + +Changes since 15.05.93 +---------------------- + +* Fixed: No shortcuts for moving up/down layers in layer view. +* Fixed: Last view layers could not be scrolled through in layer view. +* Fixed: Files provided on command line would not actually show up on the build + platform. +* Fixed: Render a ghost of the selection in Layer view to make the actual object + position clear. +* Fixed: Showing a menu would clear the selection. +* Fixed: Size and scaling factor display for scale tool. +* Fixed: Missing background for additional tool controls. +* Fixed: Loading message times out when loading large files. +* Fixed: Show recent files in the file menu. +* Fixed: Windows installer will now install MSVC 2010 redistributable, to + prevent issues with missing DLL's. +* Fixed: Collapsed/expanded state of setting categories not stored. + +Changes since 15.05.91 +---------------------- + +* There is now a working MacOSX version. Currently it supports OSX 10.7 and + higher. +* Fixed: Need to deselect before selecting a different object. +* Fixed: Object can be moved on Z axis. +* Fixed: Error values should be considered invalid values and will not trigger a + slice. +* Fixed: Text fields used a locale-aware validator while the underlying code did + not. +* Fixed: Text fields will trigger a slice on text change, not only after focus + change/enter press. +* Fixed: Rotate Tool snaps to incorrect value. +* Fixed: Object Collision would only moved objects to the right. +* Fixed: Object Collision would move the selected object when it should not. +* Fixed: Camera panning now works correctly instead of doing nothing. +* Fixed: Camera would flip around center point at maximum rotation. +* Fixed: Build platform grid blocked view from below objects. +* Fixed: Viewport on MacOSX with high-DPI screens was only taking 1/4th of the +window + +Changes since 15.05.90 +---------------------- + +* Fixed: Additional UI elements for tools and views not loading. +* Fixed: Double click needed to change setting dialog page. +* Fixed: Context menu entries (reload, center object, etc.) not working. +* Fixed: "Open With" or passing files from command line not working. +* Fixed: "Reload All" would not reload files. + +In addition, a lot of work has gone into getting a usable Mac OSX version. + +New Features +------------ + +* Plugin based system + The Uranium framework provides us with a plugin-based system + that provides additional flexibility when extending Cura. Think + of new views, tools, file formats, etc. This is probably the + biggest new feature. +* Improved UI + The UI has received a complete overhaul. +* Time-Quality Slider + The 4 static quick print profiles have been replaced with + a slider that should make it easier to find the right spot + between print time and print quality. +* More Settings + The Advanced mode is now configurable and can show many + additional settings that were previously not available, while at + the same time not overwhelming new users with too many settings. + Custom set of visible settings can be created by the user. +* Support for high-DPI screens + The refreshed UI has been designed with high-DPI screens in + mind which should improve the experience of Cura on such + devices. +* Improved language support + (Not yet available for the Beta release.) +* Improved support structure generation + The new version of the CuraEngine now features improved + support generation algorithms and additional options for support + structure generation. +* Experimental Feature: Wire Printing + Wire Printing has been added as an experimental new feature. It + will print objects as a structure of lines. It can be enabled by + from Advanced Mode -> Fixes -> Wire Printing. +* Undo/Redo + It is now possible to undo and redo most scene operations, like + moving or rotating objects. + +Features from earlier versions not (yet) in this release +-------------------------------------------------------- + +* The All-at-once/One-at-a-time toggle is not available. + We are working on an improved implementation of this mechanism + but it will not be available for this release. +* No dual extrusion features are available yet. + We are working on a completely new workflow for this but this + needs additional time. +* “Lay Flat” has been removed. + The existing implementation was unfortunately not salvageable. + We will be looking into an improved implementation for this + feature. +* "Split Object Into Parts" has been removed. + Due to the same reason as Lay Flat. +* Support for AMF and DAE file formats has been removed. + Both of these will be implemented as plugins in the future. +* Support for directly loading a GCode file is not yet available. + This will be implemented as a plugin in the future. +* Support for PNG, JPG and other image formats has been removed. + These can be supported by a plugin with an improved UI. +* Support for loading Minecraft levels has been removed. + This can be implemented as a plugin. +* Windows XP support has been dropped. + Microsoft is no longer supporting xp, so they no longer back + port certain features that we require. +* X-Ray view is missing. + Will be implemented as a (you might have guessed it) plugin. +* Fixes: Follow Mesh Surface + Has been removed from the engine, the same result can be + achieved using no infill or top/bottom layers. + +Known Issues +------------ + +For an up to date list of all known issues, please see +https://github.com/Ultimaker/Cura/issues and +https://github.com/Ultimaker/Uranium/issues . + +* Some OBJ files are rendered as black objects due to missing + normals. +* Disabling plugins does not work correctly yet. +* Unicorn occasionally still requires feeding. Do not feed it + after midnight. From 22472675f75477073d9e07c1f6da3656b43a14fe Mon Sep 17 00:00:00 2001 From: nickthetait Date: Wed, 8 Nov 2017 17:22:14 -0700 Subject: [PATCH 175/764] Update formatting on some older changelog data --- plugins/ChangeLogPlugin/ChangeLog.txt | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 37676c6ce5..d9155c9e0e 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -641,17 +641,13 @@ Prints the outer walls with a jittering motion to give your object a diffuse fin The object is printed with a mid-air / net-like structure, following the mesh surface. The build plate will move up and down during diagonal segments. Though not visible in layer view, you can view the result in other software, such as Repetier Host or http://chilipeppr.com/tinyg. -Cura 15.06 Beta -=============== - -This is the *Beta* version of Cura 15.06. +[15.06 Beta] Cura 15.06 is a new release built from the ground up on a completely new framework called Uranium. This framework has been designed to make it easier to extend Cura with additional functionality as well as provide a cleaner UI. -Changes since 15.05.95 ----------------------- +[15.05.95] * Fixed: Selection ghost remains visible after deleting an object * Fixed: Window does not show up immediately after starting application on OSX @@ -666,8 +662,7 @@ Changes since 15.05.95 * Fixed: Improved tool handle hit area size * Fixed: Render lines with a thickness based on screen DPI -Changes since 15.05.94 ----------------------- +[15.05.94] * Added Russian translations * Fixed: Infill not displayed in layer view @@ -682,8 +677,7 @@ Changes since 15.05.94 * Fixed: No indication that anything is happening when loading a model * Fixed: Eject device now works on Windows -Changes since 15.05.93 ----------------------- +[15.05.93] * Fixed: No shortcuts for moving up/down layers in layer view. * Fixed: Last view layers could not be scrolled through in layer view. @@ -700,8 +694,7 @@ Changes since 15.05.93 prevent issues with missing DLL's. * Fixed: Collapsed/expanded state of setting categories not stored. -Changes since 15.05.91 ----------------------- +[15.05.91] * There is now a working MacOSX version. Currently it supports OSX 10.7 and higher. @@ -722,8 +715,7 @@ Changes since 15.05.91 * Fixed: Viewport on MacOSX with high-DPI screens was only taking 1/4th of the window -Changes since 15.05.90 ----------------------- +[15.05.90] * Fixed: Additional UI elements for tools and views not loading. * Fixed: Double click needed to change setting dialog page. @@ -804,11 +796,6 @@ Features from earlier versions not (yet) in this release Known Issues ------------ - -For an up to date list of all known issues, please see -https://github.com/Ultimaker/Cura/issues and -https://github.com/Ultimaker/Uranium/issues . - * Some OBJ files are rendered as black objects due to missing normals. * Disabling plugins does not work correctly yet. From 1468c3aae5259a850fcea9dbc6d2c597c6e72006 Mon Sep 17 00:00:00 2001 From: Mark Date: Thu, 9 Nov 2017 07:37:09 +0100 Subject: [PATCH 176/764] move undefined/null check --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 65d33369aa..e4cbc6a0c7 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -276,12 +276,8 @@ Cura.MachineAction width: parent.width wrapMode: Text.WordWrap text:{ - if (base.selectedPrinter == undefined || base.selectedPrinter == null) - { - return ""; - } // The property cluster size does not exist for older UM3 devices. - if(base.selectedPrinter != undefined && (base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)) + if(!base.selectedPrinter && (base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)) { return ""; } From 78456d5bc3f3ba42242bdb80e4bde83edc9336d4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 9 Nov 2017 09:06:46 +0100 Subject: [PATCH 177/764] Fix clusterSize property check in QML --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index e4cbc6a0c7..cec2bf0f0f 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -277,7 +277,7 @@ Cura.MachineAction wrapMode: Text.WordWrap text:{ // The property cluster size does not exist for older UM3 devices. - if(!base.selectedPrinter && (base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1)) + if(!base.selectedPrinter || base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1) { return ""; } From 714c0f25da628cdbcf26362314b013cf0ef231fe Mon Sep 17 00:00:00 2001 From: kaleidoscopeit Date: Thu, 9 Nov 2017 10:25:30 +0100 Subject: [PATCH 178/764] Set all "setting_version" in qualitites to 4 --- resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_abs_high.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_pla_high.inst.cfg | 2 +- resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg index a44ad8c271..43643b6b92 100644 --- a/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_fast.inst.cfg @@ -5,7 +5,7 @@ name = Fast Quality (beta) [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_abs_175 quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg index 7a21407d1b..99e47bc9cb 100644 --- a/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_high.inst.cfg @@ -5,7 +5,7 @@ name = High Quality (beta) [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_abs_175 quality_type = high weight = 1 diff --git a/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg index e1889c008f..a2aa2be769 100644 --- a/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_abs_normal.inst.cfg @@ -5,7 +5,7 @@ name = Normal Quality (beta) [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_abs_175 quality_type = normal weight = 0 diff --git a/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg index ec10bfc510..fac23939cf 100644 --- a/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_nylon_fast.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_175 quality_type = fast weight = -1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg index db2a31c468..d594126474 100644 --- a/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_nylon_high.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_175 quality_type = high weight = 1 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg index a0504adfd8..76716fc16d 100644 --- a/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_nylon_normal.inst.cfg @@ -8,7 +8,7 @@ type = quality material = generic_nylon_175 quality_type = normal weight = 0 -setting_version = 3 +setting_version = 4 [values] adhesion_type = raft diff --git a/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg index a91e009353..9783cb11cc 100644 --- a/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_fast.inst.cfg @@ -5,7 +5,7 @@ name = Fast Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_pla_175 quality_type = fast weight = -1 diff --git a/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg index c42a18d8eb..9513e98b6a 100644 --- a/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_high.inst.cfg @@ -5,7 +5,7 @@ name = High Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_pla_175 quality_type = high weight = 1 diff --git a/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg b/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg index a433f2d0dd..d88f5909f0 100644 --- a/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg +++ b/resources/quality/deltacomb/deltacomb_pla_normal.inst.cfg @@ -5,7 +5,7 @@ name = Normal Quality [metadata] type = quality -setting_version = 3 +setting_version = 4 material = generic_pla_175 quality_type = normal weight = 0 From 1ff254194768bcb81888bcee17f8b9cc2bb0d25e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 9 Nov 2017 10:34:35 +0100 Subject: [PATCH 179/764] Add nozzle color to the default themes --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 1 + resources/themes/cura-dark/theme.json | 1 + resources/themes/cura-light/theme.json | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 639ea27135..ab93a01204 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -109,6 +109,7 @@ class ProcessSlicedLayersJob(Job): layer_data.addLayer(abs_layer_number) this_layer = layer_data.getLayer(abs_layer_number) layer_data.setLayerHeight(abs_layer_number, layer.height) + layer_data.setLayerThickness(abs_layer_number, layer.thickness) for p in range(layer.repeatedMessageCount("path_segment")): polygon = layer.getRepeatedMessage("path_segment", p) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index e61c48bffd..8bf1455b60 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -194,6 +194,7 @@ "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], "layerview_support_interface": [64, 192, 255, 255], + "layerview_nozzle": [181, 166, 66, 120], "material_compatibility_warning": [255, 255, 255, 255], diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index b41ea96846..166fd81dce 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -271,7 +271,8 @@ "layerview_support_infill": [0, 255, 255, 255], "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], - "layerview_support_interface": [64, 192, 255, 255] + "layerview_support_interface": [64, 192, 255, 255], + "layerview_nozzle": [181, 166, 66, 50] }, "sizes": { From 637d1a1da30ec312efcdd69696ed0b41910b18fe Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 9 Nov 2017 10:37:24 +0100 Subject: [PATCH 180/764] Fix Vertex Delta K8800 definition file --- resources/definitions/vertex_delta_k8800.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json index ddfa54f4c8..0a89b61b36 100644 --- a/resources/definitions/vertex_delta_k8800.def.json +++ b/resources/definitions/vertex_delta_k8800.def.json @@ -11,7 +11,7 @@ }, "overrides": { "material_diameter": { - "default_value": 1.75, + "default_value": 1.75 }, "machine_width": { "default_value": 200 From ff14db91334b823d28c24c3fd92c1c994918669a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 11:29:50 +0100 Subject: [PATCH 181/764] Remove convex hull for meshes that don't print geometry Anti-overhang, Infill and Cutting meshes don't print geometry, so they don't need to push other objects away. --- cura/ConvexHullDecorator.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index bfeb690192..4a2c365437 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -14,6 +14,13 @@ import numpy ## The convex hull decorator is a scene node decorator that adds the convex hull functionality to a scene node. # If a scene node has a convex hull decorator, it will have a shadow in which other objects can not be printed. class ConvexHullDecorator(SceneNodeDecorator): + ## Meshes that don't need a convex hull + # + # If these settings are True for any mesh, the mesh does not need to push other meshes away. + # Note that Support Mesh is not in here because it actually generates + # g-code in the volume of the mesh. + _not_printed_mesh_settings = {"anti_overhang_mesh", "infill_mesh", "cutting_mesh"} + def __init__(self): super().__init__() @@ -56,6 +63,9 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._node is None: return None + if (self._node.callDecoration("getStack") and any(self._node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): + return None + hull = self._compute2DConvexHull() if self._global_stack and self._node: From 477e295e707609b8505a1c3d599c4f3b8d6942d8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Thu, 9 Nov 2017 12:02:01 +0100 Subject: [PATCH 182/764] Change_Color_UI_elements_CURA-4548 --- resources/themes/cura-light/theme.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 50ee600e4e..ceb5b64263 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -100,7 +100,7 @@ "button_text_hover": [255, 255, 255, 255], "button_text_active": [255, 255, 255, 255], "button_text_active_hover": [255, 255, 255, 255], - "button_disabled": [24, 41, 77, 255], + "button_disabled": [31, 36, 39, 255], "button_disabled_text": [255, 255, 255, 101], "button_tooltip": [31, 36, 39, 255], @@ -116,7 +116,7 @@ "action_button_text": [0, 0, 0, 255], "action_button_border": [127, 127, 127, 255], "action_button_hovered": [255, 255, 255, 255], - "action_button_hovered_text": [24, 41, 77, 255], + "action_button_hovered_text": [31, 36, 39, 255], "action_button_hovered_border": [12, 169, 227, 255], "action_button_active": [255, 255, 255, 255], "action_button_active_text": [0, 0, 0, 255], @@ -134,7 +134,7 @@ "print_button_ready_pressed_border": [30, 186, 245, 243], "scrollbar_background": [255, 255, 255, 255], - "scrollbar_handle": [24, 41, 77, 255], + "scrollbar_handle": [31, 36, 39, 255], "scrollbar_handle_hover": [12, 159, 227, 255], "scrollbar_handle_down": [12, 159, 227, 255], @@ -143,11 +143,11 @@ "setting_category_hover": [245, 245, 245, 255], "setting_category_active": [245, 245, 245, 255], "setting_category_active_hover": [245, 245, 245, 255], - "setting_category_text": [24, 41, 77, 255], + "setting_category_text": [31, 36, 39, 255], "setting_category_disabled_text": [24, 41, 77, 101], - "setting_category_hover_text": [24, 41, 77, 255], - "setting_category_active_text": [24, 41, 77, 255], - "setting_category_active_hover_text": [24, 41, 77, 255], + "setting_category_hover_text": [31, 36, 39, 255], + "setting_category_active_text": [31, 36, 39, 255], + "setting_category_active_hover_text": [31, 36, 39, 255], "setting_category_border": [245, 245, 245, 255], "setting_category_disabled_border": [245, 245, 245, 255], "setting_category_hover_border": [12, 159, 227, 255], @@ -155,7 +155,7 @@ "setting_category_active_hover_border": [12, 159, 227, 255], "setting_control": [255, 255, 255, 255], - "setting_control_selected": [24, 41, 77, 255], + "setting_control_selected": [31, 36, 39, 255], "setting_control_highlight": [255, 255, 255, 255], "setting_control_border": [127, 127, 127, 255], "setting_control_border_highlight": [12, 169, 227, 255], @@ -203,9 +203,9 @@ "mode_switch_hover": [255, 255, 255, 255], "mode_switch_border": [127, 127, 127, 255], "mode_switch_border_hover": [12, 169, 227, 255], - "mode_switch_handle": [24, 41, 77, 255], - "mode_switch_text": [24, 41, 77, 255], - "mode_switch_text_hover": [24, 41, 77, 255], + "mode_switch_handle": [31, 36, 39, 255], + "mode_switch_text": [31, 36, 39, 255], + "mode_switch_text_hover": [31, 36, 39, 255], "mode_switch_text_checked": [12, 169, 227, 255], "tooltip": [68, 192, 255, 255], From 0b11117d6d15cbbfa750d5dfb40e37d31e65e5c0 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 12:28:55 +0100 Subject: [PATCH 183/764] Set a property for non-printing-meshes Remove code duplication --- cura/ConvexHullDecorator.py | 11 +++-------- cura/Settings/SettingOverrideDecorator.py | 10 ++++++++++ plugins/CuraEngineBackend/StartSliceJob.py | 11 +---------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 4a2c365437..8badc7a825 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -14,13 +14,6 @@ import numpy ## The convex hull decorator is a scene node decorator that adds the convex hull functionality to a scene node. # If a scene node has a convex hull decorator, it will have a shadow in which other objects can not be printed. class ConvexHullDecorator(SceneNodeDecorator): - ## Meshes that don't need a convex hull - # - # If these settings are True for any mesh, the mesh does not need to push other meshes away. - # Note that Support Mesh is not in here because it actually generates - # g-code in the volume of the mesh. - _not_printed_mesh_settings = {"anti_overhang_mesh", "infill_mesh", "cutting_mesh"} - def __init__(self): super().__init__() @@ -63,7 +56,9 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._node is None: return None - if (self._node.callDecoration("getStack") and any(self._node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): + if getattr(self._node, "_non_printing_mesh", False): + # infill_mesh, cutting_mesh and anti_overhang_mesh do not need a convex hull + # node._non_printing_mesh is set in SettingOverrideDecorator return None hull = self._compute2DConvexHull() diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 4e0893a35f..63e2a6837f 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -22,6 +22,14 @@ class SettingOverrideDecorator(SceneNodeDecorator): ## Event indicating that the user selected a different extruder. activeExtruderChanged = Signal() + ## Non-printing meshes + # + # If these settings are True for any mesh, the mesh does not need a convex hull, + # and is sent to the slicer regardless of whether it fits inside the build volume. + # Note that Support Mesh is not in here because it actually generates + # g-code in the volume of the mesh. + _non_printing_mesh_settings = {"anti_overhang_mesh", "infill_mesh", "cutting_mesh"} + def __init__(self): super().__init__() self._stack = PerObjectContainerStack(stack_id = id(self)) @@ -82,6 +90,8 @@ class SettingOverrideDecorator(SceneNodeDecorator): Application.getInstance().getBackend().needsSlicing() Application.getInstance().getBackend().tickle() + self._node._non_printing_mesh = any(self._stack.getProperty(setting, "value") for setting in self._non_printing_mesh_settings) + ## Makes sure that the stack upon which the container stack is placed is # kept up to date. def _updateNextStack(self): diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index a53daa4e63..ca84f554a4 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -44,14 +44,6 @@ class GcodeStartEndFormatter(Formatter): ## Job class that builds up the message of scene data to send to CuraEngine. class StartSliceJob(Job): - ## Meshes that are sent to the engine regardless of being outside of the - # build volume. - # - # If these settings are True for any mesh, the build volume is ignored. - # Note that Support Mesh is not in here because it actually generates - # g-code in the volume of the mesh. - _not_printed_mesh_settings = {"anti_overhang_mesh", "infill_mesh", "cutting_mesh"} - def __init__(self, slice_message): super().__init__() @@ -140,8 +132,7 @@ class StartSliceJob(Job): temp_list = [] for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - if not getattr(node, "_outside_buildarea", False)\ - or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): + if not getattr(node, "_outside_buildarea", False) or getattr(node, "_non_printing_mesh", False): temp_list.append(node) Job.yieldThread() From 8f8bdc059ab9f8065a2b1ec6b75b60608bfffb23 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 12:55:03 +0100 Subject: [PATCH 184/764] Render non-printing objects as semi transparent objects in Solid View --- plugins/SolidView/SolidView.py | 29 ++++++++++++++++---------- resources/themes/cura-light/theme.json | 1 + 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8f0c9a4dc1..3474fa88f2 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -27,25 +27,33 @@ class SolidView(View): self._enabled_shader = None self._disabled_shader = None + self._non_printing_shader = None self._extruders_model = ExtrudersModel() + self._theme = None def beginRendering(self): scene = self.getController().getScene() renderer = self.getRenderer() + if not self._theme: + self._theme = Application.getInstance().getTheme() + if not self._enabled_shader: self._enabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "overhang.shader")) - theme = Application.getInstance().getTheme() - self._enabled_shader.setUniformValue("u_overhangColor", Color(*theme.getColor("model_overhang").getRgb())) + self._enabled_shader.setUniformValue("u_overhangColor", Color(*self._theme.getColor("model_overhang").getRgb())) if not self._disabled_shader: self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) - theme = Application.getInstance().getTheme() - self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*theme.getColor("model_unslicable").getRgb())) - self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*theme.getColor("model_unslicable_alt").getRgb())) + self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*self._theme.getColor("model_unslicable").getRgb())) + self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*self._theme.getColor("model_unslicable_alt").getRgb())) self._disabled_shader.setUniformValue("u_width", 50.0) + if not self._non_printing_shader: + self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) + self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb())) + self._non_printing_shader.setUniformValue("u_opacity", 0.6) + multi_extrusion = False global_container_stack = Application.getInstance().getGlobalContainerStack() @@ -110,13 +118,12 @@ class SolidView(View): except ValueError: pass - if hasattr(node, "_outside_buildarea"): - if node._outside_buildarea: - renderer.queueNode(node, shader = self._disabled_shader) - else: - renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) + if getattr(node, "_non_printing_mesh", False): + renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) + elif getattr(node, "_outside_buildarea", False): + renderer.queueNode(node, shader = self._disabled_shader) else: - renderer.queueNode(node, material = self._enabled_shader, uniforms = uniforms) + renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) if node.callDecoration("isGroup") and Selection.isSelected(node): renderer.queueNode(scene.getRoot(), mesh = node.getBoundingBoxMesh(), mode = RenderBatch.RenderMode.LineLoop) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 50ee600e4e..6d07ca09b8 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -256,6 +256,7 @@ "model_unslicable": [122, 122, 122, 255], "model_unslicable_alt": [172, 172, 127, 255], "model_selection_outline": [12, 169, 227, 255], + "model_non_printing": [122, 122, 122, 255], "xray": [26, 26, 62, 255], "xray_error": [255, 0, 0, 255], From f2e7fef747d4424ab6c1fdc73cadcc47f3eb55cb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Nov 2017 13:51:47 +0100 Subject: [PATCH 185/764] Update PreviewPass so that only slicable objects are rendered --- cura/PreviewPass.py | 51 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index fd87754ae3..c1880e82ef 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -2,27 +2,56 @@ # Uranium is released under the terms of the LGPLv3 or higher. from UM.Application import Application -from UM.View.RenderPass import RenderPass -from UM.Scene.Camera import Camera +from UM.Resources import Resources -## A render pass subclass that renders everything with default parameters, but can be used with a non-default camera +from UM.View.RenderPass import RenderPass +from UM.View.GL.OpenGL import OpenGL +from UM.View.RenderBatch import RenderBatch + + +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator + +from typing import Optional + +MYPY = False +if MYPY: + from UM.Scene.Camera import Camera + +## A render pass subclass that renders slicable objects with default parameters. +# It uses the active camera by default, but it can be overridden to use a different camera. # # This is useful to get a preview image of a scene taken from a different location as the active camera. class PreviewPass(RenderPass): - def __init__(self, width, height): + def __init__(self, width: int, height: int): super().__init__("preview", width, height, 0) - self._camera = Application.getInstance().getController().getScene().getActiveCamera() + self._camera = None # type: Optional[Camera] + self._renderer = Application.getInstance().getRenderer() - # Override the camera to be used for this render pass - def setCamera(self, camera: Camera): + self._shader = None + self._scene = Application.getInstance().getController().getScene() + + # Set the camera to be used by this render pass + # if it's None, the active camera is used + def setCamera(self, camera: Optional["Camera"]): self._camera = camera - def render(self): + def render(self) -> None: + if not self._shader: + self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "object.shader")) + + # Create a new batch to be rendered + batch = RenderBatch(self._shader) + + # Fill up the batch with objects that can be sliced. ` + for node in DepthFirstIterator(self._scene.getRoot()): + if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible(): + batch.addItem(node.getWorldTransformation(), node.getMeshData()) + self.bind() - - for batch in self._renderer.getBatches(): + if self._camera is None: + batch.render(Application.getInstance().getController().getScene().getActiveCamera()) + else: batch.render(self._camera) - self.release() From 3251e5915be2effbb558379539fd1b7992396c8b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 16:04:13 +0100 Subject: [PATCH 186/764] Show the support material for support_mesh --- plugins/SolidView/SolidView.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 3474fa88f2..56d8cf11d7 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -98,12 +98,19 @@ class SolidView(View): extruder_id = node.callDecoration("getActiveExtruder") if extruder_id: extruder_index = max(0, self._extruders_model.find("id", extruder_id)) + + # Use the support extruder instead of the active extruder if this is a support_mesh + per_mesh_stack = node.callDecoration("getStack") + if per_mesh_stack: + if per_mesh_stack.getProperty("support_mesh", "value"): + extruder_index = global_container_stack.getProperty("support_extruder_nr", "value") + try: material_color = self._extruders_model.getItem(extruder_index)["color"] except KeyError: material_color = self._extruders_model.defaultColors[0] - if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: + if int(extruder_index) != int(ExtruderManager.getInstance().activeExtruderIndex): # Shade objects that are printed with the non-active extruder 25% darker shade_factor = 0.6 try: From e21acd1a07da8bd40031c0039dc5abc831f276ec Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 9 Nov 2017 17:03:20 +0100 Subject: [PATCH 187/764] CURA-4525 first multi slice + multi layer data, added filter on build plate, added option arrange on load, visuals like convex hull are now correct --- cura/Arrange.py | 2 +- cura/ArrangeObjectsAllBuildPlatesJob.py | 1 - cura/ConvexHullNode.py | 3 +- cura/CuraApplication.py | 105 +++--- cura/ObjectManager.py | 29 +- cura/Scene/BuildPlateDecorator.py | 7 + cura/Scene/CuraSceneNode.py | 40 +++ plugins/3MFReader/ThreeMFReader.py | 3 +- .../CuraEngineBackend/CuraEngineBackend.py | 140 +++++--- .../ProcessSlicedLayersJob.py | 27 +- plugins/CuraEngineBackend/StartSliceJob.py | 19 +- plugins/ImageReader/ImageReader.py | 4 +- plugins/LayerView/LayerPass.py | 3 +- plugins/SolidView/SolidView.py | 2 +- plugins/X3DReader/X3DReader.py | 303 +++++++++--------- resources/qml/Cura.qml | 1 + resources/qml/ObjectsList.qml | 23 +- resources/qml/Preferences/GeneralPage.qml | 16 +- 18 files changed, 468 insertions(+), 260 deletions(-) create mode 100644 cura/Scene/CuraSceneNode.py diff --git a/cura/Arrange.py b/cura/Arrange.py index 305729d763..2f77ec9a7f 100755 --- a/cura/Arrange.py +++ b/cura/Arrange.py @@ -40,7 +40,7 @@ class Arrange: # \param fixed_nodes Scene nodes to be placed @classmethod def create(cls, scene_root = None, fixed_nodes = None, scale = 0.5, x = 220, y = 220): - arranger = Arrange(x, y, x / 2, y / 2, scale = scale) + arranger = Arrange(x, y, x // 2, y // 2, scale = scale) arranger.centerFirst() if fixed_nodes is None: diff --git a/cura/ArrangeObjectsAllBuildPlatesJob.py b/cura/ArrangeObjectsAllBuildPlatesJob.py index eacd18d5ad..7991ac39f0 100644 --- a/cura/ArrangeObjectsAllBuildPlatesJob.py +++ b/cura/ArrangeObjectsAllBuildPlatesJob.py @@ -112,7 +112,6 @@ class ArrangeObjectsAllBuildPlatesJob(Job): # start_priority = 0 while try_placement: - Logger.log("d", "start_priority %s", start_priority) # make sure that current_build_plate_number is not going crazy or you'll have a lot of arrange objects while current_build_plate_number >= arrange_array.count(): arrange_array.add() diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py index cc4720c197..c6ff80670d 100644 --- a/cura/ConvexHullNode.py +++ b/cura/ConvexHullNode.py @@ -6,7 +6,6 @@ from UM.Scene.SceneNode import SceneNode from UM.Resources import Resources from UM.Math.Color import Color from UM.Mesh.MeshBuilder import MeshBuilder # To create a mesh to display the convex hull with. - from UM.View.GL.OpenGL import OpenGL @@ -65,7 +64,7 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_diffuseColor", self._color) ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) - if self.getParent(): + if self.getParent() and self.getParent().callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate: if self.getMeshData(): renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 39e4b38824..c1c894c735 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -33,6 +33,7 @@ from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation + from cura.Arrange import Arrange from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator @@ -41,6 +42,7 @@ from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator # research from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.ArrangeObjectsJob import ArrangeObjectsJob from cura.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob @@ -307,11 +309,13 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/asked_dialog_on_project_save", False) preferences.addPreference("cura/choice_on_profile_override", "always_ask") preferences.addPreference("cura/choice_on_open_project", "always_ask") + preferences.addPreference("cura/arrange_objects_on_load", True) preferences.addPreference("cura/currency", "€") preferences.addPreference("cura/material_settings", "{}") preferences.addPreference("view/invert_zoom", False) + preferences.addPreference("view/filter_current_build_plate", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") @@ -896,7 +900,7 @@ class CuraApplication(QtApplication): scene_bounding_box = None is_block_slicing_node = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -1013,7 +1017,7 @@ class CuraApplication(QtApplication): Selection.clear() for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1021,6 +1025,9 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data + if not node.callDecoration("isSliceable"): + continue # i.e. node with layer data + Selection.add(node) ## Delete all nodes containing mesh data in the scene. @@ -1032,7 +1039,7 @@ class CuraApplication(QtApplication): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1054,7 +1061,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene translations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1082,13 +1089,13 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene transformations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) - if not node.isSelectable(): + if not node.callDecoration("isSliceable"): continue # i.e. node with layer data nodes.append(node) @@ -1109,7 +1116,27 @@ class CuraApplication(QtApplication): def arrangeObjectsToAllBuildPlates(self): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): + continue + if not node.getMeshData() and not node.callDecoration("isGroup"): + continue # Node that doesnt have a mesh and is not a group. + if node.getParent() and node.getParent().callDecoration("isGroup"): + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) + if not node.callDecoration("isSliceable"): + continue # i.e. node with layer data + # Skip nodes that are too big + if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: + nodes.append(node) + job = ArrangeObjectsAllBuildPlatesJob(nodes) + job.start() + self.setActiveBuildPlate(0) + + # Single build plate + @pyqtSlot() + def arrangeAll(self): + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if not issubclass(type(node), SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1117,24 +1144,7 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data - # Skip nodes that are too big - if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: - nodes.append(node) - job = ArrangeObjectsAllBuildPlatesJob(nodes) - job.start() - - # Single build plate - @pyqtSlot() - def arrangeAll(self): - nodes = [] - for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: - continue - if not node.getMeshData() and not node.callDecoration("isGroup"): - continue # Node that doesnt have a mesh and is not a group. - if node.getParent() and node.getParent().callDecoration("isGroup"): - continue # Grouped nodes don't need resetting as their parent (the group) is resetted) - if not node.isSelectable(): + if not node.callDecoration("isSliceable"): continue # i.e. node with layer data if node.callDecoration("getBuildPlateNumber") == self._active_build_plate: # Skip nodes that are too big @@ -1150,7 +1160,7 @@ class CuraApplication(QtApplication): # What nodes are on the build plate and are not being moved fixed_nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode: + if not issubclass(type(node), SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1158,6 +1168,8 @@ class CuraApplication(QtApplication): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) if not node.isSelectable(): continue # i.e. node with layer data + if not node.callDecoration("isSliceable"): + continue # i.e. node with layer data if node in nodes: # exclude selected node from fixed_nodes continue fixed_nodes.append(node) @@ -1176,7 +1188,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Reloading all loaded mesh data.") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or not node.getMeshData(): + if not issubclass(type(node), SceneNode) or not node.getMeshData(): continue nodes.append(node) @@ -1267,7 +1279,7 @@ class CuraApplication(QtApplication): @pyqtSlot() def groupSelected(self): # Create a group-node - group_node = SceneNode() + group_node = CuraSceneNode() group_decorator = GroupDecorator() group_node.addDecorator(group_decorator) group_node.addDecorator(ConvexHullDecorator()) @@ -1413,11 +1425,15 @@ class CuraApplication(QtApplication): min_offset = 8 self.fileLoaded.emit(filename) + arrange_objects_on_load = Preferences.getInstance().getValue("cura/arrange_objects_on_load") + target_build_plate = self.activeBuildPlate if arrange_objects_on_load else -1 + + for original_node in nodes: + node = CuraSceneNode() # We want our own CuraSceneNode + node.setMeshData(original_node.getMeshData()) - for node in nodes: node.setSelectable(True) node.setName(os.path.basename(filename)) - node.addDecorator(BuildPlateDecorator()) extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: @@ -1442,20 +1458,23 @@ class CuraApplication(QtApplication): if not child.getDecorator(ConvexHullDecorator): child.addDecorator(ConvexHullDecorator()) - if node.callDecoration("isSliceable"): - # Only check position if it's not already blatantly obvious that it won't fit. - if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: - # Find node location - offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = min_offset) + if arrange_objects_on_load: + if node.callDecoration("isSliceable"): + # Only check position if it's not already blatantly obvious that it won't fit. + if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: + # Find node location + offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = min_offset) - # If a model is to small then it will not contain any points - if offset_shape_arr is None and hull_shape_arr is None: - Message(self._i18n_catalog.i18nc("@info:status", "The selected model was too small to load."), - title=self._i18n_catalog.i18nc("@info:title", "Warning")).show() - return + # If a model is to small then it will not contain any points + if offset_shape_arr is None and hull_shape_arr is None: + Message(self._i18n_catalog.i18nc("@info:status", "The selected model was too small to load."), + title=self._i18n_catalog.i18nc("@info:title", "Warning")).show() + return - # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher - node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10) + # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher + node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10) + + node.addDecorator(BuildPlateDecorator(target_build_plate)) op = AddSceneNodeOperation(node, scene.getRoot()) op.push() @@ -1494,6 +1513,8 @@ class CuraApplication(QtApplication): #### research - hacky place for these kind of thing @pyqtSlot(int) def setActiveBuildPlate(self, nr): + if nr == self._active_build_plate: + return Logger.log("d", "Select build plate: %s" % nr) self._active_build_plate = nr diff --git a/cura/ObjectManager.py b/cura/ObjectManager.py index fc6d343252..a148c05f28 100644 --- a/cura/ObjectManager.py +++ b/cura/ObjectManager.py @@ -7,23 +7,35 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication +#from cura.Scene.CuraSceneNode import CuraSceneNode +from UM.Preferences import Preferences class ObjectManager(ListModel): def __init__(self): super().__init__() self._last_selected_index = 0 - Application.getInstance().getController().getScene().sceneChanged.connect(self._update) + Application.getInstance().getController().getScene().sceneChanged.connect(self._update_scene_changed) + Preferences.getInstance().preferenceChanged.connect(self._update) + Application.getInstance().activeBuildPlateChanged.connect(self._update) def _update(self, *args): nodes = [] + filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") + active_build_plate_number = Application.getInstance().activeBuildPlate for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + continue + if not node.callDecoration("isSliceable"): + continue + node_build_plate_number = node.callDecoration("getBuildPlateNumber") + if filter_current_build_plate and node_build_plate_number != active_build_plate_number: continue nodes.append({ "name": node.getName(), "isSelected": Selection.isSelected(node), - "buildPlateNumber": node.callDecoration("getBuildPlateNumber"), + "isOutsideBuildArea": node.isOutsideBuildArea(), + "buildPlateNumber": node_build_plate_number, "node": node }) nodes = sorted(nodes, key=lambda n: n["name"]) @@ -31,6 +43,12 @@ class ObjectManager(ListModel): self.itemsChanged.emit() + def _update_scene_changed(self, *args): + # if args and type(args[0]) is not CuraSceneNode: + # Logger.log("d", " ascdf %s", args) + # return + self._update(*args) + ## Either select or deselect an item @pyqtSlot(int) def changeSelection(self, index): @@ -63,6 +81,11 @@ class ObjectManager(ListModel): self._last_selected_index = index + # testing + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if node.callDecoration("getLayerData"): + Logger.log("d", " ##### NODE: %s", node) + @staticmethod def createObjectManager(): return ObjectManager() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index b0a14e41f4..2c886c7444 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -6,11 +6,14 @@ from UM.Logger import Logger class BuildPlateDecorator(SceneNodeDecorator): def __init__(self, build_plate_number = -1): super().__init__() + self._build_plate_number = None + self._previous_build_plate_number = None self.setBuildPlateNumber(build_plate_number) def setBuildPlateNumber(self, nr): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. + self._previous_build_plate_number = self._build_plate_number self._build_plate_number = nr if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): @@ -19,5 +22,9 @@ class BuildPlateDecorator(SceneNodeDecorator): def getBuildPlateNumber(self): return self._build_plate_number + # Used to determine from what build plate the node moved. + def getPreviousBuildPlateNumber(self): + return self._previous_build_plate_number + def __deepcopy__(self, memo): return BuildPlateDecorator() diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py new file mode 100644 index 0000000000..ccec76b53d --- /dev/null +++ b/cura/Scene/CuraSceneNode.py @@ -0,0 +1,40 @@ +from UM.Application import Application +from UM.Logger import Logger +from UM.Scene.SceneNode import SceneNode +from copy import deepcopy + + +## Scene nodes that are models are only seen when selecting the corresponding build plate +# Note that many other nodes can just be UM SceneNode objects. +class CuraSceneNode(SceneNode): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self._outside_buildarea = True + + def setOutsideBuildArea(self, new_value): + self._outside_buildarea = new_value + + def isOutsideBuildArea(self): + return self._outside_buildarea or self.callDecoration("getBuildPlateNumber") < 0 + + def isVisible(self): + return super().isVisible() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate + + def isSelectable(self) -> bool: + return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate + + ## Taken from SceneNode, but replaced SceneNode with CuraSceneNode + def __deepcopy__(self, memo): + copy = CuraSceneNode() + copy.setTransformation(self.getLocalTransformation()) + copy.setMeshData(self._mesh_data) + copy.setVisible(deepcopy(self._visible, memo)) + copy._selectable = deepcopy(self._selectable, memo) + copy._name = deepcopy(self._name, memo) + for decorator in self._decorators: + copy.addDecorator(deepcopy(decorator, memo)) + + for child in self._children: + copy.addChild(deepcopy(child, memo)) + self.calculateBoundingBoxMesh() + return copy diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index a34bf771d7..8c4ef9d1ae 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -15,7 +15,8 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Application import Application from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager -from UM.Scene.SceneNode import SceneNode +#from UM.Scene.SceneNode import SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.ZOffsetDecorator import ZOffsetDecorator diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 914aa1dee0..67d3fe8c42 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -69,9 +69,10 @@ class CuraEngineBackend(QObject, Backend): # Workaround to disable layer view processing if layer view is not active. self._layer_view_active = False Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) + Application.getInstance().activeBuildPlateChanged.connect(self._onActiveViewChanged) self._onActiveViewChanged() self._stored_layer_data = [] - self._stored_optimized_layer_data = [] + self._stored_optimized_layer_data = {} # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) @@ -104,12 +105,14 @@ class CuraEngineBackend(QObject, Backend): self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage self._start_slice_job = None + self._start_slice_job_build_plate = None self._slicing = False # Are we currently slicing? self._restart = False # Back-end is currently restarting? self._tool_active = False # If a tool is active, some tasks do not have to do anything self._always_restart = True # Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness. self._process_layers_job = None # The currently active job to process layers, or None if it is not processing layers. - self._need_slicing = False + # self._need_slicing = False + self._build_plates_to_be_sliced = [] # what needs slicing? self._engine_is_fresh = True # Is the newly started engine used before or not? self._backend_log_max_lines = 20000 # Maximum number of lines to buffer @@ -189,8 +192,9 @@ class CuraEngineBackend(QObject, Backend): ## Perform a slice of the scene. def slice(self): + Logger.log("d", "starting to slice again!") self._slice_start_time = time() - if not self._need_slicing: + if not self._build_plates_to_be_sliced: self.processingProgress.emit(1.0) self.backendStateChange.emit(BackendState.Done) Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.") @@ -199,7 +203,6 @@ class CuraEngineBackend(QObject, Backend): Application.getInstance().getPrintInformation().setToZeroPrintInformation() self._stored_layer_data = [] - self._stored_optimized_layer_data = [] if self._process is None: self._createSocket() @@ -215,6 +218,9 @@ class CuraEngineBackend(QObject, Backend): slice_message = self._socket.createMessage("cura.proto.Slice") self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) + self._start_slice_job_build_plate = self._build_plates_to_be_sliced.pop(0) + self._stored_optimized_layer_data[self._start_slice_job_build_plate] = [] + self._start_slice_job.setBuildPlate(self._start_slice_job_build_plate) self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) @@ -223,7 +229,8 @@ class CuraEngineBackend(QObject, Backend): def _terminate(self): self._slicing = False self._stored_layer_data = [] - self._stored_optimized_layer_data = [] + if self._start_slice_job_build_plate in self._stored_optimized_layer_data: + del self._stored_optimized_layer_data[self._start_slice_job_build_plate] if self._start_slice_job is not None: self._start_slice_job.cancel() @@ -315,10 +322,13 @@ class CuraEngineBackend(QObject, Backend): self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."), title = catalog.i18nc("@info:title", "Unable to slice")) self._error_message.show() - self.backendStateChange.emit(BackendState.Error) + #self.backendStateChange.emit(BackendState.Error) else: - self.backendStateChange.emit(BackendState.NotStarted) + #self.backendStateChange.emit(BackendState.NotStarted) + pass + self._invokeSlice() return + # Preparation completed, send it to the backend. self._socket.sendMessage(job.getSliceMessage()) @@ -360,27 +370,34 @@ class CuraEngineBackend(QObject, Backend): # # \param source The scene node that was changed. def _onSceneChanged(self, source): - if type(source) is not SceneNode: + Logger.log("d", " ##### scene changed: %s", source) + if not issubclass(type(source), SceneNode): return root_scene_nodes_changed = False + build_plates_changed = set() if source == self._scene.getRoot(): num_objects = 0 for node in DepthFirstIterator(self._scene.getRoot()): # Only count sliceable objects if node.callDecoration("isSliceable"): num_objects += 1 + build_plates_changed.add(node.callDecoration("getBuildPlateNumber")) + build_plates_changed.add(node.callDecoration("getPreviousBuildPlateNumber")) if num_objects != self._last_num_objects: self._last_num_objects = num_objects root_scene_nodes_changed = True - else: - return + # else: + # return # ?? + build_plates_changed.discard(None) + build_plates_changed.discard(-1) # object not on build plate + Logger.log("d", " #### build plates changed: %s", build_plates_changed) - if not source.callDecoration("isGroup") and not root_scene_nodes_changed: - if source.getMeshData() is None: - return - if source.getMeshData().getVertices() is None: - return + # if not source.callDecoration("isGroup") and not root_scene_nodes_changed: + # if source.getMeshData() is None: + # return + # if source.getMeshData().getVertices() is None: + # return if self._tool_active: # do it later, each source only has to be done once @@ -388,9 +405,24 @@ class CuraEngineBackend(QObject, Backend): self._postponed_scene_change_sources.append(source) return - self.needsSlicing() - self.stopSlicing() - self._onChanged() + if build_plates_changed: + Logger.log("d", " going to reslice") + self.stopSlicing() + for build_plate_number in build_plates_changed: + if build_plate_number not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(build_plate_number) + self.processingProgress.emit(0.0) + self.backendStateChange.emit(BackendState.NotStarted) + if not self._use_timer: + # With manually having to slice, we want to clear the old invalid layer data. + self._clearLayerData(build_plates_changed) + + self._invokeSlice() + + # #self.needsSlicing() + # self.stopSlicing() + # #self._onChanged() + # self._invokeSlice() ## Called when an error occurs in the socket connection towards the engine. # @@ -410,16 +442,24 @@ class CuraEngineBackend(QObject, Backend): Logger.log("w", "A socket error caused the connection to be reset") ## Remove old layer data (if any) - def _clearLayerData(self): + def _clearLayerData(self, build_plate_numbers = set()): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): - node.getParent().removeChild(node) - break + if node.callDecoration("getBuildPlateNumber") in build_plate_numbers or not build_plate_numbers: + node.getParent().removeChild(node) - ## Convenient function: set need_slicing, emit state and clear layer data + def markSliceAll(self): + if 0 not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(0) + if 1 not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(1) + if 2 not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(2) + + ## Convenient function: mark everything to slice, emit state and clear layer data def needsSlicing(self): self.stopSlicing() - self._need_slicing = True + self.markSliceAll() self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) if not self._use_timer: @@ -441,7 +481,7 @@ class CuraEngineBackend(QObject, Backend): def _onStackErrorCheckFinished(self): self._is_error_check_scheduled = False - if not self._slicing and self._need_slicing: + if not self._slicing and self._build_plates_to_be_sliced: #self._need_slicing: self.needsSlicing() self._onChanged() @@ -455,7 +495,7 @@ class CuraEngineBackend(QObject, Backend): # # \param message The protobuf message containing sliced layer data. def _onOptimizedLayerMessage(self, message): - self._stored_optimized_layer_data.append(message) + self._stored_optimized_layer_data[self._start_slice_job_build_plate].append(message) ## Called when a progress message is received from the engine. # @@ -464,6 +504,16 @@ class CuraEngineBackend(QObject, Backend): self.processingProgress.emit(message.amount) self.backendStateChange.emit(BackendState.Processing) + # testing + def _invokeSlice(self): + if self._use_timer: + # if the error check is scheduled, wait for the error check finish signal to trigger auto-slice, + # otherwise business as usual + if self._is_error_check_scheduled: + self._change_timer.stop() + else: + self._change_timer.start() + ## Called when the engine sends a message that slicing is finished. # # \param message The protobuf message signalling that slicing is finished. @@ -481,13 +531,20 @@ class CuraEngineBackend(QObject, Backend): self._scene.gcode_list[self._scene.gcode_list.index(line)] = replaced self._slicing = False - self._need_slicing = False + #self._need_slicing = False Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time ) - if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()): - self._process_layers_job = ProcessSlicedLayersJob.ProcessSlicedLayersJob(self._stored_optimized_layer_data) - self._process_layers_job.finished.connect(self._onProcessLayersFinished) - self._process_layers_job.start() - self._stored_optimized_layer_data = [] + + # See if we need to process the sliced layers job. + active_build_plate = Application.getInstance().activeBuildPlate + if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()) and active_build_plate == self._start_slice_job_build_plate: + self._startProcessSlicedLayersJob(active_build_plate) + self._start_slice_job_build_plate = None + + Logger.log("d", "See if there is more to slice...") + # Somehow this results in an Arcus Error + # self.slice() + # Testing call slice again, allow backend to restart by using the timer + self._invokeSlice() ## Called when a g-code message is received from the engine. # @@ -584,19 +641,26 @@ class CuraEngineBackend(QObject, Backend): source = self._postponed_scene_change_sources.pop(0) self._onSceneChanged(source) + def _startProcessSlicedLayersJob(self, build_plate_number): + self._process_layers_job = ProcessSlicedLayersJob.ProcessSlicedLayersJob(self._stored_optimized_layer_data[build_plate_number]) + self._process_layers_job.setBuildPlate(build_plate_number) + self._process_layers_job.finished.connect(self._onProcessLayersFinished) + self._process_layers_job.start() + del self._stored_optimized_layer_data[build_plate_number] + ## Called when the user changes the active view mode. def _onActiveViewChanged(self): - if Application.getInstance().getController().getActiveView(): - view = Application.getInstance().getController().getActiveView() + application = Application.getInstance() + view = application.getController().getActiveView() + if view: + active_build_plate = application.activeBuildPlate if view.getPluginId() == "LayerView": # If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. - if self._stored_optimized_layer_data and not self._slicing: - self._process_layers_job = ProcessSlicedLayersJob.ProcessSlicedLayersJob(self._stored_optimized_layer_data) - self._process_layers_job.finished.connect(self._onProcessLayersFinished) - self._process_layers_job.start() - self._stored_optimized_layer_data = [] + # TODO: what build plate I am slicing + if active_build_plate in self._stored_optimized_layer_data and not self._slicing: + self._startProcessSlicedLayersJob(active_build_plate) else: self._layer_view_active = False diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index a352564bc2..1e56f2dd35 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -17,10 +17,12 @@ from UM.Logger import Logger from UM.Math.Vector import Vector +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Settings.ExtruderManager import ExtruderManager from cura import LayerDataBuilder from cura import LayerDataDecorator from cura import LayerPolygon +# from cura.Scene.CuraSceneNode import CuraSceneNode import numpy from time import time @@ -49,6 +51,7 @@ class ProcessSlicedLayersJob(Job): self._scene = Application.getInstance().getController().getScene() self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, -1) self._abort_requested = False + self._build_plate_number = None ## Aborts the processing of layers. # @@ -59,7 +62,11 @@ class ProcessSlicedLayersJob(Job): def abort(self): self._abort_requested = True + def setBuildPlate(self, new_value): + self._build_plate_number = new_value + def run(self): + Logger.log("d", "########## Processing new layer for [%s]..." % self._build_plate_number) start_time = time() if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": self._progress_message.show() @@ -72,16 +79,18 @@ class ProcessSlicedLayersJob(Job): Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) new_node = SceneNode() + new_node.addDecorator(BuildPlateDecorator(self._build_plate_number)) - ## Remove old layer data (if any) - for node in DepthFirstIterator(self._scene.getRoot()): - if node.callDecoration("getLayerData"): - node.getParent().removeChild(node) - break - if self._abort_requested: - if self._progress_message: - self._progress_message.hide() - return + # ## Remove old layer data (if any) + # for node in DepthFirstIterator(self._scene.getRoot()): + # if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number: + # Logger.log("d", " # Removing: %s", node) + # node.getParent().removeChild(node) + # #break + # if self._abort_requested: + # if self._progress_message: + # self._progress_message.hide() + # return # Force garbage collection. # For some reason, Python has a tendency to keep the layer data diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 607914f5c5..f6abe94702 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -10,12 +10,13 @@ from UM.Job import Job from UM.Application import Application from UM.Logger import Logger -from UM.Scene.SceneNode import SceneNode +#from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.Validator import ValidatorState from UM.Settings.SettingRelation import RelationType +from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode from cura.OneAtATimeIterator import OneAtATimeIterator from cura.Settings.ExtruderManager import ExtruderManager @@ -58,10 +59,14 @@ class StartSliceJob(Job): self._scene = Application.getInstance().getController().getScene() self._slice_message = slice_message self._is_cancelled = False + self._build_plate_number = None def getSliceMessage(self): return self._slice_message + def setBuildPlate(self, build_plate_number): + self._build_plate_number = build_plate_number + ## Check if a stack has any errors. ## returns true if it has errors, false otherwise. def _checkStackForErrors(self, stack): @@ -78,6 +83,10 @@ class StartSliceJob(Job): ## Runs the job that initiates the slicing. def run(self): + if self._build_plate_number is None: + self.setResult(StartJobResult.Error) + return + stack = Application.getInstance().getGlobalContainerStack() if not stack: self.setResult(StartJobResult.Error) @@ -141,14 +150,12 @@ class StartSliceJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - # temp hack to filter on build plate 0 - if (node.callDecoration("getBuildPlateNumber") == 0): - - if not getattr(node, "_outside_buildarea", False)\ - or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): + if (node.callDecoration("getBuildPlateNumber") == self._build_plate_number): + if not getattr(node, "_outside_buildarea", False) or (node.callDecoration("getStack") and any(node.callDecoration("getStack").getProperty(setting, "value") for setting in self._not_printed_mesh_settings)): temp_list.append(node) Job.yieldThread() + Logger.log("d", " objects to be sliced: %s", temp_list) if temp_list: object_groups.append(temp_list) diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py index b419c0b496..2529abf2d8 100644 --- a/plugins/ImageReader/ImageReader.py +++ b/plugins/ImageReader/ImageReader.py @@ -8,12 +8,14 @@ from PyQt5.QtCore import Qt from UM.Mesh.MeshReader import MeshReader from UM.Mesh.MeshBuilder import MeshBuilder -from UM.Scene.SceneNode import SceneNode +#from UM.Scene.SceneNode import SceneNode from UM.Math.Vector import Vector from UM.Job import Job from UM.Logger import Logger from .ImageReaderUI import ImageReaderUI +from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode + class ImageReader(MeshReader): def __init__(self): diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 963c8c75c8..2b0e82d4b3 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -66,13 +66,14 @@ class LayerPass(RenderPass): self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) + active_build_plate = Application.getInstance().activeBuildPlate for node in DepthFirstIterator(self._scene.getRoot()): if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible() and node.callDecoration("getBuildPlateNumber") == active_build_plate: layer_data = node.callDecoration("getLayerData") if not layer_data: continue diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index d37fbb7c9d..699cec23f5 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -75,7 +75,7 @@ class SolidView(View): for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): - if node.getMeshData() and node.isVisible() and (node.callDecoration("getBuildPlateNumber") == activeBuildPlateNumber): + if node.getMeshData() and node.isVisible(): # and (node.callDecoration("getBuildPlateNumber") == activeBuildPlateNumber): uniforms = {} shade_factor = 1.0 diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py index e4a59dcdaa..a0d530c78c 100644 --- a/plugins/X3DReader/X3DReader.py +++ b/plugins/X3DReader/X3DReader.py @@ -11,7 +11,8 @@ from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector from UM.Mesh.MeshBuilder import MeshBuilder from UM.Mesh.MeshReader import MeshReader -from UM.Scene.SceneNode import SceneNode +#from UM.Scene.SceneNode import SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode MYPY = False try: @@ -19,63 +20,63 @@ try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET - + # TODO: preserve the structure of scenes that contain several objects -# Use CADPart, for example, to distinguish between separate objects - +# Use CADPart, for example, to distinguish between separate objects + DEFAULT_SUBDIV = 16 # Default subdivision factor for spheres, cones, and cylinders EPSILON = 0.000001 class Shape: - + # Expects verts in MeshBuilder-ready format, as a n by 3 mdarray # with vertices stored in rows def __init__(self, verts, faces, index_base, name): self.verts = verts self.faces = faces # Those are here for debugging purposes only - self.index_base = index_base + self.index_base = index_base self.name = name - + class X3DReader(MeshReader): def __init__(self): super().__init__() self._supported_extensions = [".x3d"] self._namespaces = {} - + # Main entry point # Reads the file, returns a SceneNode (possibly with nested ones), or None def read(self, file_name): try: self.defs = {} self.shapes = [] - + tree = ET.parse(file_name) xml_root = tree.getroot() - + if xml_root.tag != "X3D": return None - scale = 1000 # Default X3D unit it one meter, while Cura's is one millimeters + scale = 1000 # Default X3D unit it one meter, while Cura's is one millimeters if xml_root[0].tag == "head": for head_node in xml_root[0]: if head_node.tag == "unit" and head_node.attrib.get("category") == "length": scale *= float(head_node.attrib["conversionFactor"]) - break + break xml_scene = xml_root[1] else: xml_scene = xml_root[0] - + if xml_scene.tag != "Scene": return None - + self.transform = Matrix() self.transform.setByScaleFactor(scale) self.index_base = 0 - + # Traverse the scene tree, populate the shapes list self.processChildNodes(xml_scene) - + if self.shapes: builder = MeshBuilder() builder.setVertices(numpy.concatenate([shape.verts for shape in self.shapes])) @@ -95,20 +96,20 @@ class X3DReader(MeshReader): else: return None - + except Exception: Logger.logException("e", "Exception in X3D reader") return None return node - + # ------------------------- XML tree traversal - + def processNode(self, xml_node): xml_node = self.resolveDefUse(xml_node) if xml_node is None: return - + tag = xml_node.tag if tag in ("Group", "StaticGroup", "CADAssembly", "CADFace", "CADLayer", "Collision"): self.processChildNodes(xml_node) @@ -120,8 +121,8 @@ class X3DReader(MeshReader): self.processTransform(xml_node) elif tag == "Shape": self.processShape(xml_node) - - + + def processShape(self, xml_node): # Find the geometry and the appearance inside the Shape geometry = appearance = None @@ -130,21 +131,21 @@ class X3DReader(MeshReader): appearance = self.resolveDefUse(sub_node) elif sub_node.tag in self.geometry_importers and not geometry: geometry = self.resolveDefUse(sub_node) - - # TODO: appearance is completely ignored. At least apply the material color... + + # TODO: appearance is completely ignored. At least apply the material color... if not geometry is None: try: - self.verts = self.faces = [] # Safeguard + self.verts = self.faces = [] # Safeguard self.geometry_importers[geometry.tag](self, geometry) m = self.transform.getData() verts = m.dot(self.verts)[:3].transpose() - + self.shapes.append(Shape(verts, self.faces, self.index_base, geometry.tag)) self.index_base += len(verts) - + except Exception: Logger.logException("e", "Exception in X3D reader while reading %s", geometry.tag) - + # Returns the referenced node if the node has USE, the same node otherwise. # May return None is USE points at a nonexistent node # In X3DOM, when both DEF and USE are in the same node, DEF is ignored. @@ -155,34 +156,34 @@ class X3DReader(MeshReader): if USE: return self.defs.get(USE, None) - DEF = node.attrib.get("DEF") + DEF = node.attrib.get("DEF") if DEF: - self.defs[DEF] = node + self.defs[DEF] = node return node - + def processChildNodes(self, node): for c in node: self.processNode(c) Job.yieldThread() - + # Since this is a grouping node, will recurse down the tree. # According to the spec, the final transform matrix is: # T * C * R * SR * S * -SR * -C # Where SR corresponds to the rotation matrix to scaleOrientation - # C and SR are rather exotic. S, slightly less so. + # C and SR are rather exotic. S, slightly less so. def processTransform(self, node): rot = readRotation(node, "rotation", (0, 0, 1, 0)) # (angle, axisVactor) tuple trans = readVector(node, "translation", (0, 0, 0)) # Vector scale = readVector(node, "scale", (1, 1, 1)) # Vector center = readVector(node, "center", (0, 0, 0)) # Vector scale_orient = readRotation(node, "scaleOrientation", (0, 0, 1, 0)) # (angle, axisVactor) tuple - - # Store the previous transform; in Cura, the default matrix multiplication is in place + + # Store the previous transform; in Cura, the default matrix multiplication is in place prev = Matrix(self.transform.getData()) # It's deep copy, I've checked - + # The rest of transform manipulation will be applied in place got_center = (center.x != 0 or center.y != 0 or center.z != 0) - + T = self.transform if trans.x != 0 or trans.y != 0 or trans.z !=0: T.translate(trans) @@ -202,13 +203,13 @@ class X3DReader(MeshReader): T.rotateByAxis(-scale_orient[0], scale_orient[1]) if got_center: T.translate(-center) - + self.processChildNodes(node) self.transform = prev - + # ------------------------- Geometry importers # They are supposed to fill the self.verts and self.faces arrays, the caller will do the rest - + # Primitives def processGeometryBox(self, node): @@ -228,14 +229,14 @@ class X3DReader(MeshReader): self.addVertex(-dx, -dy, dz) self.addVertex(-dx, -dy, -dz) self.addVertex(dx, -dy, -dz) - + self.addQuad(0, 1, 2, 3) # +y self.addQuad(4, 0, 3, 7) # +x self.addQuad(7, 3, 2, 6) # -z self.addQuad(6, 2, 1, 5) # -x self.addQuad(5, 1, 0, 4) # +z self.addQuad(7, 6, 5, 4) # -y - + # The sphere is subdivided into nr rings and ns segments def processGeometrySphere(self, node): r = readFloat(node, "radius", 0.5) @@ -247,16 +248,16 @@ class X3DReader(MeshReader): (nr, ns) = subdiv else: nr = ns = DEFAULT_SUBDIV - + lau = pi / nr # Unit angle of latitude (rings) for the given tesselation lou = 2 * pi / ns # Unit angle of longitude (segments) - + self.reserveFaceAndVertexCount(ns*(nr*2 - 2), 2 + (nr - 1)*ns) - + # +y and -y poles self.addVertex(0, r, 0) self.addVertex(0, -r, 0) - + # The non-polar vertices go from x=0, negative z plane counterclockwise - # to -x, to +z, to +x, back to -z for ring in range(1, nr): @@ -264,12 +265,12 @@ class X3DReader(MeshReader): self.addVertex(-r*sin(lou * seg) * sin(lau * ring), r*cos(lau * ring), -r*cos(lou * seg) * sin(lau * ring)) - + vb = 2 + (nr - 2) * ns # First vertex index for the bottom cap - + # Faces go in order: top cap, sides, bottom cap. # Sides go by ring then by segment. - + # Caps # Top cap face vertices go in order: down right up # (starting from +y pole) @@ -277,7 +278,7 @@ class X3DReader(MeshReader): for seg in range(ns): self.addTri(0, seg + 2, (seg + 1) % ns + 2) self.addTri(1, vb + (seg + 1) % ns, vb + seg) - + # Sides # Side face vertices go in order: down right upleft, downright up left for ring in range(nr - 2): @@ -288,24 +289,24 @@ class X3DReader(MeshReader): for seg in range(ns): nseg = (seg + 1) % ns self.addQuad(tvb + seg, bvb + seg, bvb + nseg, tvb + nseg) - + def processGeometryCone(self, node): r = readFloat(node, "bottomRadius", 1) height = readFloat(node, "height", 2) bottom = readBoolean(node, "bottom", True) side = readBoolean(node, "side", True) n = readInt(node, "subdivision", DEFAULT_SUBDIV) - + d = height / 2 angle = 2 * pi / n - + self.reserveFaceAndVertexCount((n if side else 0) + (n-2 if bottom else 0), n+1) - + # Vertex 0 is the apex, vertices 1..n are the bottom self.addVertex(0, d, 0) for i in range(n): self.addVertex(-r * sin(angle * i), -d, -r * cos(angle * i)) - + # Side face vertices go: up down right if side: for i in range(n): @@ -313,7 +314,7 @@ class X3DReader(MeshReader): if bottom: for i in range(2, n): self.addTri(1, i, i+1) - + def processGeometryCylinder(self, node): r = readFloat(node, "radius", 1) height = readFloat(node, "height", 2) @@ -321,13 +322,13 @@ class X3DReader(MeshReader): side = readBoolean(node, "side", True) top = readBoolean(node, "top", True) n = readInt(node, "subdivision", DEFAULT_SUBDIV) - + nn = n * 2 angle = 2 * pi / n hh = height/2 - + self.reserveFaceAndVertexCount((nn if side else 0) + (n - 2 if top else 0) + (n - 2 if bottom else 0), nn) - + # The seam is at x=0, z=-r, vertices go ccw - # to pos x, to neg z, to neg x, back to neg z for i in range(n): @@ -335,18 +336,18 @@ class X3DReader(MeshReader): rc = -r * cos(angle * i) self.addVertex(rs, hh, rc) self.addVertex(rs, -hh, rc) - + if side: for i in range(n): ni = (i + 1) % n self.addQuad(ni * 2 + 1, ni * 2, i * 2, i * 2 + 1) - + for i in range(2, nn-3, 2): if top: self.addTri(0, i, i+2) if bottom: self.addTri(1, i+1, i+3) - + # Semi-primitives def processGeometryElevationGrid(self, node): @@ -356,21 +357,21 @@ class X3DReader(MeshReader): nz = readInt(node, "zDimension", 0) height = readFloatArray(node, "height", False) ccw = readBoolean(node, "ccw", True) - + if nx <= 0 or nz <= 0 or len(height) < nx*nz: return # That's weird, the wording of the standard suggests grids with zero quads are somehow valid - + self.reserveFaceAndVertexCount(2*(nx-1)*(nz-1), nx*nz) - + for z in range(nz): for x in range(nx): self.addVertex(x * dx, height[z*nx + x], z * dz) - + for z in range(1, nz): for x in range(1, nx): self.addTriFlip((z - 1)*nx + x - 1, z*nx + x, (z - 1)*nx + x, ccw) self.addTriFlip((z - 1)*nx + x - 1, z*nx + x - 1, z*nx + x, ccw) - + def processGeometryExtrusion(self, node): ccw = readBoolean(node, "ccw", True) begin_cap = readBoolean(node, "beginCap", True) @@ -384,23 +385,23 @@ class X3DReader(MeshReader): # This converts X3D's axis/angle rotation to a 3x3 numpy matrix def toRotationMatrix(rot): (x, y, z) = rot[:3] - a = rot[3] + a = rot[3] s = sin(a) c = cos(a) t = 1-c return numpy.array(( (x * x * t + c, x * y * t - z*s, x * z * t + y * s), (x * y * t + z*s, y * y * t + c, y * z * t - x * s), - (x * z * t - y * s, y * z * t + x * s, z * z * t + c))) - + (x * z * t - y * s, y * z * t + x * s, z * z * t + c))) + orient = [toRotationMatrix(orient[i:i+4]) if orient[i+3] != 0 else None for i in range(0, len(orient), 4)] - + scale = readFloatArray(node, "scale", None) if scale: scale = [numpy.array(((scale[i], 0, 0), (0, 1, 0), (0, 0, scale[i+1]))) if scale[i] != 1 or scale[i+1] != 1 else None for i in range(0, len(scale), 2)] - - + + # Special treatment for the closed spine and cross section. # Let's save some memory by not creating identical but distinct vertices; # later we'll introduce conditional logic to link the last vertex with @@ -413,14 +414,14 @@ class X3DReader(MeshReader): ncf = nc if crossClosed else nc - 1 # Face count along the cross; for closed cross, it's the same as the # respective vertex count - + spine_closed = spine[0] == spine[-1] if spine_closed: spine = spine[:-1] ns = len(spine) spine = [Vector(*s) for s in spine] nsf = ns if spine_closed else ns - 1 - + # This will be used for fallback, where the current spine point joins # two collinear spine segments. No need to recheck the case of the # closed spine/last-to-first point juncture; if there's an angle there, @@ -442,7 +443,7 @@ class X3DReader(MeshReader): if v.cross(orig_y).length() > EPSILON: # Spine at angle with global y - rotate the z accordingly a = v.cross(orig_y) # Axis of rotation to get to the Z - (x, y, z) = a.normalized().getData() + (x, y, z) = a.normalized().getData() s = a.length()/v.length() c = sqrt(1-s*s) t = 1-c @@ -452,7 +453,7 @@ class X3DReader(MeshReader): (x * z * t + y * s, y * z * t - x * s, z * z * t + c))) orig_z = Vector(*m.dot(orig_z.getData())) return orig_z - + self.reserveFaceAndVertexCount(2*nsf*ncf + (nc - 2 if begin_cap else 0) + (nc - 2 if end_cap else 0), ns*nc) z = None @@ -482,151 +483,151 @@ class X3DReader(MeshReader): y = spt - sprev # If there's more than one point in the spine, z is already set. # One point in the spline is an error anyway. - + z = z.normalized() y = y.normalized() x = y.cross(z) # Already normalized m = numpy.array(((x.x, y.x, z.x), (x.y, y.y, z.y), (x.z, y.z, z.z))) - + # Columns are the unit vectors for the xz plane for the cross-section if orient: mrot = orient[i] if len(orient) > 1 else orient[0] if not mrot is None: m = m.dot(mrot) # Tested against X3DOM, the result matches, still not sure :( - + if scale: mscale = scale[i] if len(scale) > 1 else scale[0] if not mscale is None: m = m.dot(mscale) - + # First the cross-section 2-vector is scaled, # then rotated (which may make it a 3-vector), # then applied to the xz plane unit vectors - + sptv3 = numpy.array(spt.getData()[:3]) for cpt in cross: v = sptv3 + m.dot(cpt) self.addVertex(*v) - + if begin_cap: self.addFace([x for x in range(nc - 1, -1, -1)], ccw) - + # Order of edges in the face: forward along cross, forward along spine, # backward along cross, backward along spine, flipped if now ccw. # This order is assumed later in the texture coordinate assignment; # please don't change without syncing. - + for s in range(ns - 1): for c in range(ncf): self.addQuadFlip(s * nc + c, s * nc + (c + 1) % nc, (s + 1) * nc + (c + 1) % nc, (s + 1) * nc + c, ccw) - + if spine_closed: # The faces between the last and the first spine points b = (ns - 1) * nc for c in range(ncf): self.addQuadFlip(b + c, b + (c + 1) % nc, (c + 1) % nc, c, ccw) - + if end_cap: self.addFace([(ns - 1) * nc + x for x in range(0, nc)], ccw) - + # Triangle meshes # Helper for numerous nodes with a Coordinate subnode holding vertices # That all triangle meshes and IndexedFaceSet - # num_faces can be a function, in case the face count is a function of vertex count + # num_faces can be a function, in case the face count is a function of vertex count def startCoordMesh(self, node, num_faces): ccw = readBoolean(node, "ccw", True) self.readVertices(node) # This will allocate and fill the vertex array if hasattr(num_faces, "__call__"): num_faces = num_faces(self.getVertexCount()) self.reserveFaceCount(num_faces) - + return ccw - + def processGeometryIndexedTriangleSet(self, node): index = readIntArray(node, "index", []) num_faces = len(index) // 3 ccw = int(self.startCoordMesh(node, num_faces)) - + for i in range(0, num_faces*3, 3): self.addTri(index[i + 1 - ccw], index[i + ccw], index[i+2]) - + def processGeometryIndexedTriangleStripSet(self, node): strips = readIndex(node, "index") ccw = int(self.startCoordMesh(node, sum([len(strip) - 2 for strip in strips]))) - + for strip in strips: sccw = ccw # Running CCW value, reset for each strip for i in range(len(strip) - 2): self.addTri(strip[i + 1 - sccw], strip[i + sccw], strip[i+2]) sccw = 1 - sccw - + def processGeometryIndexedTriangleFanSet(self, node): fans = readIndex(node, "index") ccw = int(self.startCoordMesh(node, sum([len(fan) - 2 for fan in fans]))) - + for fan in fans: for i in range(1, len(fan) - 1): self.addTri(fan[0], fan[i + 1 - ccw], fan[i + ccw]) - + def processGeometryTriangleSet(self, node): ccw = int(self.startCoordMesh(node, lambda num_vert: num_vert // 3)) for i in range(0, self.getVertexCount(), 3): self.addTri(i + 1 - ccw, i + ccw, i+2) - + def processGeometryTriangleStripSet(self, node): strips = readIntArray(node, "stripCount", []) ccw = int(self.startCoordMesh(node, sum([n-2 for n in strips]))) - + vb = 0 for n in strips: sccw = ccw - for i in range(n-2): + for i in range(n-2): self.addTri(vb + i + 1 - sccw, vb + i + sccw, vb + i + 2) sccw = 1 - sccw vb += n - + def processGeometryTriangleFanSet(self, node): fans = readIntArray(node, "fanCount", []) ccw = int(self.startCoordMesh(node, sum([n-2 for n in fans]))) - + vb = 0 for n in fans: - for i in range(1, n-1): + for i in range(1, n-1): self.addTri(vb, vb + i + 1 - ccw, vb + i + ccw) vb += n - + # Quad geometries from the CAD module, might be relevant for printing - + def processGeometryQuadSet(self, node): ccw = self.startCoordMesh(node, lambda num_vert: 2*(num_vert // 4)) for i in range(0, self.getVertexCount(), 4): self.addQuadFlip(i, i+1, i+2, i+3, ccw) - + def processGeometryIndexedQuadSet(self, node): index = readIntArray(node, "index", []) num_quads = len(index) // 4 ccw = self.startCoordMesh(node, num_quads*2) - + for i in range(0, num_quads*4, 4): self.addQuadFlip(index[i], index[i+1], index[i+2], index[i+3], ccw) - + # 2D polygon geometries # Won't work for now, since Cura expects every mesh to have a nontrivial convex hull # The only way around that is merging meshes. - + def processGeometryDisk2D(self, node): innerRadius = readFloat(node, "innerRadius", 0) outerRadius = readFloat(node, "outerRadius", 1) n = readInt(node, "subdivision", DEFAULT_SUBDIV) - + angle = 2 * pi / n - + self.reserveFaceAndVertexCount(n*4 if innerRadius else n-2, n*2 if innerRadius else n) - + for i in range(n): s = sin(angle * i) c = cos(angle * i) @@ -635,11 +636,11 @@ class X3DReader(MeshReader): self.addVertex(innerRadius*c, innerRadius*s, 0) ni = (i+1) % n self.addQuad(2*i, 2*ni, 2*ni+1, 2*i+1) - + if not innerRadius: for i in range(2, n): self.addTri(0, i-1, i) - + def processGeometryRectangle2D(self, node): (x, y) = readFloatArray(node, "size", (2, 2)) self.reserveFaceAndVertexCount(2, 4) @@ -648,7 +649,7 @@ class X3DReader(MeshReader): self.addVertex(x/2, y/2, 0) self.addVertex(-x/2, y/2, 0) self.addQuad(0, 1, 2, 3) - + def processGeometryTriangleSet2D(self, node): verts = readFloatArray(node, "vertices", ()) num_faces = len(verts) // 6; @@ -656,25 +657,25 @@ class X3DReader(MeshReader): self.reserveFaceAndVertexCount(num_faces, num_faces * 3) for vert in verts: self.addVertex(*vert) - + # The front face is on the +Z side, so CCW is a variable for i in range(0, num_faces*3, 3): a = Vector(*verts[i+2]) - Vector(*verts[i]) b = Vector(*verts[i+1]) - Vector(*verts[i]) self.addTriFlip(i, i+1, i+2, a.x*b.y > a.y*b.x) - + # General purpose polygon mesh def processGeometryIndexedFaceSet(self, node): faces = readIndex(node, "coordIndex") ccw = self.startCoordMesh(node, sum([len(face) - 2 for face in faces])) - + for face in faces: if len(face) == 3: self.addTriFlip(face[0], face[1], face[2], ccw) elif len(face) > 3: self.addFace(face, ccw) - + geometry_importers = { "IndexedFaceSet": processGeometryIndexedFaceSet, "IndexedTriangleSet": processGeometryIndexedTriangleSet, @@ -695,7 +696,7 @@ class X3DReader(MeshReader): "Cylinder": processGeometryCylinder, "Cone": processGeometryCone } - + # Parses the Coordinate.@point field, fills the verts array. def readVertices(self, node): for c in node: @@ -704,9 +705,9 @@ class X3DReader(MeshReader): if not c is None: pt = c.attrib.get("point") if pt: - # allow the list of float values in 'point' attribute to - # be separated by commas or whitespace as per spec of - # XML encoding of X3D + # allow the list of float values in 'point' attribute to + # be separated by commas or whitespace as per spec of + # XML encoding of X3D # Ref ISO/IEC 19776-1:2015 : Section 5.1.2 co = [float(x) for vec in pt.split(',') for x in vec.split()] num_verts = len(co) // 3 @@ -715,57 +716,57 @@ class X3DReader(MeshReader): # Group by three for i in range(num_verts): self.verts[:3,i] = co[3*i:3*i+3] - + # Mesh builder helpers - + def reserveFaceAndVertexCount(self, num_faces, num_verts): # Unlike the Cura MeshBuilder, we use 4-vectors stored as columns for easier transform self.verts = numpy.zeros((4, num_verts), dtype=numpy.float32) self.verts[3,:] = numpy.ones((num_verts), dtype=numpy.float32) self.num_verts = 0 self.reserveFaceCount(num_faces) - + def reserveFaceCount(self, num_faces): self.faces = numpy.zeros((num_faces, 3), dtype=numpy.int32) self.num_faces = 0 - + def getVertexCount(self): return self.verts.shape[1] - + def addVertex(self, x, y, z): self.verts[0, self.num_verts] = x self.verts[1, self.num_verts] = y self.verts[2, self.num_verts] = z self.num_verts += 1 - + # Indices are 0-based for this shape, but they won't be zero-based in the merged mesh def addTri(self, a, b, c): self.faces[self.num_faces, 0] = self.index_base + a self.faces[self.num_faces, 1] = self.index_base + b self.faces[self.num_faces, 2] = self.index_base + c self.num_faces += 1 - + def addTriFlip(self, a, b, c, ccw): if ccw: self.addTri(a, b, c) else: self.addTri(b, a, c) - + # Needs to be convex, but not necessaily planar # Assumed ccw, cut along the ac diagonal def addQuad(self, a, b, c, d): self.addTri(a, b, c) self.addTri(c, d, a) - + def addQuadFlip(self, a, b, c, d, ccw): if ccw: self.addTri(a, b, c) self.addTri(c, d, a) else: self.addTri(a, c, b) - self.addTri(c, a, d) - - + self.addTri(c, a, d) + + # Arbitrary polygon triangulation. # Doesn't assume convexity and doesn't check the "convex" flag in the file. # Works by the "cutting of ears" algorithm: @@ -776,13 +777,13 @@ class X3DReader(MeshReader): def addFace(self, indices, ccw): # Resolve indices to coordinates for faster math face = [Vector(data=self.verts[0:3, i]) for i in indices] - + # Need a normal to the plane so that we can know which vertices form inner angles normal = findOuterNormal(face) - + if not normal: # Couldn't find an outer edge, non-planar polygon maybe? return - + # Find the vertex with the smallest inner angle and no points inside, cut off. Repeat until done n = len(face) vi = [i for i in range(n)] # We'll be using this to kick vertices from the face @@ -807,17 +808,17 @@ class X3DReader(MeshReader): if pointInsideTriangle(vx, next, prev, nextXprev): no_points_inside = False break - + if no_points_inside: max_cos = cos i_min = i - + self.addTriFlip(indices[vi[(i_min + n - 1) % n]], indices[vi[i_min]], indices[vi[(i_min + 1) % n]], ccw) vi.pop(i_min) n -= 1 self.addTriFlip(indices[vi[0]], indices[vi[1]], indices[vi[2]], ccw) - + # ------------------------------------------------------------ # X3D field parsers # ------------------------------------------------------------ @@ -844,7 +845,7 @@ def readInt(node, attr, default): if not s: return default return int(s, 0) - + def readBoolean(node, attr, default): s = node.attrib.get(attr) if not s: @@ -873,8 +874,8 @@ def readIndex(node, attr): chunk.append(v[i]) if chunk: chunks.append(chunk) - return chunks - + return chunks + # Given a face as a sequence of vectors, returns a normal to the polygon place that forms a right triple # with a vector along the polygon sequence and a vector backwards def findOuterNormal(face): @@ -894,25 +895,25 @@ def findOuterNormal(face): if rejection.dot(prev_rejection) < -EPSILON: # points on both sides of the edge - not an outer one is_outer = False break - elif rejection.length() > prev_rejection.length(): # Pick a greater rejection for numeric stability + elif rejection.length() > prev_rejection.length(): # Pick a greater rejection for numeric stability prev_rejection = rejection - + if is_outer: # Found an outer edge, prev_rejection is the rejection inside the face. Generate a normal. return edge.cross(prev_rejection) return False -# Given two *collinear* vectors a and b, returns the coefficient that takes b to a. +# Given two *collinear* vectors a and b, returns the coefficient that takes b to a. # No error handling. -# For stability, taking the ration between the biggest coordinates would be better... +# For stability, taking the ration between the biggest coordinates would be better... def ratio(a, b): if b.x > EPSILON or b.x < -EPSILON: return a.x / b.x elif b.y > EPSILON or b.y < -EPSILON: return a.y / b.y else: - return a.z / b.z - + return a.z / b.z + def pointInsideTriangle(vx, next, prev, nextXprev): vxXprev = vx.cross(prev) r = ratio(vxXprev, nextXprev) @@ -921,4 +922,4 @@ def pointInsideTriangle(vx, next, prev, nextXprev): vxXnext = vx.cross(next); s = -ratio(vxXnext, nextXprev) return s > 0 and (s + r) < 1 - + diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 03d0ce9ecd..29d8b439a8 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -409,6 +409,7 @@ UM.MainWindow { id: objectsList; visible: false; + //z: -10; anchors { top: objectsButton.top; diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 4a7c84c41e..cde7f065fa 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -55,7 +55,7 @@ Rectangle //anchors.right: parent.right width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 text: Cura.ObjectManager.getItem(index).name; - color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text + color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectManager.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) elide: Text.ElideRight } @@ -95,7 +95,7 @@ Rectangle topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; - bottom: buildPlateSelection.top; + bottom: filterBuildPlateCheckbox.top; bottomMargin: UM.Theme.getSize("default_margin").height; } @@ -115,6 +115,25 @@ Rectangle } } + + CheckBox + { + id: filterBuildPlateCheckbox + checked: boolCheck(UM.Preferences.getValue("view/filter_current_build_plate")) + onClicked: UM.Preferences.setValue("view/filter_current_build_plate", checked) + + text: catalog.i18nc("@option:check","Filter active build plate"); + + anchors + { + left: parent.left; + topMargin: UM.Theme.getSize("default_margin").height; + bottomMargin: UM.Theme.getSize("default_margin").height; + leftMargin: UM.Theme.getSize("default_margin").height; + bottom: buildPlateSelection.top; + } + } + ListModel { id: buildPlatesModel diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index ad6c2ce050..c74fb5720d 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -304,7 +304,7 @@ UM.PreferencesPage text: catalog.i18nc("@option:check","Slice automatically"); } } - + Item { //: Spacer @@ -451,6 +451,20 @@ UM.PreferencesPage text: catalog.i18nc("@label","Opening and saving files") } + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should newly loaded models be arranged on the build palte?") + + CheckBox + { + id: arrangeOnLoadCheckbox + text: catalog.i18nc("@option:check","Arrange objects on load") + checked: boolCheck(UM.Preferences.getValue("cura/arrange_objects_on_load")) + onCheckedChanged: UM.Preferences.setValue("cura/arrange_objects_on_load", checked) + } + } + UM.TooltipArea { width: childrenRect.width height: childrenRect.height From 7bf40ef82b436d5621a2b60c461e7bd17174704a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 17:15:56 +0100 Subject: [PATCH 188/764] Add dropdown to per object settings for quick access to mesh types (not yet functional) --- .../PerObjectSettingsPanel.qml | 71 ++++++++++++++----- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index c15431c9e2..57b98b3161 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -26,17 +26,62 @@ Item { spacing: UM.Theme.getSize("default_margin").height + Row + { + spacing: UM.Theme.getSize("default_margin").width + + Label + { + text: catalog.i18nc("@label","Mesh Type") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + height: UM.Theme.getSize("setting").height + verticalAlignment: Text.AlignVCenter + } + + ComboBox + { + id: meshTypeSelection + style: UM.Theme.styles.combobox + model: ListModel + { + id: meshTypeModel + Component.onCompleted: + { + meshTypeModel.append({ + type: "", + text: catalog.i18nc("@label", "Normal model") + }); + meshTypeModel.append({ + type: "support_mesh", + text: catalog.i18nc("@label", "Print as support") + }); + meshTypeModel.append({ + type: "anti_overhang_mesh", + text: catalog.i18nc("@label", "Remove support for overlap with other models") + }); + meshTypeModel.append({ + type: "cutting_mesh", + text: catalog.i18nc("@label", "Modify extruder or settings for overlap with other models") + }); + } + } + } + } + Column { // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar. // It kinda looks ugly otherwise (big panel, no content on it) + id: currentSettings property int maximumHeight: 200 * screenScaleFactor height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) + visible: ["support_mesh", "anti_overhang_mesh"].indexOf(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) == -1 ScrollView { height: parent.height - width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height + width: UM.Theme.getSize("setting").width style: UM.Theme.styles.scrollview ListView @@ -58,6 +103,7 @@ Item { delegate: Row { + spacing: - UM.Theme.getSize("default_margin").width Loader { id: settingLoader @@ -112,7 +158,7 @@ Item { Button { - width: (UM.Theme.getSize("setting").height / 2) | 0 + width: Math.floor(UM.Theme.getSize("setting").height / 2) height: UM.Theme.getSize("setting").height onClicked: addedSettingsModel.setVisible(model.key, false) @@ -125,7 +171,7 @@ Item { { anchors.verticalCenter: parent.verticalCenter width: parent.width - height: parent.height / 2 + height: width sourceSize.width: width sourceSize.height: width color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button") @@ -201,9 +247,9 @@ Item { Button { - id: customise_settings_button; - height: UM.Theme.getSize("setting").height; - visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1 + id: customiseSettingsButton; + height: UM.Theme.getSize("setting_control").height; + visible: currentSettings.visible text: catalog.i18nc("@action:button", "Select settings"); @@ -223,21 +269,12 @@ Item { { text: control.text; color: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default") anchors.centerIn: parent } } onClicked: settingPickDialog.visible = true; - - Connections - { - target: UM.Preferences; - - onPreferenceChanged: - { - customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode")) - } - } } } @@ -325,7 +362,7 @@ Item { } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} expanded: [ "*" ] - exclude: [ "machine_settings", "command_line_settings" ] + exclude: [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] } delegate:Loader { From 316ae49b0bf565d4d13d3811c623774c7674eeec Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 18:25:09 +0100 Subject: [PATCH 189/764] Fix setting mesh type through Per Model Settings combobox --- .../PerObjectSettingsPanel.qml | 4 ++++ .../PerObjectSettingsTool.py | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 57b98b3161..138749c1bf 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -43,6 +43,9 @@ Item { { id: meshTypeSelection style: UM.Theme.styles.combobox + onActivated: { + UM.ActiveTool.setProperty("MeshType", model.get(index).type) + } model: ListModel { id: meshTypeModel @@ -94,6 +97,7 @@ Item { id: addedSettingsModel; containerId: Cura.MachineManager.activeDefinitionId expanded: [ "*" ] + exclude: [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] visibilityHandler: Cura.PerObjectSettingVisibilityHandler { diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index d0cb53c4f8..119c8db41d 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -8,6 +8,7 @@ from UM.Application import Application from UM.Preferences import Preferences from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from cura.Settings.ExtruderManager import ExtruderManager +from UM.Settings.SettingInstance import SettingInstance from UM.Event import Event @@ -70,6 +71,26 @@ class PerObjectSettingsTool(Tool): selected_object.addDecorator(SettingOverrideDecorator()) selected_object.callDecoration("setActiveExtruder", extruder_stack_id) + def setMeshType(self, mesh_type): + selected_object = Selection.getSelectedObject(0) + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + selected_object.addDecorator(SettingOverrideDecorator()) + stack = selected_object.callDecoration("getStack") + + settings = stack.getTop() + for property_key in ["infill_mesh", "cutting_mesh", "support_mesh", "anti_overhang_mesh"]: + if property_key != mesh_type: + if settings.getInstance(property_key): + settings.removeInstance(property_key) + else: + if not (settings.getInstance(property_key) and settings.getProperty(property_key, "value")): + definition = stack.getSettingDefinition(property_key) + new_instance = SettingInstance(definition, settings) + new_instance.setProperty("value", True) + new_instance.resetState() # Ensure that the state is not seen as a user state. + settings.addInstance(new_instance) + def _onPreferenceChanged(self, preference): if preference == "cura/active_mode": self._advanced_mode = Preferences.getInstance().getValue(preference) == 1 From 9c3e50c494de2bbe7c97562774fa16e339c46bd5 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 19:21:05 +0100 Subject: [PATCH 190/764] Ignore models without a convex hull when auto arranging --- cura/Arrange.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Arrange.py b/cura/Arrange.py index 0d1f2e0c06..335e42a267 100755 --- a/cura/Arrange.py +++ b/cura/Arrange.py @@ -52,6 +52,8 @@ class Arrange: # Place all objects fixed nodes for fixed_node in fixed_nodes: vertices = fixed_node.callDecoration("getConvexHull") + if not vertices: + continue points = copy.deepcopy(vertices._points) shape_arr = ShapeArray.fromPolygon(points, scale = scale) arranger.place(0, 0, shape_arr) From a1320939e833f9bf7024b9e52495a642b54759cc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 21:42:10 +0100 Subject: [PATCH 191/764] Update mesh type dropdown when to reflect the selected object --- .../PerObjectSettingsPanel.qml | 23 +++++++++++++++++++ .../PerObjectSettingsTool.py | 15 +++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 138749c1bf..de396b1570 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -67,9 +67,32 @@ Item { type: "cutting_mesh", text: catalog.i18nc("@label", "Modify extruder or settings for overlap with other models") }); + + meshTypeSelection.updateCurrentIndex(); } } + + function updateCurrentIndex() + { + var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); + for(var index=0; index < meshTypeSelection.model.count; index++) + { + if(meshTypeSelection.model.get(index).type == mesh_type) + { + meshTypeSelection.currentIndex = index; + return; + } + } + meshTypeSelection.currentIndex = 0; + } } + + Connections + { + target: UM.Selection + onSelectionChanged: meshTypeSelection.updateCurrentIndex() + } + } Column diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 119c8db41d..f0fc0f7cb5 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -19,7 +19,7 @@ class PerObjectSettingsTool(Tool): super().__init__() self._model = None - self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder") + self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder", "MeshType") self._advanced_mode = False self._multi_extrusion = False @@ -91,6 +91,19 @@ class PerObjectSettingsTool(Tool): new_instance.resetState() # Ensure that the state is not seen as a user state. settings.addInstance(new_instance) + def getMeshType(self): + selected_object = Selection.getSelectedObject(0) + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + return "" + + settings = stack.getTop() + for property_key in ["infill_mesh", "cutting_mesh", "support_mesh", "anti_overhang_mesh"]: + if settings.getInstance(property_key) and settings.getProperty(property_key, "value"): + return property_key + + return "" + def _onPreferenceChanged(self, preference): if preference == "cura/active_mode": self._advanced_mode = Preferences.getInstance().getValue(preference) == 1 From 69b707cbfe490ccd7cebfb9df907c637a3bd1e09 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 9 Nov 2017 22:02:20 +0100 Subject: [PATCH 192/764] Fix coloring support_mesh with the color of the support_extruder --- plugins/SolidView/SolidView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 56d8cf11d7..5c8f9c929f 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -103,14 +103,14 @@ class SolidView(View): per_mesh_stack = node.callDecoration("getStack") if per_mesh_stack: if per_mesh_stack.getProperty("support_mesh", "value"): - extruder_index = global_container_stack.getProperty("support_extruder_nr", "value") + extruder_index = int(global_container_stack.getProperty("support_extruder_nr", "value")) try: material_color = self._extruders_model.getItem(extruder_index)["color"] except KeyError: material_color = self._extruders_model.defaultColors[0] - if int(extruder_index) != int(ExtruderManager.getInstance().activeExtruderIndex): + if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: # Shade objects that are printed with the non-active extruder 25% darker shade_factor = 0.6 try: From ac27b3f8115a9f9d6786f13e555445eec6d7b3d2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 10 Nov 2017 10:08:27 +0100 Subject: [PATCH 193/764] Add infill_mesh as an option to the dropdown --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index de396b1570..e110c01f75 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -65,7 +65,11 @@ Item { }); meshTypeModel.append({ type: "cutting_mesh", - text: catalog.i18nc("@label", "Modify extruder or settings for overlap with other models") + text: catalog.i18nc("@label", "Modify settings for overlap with other models") + }); + meshTypeModel.append({ + type: "infill_mesh", + text: catalog.i18nc("@label", "Modify settings for overlap with infill of other models") }); meshTypeSelection.updateCurrentIndex(); From e00ac591bf21acc8c46a436d809d0321dd272d12 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 10 Nov 2017 12:24:32 +0100 Subject: [PATCH 194/764] Use material color for cutting_mesh and infill_mesh --- plugins/SolidView/SolidView.py | 8 ++++++-- resources/shaders/transparent_object.shader | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 5c8f9c929f..3fb93c0332 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -86,6 +86,8 @@ class SolidView(View): uniforms = {} shade_factor = 1.0 + per_mesh_stack = node.callDecoration("getStack") + if not multi_extrusion: if global_container_stack: material = global_container_stack.findContainer({ "type": "material" }) @@ -100,7 +102,6 @@ class SolidView(View): extruder_index = max(0, self._extruders_model.find("id", extruder_id)) # Use the support extruder instead of the active extruder if this is a support_mesh - per_mesh_stack = node.callDecoration("getStack") if per_mesh_stack: if per_mesh_stack.getProperty("support_mesh", "value"): extruder_index = int(global_container_stack.getProperty("support_extruder_nr", "value")) @@ -126,7 +127,10 @@ class SolidView(View): pass if getattr(node, "_non_printing_mesh", False): - renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) + if per_mesh_stack and (per_mesh_stack.getProperty("infill_mesh", "value") or per_mesh_stack.getProperty("cutting_mesh", "value")): + renderer.queueNode(node, shader = self._non_printing_shader, uniforms = uniforms, transparent = True) + else: + renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) elif getattr(node, "_outside_buildarea", False): renderer.queueNode(node, shader = self._disabled_shader) else: diff --git a/resources/shaders/transparent_object.shader b/resources/shaders/transparent_object.shader index faa43bb46c..75fe7e4b2c 100644 --- a/resources/shaders/transparent_object.shader +++ b/resources/shaders/transparent_object.shader @@ -111,6 +111,7 @@ u_modelMatrix = model_matrix u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_lightPosition = light_0_position +u_diffuseColor = diffuse_color [attributes] a_vertex = vertex From dcdd1f86508495cd676de32eb0f0f06cc718f1bc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 10 Nov 2017 12:27:15 +0100 Subject: [PATCH 195/764] Tweak descriptions of mesh type options --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index e110c01f75..65b67791c7 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -61,7 +61,7 @@ Item { }); meshTypeModel.append({ type: "anti_overhang_mesh", - text: catalog.i18nc("@label", "Remove support for overlap with other models") + text: catalog.i18nc("@label", "Don't support overlap with other models") }); meshTypeModel.append({ type: "cutting_mesh", @@ -69,7 +69,7 @@ Item { }); meshTypeModel.append({ type: "infill_mesh", - text: catalog.i18nc("@label", "Modify settings for overlap with infill of other models") + text: catalog.i18nc("@label", "Modify settings for infill of other models") }); meshTypeSelection.updateCurrentIndex(); From aa9f9d5b88ef7e1da0885a82d23ec413bbb563b1 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 10 Nov 2017 16:59:06 +0100 Subject: [PATCH 196/764] Add line thickness and feedrate to the data sent from the backend --- cura/Layer.py | 4 ++-- cura/LayerDataBuilder.py | 12 ++++++++--- cura/LayerPolygon.py | 20 ++++++++++++++++--- plugins/CuraEngineBackend/Cura.proto | 4 ++++ .../ProcessSlicedLayersJob.py | 11 +++++----- plugins/GCodeReader/GCodeReader.py | 6 ++++-- 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/cura/Layer.py b/cura/Layer.py index d5ef5c9bb4..9cd45380fc 100644 --- a/cura/Layer.py +++ b/cura/Layer.py @@ -47,12 +47,12 @@ class Layer: return result - def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices): + def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices): result_vertex_offset = vertex_offset result_index_offset = index_offset self._element_count = 0 for polygon in self._polygons: - polygon.build(result_vertex_offset, result_index_offset, vertices, colors, line_dimensions, extruders, line_types, indices) + polygon.build(result_vertex_offset, result_index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices) result_vertex_offset += polygon.lineMeshVertexCount() result_index_offset += polygon.lineMeshElementCount() self._element_count += polygon.elementCount diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py index 6e50611e64..d6cc81a4e9 100755 --- a/cura/LayerDataBuilder.py +++ b/cura/LayerDataBuilder.py @@ -20,11 +20,11 @@ class LayerDataBuilder(MeshBuilder): if layer not in self._layers: self._layers[layer] = Layer(layer) - def addPolygon(self, layer, polygon_type, data, line_width): + def addPolygon(self, layer, polygon_type, data, line_width, line_thickness, line_feedrate): if layer not in self._layers: self.addLayer(layer) - p = LayerPolygon(self, polygon_type, data, line_width) + p = LayerPolygon(self, polygon_type, data, line_width, line_thickness, line_feedrate) self._layers[layer].polygons.append(p) def getLayer(self, layer): @@ -64,13 +64,14 @@ class LayerDataBuilder(MeshBuilder): line_dimensions = numpy.empty((vertex_count, 2), numpy.float32) colors = numpy.empty((vertex_count, 4), numpy.float32) indices = numpy.empty((index_count, 2), numpy.int32) + feedrates = numpy.empty((vertex_count), numpy.float32) extruders = numpy.empty((vertex_count), numpy.float32) line_types = numpy.empty((vertex_count), numpy.float32) vertex_offset = 0 index_offset = 0 for layer, data in sorted(self._layers.items()): - ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices) + ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices) self._element_counts[layer] = data.elementCount self.addVertices(vertices) @@ -107,6 +108,11 @@ class LayerDataBuilder(MeshBuilder): "value": line_types, "opengl_name": "a_line_type", "opengl_type": "float" + }, + "feedrates": { + "value": feedrates, + "opengl_name": "a_feedrate", + "opengl_type": "float" } } diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 7f41351b7f..9766e0c82a 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -28,7 +28,8 @@ class LayerPolygon: # \param data new_points # \param line_widths array with line widths # \param line_thicknesses: array with type as index and thickness as value - def __init__(self, extruder, line_types, data, line_widths, line_thicknesses): + # \param line_feedrates array with line feedrates + def __init__(self, extruder, line_types, data, line_widths, line_thicknesses, line_feedrates): self._extruder = extruder self._types = line_types for i in range(len(self._types)): @@ -37,6 +38,7 @@ class LayerPolygon: self._data = data self._line_widths = line_widths self._line_thicknesses = line_thicknesses + self._line_feedrates = line_feedrates self._vertex_begin = 0 self._vertex_end = 0 @@ -84,10 +86,11 @@ class LayerPolygon: # \param vertices : vertex numpy array to be filled # \param colors : vertex numpy array to be filled # \param line_dimensions : vertex numpy array to be filled + # \param feedrates : vertex numpy array to be filled # \param extruders : vertex numpy array to be filled # \param line_types : vertex numpy array to be filled # \param indices : index numpy array to be filled - def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices): + def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices): if self._build_cache_line_mesh_mask is None or self._build_cache_needed_points is None: self.buildCache() @@ -109,10 +112,13 @@ class LayerPolygon: # Create an array with colors for each vertex and remove the color data for the points that has been thrown away. colors[self._vertex_begin:self._vertex_end, :] = numpy.tile(self._colors, (1, 2)).reshape((-1, 4))[needed_points_list.ravel()] - # Create an array with line widths for each vertex. + # Create an array with line widths and thicknesses for each vertex. line_dimensions[self._vertex_begin:self._vertex_end, 0] = numpy.tile(self._line_widths, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] line_dimensions[self._vertex_begin:self._vertex_end, 1] = numpy.tile(self._line_thicknesses, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] + # Create an array with feedrates for each line + feedrates[self._vertex_begin:self._vertex_end] = numpy.tile(self._line_feedrates, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] + extruders[self._vertex_begin:self._vertex_end] = self._extruder # Convert type per vertex to type per line @@ -166,6 +172,14 @@ class LayerPolygon: @property def lineWidths(self): return self._line_widths + + @property + def lineThicknesses(self): + return self._line_thicknesses + + @property + def lineFeedrates(self): + return self._line_feedrates @property def jumpMask(self): diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c2e4e5bb5f..69612210ec 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -61,6 +61,8 @@ message Polygon { Type type = 1; // Type of move bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) float line_width = 3; // The width of the line being laid down + float line_thickness = 4; // The thickness of the line being laid down + float line_feedrate = 5; // The feedrate of the line being laid down } message LayerOptimized { @@ -82,6 +84,8 @@ message PathSegment { bytes points = 3; // The points defining the line segments, bytes of float[2/3] array of length N+1 bytes line_type = 4; // Type of line segment as an unsigned char array of length 1 or N, where N is the number of line segments in this path bytes line_width = 5; // The widths of the line segments as bytes of a float array of length 1 or N + bytes line_thickness = 6; // The thickness of the line segments as bytes of a float array of length 1 or N + bytes line_feedrate = 7; // The feedrate of the line segments as bytes of a float array of length 1 or N } diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index ab93a01204..30fcf6cced 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -128,10 +128,11 @@ class ProcessSlicedLayersJob(Job): line_widths = numpy.fromstring(polygon.line_width, dtype="f4") # Convert bytearray to numpy array line_widths = line_widths.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. - # In the future, line_thicknesses should be given by CuraEngine as well. - # Currently the infill layer thickness also translates to line width - line_thicknesses = numpy.zeros(line_widths.shape, dtype="f4") - line_thicknesses[:] = layer.thickness / 1000 # from micrometer to millimeter + line_thicknesses = numpy.fromstring(polygon.line_thickness, dtype="f4") # Convert bytearray to numpy array + line_thicknesses = line_thicknesses.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. + + line_feedrates = numpy.fromstring(polygon.line_feedrate, dtype="f4") # Convert bytearray to numpy array + line_feedrates = line_feedrates.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. # Create a new 3D-array, copy the 2D points over and insert the right height. # This uses manual array creation + copy rather than numpy.insert since this is @@ -146,7 +147,7 @@ class ProcessSlicedLayersJob(Job): new_points[:, 1] = points[:, 2] new_points[:, 2] = -points[:, 1] - this_poly = LayerPolygon.LayerPolygon(extruder, line_types, new_points, line_widths, line_thicknesses) + this_poly = LayerPolygon.LayerPolygon(extruder, line_types, new_points, line_widths, line_thicknesses, line_feedrates) this_poly.buildCache() this_layer.polygons.append(this_poly) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 9107ec3258..c7aea0ddcc 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -114,9 +114,11 @@ class GCodeReader(MeshReader): line_types = numpy.empty((count - 1, 1), numpy.int32) line_widths = numpy.empty((count - 1, 1), numpy.float32) line_thicknesses = numpy.empty((count - 1, 1), numpy.float32) + line_feedrates = numpy.empty((count - 1, 1), numpy.float32) # TODO: need to calculate actual line width based on E values line_widths[:, 0] = 0.35 # Just a guess - line_thicknesses[:, 0] = layer_thickness + line_thicknesses[:, 0] = layer_thickness # TODO Same for all, but it should be calculated from the layer height differences + line_feedrates[:, 0] = 50 # TODO Now we use 50mm/s as a demo, it should be obtained from the GCode points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: @@ -127,7 +129,7 @@ class GCodeReader(MeshReader): line_widths[i - 1] = 0.1 i += 1 - this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses) + this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) this_poly.buildCache() this_layer.polygons.append(this_poly) From 6d05c320a83e77dc559db2bd2d32dc4beadaa28c Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sat, 11 Nov 2017 17:51:33 +0100 Subject: [PATCH 197/764] Remove disfunctional initial layer z offset settings The pull request for the engine wasn't merged. It looks like the pull request for the front-end settings wasn't merged either, but here they are. They shouldn't be here. Fixes #2744. --- resources/definitions/fdmprinter.def.json | 24 ----------------------- 1 file changed, 24 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 550733badf..ae7050a546 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4132,30 +4132,6 @@ "settable_per_extruder": true, "limit_to_extruder": "adhesion_extruder_nr" }, - "z_offset_layer_0": - { - "label": "Initial Layer Z Offset", - "description": "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly.", - "unit": "mm", - "type": "float", - "default_value": 0, - "minimum_value_warning": "0", - "maximum_value_warning": "layer_height_0", - "enabled": "resolveOrValue('adhesion_type') != 'raft'", - "settable_per_mesh": false, - "settable_per_extruder": false - }, - "z_offset_taper_layers": - { - "label": "Z Offset Taper Layers", - "description": "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print.", - "type": "int", - "default_value": 0, - "minimum_value": "0", - "enabled": "resolveOrValue('adhesion_type') != 'raft' and z_offset_layer_0 != 0", - "settable_per_mesh": false, - "settable_per_extruder": false - }, "raft_margin": { "label": "Raft Extra Margin", From 826f438c7219cfa777675bfd2ec03848db794084 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Nov 2017 15:29:31 +0100 Subject: [PATCH 198/764] Get target temperatures from M105 responses Contributes to #2760 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 59 ++++++++++++++++--- 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 3b9603cc1b..26a09242b1 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -125,6 +125,29 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _homeBed(self): self._sendCommand("G28 Z") + ## Updates the target bed temperature from the printer, and emit a signal if it was changed. + # + # /param temperature The new target temperature of the bed. + # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature + def _updateTargetBedTemperature(self, temperature): + if self._target_bed_temperature == temperature: + return False + self._target_bed_temperature = temperature + self.targetBedTemperatureChanged.emit() + return True + + ## Updates the target hotend temperature from the printer, and emit a signal if it was changed. + # + # /param index The index of the hotend. + # /param temperature The new target temperature of the hotend. + # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature + def _updateTargetHotendTemperature(self, index, temperature): + if self._target_hotend_temperatures[index] == temperature: + return False + self._target_hotend_temperatures[index] = temperature + self.targetHotendTemperaturesChanged.emit() + return True + ## A name for the device. @pyqtProperty(str, constant = True) def name(self): @@ -511,16 +534,36 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._setErrorState(line[6:]) elif b" T:" in line or line.startswith(b"T:"): # Temperature message + temperature_matches = re.findall(b"T(\d*):s?*([\d\.]+)\s?\/?([\d\.]+)?", line) + temperature_set = False try: - self._setHotendTemperature(self._temperature_requested_extruder_index, float(re.search(b"T: *([0-9\.]*)", line).group(1))) + for match in temperature_matches: + if match[0]: + extruder_nr = int(match[0]) + if match[1]: + self._setHotendTemperature(extruder_nr, float(match[1])) + temperature_set = True + if match[2]: + self._updateTargetHotendTemperature(extruder_nr, float(match[2])) + else: + requested_temperatures = match + if not temperature_set and requested_temperatures: + if requested_temperatures[1]: + self._setHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) + if requested_temperatures[2]: + self._updateTargetHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) except: - pass - if b"B:" in line: # Check if it's a bed temperature - try: - self._setBedTemperature(float(re.search(b"B: *([0-9\.]*)", line).group(1))) - except Exception as e: - pass - #TODO: temperature changed callback + Logger.log("w", "Could not parse hotend temperatures from response: %s", line) + # Check if there's also a bed temperature + temperature_matches = re.findall(b"B:\s?*([\d\.]+)\s?\/?([\d\.]+)?", line) + try: + if match[0]: + self._setBedTemperature(float(match[0])) + if match[1]: + self._updateTargetBedTemperature(float(match[1])) + except: + Logger.log("w", "Could not parse bed temperature from response: %s", line) + elif b"_min" in line or b"_max" in line: tag, value = line.split(b":", 1) self._setEndstopState(tag,(b"H" in value or b"TRIGGERED" in value)) From 698f42b837cc7404e022cd820d668a72c8525d78 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Nov 2017 15:37:43 +0100 Subject: [PATCH 199/764] Set job name when starting a print and clear it after printing --- plugins/USBPrinting/USBPrinterOutputDevice.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 26a09242b1..19e19e6487 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -52,6 +52,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._heatup_wait_start_time = time.time() + self.jobStateChanged.connect(self._onJobStateChanged) + ## Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = queue.Queue() @@ -469,7 +471,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # # \param nodes A collection of scene nodes to send. This is ignored. # \param file_name \type{string} A suggestion for a file name to write. - # This is ignored. # \param filter_by_machine Whether to filter MIME types by machine. This # is ignored. # \param kwargs Keyword arguments. @@ -485,6 +486,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._error_message.show() return + self.setJobName(file_name) + Application.getInstance().showPrintMonitor.emit(True) self.startPrint() @@ -643,6 +646,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elif job_state == "abort": self.cancelPrint() + def _onJobStateChanged(self): + # clear the job name when printing is done or aborted + if self._job_state == "ready": + self.setJobName("") + ## Set the progress of the print. # It will be normalized (based on max_progress) to range 0 - 100 def setProgress(self, progress, max_progress = 100): From e0c37cc56eeaf23fe1046f23eb1c9e733fcddf30 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 12 Nov 2017 20:59:31 +0100 Subject: [PATCH 200/764] Add elapsed time and total time --- plugins/USBPrinting/USBPrinterOutputDevice.py | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 19e19e6487..b9388808ae 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -13,6 +13,7 @@ from UM.Application import Application from UM.Logger import Logger from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from UM.Message import Message +from UM.Qt.Duration import DurationFormat from PyQt5.QtCore import QUrl, pyqtSlot, pyqtSignal, pyqtProperty @@ -62,7 +63,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): ## Set when print is started in order to check running time. self._print_start_time = None - self._print_start_time_100 = None + self._print_estimated_time = None ## Keep track where in the provided g-code the print is self._gcode_position = 0 @@ -189,7 +190,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # Reset line number. If this is not done, first line is sometimes ignored self._gcode.insert(0, "M110") self._gcode_position = 0 - self._print_start_time_100 = None self._is_printing = True self._print_start_time = time.time() @@ -487,6 +487,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): return self.setJobName(file_name) + self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) Application.getInstance().showPrintMonitor.emit(True) self.startPrint() @@ -605,8 +606,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _sendNextGcodeLine(self): if self._gcode_position >= len(self._gcode): return - if self._gcode_position == 100: - self._print_start_time_100 = time.time() line = self._gcode[self._gcode_position] if ";" in line: @@ -630,8 +629,18 @@ class USBPrinterOutputDevice(PrinterOutputDevice): checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line))) self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) + + progress = (self._gcode_position / len(self._gcode)) + + elapsed_time = int(time.time() - self._print_start_time) + self.setTimeElapsed(elapsed_time) + estimated_time = self._print_estimated_time + if progress > .1: + estimated_time = self._print_estimated_time * (1-progress) + elapsed_time + self.setTimeTotal(estimated_time) + self._gcode_position += 1 - self.setProgress((self._gcode_position / len(self._gcode)) * 100) + self.setProgress(progress * 100) self.progressChanged.emit() ## Set the state of the print. @@ -647,9 +656,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.cancelPrint() def _onJobStateChanged(self): - # clear the job name when printing is done or aborted + # clear the job name & times when printing is done or aborted if self._job_state == "ready": self.setJobName("") + self.setTimeElapsed(0) + self.setTimeTotal(0) ## Set the progress of the print. # It will be normalized (based on max_progress) to range 0 - 100 From 2d2b943d073c56a8ada45a21ed695c4fa5e318b6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 13 Nov 2017 10:44:49 +0100 Subject: [PATCH 201/764] Fix getting temperatures --- plugins/USBPrinting/USBPrinterOutputDevice.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index b9388808ae..dd8a2f0c4c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -509,6 +509,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): ## Listen thread function. def _listen(self): Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port) + container_stack = Application.getInstance().getGlobalContainerStack() temperature_request_timeout = time.time() ok_timeout = time.time() while self._connection_state == ConnectionState.connected: @@ -538,12 +539,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._setErrorState(line[6:]) elif b" T:" in line or line.startswith(b"T:"): # Temperature message - temperature_matches = re.findall(b"T(\d*):s?*([\d\.]+)\s?\/?([\d\.]+)?", line) + temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) temperature_set = False try: for match in temperature_matches: if match[0]: extruder_nr = int(match[0]) + if extruder_nr >= container_stack.getProperty("machine_extruder_count", "value"): + continue if match[1]: self._setHotendTemperature(extruder_nr, float(match[1])) temperature_set = True @@ -555,18 +558,20 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if requested_temperatures[1]: self._setHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) if requested_temperatures[2]: - self._updateTargetHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) + self._updateTargetHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[2])) except: Logger.log("w", "Could not parse hotend temperatures from response: %s", line) # Check if there's also a bed temperature - temperature_matches = re.findall(b"B:\s?*([\d\.]+)\s?\/?([\d\.]+)?", line) - try: - if match[0]: - self._setBedTemperature(float(match[0])) - if match[1]: - self._updateTargetBedTemperature(float(match[1])) - except: - Logger.log("w", "Could not parse bed temperature from response: %s", line) + temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) + if container_stack.getProperty("machine_heated_bed", "value") and len(temperature_matches) > 0: + match = temperature_matches[0] + try: + if match[0]: + self._setBedTemperature(float(match[0])) + if match[1]: + self._updateTargetBedTemperature(float(match[1])) + except: + Logger.log("w", "Could not parse bed temperature from response: %s", line) elif b"_min" in line or b"_max" in line: tag, value = line.split(b":", 1) From 720b9ebdfab1e0e0df185a262b9b36f735dec23c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 13 Nov 2017 11:06:27 +0100 Subject: [PATCH 202/764] CURA-4556 Add profiles for AA0.25 and BAM material --- .../um3_aa0.25_ABS_Normal_Quality.inst.cfg | 24 ++++++++ .../um3_aa0.25_CPE_Normal_Quality.inst.cfg | 22 +++++++ .../um3_aa0.25_Nylon_Normal_Quality.inst.cfg | 37 ++++++++++++ .../um3_aa0.25_PC_Normal_Quality.inst.cfg | 53 ++++++++++++++++ .../um3_aa0.25_PLA_Normal_Quality.inst.cfg | 37 ++++++++++++ .../um3_aa0.25_PP_Normal_Quality.inst.cfg | 60 +++++++++++++++++++ .../um3_aa0.4_BAM_Draft_Print.inst.cfg | 38 ++++++++++++ .../um3_aa0.4_BAM_Fast_Print.inst.cfg | 38 ++++++++++++ .../um3_aa0.4_BAM_Normal_Quality.inst.cfg | 36 +++++++++++ resources/variants/ultimaker3_aa0.25.inst.cfg | 40 +++++++++++++ .../ultimaker3_extended_aa0.25.inst.cfg | 40 +++++++++++++ 11 files changed, 425 insertions(+) create mode 100644 resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg create mode 100644 resources/variants/ultimaker3_aa0.25.inst.cfg create mode 100644 resources/variants/ultimaker3_extended_aa0.25.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5d798d556e --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_abs_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +cool_fan_speed = 40 +infill_overlap = 15 +material_final_print_temperature = =material_print_temperature - 5 +prime_tower_enable = True +prime_tower_purge_volume = 0.6 +prime_tower_size = 12 +prime_tower_wall_thickness = 0.9 +retraction_prime_speed = 25 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +wall_thickness = 0.92 + diff --git a/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..a68b43fa2a --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_cpe_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +infill_overlap = =10 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0 +prime_tower_size = 12 +prime_tower_wall_thickness = 0.9 +retraction_extrusion_window = 0.5 +speed_infill = 40 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +top_bottom_thickness = 0.8 +wall_thickness = 0.92 + diff --git a/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..fda770266e --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg @@ -0,0 +1,37 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_nylon_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 12 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +infill_overlap = =10 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 2.0 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 3) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +retraction_extrusion_window = =retraction_amount +retraction_min_travel = =line_width * 2 +skin_overlap = 50 +speed_print = 70 +speed_topbottom = =math.ceil(speed_print * 30 / 70) +speed_wall = =math.ceil(speed_print * 30 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + diff --git a/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..43b8f95677 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg @@ -0,0 +1,53 @@ +[general] +version = 2 +name = Fine - Experimental +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_pc_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 50 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 5 +infill_line_width = =line_width +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +retraction_count_max = 80 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = 25 +speed_print = 50 +speed_topbottom = 25 +speed_travel = 250 +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = 1.2 + diff --git a/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..d3772448cf --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg @@ -0,0 +1,37 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_pla_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +brim_width = 8 +cool_fan_full_at_height = =layer_height_0 +cool_min_speed = 10 +infill_overlap = 10 +infill_pattern = grid +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 2.0 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = 190 +retraction_extrusion_window = =retraction_amount +retraction_hop = 0.2 +skin_overlap = 5 +speed_layer_0 = 30 +speed_print = 30 +speed_travel_layer_0 = 120 +speed_wall = 25 +speed_wall_0 = 20 +top_bottom_thickness = 0.72 +travel_avoid_distance = 0.4 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 +wall_thickness = 0.7 + diff --git a/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..7f138f979d --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg @@ -0,0 +1,60 @@ +[general] +version = 2 +name = Fine - Experimental +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_pp_ultimaker3_AA_0.25 +weight = 0 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 10 +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_pattern = tetrahedral +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.92 +machine_min_cool_heat_time_window = 15 +material_bed_temperature_layer_0 = 90 +material_final_print_temperature = 195 +material_initial_print_temperature = 200 +material_print_temperature = 205 +material_print_temperature_layer_0 = 208 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_count_max = 6 +retraction_extra_prime_amount = 0.2 +retraction_extrusion_window = 6.5 +retraction_hop = 2 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 13 +speed_equalize_flow_enabled = True +speed_layer_0 = 15 +speed_print = 25 +speed_travel = 300 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 + diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg new file mode 100644 index 0000000000..980da522c8 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 2 +name = Fast +definition = ultimaker3 + +[metadata] +type = quality +quality_type = draft +material = generic_bam_ultimaker3_AA_0.4 +weight = -2 +setting_version = 4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =230 +material_standby_temperature = 100 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +skin_overlap = 20 +speed_layer_0 = 20 +speed_topbottom = =math.ceil(speed_print * 35 / 70) +speed_wall = =math.ceil(speed_print * 50 / 70) +speed_wall_0 = =math.ceil(speed_wall * 35 / 50) +top_bottom_thickness = 1 +wall_thickness = 1 +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = 10 diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg new file mode 100644 index 0000000000..86b584c9af --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 2 +name = Normal +definition = ultimaker3 + +[metadata] +type = quality +quality_type = fast +material = generic_bam_ultimaker3_AA_0.4 +weight = -1 +setting_version = 4 + +[values] +default_material_print_temperature = 225 +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_standby_temperature = 100 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +speed_print = 80 +speed_layer_0 = 20 +speed_topbottom = =math.ceil(speed_print * 30 / 80) +speed_wall = =math.ceil(speed_print * 40 / 80) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +top_bottom_thickness = 1 +wall_thickness = 1 +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = 10 diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b9f35fcfa0 --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_bam_ultimaker3_AA_0.4 +weight = 0 +setting_version = 4 + +[values] +default_material_print_temperature = 225 +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_standby_temperature = 100 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +skin_overlap = 10 +speed_layer_0 = 20 +top_bottom_thickness = 1 +wall_thickness = 1 +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = 10 diff --git a/resources/variants/ultimaker3_aa0.25.inst.cfg b/resources/variants/ultimaker3_aa0.25.inst.cfg new file mode 100644 index 0000000000..ebb584f674 --- /dev/null +++ b/resources/variants/ultimaker3_aa0.25.inst.cfg @@ -0,0 +1,40 @@ +[general] +name = AA 0.25 +version = 2 +definition = ultimaker3 + +[metadata] +author = ultimaker +type = variant +setting_version = 4 + +[values] +brim_width = 7 +infill_line_width = 0.23 +infill_overlap = 0 +layer_height_0 = 0.17 +line_width = 0.23 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = AA 0.25 +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.65 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +raft_interface_thickness = =layer_height * 1.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_min_travel = 0.7 +skin_overlap = 15 +speed_layer_0 = 20 +speed_print = 55 +speed_topbottom = 20 +speed_wall = =math.ceil(speed_print * 30 / 55) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +top_bottom_thickness = 1.2 +wall_line_width_x = 0.23 +wall_thickness = 1.3 + diff --git a/resources/variants/ultimaker3_extended_aa0.25.inst.cfg b/resources/variants/ultimaker3_extended_aa0.25.inst.cfg new file mode 100644 index 0000000000..631768346e --- /dev/null +++ b/resources/variants/ultimaker3_extended_aa0.25.inst.cfg @@ -0,0 +1,40 @@ +[general] +name = AA 0.25 +version = 2 +definition = ultimaker3_extended + +[metadata] +author = ultimaker +type = variant +setting_version = 4 + +[values] +brim_width = 7 +infill_line_width = 0.23 +infill_overlap = 0 +layer_height_0 = 0.17 +line_width = 0.23 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = AA 0.25 +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.65 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +raft_interface_thickness = =layer_height * 1.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_min_travel = 0.7 +skin_overlap = 15 +speed_layer_0 = 20 +speed_print = 55 +speed_topbottom = 20 +speed_wall = =math.ceil(speed_print * 30 / 55) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +top_bottom_thickness = 1.2 +wall_line_width_x = 0.23 +wall_thickness = 1.3 + From c73247016912af860ce1a6a351ae33a64c09d06f Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 13 Nov 2017 13:01:58 +0100 Subject: [PATCH 203/764] CURA-4525 refined the condition when to reslice build plates; however from the layer view it (still) doesn't always show the layers --- cura/Scene/BuildPlateDecorator.py | 3 + .../CuraEngineBackend/CuraEngineBackend.py | 112 +++++++++++------- 2 files changed, 74 insertions(+), 41 deletions(-) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 2c886c7444..41921a120f 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -26,5 +26,8 @@ class BuildPlateDecorator(SceneNodeDecorator): def getPreviousBuildPlateNumber(self): return self._previous_build_plate_number + def removePreviousBuildPlateNumber(self): + self._previous_build_plate_number = None + def __deepcopy__(self, memo): return BuildPlateDecorator() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 67d3fe8c42..78e1f9f8d6 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -16,6 +16,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Qt.Duration import DurationFormat from PyQt5.QtCore import QObject, pyqtSlot +from collections import defaultdict from cura.Settings.ExtruderManager import ExtruderManager from . import ProcessSlicedLayersJob from . import StartSliceJob @@ -117,7 +118,7 @@ class CuraEngineBackend(QObject, Backend): self._backend_log_max_lines = 20000 # Maximum number of lines to buffer self._error_message = None # Pop-up message that shows errors. - self._last_num_objects = 0 # Count number of objects to see if there is something changed + self._last_num_objects = defaultdict(int) # Count number of objects to see if there is something changed self._postponed_scene_change_sources = [] # scene change is postponed (by a tool) self.backendQuit.connect(self._onBackendQuit) @@ -192,17 +193,26 @@ class CuraEngineBackend(QObject, Backend): ## Perform a slice of the scene. def slice(self): - Logger.log("d", "starting to slice again!") + Logger.log("d", "starting to slice!") self._slice_start_time = time() if not self._build_plates_to_be_sliced: self.processingProgress.emit(1.0) self.backendStateChange.emit(BackendState.Done) Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.") return - if Application.getInstance().getPrintInformation(): - Application.getInstance().getPrintInformation().setToZeroPrintInformation() + + # see if we really have to slice + build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0) + num_objects = self._numObjects() + if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: + Logger.log("d", " ## Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) + self._invokeSlice() self._stored_layer_data = [] + self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] + + if Application.getInstance().getPrintInformation(): + Application.getInstance().getPrintInformation().setToZeroPrintInformation() if self._process is None: self._createSocket() @@ -218,8 +228,7 @@ class CuraEngineBackend(QObject, Backend): slice_message = self._socket.createMessage("cura.proto.Slice") self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) - self._start_slice_job_build_plate = self._build_plates_to_be_sliced.pop(0) - self._stored_optimized_layer_data[self._start_slice_job_build_plate] = [] + self._start_slice_job_build_plate = build_plate_to_be_sliced self._start_slice_job.setBuildPlate(self._start_slice_job_build_plate) self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) @@ -364,40 +373,62 @@ class CuraEngineBackend(QObject, Backend): self.disableTimer() return False + ## Return a dict with number of objects per build plate + def _numObjects(self): + num_objects = defaultdict(int) + for node in DepthFirstIterator(self._scene.getRoot()): + # Only count sliceable objects + if node.callDecoration("isSliceable"): + build_plate_number = node.callDecoration("getBuildPlateNumber") + num_objects[build_plate_number] += 1 + return num_objects + ## Listener for when the scene has changed. # # This should start a slice if the scene is now ready to slice. # # \param source The scene node that was changed. def _onSceneChanged(self, source): - Logger.log("d", " ##### scene changed: %s", source) if not issubclass(type(source), SceneNode): return - root_scene_nodes_changed = False - build_plates_changed = set() + build_plate_changed = set() + source_build_plate_number = source.callDecoration("getBuildPlateNumber") if source == self._scene.getRoot(): - num_objects = 0 + # we got the root node + num_objects = self._numObjects() + # num_objects = defaultdict(int) for node in DepthFirstIterator(self._scene.getRoot()): - # Only count sliceable objects - if node.callDecoration("isSliceable"): - num_objects += 1 - build_plates_changed.add(node.callDecoration("getBuildPlateNumber")) - build_plates_changed.add(node.callDecoration("getPreviousBuildPlateNumber")) - if num_objects != self._last_num_objects: - self._last_num_objects = num_objects - root_scene_nodes_changed = True - # else: - # return # ?? - build_plates_changed.discard(None) - build_plates_changed.discard(-1) # object not on build plate - Logger.log("d", " #### build plates changed: %s", build_plates_changed) + # # Only count sliceable objects + # if node.callDecoration("isSliceable"): + # build_plate_number = node.callDecoration("getBuildPlateNumber") + # num_objects[build_plate_number] += 1 + node.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time + for build_plate_number in list(self._last_num_objects.keys()) + list(num_objects.keys()): + if build_plate_number not in self._last_num_objects or num_objects[build_plate_number] != self._last_num_objects[build_plate_number]: + self._last_num_objects[build_plate_number] = num_objects[build_plate_number] + build_plate_changed.add(build_plate_number) + else: + # we got a single scenenode, how do we know if it's changed? + # build_plate_changed.add(source_build_plate_number) + # build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber")) + # source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time + if not source.callDecoration("isGroup"): + if source.getMeshData() is None: + return + if source.getMeshData().getVertices() is None: + return - # if not source.callDecoration("isGroup") and not root_scene_nodes_changed: - # if source.getMeshData() is None: - # return - # if source.getMeshData().getVertices() is None: - # return + # we got a single object and it passed all the tests of being changed + build_plate_changed.add(source_build_plate_number) + build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber")) + source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time + + build_plate_changed.discard(None) + build_plate_changed.discard(-1) # object not on build plate + if not build_plate_changed: + return + # Logger.log("d", " #### build plates changed: %s", build_plate_changed) if self._tool_active: # do it later, each source only has to be done once @@ -405,19 +436,18 @@ class CuraEngineBackend(QObject, Backend): self._postponed_scene_change_sources.append(source) return - if build_plates_changed: - Logger.log("d", " going to reslice") - self.stopSlicing() - for build_plate_number in build_plates_changed: - if build_plate_number not in self._build_plates_to_be_sliced: - self._build_plates_to_be_sliced.append(build_plate_number) - self.processingProgress.emit(0.0) - self.backendStateChange.emit(BackendState.NotStarted) - if not self._use_timer: - # With manually having to slice, we want to clear the old invalid layer data. - self._clearLayerData(build_plates_changed) + Logger.log("d", " going to reslice: %s", build_plate_changed) + self.stopSlicing() + for build_plate_number in build_plate_changed: + if build_plate_number not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(build_plate_number) + self.processingProgress.emit(0.0) + self.backendStateChange.emit(BackendState.NotStarted) + if not self._use_timer: + # With manually having to slice, we want to clear the old invalid layer data. + self._clearLayerData(build_plate_changed) - self._invokeSlice() + self._invokeSlice() # #self.needsSlicing() # self.stopSlicing() @@ -445,7 +475,7 @@ class CuraEngineBackend(QObject, Backend): def _clearLayerData(self, build_plate_numbers = set()): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): - if node.callDecoration("getBuildPlateNumber") in build_plate_numbers or not build_plate_numbers: + if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers: node.getParent().removeChild(node) def markSliceAll(self): From 040cc31079e904aa10a3519f44191d33a7ca5d5a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 13 Nov 2017 14:25:22 +0100 Subject: [PATCH 204/764] CURA-4525 layer data viewing seems fixed, although after moving an object to a different build plate triggers the reslice only after deselecting --- cura/Scene/BuildPlateDecorator.py | 9 --- .../CuraEngineBackend/CuraEngineBackend.py | 58 +++++++++---------- .../ProcessSlicedLayersJob.py | 3 + plugins/CuraEngineBackend/StartSliceJob.py | 3 +- 4 files changed, 32 insertions(+), 41 deletions(-) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 41921a120f..6b4dcfc970 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -7,13 +7,11 @@ class BuildPlateDecorator(SceneNodeDecorator): def __init__(self, build_plate_number = -1): super().__init__() self._build_plate_number = None - self._previous_build_plate_number = None self.setBuildPlateNumber(build_plate_number) def setBuildPlateNumber(self, nr): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. - self._previous_build_plate_number = self._build_plate_number self._build_plate_number = nr if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): @@ -22,12 +20,5 @@ class BuildPlateDecorator(SceneNodeDecorator): def getBuildPlateNumber(self): return self._build_plate_number - # Used to determine from what build plate the node moved. - def getPreviousBuildPlateNumber(self): - return self._previous_build_plate_number - - def removePreviousBuildPlateNumber(self): - self._previous_build_plate_number = None - def __deepcopy__(self, memo): return BuildPlateDecorator() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 78e1f9f8d6..ebe4634786 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -177,6 +177,7 @@ class CuraEngineBackend(QObject, Backend): self._createSocket() if self._process_layers_job: # We were processing layers. Stop that, the layers are going to change soon. + Logger.log("d", "Aborting process layers job...") self._process_layers_job.abort() self._process_layers_job = None @@ -201,12 +202,19 @@ class CuraEngineBackend(QObject, Backend): Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.") return + if self._process_layers_job: + Logger.log("d", " ## Process layers job still busy, trying later") + self._invokeSlice() + return + # see if we really have to slice build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0) + Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced) num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: Logger.log("d", " ## Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) self._invokeSlice() + return self._stored_layer_data = [] self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] @@ -326,17 +334,18 @@ class CuraEngineBackend(QObject, Backend): else: self.backendStateChange.emit(BackendState.NotStarted) - if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: - if Application.getInstance().platformActivity: - self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."), - title = catalog.i18nc("@info:title", "Unable to slice")) - self._error_message.show() - #self.backendStateChange.emit(BackendState.Error) - else: - #self.backendStateChange.emit(BackendState.NotStarted) - pass - self._invokeSlice() - return + # Doesn't occur anymore, is handled in slice() + # if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: + # if Application.getInstance().platformActivity: + # self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."), + # title = catalog.i18nc("@info:title", "Unable to slice")) + # self._error_message.show() + # #self.backendStateChange.emit(BackendState.Error) + # else: + # #self.backendStateChange.emit(BackendState.NotStarted) + # pass + # self._invokeSlice() + # return # Preparation completed, send it to the backend. self._socket.sendMessage(job.getSliceMessage()) @@ -397,38 +406,24 @@ class CuraEngineBackend(QObject, Backend): if source == self._scene.getRoot(): # we got the root node num_objects = self._numObjects() - # num_objects = defaultdict(int) - for node in DepthFirstIterator(self._scene.getRoot()): - # # Only count sliceable objects - # if node.callDecoration("isSliceable"): - # build_plate_number = node.callDecoration("getBuildPlateNumber") - # num_objects[build_plate_number] += 1 - node.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time for build_plate_number in list(self._last_num_objects.keys()) + list(num_objects.keys()): if build_plate_number not in self._last_num_objects or num_objects[build_plate_number] != self._last_num_objects[build_plate_number]: self._last_num_objects[build_plate_number] = num_objects[build_plate_number] build_plate_changed.add(build_plate_number) else: - # we got a single scenenode, how do we know if it's changed? - # build_plate_changed.add(source_build_plate_number) - # build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber")) - # source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time + # we got a single scenenode if not source.callDecoration("isGroup"): if source.getMeshData() is None: return if source.getMeshData().getVertices() is None: return - # we got a single object and it passed all the tests of being changed build_plate_changed.add(source_build_plate_number) - build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber")) - source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time build_plate_changed.discard(None) build_plate_changed.discard(-1) # object not on build plate if not build_plate_changed: return - # Logger.log("d", " #### build plates changed: %s", build_plate_changed) if self._tool_active: # do it later, each source only has to be done once @@ -443,9 +438,9 @@ class CuraEngineBackend(QObject, Backend): self._build_plates_to_be_sliced.append(build_plate_number) self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) - if not self._use_timer: + # if not self._use_timer: # With manually having to slice, we want to clear the old invalid layer data. - self._clearLayerData(build_plate_changed) + self._clearLayerData(build_plate_changed) self._invokeSlice() @@ -568,6 +563,7 @@ class CuraEngineBackend(QObject, Backend): active_build_plate = Application.getInstance().activeBuildPlate if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()) and active_build_plate == self._start_slice_job_build_plate: self._startProcessSlicedLayersJob(active_build_plate) + # self._onActiveViewChanged() self._start_slice_job_build_plate = None Logger.log("d", "See if there is more to slice...") @@ -676,7 +672,6 @@ class CuraEngineBackend(QObject, Backend): self._process_layers_job.setBuildPlate(build_plate_number) self._process_layers_job.finished.connect(self._onProcessLayersFinished) self._process_layers_job.start() - del self._stored_optimized_layer_data[build_plate_number] ## Called when the user changes the active view mode. def _onActiveViewChanged(self): @@ -689,7 +684,7 @@ class CuraEngineBackend(QObject, Backend): # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. # TODO: what build plate I am slicing - if active_build_plate in self._stored_optimized_layer_data and not self._slicing: + if active_build_plate in self._stored_optimized_layer_data and not self._slicing and not self._process_layers_job: self._startProcessSlicedLayersJob(active_build_plate) else: self._layer_view_active = False @@ -726,7 +721,10 @@ class CuraEngineBackend(QObject, Backend): self._onChanged() def _onProcessLayersFinished(self, job): + del self._stored_optimized_layer_data[job.getBuildPlate()] self._process_layers_job = None + Logger.log("d", "See if there is more to slice(2)...") + self._invokeSlice() ## Connect slice function to timer. def enableTimer(self): diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 1e56f2dd35..916cc4d914 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -65,6 +65,9 @@ class ProcessSlicedLayersJob(Job): def setBuildPlate(self, new_value): self._build_plate_number = new_value + def getBuildPlate(self): + return self._build_plate_number + def run(self): Logger.log("d", "########## Processing new layer for [%s]..." % self._build_plate_number) start_time = time() diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index f6abe94702..cf6043c6cb 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -120,7 +120,7 @@ class StartSliceJob(Job): with self._scene.getSceneLock(): # Remove old layer data. for node in DepthFirstIterator(self._scene.getRoot()): - if node.callDecoration("getLayerData"): + if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number: node.getParent().removeChild(node) break @@ -155,7 +155,6 @@ class StartSliceJob(Job): temp_list.append(node) Job.yieldThread() - Logger.log("d", " objects to be sliced: %s", temp_list) if temp_list: object_groups.append(temp_list) From 8e5e555344bb1b7e59779390358ecbd3e4ae1501 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 13 Nov 2017 16:27:15 +0100 Subject: [PATCH 205/764] CURA-4525 Send all build plate gcodes to printer at one press of the button :-) --- cura/CuraApplication.py | 19 +++++++++++- cura/GCodeListDecorator.py | 2 +- .../CuraEngineBackend/CuraEngineBackend.py | 16 ++++++---- .../NetworkClusterPrinterOutputDevice.py | 30 ++++++++++++++----- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c1c894c735..de78f808cd 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -258,6 +258,7 @@ class CuraApplication(QtApplication): self._i18n_catalog = i18nCatalog("cura") self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) + self.getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) @@ -1523,7 +1524,7 @@ class CuraApplication(QtApplication): @pyqtSlot() def newBuildPlate(self): Logger.log("d", "New build plate") - self._num_build_plates += 1 + #self._num_build_plates += 1 self.numBuildPlatesChanged.emit() @pyqtProperty(int, notify = numBuildPlatesChanged) @@ -1533,3 +1534,19 @@ class CuraApplication(QtApplication): @pyqtProperty(int, notify = activeBuildPlateChanged) def activeBuildPlate(self): return self._active_build_plate + + def updateMaxBuildPlate(self, source): + if not issubclass(type(source), SceneNode): + return + num_build_plates = self._calcMaxBuildPlate() + if num_build_plates != self._num_build_plates: + self._num_build_plates = num_build_plates + self.numBuildPlatesChanged.emit() + + def _calcMaxBuildPlate(self): + max_build_plate = 0 + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if node.callDecoration("isSliceable"): + build_plate_number = node.callDecoration("getBuildPlateNumber") + max_build_plate = max(build_plate_number, max_build_plate) + return max_build_plate diff --git a/cura/GCodeListDecorator.py b/cura/GCodeListDecorator.py index 5738d0a7f2..66ecf3beac 100644 --- a/cura/GCodeListDecorator.py +++ b/cura/GCodeListDecorator.py @@ -4,7 +4,7 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator class GCodeListDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - self._gcode_list = [] + self._gcode_list = {} # [] def getGCodeList(self): return self._gcode_list diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index ebe4634786..f8b68e118a 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -230,7 +230,9 @@ class CuraEngineBackend(QObject, Backend): self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) - self._scene.gcode_list = [] + if not hasattr(self._scene, "gcode_list"): + self._scene.gcode_list = {} + self._scene.gcode_list[build_plate_to_be_sliced] = [] #[] indexed by build plate number self._slicing = True self.slicingStarted.emit() @@ -370,7 +372,7 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.Disabled) gcode_list = node.callDecoration("getGCodeList") if gcode_list is not None: - self._scene.gcode_list = gcode_list + self._scene.gcode_list[node.callDecoration("getBuildPlateNumber")] = gcode_list if self._use_timer == enable_timer: return self._use_timer @@ -546,14 +548,16 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.Done) self.processingProgress.emit(1.0) - for line in self._scene.gcode_list: + gcode_list = self._scene.gcode_list[self._start_slice_job_build_plate] + for index, line in enumerate(gcode_list): replaced = line.replace("{print_time}", str(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) replaced = replaced.replace("{filament_amount}", str(Application.getInstance().getPrintInformation().materialLengths)) replaced = replaced.replace("{filament_weight}", str(Application.getInstance().getPrintInformation().materialWeights)) replaced = replaced.replace("{filament_cost}", str(Application.getInstance().getPrintInformation().materialCosts)) replaced = replaced.replace("{jobname}", str(Application.getInstance().getPrintInformation().jobName)) - self._scene.gcode_list[self._scene.gcode_list.index(line)] = replaced + #gcode_list[gcode_list.index(line)] = replaced + gcode_list[index] = replaced self._slicing = False #self._need_slicing = False @@ -576,14 +580,14 @@ class CuraEngineBackend(QObject, Backend): # # \param message The protobuf message containing g-code, encoded as UTF-8. def _onGCodeLayerMessage(self, message): - self._scene.gcode_list.append(message.data.decode("utf-8", "replace")) + self._scene.gcode_list[self._start_slice_job_build_plate].append(message.data.decode("utf-8", "replace")) ## Called when a g-code prefix message is received from the engine. # # \param message The protobuf message containing the g-code prefix, # encoded as UTF-8. def _onGCodePrefixMessage(self, message): - self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace")) + self._scene.gcode_list[self._start_slice_job_build_plate].insert(0, message.data.decode("utf-8", "replace")) ## Creates a new socket connection. def _createSocket(self): diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index b6e94121f8..14a60a6b22 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -254,6 +254,10 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._selected_printer = self._automatic_printer # reset to default option self._request_job = [nodes, file_name, filter_by_machine, file_handler, kwargs] + # the build plates to be sent + self._job_list = list(getattr(Application.getInstance().getController().getScene(), "gcode_list").keys()) + Logger.log("d", "build plates to be sent to printer: %s", (self._job_list)) + if self._stage != OutputStage.ready: if self._error_message: self._error_message.hide() @@ -263,12 +267,14 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._error_message.show() return + self._add_build_plate_number = len(self._job_list) > 1 if len(self._printers) > 1: self.spawnPrintView() # Ask user how to print it. elif len(self._printers) == 1: # If there is only one printer, don't bother asking. self.selectAutomaticPrinter() self.sendPrintJob() + else: # Cluster has no printers, warn the user of this. if self._error_message: @@ -283,28 +289,34 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte @pyqtSlot() def sendPrintJob(self): nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job - require_printer_name = self._selected_printer["unique_name"] + output_build_plate_number = self._job_list.pop(0) + gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")[output_build_plate_number] self._send_gcode_start = time.time() - Logger.log("d", "Sending print job [%s] to host..." % file_name) + Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) if self._stage != OutputStage.ready: Logger.log("d", "Unable to send print job as the state is %s", self._stage) raise OutputDeviceError.DeviceBusyError() self._stage = OutputStage.uploading - self._file_name = "%s.gcode.gz" % file_name + if self._add_build_plate_number: + self._file_name = "%s_%d.gcode.gz" % (file_name, output_build_plate_number) + else: + self._file_name = "%s.gcode.gz" % (file_name) self._showProgressMessage() - new_request = self._buildSendPrintJobHttpRequest(require_printer_name) + require_printer_name = self._selected_printer["unique_name"] + + new_request = self._buildSendPrintJobHttpRequest(require_printer_name, gcode) if new_request is None or self._stage != OutputStage.uploading: return self._request = new_request self._reply = self._manager.post(self._request, self._multipart) self._reply.uploadProgress.connect(self._onUploadProgress) - # See _finishedPostPrintJobRequest() + # See _finishedPrintJobPostRequest() - def _buildSendPrintJobHttpRequest(self, require_printer_name): + def _buildSendPrintJobHttpRequest(self, require_printer_name, gcode): api_url = QUrl(self._api_base_uri + "print_jobs/") request = QNetworkRequest(api_url) # Create multipart request and add the g-code. @@ -313,9 +325,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte # Add gcode part = QHttpPart() part.setHeader(QNetworkRequest.ContentDispositionHeader, - 'form-data; name="file"; filename="%s"' % self._file_name) + 'form-data; name="file"; filename="%s"' % (self._file_name)) - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") compressed_gcode = self._compressGcode(gcode) if compressed_gcode is None: return None # User aborted print, so stop trying. @@ -401,6 +412,9 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._cleanupRequest() + if self._job_list: # start sending next job + self.sendPrintJob() + def _showRequestFailedMessage(self, reply): if reply is not None: Logger.log("w", "Unable to send print job to group {cluster_name}: {error_string} ({error})".format( From 97f61366a83a24e0fa5c5664dc513e29b70bd5de Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 13 Nov 2017 16:51:07 +0100 Subject: [PATCH 206/764] CURA-4525 fix accidently remove all scenenodes when deleteAll --- cura/CuraApplication.py | 2 +- resources/qml/ObjectsList.qml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index de78f808cd..7667d6dad8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1040,7 +1040,7 @@ class CuraApplication(QtApplication): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if type(node) not in {SceneNode, CuraSceneNode}: continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index cde7f065fa..4eeb0cd568 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -54,7 +54,7 @@ Rectangle anchors.leftMargin: UM.Theme.getSize("default_margin").width //anchors.right: parent.right width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 - text: Cura.ObjectManager.getItem(index).name; + text: Cura.ObjectManager.getItem(index) ? Cura.ObjectManager.getItem(index).name : ""; color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectManager.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) elide: Text.ElideRight } @@ -66,7 +66,7 @@ Rectangle anchors.left: nodeNameLabel.right anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right - text: Cura.ObjectManager.getItem(index).buildPlateNumber; + text: Cura.ObjectManager.getItem(index) ? Cura.ObjectManager.getItem(index).buildPlateNumber : 0; color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text elide: Text.ElideRight } From ef2d9b0468c126ae19a6854083c3b97105335ac2 Mon Sep 17 00:00:00 2001 From: maukcc Date: Tue, 14 Nov 2017 10:30:10 +0100 Subject: [PATCH 207/764] Cartesio profiles updated prime tower update PC profiles --- resources/definitions/cartesio.def.json | 9 ++++++--- resources/extruders/cartesio_extruder_0.def.json | 2 +- resources/extruders/cartesio_extruder_1.def.json | 2 +- resources/extruders/cartesio_extruder_2.def.json | 2 +- resources/extruders/cartesio_extruder_3.def.json | 2 +- .../quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 2 +- .../quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg | 2 +- 13 files changed, 18 insertions(+), 15 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index bbc62bdf75..61ad0f4e73 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -48,21 +48,24 @@ "material_bed_temp_wait": { "default_value": false }, "prime_tower_enable": { "default_value": true }, "prime_tower_wall_thickness": { "resolve": 0.7 }, - "prime_tower_position_x": { "default_value": 50 }, - "prime_tower_position_y": { "default_value": 150 }, + "prime_tower_size": { "default_value": 24.0 }, + "prime_tower_position_x": { "default_value": 125 }, + "prime_tower_position_y": { "default_value": 70 }, "prime_blob_enable": { "default_value": false }, "machine_max_feedrate_z": { "default_value": 20 }, "machine_disallowed_areas": { "default_value": [ [[215, 135], [-215, 135], [-215, 75], [215, 75]] ]}, "machine_start_gcode": { - "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" + "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM140 S{material_bed_temperature_layer_0}\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM117 cooling down....\nM106 S255\nM140 S5\nM104 S5 T0\nM104 S5 T1\nM104 S5 T2\nM104 S5 T3\n\nG91\nG1 Z1 F900\nG90\n\nG1 X20.0 Y260.0 F6000\nG4 S7\nM84\nG4 S90\nM107\nM42 P12 S0\nM42 P13 S0\nM84\nT0\nM117 Finished.\n; -- end of GCODE --" }, "layer_height": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, "layer_height_0": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, + "retraction_extra_prime_amount": { "minimum_value_warning": "-2.0" }, + "optimize_wall_printing_order": { "default_value": true }, "machine_nozzle_heat_up_speed": {"default_value": 20}, "machine_nozzle_cool_down_speed": {"default_value": 20}, "machine_min_cool_heat_time_window": {"default_value": 5} diff --git a/resources/extruders/cartesio_extruder_0.def.json b/resources/extruders/cartesio_extruder_0.def.json index f1423f3530..5558d9325e 100644 --- a/resources/extruders/cartesio_extruder_0.def.json +++ b/resources/extruders/cartesio_extruder_0.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_0", "version": 2, - "name": "Extruder 0", + "name": "Extruder 1", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_1.def.json b/resources/extruders/cartesio_extruder_1.def.json index 402553ff96..f8350f8091 100644 --- a/resources/extruders/cartesio_extruder_1.def.json +++ b/resources/extruders/cartesio_extruder_1.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_1", "version": 2, - "name": "Extruder 1", + "name": "Extruder 2", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_2.def.json b/resources/extruders/cartesio_extruder_2.def.json index e8f47772cb..bfc10e75c3 100644 --- a/resources/extruders/cartesio_extruder_2.def.json +++ b/resources/extruders/cartesio_extruder_2.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_2", "version": 2, - "name": "Extruder 2", + "name": "Extruder 3", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_3.def.json b/resources/extruders/cartesio_extruder_3.def.json index a3e435470a..f0be53e564 100644 --- a/resources/extruders/cartesio_extruder_3.def.json +++ b/resources/extruders/cartesio_extruder_3.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_3", "version": 2, - "name": "Extruder 3", + "name": "Extruder 4", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 1c5f445056..22edfa5656 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg index 256f3237ea..57d44cc28b 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index fc7c7dd28e..088bb89a58 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg index ff3d5f2de2..a56ff61beb 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg index e57f5eaca2..52b3c9b17b 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 30 +speed_print = 15 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg index 73d2084610..6f02452fba 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 25 +speed_print = 15 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index 334d70b84f..72a7c8eec0 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg index 2c1ddf6ec5..63d36a1371 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) From 38882c6d13580aa491fe38be49d97107b4ef04e0 Mon Sep 17 00:00:00 2001 From: MaukCC Date: Tue, 14 Nov 2017 10:53:51 +0100 Subject: [PATCH 208/764] Update cartesio.def.json --- resources/definitions/cartesio.def.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index 61ad0f4e73..15442ef183 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -48,9 +48,9 @@ "material_bed_temp_wait": { "default_value": false }, "prime_tower_enable": { "default_value": true }, "prime_tower_wall_thickness": { "resolve": 0.7 }, - "prime_tower_size": { "default_value": 24.0 }, - "prime_tower_position_x": { "default_value": 125 }, - "prime_tower_position_y": { "default_value": 70 }, + "prime_tower_size": { "value": 24.0 }, + "prime_tower_position_x": { "value": 125 }, + "prime_tower_position_y": { "value": 70 }, "prime_blob_enable": { "default_value": false }, "machine_max_feedrate_z": { "default_value": 20 }, "machine_disallowed_areas": { "default_value": [ From 913bcf45b184fe01392e41803a260d37b333a30c Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 14 Nov 2017 11:53:24 +0100 Subject: [PATCH 209/764] Add stderr to send errors to --- .../RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py index d87499273b..5ad2caed0b 100644 --- a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py +++ b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py @@ -4,8 +4,6 @@ from . import RemovableDrivePlugin -from UM.Logger import Logger - import subprocess import os @@ -15,12 +13,12 @@ import plistlib class OSXRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin): def checkRemovableDrives(self): drives = {} - p = subprocess.Popen(["system_profiler", "SPUSBDataType", "-xml"], stdout = subprocess.PIPE) + p = subprocess.Popen(["system_profiler", "SPUSBDataType", "-xml"], stdout = subprocess.PIPE, stderr = subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) result = self._recursiveSearch(plist, "removable_media") - p = subprocess.Popen(["system_profiler", "SPCardReaderDataType", "-xml"], stdout=subprocess.PIPE) + p = subprocess.Popen(["system_profiler", "SPCardReaderDataType", "-xml"], stdout=subprocess.PIPE, stderr = subprocess.PIPE) plist = plistlib.loads(p.communicate()[0]) result.extend(self._recursiveSearch(plist, "removable_media")) From bd8aa8d989bb53b968ef1d114776aece8ca4bf9f Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 14 Nov 2017 14:27:46 +0100 Subject: [PATCH 210/764] CURA-4525 automatic build plate menu items using BuildPlateModel --- cura/BuildPlateModel.py | 60 +++++++++++++++++ cura/ConvexHullNode.py | 2 +- cura/CuraApplication.py | 64 ++++--------------- cura/ObjectManager.py | 15 ++--- cura/Scene/CuraSceneNode.py | 4 +- .../CuraEngineBackend/CuraEngineBackend.py | 6 +- plugins/LayerView/LayerPass.py | 2 +- plugins/SolidView/SolidView.py | 4 +- resources/qml/Cura.qml | 7 +- resources/qml/Menus/ContextMenu.qml | 28 ++++---- resources/qml/Menus/ViewMenu.qml | 41 ++++++------ resources/qml/ObjectsList.qml | 50 +++------------ 12 files changed, 131 insertions(+), 152 deletions(-) diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index 139597f9cb..35a311dc5f 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -1,2 +1,62 @@ +from UM.Qt.ListModel import ListModel +from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +from UM.Logger import Logger +from UM.Application import Application +class BuildPlateModel(ListModel): + maxBuildPlateChanged = pyqtSignal() + activeBuildPlateChanged = pyqtSignal() + + def __init__(self): + super().__init__() + Application.getInstance().getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously + + self._max_build_plate = 1 # default + self._active_build_plate = 0 + + @pyqtSlot(int) + def setActiveBuildPlate(self, nr): + if nr == self._active_build_plate: + return + Logger.log("d", "Select build plate: %s" % nr) + self._active_build_plate = nr + + self.activeBuildPlateChanged.emit() + + @pyqtProperty(int, notify = activeBuildPlateChanged) + def activeBuildPlate(self): + return self._active_build_plate + + ## Return the highest build plate number + @pyqtProperty(int, notify = maxBuildPlateChanged) + def maxBuildPlate(self): + return self._max_build_plate + + def updateMaxBuildPlate(self, source): + if not issubclass(type(source), SceneNode): + return + max_build_plate = self._calcMaxBuildPlate() + changed = False + if max_build_plate != self._max_build_plate: + self._max_build_plate = max_build_plate + changed = True + if changed: + self.maxBuildPlateChanged.emit() + build_plates = [{"name": "Build Plate %d" % (i + 1), "buildPlateNumber": i} for i in range(self._max_build_plate + 1)] + self.setItems(build_plates) + self.itemsChanged.emit() + + def _calcMaxBuildPlate(self): + max_build_plate = 0 + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if node.callDecoration("isSliceable"): + build_plate_number = node.callDecoration("getBuildPlateNumber") + max_build_plate = max(build_plate_number, max_build_plate) + return max_build_plate + + @staticmethod + def createBuildPlateModel(): + return BuildPlateModel() diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py index c6ff80670d..cec9d3d698 100644 --- a/cura/ConvexHullNode.py +++ b/cura/ConvexHullNode.py @@ -64,7 +64,7 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_diffuseColor", self._color) ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) - if self.getParent() and self.getParent().callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate: + if self.getParent() and self.getParent().callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: if self.getMeshData(): renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7667d6dad8..08b81d568c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -40,7 +40,6 @@ from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator -# research from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.CuraSceneNode import CuraSceneNode @@ -83,6 +82,7 @@ from cura.Settings.GlobalStack import GlobalStack from cura.Settings.ExtruderStack import ExtruderStack from cura.ObjectManager import ObjectManager +from cura.BuildPlateModel import BuildPlateModel from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from UM.FlameProfiler import pyqtSlot @@ -211,6 +211,7 @@ class CuraApplication(QtApplication): self._machine_manager = None # This is initialized on demand. self._material_manager = None self._object_manager = None + self._build_plate_model = None self._setting_inheritance_manager = None self._simple_mode_settings_manager = None @@ -258,7 +259,6 @@ class CuraApplication(QtApplication): self._i18n_catalog = i18nCatalog("cura") self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) - self.getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) @@ -389,10 +389,6 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") - # research - self._num_build_plates = 1 # default - self._active_build_plate = 0 - def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -724,8 +720,8 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) - Logger.log("d", " #### going to register object manager") qmlRegisterSingletonType(ObjectManager, "Cura", 1, 2, "ObjectManager", self.getObjectManager) + qmlRegisterSingletonType(BuildPlateModel, "Cura", 1, 2, "BuildPlateModel", self.getBuildPlateModel) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) @@ -759,6 +755,11 @@ class CuraApplication(QtApplication): self._object_manager = ObjectManager.createObjectManager() return self._object_manager + def getBuildPlateModel(self, *args): + if self._build_plate_model is None: + self._build_plate_model = BuildPlateModel.createBuildPlateModel() + return self._build_plate_model + def getSettingInheritanceManager(self, *args): if self._setting_inheritance_manager is None: self._setting_inheritance_manager = SettingInheritanceManager.createSettingInheritanceManager() @@ -881,8 +882,6 @@ class CuraApplication(QtApplication): activityChanged = pyqtSignal() sceneBoundingBoxChanged = pyqtSignal() preferredOutputMimetypeChanged = pyqtSignal() - numBuildPlatesChanged = pyqtSignal() - activeBuildPlateChanged = pyqtSignal() @pyqtProperty(bool, notify = activityChanged) def platformActivity(self): @@ -1130,12 +1129,13 @@ class CuraApplication(QtApplication): nodes.append(node) job = ArrangeObjectsAllBuildPlatesJob(nodes) job.start() - self.setActiveBuildPlate(0) + self.getBuildPlateModel().setActiveBuildPlate(0) # Single build plate @pyqtSlot() def arrangeAll(self): nodes = [] + active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): if not issubclass(type(node), SceneNode): continue @@ -1147,7 +1147,7 @@ class CuraApplication(QtApplication): continue # i.e. node with layer data if not node.callDecoration("isSliceable"): continue # i.e. node with layer data - if node.callDecoration("getBuildPlateNumber") == self._active_build_plate: + if node.callDecoration("getBuildPlateNumber") == active_build_plate: # Skip nodes that are too big if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: nodes.append(node) @@ -1284,7 +1284,7 @@ class CuraApplication(QtApplication): group_decorator = GroupDecorator() group_node.addDecorator(group_decorator) group_node.addDecorator(ConvexHullDecorator()) - group_node.addDecorator(BuildPlateDecorator(self.activeBuildPlate)) + group_node.addDecorator(BuildPlateDecorator(self.getBuildPlateModel().activeBuildPlate)) group_node.setParent(self.getController().getScene().getRoot()) group_node.setSelectable(True) center = Selection.getSelectionCenter() @@ -1510,43 +1510,3 @@ class CuraApplication(QtApplication): node = node.getParent() Selection.add(node) - - #### research - hacky place for these kind of thing - @pyqtSlot(int) - def setActiveBuildPlate(self, nr): - if nr == self._active_build_plate: - return - Logger.log("d", "Select build plate: %s" % nr) - self._active_build_plate = nr - - self.activeBuildPlateChanged.emit() - - @pyqtSlot() - def newBuildPlate(self): - Logger.log("d", "New build plate") - #self._num_build_plates += 1 - self.numBuildPlatesChanged.emit() - - @pyqtProperty(int, notify = numBuildPlatesChanged) - def numBuildPlates(self): - return self._num_build_plates - - @pyqtProperty(int, notify = activeBuildPlateChanged) - def activeBuildPlate(self): - return self._active_build_plate - - def updateMaxBuildPlate(self, source): - if not issubclass(type(source), SceneNode): - return - num_build_plates = self._calcMaxBuildPlate() - if num_build_plates != self._num_build_plates: - self._num_build_plates = num_build_plates - self.numBuildPlatesChanged.emit() - - def _calcMaxBuildPlate(self): - max_build_plate = 0 - for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if node.callDecoration("isSliceable"): - build_plate_number = node.callDecoration("getBuildPlateNumber") - max_build_plate = max(build_plate_number, max_build_plate) - return max_build_plate diff --git a/cura/ObjectManager.py b/cura/ObjectManager.py index a148c05f28..8361e43d71 100644 --- a/cura/ObjectManager.py +++ b/cura/ObjectManager.py @@ -15,14 +15,15 @@ class ObjectManager(ListModel): def __init__(self): super().__init__() self._last_selected_index = 0 - Application.getInstance().getController().getScene().sceneChanged.connect(self._update_scene_changed) + self._build_plate_model = Application.getInstance().getBuildPlateModel() + Application.getInstance().getController().getScene().sceneChanged.connect(self._update) Preferences.getInstance().preferenceChanged.connect(self._update) - Application.getInstance().activeBuildPlateChanged.connect(self._update) + self._build_plate_model.activeBuildPlateChanged.connect(self._update) def _update(self, *args): nodes = [] filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") - active_build_plate_number = Application.getInstance().activeBuildPlate + active_build_plate_number = self._build_plate_model.activeBuildPlate for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): continue @@ -43,12 +44,6 @@ class ObjectManager(ListModel): self.itemsChanged.emit() - def _update_scene_changed(self, *args): - # if args and type(args[0]) is not CuraSceneNode: - # Logger.log("d", " ascdf %s", args) - # return - self._update(*args) - ## Either select or deselect an item @pyqtSlot(int) def changeSelection(self, index): @@ -77,7 +72,7 @@ class ObjectManager(ListModel): Selection.add(node) build_plate_number = node.callDecoration("getBuildPlateNumber") if build_plate_number is not None and build_plate_number != -1: - Application.getInstance().setActiveBuildPlate(build_plate_number) + self._build_plate_model.setActiveBuildPlate(build_plate_number) self._last_selected_index = index diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index ccec76b53d..e68405daf6 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -18,10 +18,10 @@ class CuraSceneNode(SceneNode): return self._outside_buildarea or self.callDecoration("getBuildPlateNumber") < 0 def isVisible(self): - return super().isVisible() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate + return super().isVisible() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate def isSelectable(self) -> bool: - return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().activeBuildPlate + return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate ## Taken from SceneNode, but replaced SceneNode with CuraSceneNode def __deepcopy__(self, memo): diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index f8b68e118a..c250b9019c 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -70,7 +70,7 @@ class CuraEngineBackend(QObject, Backend): # Workaround to disable layer view processing if layer view is not active. self._layer_view_active = False Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) - Application.getInstance().activeBuildPlateChanged.connect(self._onActiveViewChanged) + Application.getInstance().getBuildPlateModel().activeBuildPlateChanged.connect(self._onActiveViewChanged) self._onActiveViewChanged() self._stored_layer_data = [] self._stored_optimized_layer_data = {} # key is build plate number, then arrays are stored until they go to the ProcessSlicesLayersJob @@ -564,7 +564,7 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time ) # See if we need to process the sliced layers job. - active_build_plate = Application.getInstance().activeBuildPlate + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()) and active_build_plate == self._start_slice_job_build_plate: self._startProcessSlicedLayersJob(active_build_plate) # self._onActiveViewChanged() @@ -682,7 +682,7 @@ class CuraEngineBackend(QObject, Backend): application = Application.getInstance() view = application.getController().getActiveView() if view: - active_build_plate = application.activeBuildPlate + active_build_plate = application.getBuildPlateModel().activeBuildPlate if view.getPluginId() == "LayerView": # If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 2b0e82d4b3..e6f60df723 100755 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -66,7 +66,7 @@ class LayerPass(RenderPass): self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) - active_build_plate = Application.getInstance().activeBuildPlate + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self._scene.getRoot()): diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 699cec23f5..973b513794 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -71,11 +71,9 @@ class SolidView(View): else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - activeBuildPlateNumber = Application.getInstance().activeBuildPlate - for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): - if node.getMeshData() and node.isVisible(): # and (node.callDecoration("getBuildPlateNumber") == activeBuildPlateNumber): + if node.getMeshData() and node.isVisible(): uniforms = {} shade_factor = 1.0 diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 29d8b439a8..1db6e2a511 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -324,6 +324,7 @@ UM.MainWindow } } + /* Button { id: openFileButton; @@ -339,17 +340,19 @@ UM.MainWindow } action: Cura.Actions.open; } + */ Button { id: objectsButton; text: catalog.i18nc("@action:button","Objects"); - iconSource: UM.Theme.getIcon("load") + iconSource: UM.Theme.getIcon("plus") style: UM.Theme.styles.tool_button tooltip: ''; anchors { - top: openFileButton.bottom; + top: topbar.bottom; + //top: openFileButton.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; } diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 175410773e..2aa3bd6bdb 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -7,7 +7,7 @@ import QtQuick.Dialogs 1.2 import QtQuick.Window 2.1 import UM 1.2 as UM -import Cura 1.0 as Cura +import Cura 1.2 as Cura Menu { @@ -40,21 +40,21 @@ Menu } MenuSeparator {} - MenuItem { - text: "build plate 0"; - onTriggered: CuraActions.setBuildPlateForSelection(0); - checkable: true - checked: false + Instantiator + { + model: Cura.BuildPlateModel + MenuItem { + text: Cura.BuildPlateModel.getItem(index).name; + onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.getItem(index).buildPlateNumber); + checkable: true + checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate + } + onObjectAdded: base.insertItem(index, object); + onObjectRemoved: base.removeItem(object) } MenuItem { - text: "build plate 1"; - onTriggered: CuraActions.setBuildPlateForSelection(1); - checkable: true - checked: false - } - MenuItem { - text: "build plate 2"; - onTriggered: CuraActions.setBuildPlateForSelection(2); + text: "New build plate"; + onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.maxBuildPlate + 1); checkable: true checked: false } diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 3c5485da32..a78e465c85 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -5,12 +5,12 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import UM 1.2 as UM -import Cura 1.0 as Cura +import Cura 1.2 as Cura Menu { title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); - id: menu + id: base enabled: !PrintInformation.preSliced Instantiator { @@ -23,30 +23,27 @@ Menu exclusiveGroup: group; onTriggered: UM.Controller.setActiveView(model.id); } - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) + onObjectAdded: base.insertItem(index, object) + onObjectRemoved: base.removeItem(object) } ExclusiveGroup { id: group; } MenuSeparator {} - MenuItem { - text: "build plate 0"; - onTriggered: CuraApplication.setActiveBuildPlate(0); - } - MenuItem { - text: "build plate 1"; - onTriggered: CuraApplication.setActiveBuildPlate(1); - } - MenuItem { - text: "build plate 2"; - onTriggered: CuraApplication.setActiveBuildPlate(2); + MenuItem { action: Cura.Actions.homeCamera; } + + MenuSeparator {} + Instantiator + { + model: Cura.BuildPlateModel + MenuItem { + text: Cura.BuildPlateModel.getItem(index).name; + onTriggered: Cura.BuildPlateModel.setActiveBuildPlate(Cura.BuildPlateModel.getItem(index).buildPlateNumber); + checkable: true; + checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate; + exclusiveGroup: buildPlateGroup; + } + onObjectAdded: base.insertItem(index, object); + onObjectRemoved: base.removeItem(object) } ExclusiveGroup { id: buildPlateGroup; } - - MenuItem { - text: "New build plate"; - onTriggered: CuraApplication.newBuildPlate(); - } - MenuSeparator {} - MenuItem { action: Cura.Actions.homeCamera; } } diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 4eeb0cd568..bf7d92c4d6 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -52,7 +52,6 @@ Rectangle id: nodeNameLabel anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - //anchors.right: parent.right width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 text: Cura.ObjectManager.getItem(index) ? Cura.ObjectManager.getItem(index).name : ""; color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectManager.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) @@ -66,7 +65,7 @@ Rectangle anchors.left: nodeNameLabel.right anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right - text: Cura.ObjectManager.getItem(index) ? Cura.ObjectManager.getItem(index).buildPlateNumber : 0; + text: Cura.ObjectManager.getItem(index).buildPlateNumber != -1 ? Cura.ObjectManager.getItem(index).buildPlateNumber + 1 : ""; color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text elide: Text.ElideRight } @@ -134,41 +133,22 @@ Rectangle } } - ListModel - { - id: buildPlatesModel - - ListElement - { - name: "build plate 0" - buildPlateNumber: 0 - } - ListElement - { - name: "build plate 1" - buildPlateNumber: 1 - } - ListElement - { - name: "build plate 2" - buildPlateNumber: 2 - } - } Component { id: buildPlateDelegate Rectangle { height: childrenRect.height - color: CuraApplication.activeBuildPlate == buildPlateNumber ? palette.highlight : index % 2 ? palette.base : palette.alternateBase + color: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate ? palette.highlight : index % 2 ? palette.base : palette.alternateBase width: parent.width Label { + id: buildPlateNameLabel anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: parent.right - text: name //Cura.ObjectManager.getItem(index).name; - color: CuraApplication.activeBuildPlate == buildPlateNumber ? palette.highlightedText : palette.text + width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 + text: Cura.BuildPlateModel.getItem(index) ? Cura.BuildPlateModel.getItem(index).name : ""; + color: Cura.BuildPlateModel.activeBuildPlate == index ? palette.highlightedText : palette.text elide: Text.ElideRight } @@ -177,7 +157,7 @@ Rectangle anchors.fill: parent; onClicked: { - CuraApplication.setActiveBuildPlate(buildPlateNumber); + Cura.BuildPlateModel.setActiveBuildPlate(index); } } } @@ -192,7 +172,6 @@ Rectangle anchors { - // top: objectsList.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; @@ -210,21 +189,8 @@ Rectangle ListView { id: buildPlateListView - model: buildPlatesModel - - onModelChanged: - { - //currentIndex = -1; - } + model: Cura.BuildPlateModel width: parent.width - currentIndex: -1 - onCurrentIndexChanged: - { - //base.selectedPrinter = listview.model[currentIndex]; - // Only allow connecting if the printer has responded to API query since the last refresh - //base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; - } - //Component.onCompleted: manager.startDiscovery() delegate: buildPlateDelegate } } From f6c7ffac116c0541aff3d8d4d68e66055bc4c8ad Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 14 Nov 2017 14:48:51 +0100 Subject: [PATCH 211/764] CURA-4525 some cleanup and comments --- cura/CuraApplication.py | 1 - cura/GCodeListDecorator.py | 2 +- cura/ObjectManager.py | 1 + cura/Scene/BuildPlateDecorator.py | 1 + plugins/CuraEngineBackend/CuraEngineBackend.py | 15 +++------------ .../CuraEngineBackend/ProcessSlicedLayersJob.py | 11 ----------- 6 files changed, 6 insertions(+), 25 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 08b81d568c..4b71047dfc 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -815,7 +815,6 @@ class CuraApplication(QtApplication): qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") - # qmlRegisterSingletonType(ObjectManager, "Cura", 1, 0, "ObjectManager", ObjectManager.createObjectManager) qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) diff --git a/cura/GCodeListDecorator.py b/cura/GCodeListDecorator.py index 66ecf3beac..5738d0a7f2 100644 --- a/cura/GCodeListDecorator.py +++ b/cura/GCodeListDecorator.py @@ -4,7 +4,7 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator class GCodeListDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - self._gcode_list = {} # [] + self._gcode_list = [] def getGCodeList(self): return self._gcode_list diff --git a/cura/ObjectManager.py b/cura/ObjectManager.py index 8361e43d71..413f43ed73 100644 --- a/cura/ObjectManager.py +++ b/cura/ObjectManager.py @@ -11,6 +11,7 @@ from PyQt5.QtWidgets import QApplication from UM.Preferences import Preferences +## Keep track of all objects in the project class ObjectManager(ListModel): def __init__(self): super().__init__() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 6b4dcfc970..cfbe792699 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -3,6 +3,7 @@ from UM.Application import Application from UM.Logger import Logger +## Make a SceneNode build plate aware CuraSceneNode objects all have this decorator. class BuildPlateDecorator(SceneNodeDecorator): def __init__(self, build_plate_number = -1): super().__init__() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index c250b9019c..b0f44e931d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -112,7 +112,6 @@ class CuraEngineBackend(QObject, Backend): self._tool_active = False # If a tool is active, some tasks do not have to do anything self._always_restart = True # Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness. self._process_layers_job = None # The currently active job to process layers, or None if it is not processing layers. - # self._need_slicing = False self._build_plates_to_be_sliced = [] # what needs slicing? self._engine_is_fresh = True # Is the newly started engine used before or not? @@ -446,11 +445,6 @@ class CuraEngineBackend(QObject, Backend): self._invokeSlice() - # #self.needsSlicing() - # self.stopSlicing() - # #self._onChanged() - # self._invokeSlice() - ## Called when an error occurs in the socket connection towards the engine. # # \param error The exception that occurred. @@ -476,12 +470,9 @@ class CuraEngineBackend(QObject, Backend): node.getParent().removeChild(node) def markSliceAll(self): - if 0 not in self._build_plates_to_be_sliced: - self._build_plates_to_be_sliced.append(0) - if 1 not in self._build_plates_to_be_sliced: - self._build_plates_to_be_sliced.append(1) - if 2 not in self._build_plates_to_be_sliced: - self._build_plates_to_be_sliced.append(2) + for build_plate_number in range(Application.getInstance().getBuildPlateModel().maxBuildPlate + 1): + if build_plate_number not in self._build_plates_to_be_sliced: + self._build_plates_to_be_sliced.append(build_plate_number) ## Convenient function: mark everything to slice, emit state and clear layer data def needsSlicing(self): diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 916cc4d914..8da18a066d 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -84,17 +84,6 @@ class ProcessSlicedLayersJob(Job): new_node = SceneNode() new_node.addDecorator(BuildPlateDecorator(self._build_plate_number)) - # ## Remove old layer data (if any) - # for node in DepthFirstIterator(self._scene.getRoot()): - # if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number: - # Logger.log("d", " # Removing: %s", node) - # node.getParent().removeChild(node) - # #break - # if self._abort_requested: - # if self._progress_message: - # self._progress_message.hide() - # return - # Force garbage collection. # For some reason, Python has a tendency to keep the layer data # in memory longer than needed. Forcing the GC to run here makes From 99319b223cbc49f75b25c6e3e01ccddc3c6a9872 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 14 Nov 2017 15:28:31 +0100 Subject: [PATCH 212/764] CURA-4526 GCodeReader now reads the feedrate and layer thickness --- plugins/GCodeReader/GCodeReader.py | 54 +++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 15 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index c7aea0ddcc..9ff4df4692 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -40,7 +40,8 @@ class GCodeReader(MeshReader): self._extruder_number = 0 self._clearValues() self._scene_node = None - self._position = namedtuple('Position', ['x', 'y', 'z', 'e']) + # X, Y, Z position, F feedrate and E extruder values are stored + self._position = namedtuple('Position', ['x', 'y', 'z', 'f', 'e']) self._is_layers_in_file = False # Does the Gcode have the layers comment? self._extruder_offsets = {} # Offsets for multi extruders. key is index, value is [x-offset, y-offset] self._current_layer_thickness = 0.2 # default @@ -96,7 +97,7 @@ class GCodeReader(MeshReader): def _createPolygon(self, layer_thickness, path, extruder_offsets): countvalid = 0 for point in path: - if point[3] > 0: + if point[4] > 0: countvalid += 1 if countvalid >= 2: # we know what to do now, no need to count further @@ -117,16 +118,19 @@ class GCodeReader(MeshReader): line_feedrates = numpy.empty((count - 1, 1), numpy.float32) # TODO: need to calculate actual line width based on E values line_widths[:, 0] = 0.35 # Just a guess - line_thicknesses[:, 0] = layer_thickness # TODO Same for all, but it should be calculated from the layer height differences - line_feedrates[:, 0] = 50 # TODO Now we use 50mm/s as a demo, it should be obtained from the GCode + line_thicknesses[:, 0] = layer_thickness points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: points[i, :] = [point[0] + extruder_offsets[0], point[2], -point[1] - extruder_offsets[1]] if i > 0: - line_types[i - 1] = point[3] - if point[3] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + line_feedrates[i - 1] = point[3] + line_types[i - 1] = point[4] + if point[4] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: line_widths[i - 1] = 0.1 + line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines + # else: + # line_widths[i - 1] = _calculateLineWidth(layer_thickness) i += 1 this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) @@ -135,27 +139,43 @@ class GCodeReader(MeshReader): this_layer.polygons.append(this_poly) return True + def _calculateLineWidth(self, current_position, previous_position, layer_thickness): + # Area of the filament + filament_diameter = 2.85 + Af = (filament_diameter / 2) ** 2 * numpy.pi + # Length of the extruded filament + de = current_position.e - previous_position.e + # Volumne of the extruded filament + dVe = de * Af + # Length of the printed line + dX = numpy.sqrt((current_position.x - previous_position.x)**2 + (current_position.y - previous_position.y)**2) + # Area of the printed line. This area is a ellipse + Ae = dVe / dX + # This area is a ellipse with: r1 = layer_thickness, r2 = layer_width + return Ae / (layer_thickness * numpy.pi) + def _gCode0(self, position, params, path): - x, y, z, e = position + x, y, z, f, e = position x = params.x if params.x is not None else x y = params.y if params.y is not None else y z = params.z if params.z is not None else position.z + f = params.f if params.f is not None else position.f if params.e is not None: if params.e > e[self._extruder_number]: - path.append([x, y, z, self._layer_type]) # extrusion + path.append([x, y, z, f, self._layer_type]) # extrusion else: - path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction + path.append([x, y, z, f, LayerPolygon.MoveRetractionType]) # retraction e[self._extruder_number] = params.e # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. if z > self._previous_z and (z - self._previous_z < 1.5): - self._current_layer_thickness = z - self._previous_z + 0.05 # allow a tiny overlap + self._current_layer_thickness = z - self._previous_z # allow a tiny overlap self._previous_z = z else: - path.append([x, y, z, LayerPolygon.MoveCombingType]) - return self._position(x, y, z, e) + path.append([x, y, z, f, LayerPolygon.MoveCombingType]) + return self._position(x, y, z, f, e) # G0 and G1 should be handled exactly the same. _gCode1 = _gCode0 @@ -166,6 +186,7 @@ class GCodeReader(MeshReader): params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, 0, + position.f, position.e) ## Reset the current position to the values specified. @@ -177,6 +198,7 @@ class GCodeReader(MeshReader): params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, params.z if params.z is not None else position.z, + params.f if params.f is not None else position.f, position.e) def _processGCode(self, G, line, position, path): @@ -184,7 +206,7 @@ class GCodeReader(MeshReader): line = line.split(";", 1)[0] # Remove comments (if any) if func is not None: s = line.upper().split(" ") - x, y, z, e = None, None, None, None + x, y, z, f, e = None, None, None, None, None for item in s[1:]: if len(item) <= 1: continue @@ -196,11 +218,13 @@ class GCodeReader(MeshReader): y = float(item[1:]) if item[0] == "Z": z = float(item[1:]) + if item[0] == "F": + f = float(item[1:]) / 60 if item[0] == "E": e = float(item[1:]) if (x is not None and x < 0) or (y is not None and y < 0): self._center_is_zero = True - params = self._position(x, y, z, e) + params = self._position(x, y, z, f, e) return func(position, params, path) return position @@ -262,7 +286,7 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s..." % file_name) - current_position = self._position(0, 0, 0, [0]) + current_position = self._position(0, 0, 0, 0, [0]) current_path = [] for line in file: From 4a893c048e28259819aac59f72e0e54d628e76f7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 14 Nov 2017 16:35:37 +0100 Subject: [PATCH 213/764] CURA-4525 made PrintInformation multi buildplate-aware --- cura/BuildPlateModel.py | 2 +- cura/CuraApplication.py | 2 + cura/PrintInformation.py | 106 ++++++++++++------ .../CuraEngineBackend/CuraEngineBackend.py | 9 +- 4 files changed, 81 insertions(+), 38 deletions(-) diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index 35a311dc5f..a29dd65de4 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -15,7 +15,7 @@ class BuildPlateModel(ListModel): Application.getInstance().getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously self._max_build_plate = 1 # default - self._active_build_plate = 0 + self._active_build_plate = -1 @pyqtSlot(int) def setActiveBuildPlate(self, nr): diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4b71047dfc..46d4270da7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -758,6 +758,8 @@ class CuraApplication(QtApplication): def getBuildPlateModel(self, *args): if self._build_plate_model is None: self._build_plate_model = BuildPlateModel.createBuildPlateModel() + self._build_plate_model.setActiveBuildPlate(0) # default value + return self._build_plate_model def getSettingInheritanceManager(self, *args): diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index d3bcc10781..6bf35f49c7 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -53,10 +53,10 @@ class PrintInformation(QObject): self.initializeCuraMessagePrintTimeProperties() - self._material_lengths = [] - self._material_weights = [] - self._material_costs = [] - self._material_names = [] + self._material_lengths = {} # indexed by build plate number + self._material_weights = {} + self._material_costs = {} + self._material_names = {} self._pre_sliced = False @@ -68,10 +68,13 @@ class PrintInformation(QObject): self._abbr_machine = "" self._job_name = "" self._project_name = "" + self._active_build_plate = 0 + self._initVariablesWithBuildPlate(self._active_build_plate) Application.getInstance().globalContainerStackChanged.connect(self._updateJobName) Application.getInstance().fileLoaded.connect(self.setBaseName) Application.getInstance().projectFileLoaded.connect(self.setProjectName) + Application.getInstance().getBuildPlateModel().activeBuildPlateChanged.connect(self._onActiveBuildPlateChanged) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._active_material_container = None @@ -83,7 +86,7 @@ class PrintInformation(QObject): # Crate cura message translations and using translation keys initialize empty time Duration object for total time # and time for each feature def initializeCuraMessagePrintTimeProperties(self): - self._current_print_time = Duration(None, self) + self._current_print_time = {} # Duration(None, self) self._print_time_message_translations = { "inset_0": catalog.i18nc("@tooltip", "Outer Wall"), @@ -101,10 +104,26 @@ class PrintInformation(QObject): self._print_time_message_values = {} - # Full fill message values using keys from _print_time_message_translations - for key in self._print_time_message_translations.keys(): - self._print_time_message_values[key] = Duration(None, self) + def _initPrintTimeMessageValues(self, build_plate_number): + # Full fill message values using keys from _print_time_message_translations + self._print_time_message_values[build_plate_number] = {} + for key in self._print_time_message_translations.keys(): + self._print_time_message_values[build_plate_number][key] = Duration(None, self) + + def _initVariablesWithBuildPlate(self, build_plate_number): + if build_plate_number not in self._print_time_message_values: + self._initPrintTimeMessageValues(build_plate_number) + if self._active_build_plate not in self._material_lengths: + self._material_lengths[self._active_build_plate] = [] + if self._active_build_plate not in self._material_weights: + self._material_weights[self._active_build_plate] = [] + if self._active_build_plate not in self._material_costs: + self._material_costs[self._active_build_plate] = [] + if self._active_build_plate not in self._material_names: + self._material_names[self._active_build_plate] = [] + if self._active_build_plate not in self._current_print_time: + self._current_print_time[self._active_build_plate] = Duration(None, self) currentPrintTimeChanged = pyqtSignal() @@ -120,53 +139,58 @@ class PrintInformation(QObject): @pyqtProperty(Duration, notify = currentPrintTimeChanged) def currentPrintTime(self): - return self._current_print_time + return self._current_print_time[self._active_build_plate] materialLengthsChanged = pyqtSignal() @pyqtProperty("QVariantList", notify = materialLengthsChanged) def materialLengths(self): - return self._material_lengths + return self._material_lengths[self._active_build_plate] materialWeightsChanged = pyqtSignal() @pyqtProperty("QVariantList", notify = materialWeightsChanged) def materialWeights(self): - return self._material_weights + return self._material_weights[self._active_build_plate] materialCostsChanged = pyqtSignal() @pyqtProperty("QVariantList", notify = materialCostsChanged) def materialCosts(self): - return self._material_costs + return self._material_costs[self._active_build_plate] materialNamesChanged = pyqtSignal() @pyqtProperty("QVariantList", notify = materialNamesChanged) def materialNames(self): - return self._material_names + return self._material_names[self._active_build_plate] - def _onPrintDurationMessage(self, print_time, material_amounts): - - self._updateTotalPrintTimePerFeature(print_time) + def _onPrintDurationMessage(self, build_plate_number, print_time, material_amounts): + Logger.log("d", " ### print duration message for build plate %s", build_plate_number) + self._updateTotalPrintTimePerFeature(build_plate_number, print_time) self.currentPrintTimeChanged.emit() self._material_amounts = material_amounts self._calculateInformation() - def _updateTotalPrintTimePerFeature(self, print_time): + def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time): total_estimated_time = 0 + if build_plate_number not in self._print_time_message_values: + self._initPrintTimeMessageValues(build_plate_number) + for feature, time in print_time.items(): if time != time: # Check for NaN. Engine can sometimes give us weird values. - self._print_time_message_values.get(feature).setDuration(0) + self._print_time_message_values[build_plate_number].get(feature).setDuration(0) Logger.log("w", "Received NaN for print duration message") continue total_estimated_time += time - self._print_time_message_values.get(feature).setDuration(time) + self._print_time_message_values[build_plate_number].get(feature).setDuration(time) - self._current_print_time.setDuration(total_estimated_time) + if build_plate_number not in self._current_print_time: + self._current_print_time[build_plate_number] = Duration(None, self) + self._current_print_time[build_plate_number].setDuration(total_estimated_time) def _calculateInformation(self): if Application.getInstance().getGlobalContainerStack() is None: @@ -174,10 +198,10 @@ class PrintInformation(QObject): # Material amount is sent as an amount of mm^3, so calculate length from that radius = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2 - self._material_lengths = [] - self._material_weights = [] - self._material_costs = [] - self._material_names = [] + self._material_lengths[self._active_build_plate] = [] + self._material_weights[self._active_build_plate] = [] + self._material_costs[self._active_build_plate] = [] + self._material_names[self._active_build_plate] = [] material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings")) @@ -215,10 +239,10 @@ class PrintInformation(QObject): length = round((amount / (math.pi * radius ** 2)) / 1000, 2) else: length = 0 - self._material_weights.append(weight) - self._material_lengths.append(length) - self._material_costs.append(cost) - self._material_names.append(material_name) + self._material_weights[self._active_build_plate].append(weight) + self._material_lengths[self._active_build_plate].append(length) + self._material_costs[self._active_build_plate].append(cost) + self._material_names[self._active_build_plate].append(material_name) self.materialLengthsChanged.emit() self.materialWeightsChanged.emit() @@ -245,6 +269,20 @@ class PrintInformation(QObject): self._active_material_container = active_material_containers[0] self._active_material_container.metaDataChanged.connect(self._onMaterialMetaDataChanged) + def _onActiveBuildPlateChanged(self): + new_active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate + if new_active_build_plate != self._active_build_plate: + Logger.log("d", " ## active build plate changed: %s", self._active_build_plate) + self._active_build_plate = new_active_build_plate + + self._initVariablesWithBuildPlate(self._active_build_plate) + + self.materialLengthsChanged.emit() + self.materialWeightsChanged.emit() + self.materialCostsChanged.emit() + self.materialNamesChanged.emit() + self.currentPrintTimeChanged.emit() + def _onMaterialMetaDataChanged(self, *args, **kwargs): self._calculateInformation() @@ -341,7 +379,9 @@ class PrintInformation(QObject): @pyqtSlot(result = "QVariantMap") def getFeaturePrintTimes(self): result = {} - for feature, time in self._print_time_message_values.items(): + if self._active_build_plate not in self._print_time_message_values: + self._initPrintTimeMessageValues(self._active_build_plate) + for feature, time in self._print_time_message_values[self._active_build_plate].items(): if feature in self._print_time_message_translations: result[self._print_time_message_translations[feature]] = time else: @@ -349,10 +389,12 @@ class PrintInformation(QObject): return result # Simulate message with zero time duration - def setToZeroPrintInformation(self): + def setToZeroPrintInformation(self, build_plate_number): temp_message = {} - for key in self._print_time_message_values.keys(): + if build_plate_number not in self._print_time_message_values: + self._print_time_message_values[build_plate_number] = {} + for key in self._print_time_message_values[build_plate_number].keys(): temp_message[key] = 0 temp_material_amounts = [0] - self._onPrintDurationMessage(temp_message, temp_material_amounts) + self._onPrintDurationMessage(build_plate_number, temp_message, temp_material_amounts) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b0f44e931d..859578c3e9 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -207,6 +207,7 @@ class CuraEngineBackend(QObject, Backend): return # see if we really have to slice + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0) Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced) num_objects = self._numObjects() @@ -218,8 +219,8 @@ class CuraEngineBackend(QObject, Backend): self._stored_layer_data = [] self._stored_optimized_layer_data[build_plate_to_be_sliced] = [] - if Application.getInstance().getPrintInformation(): - Application.getInstance().getPrintInformation().setToZeroPrintInformation() + if Application.getInstance().getPrintInformation() and build_plate_to_be_sliced == active_build_plate: + Application.getInstance().getPrintInformation().setToZeroPrintInformation(build_plate_to_be_sliced) if self._process is None: self._createSocket() @@ -547,11 +548,9 @@ class CuraEngineBackend(QObject, Backend): replaced = replaced.replace("{filament_cost}", str(Application.getInstance().getPrintInformation().materialCosts)) replaced = replaced.replace("{jobname}", str(Application.getInstance().getPrintInformation().jobName)) - #gcode_list[gcode_list.index(line)] = replaced gcode_list[index] = replaced self._slicing = False - #self._need_slicing = False Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time ) # See if we need to process the sliced layers job. @@ -608,7 +607,7 @@ class CuraEngineBackend(QObject, Backend): material_amounts.append(message.getRepeatedMessage("materialEstimates", index).material_amount) times = self._parseMessagePrintTimes(message) - self.printDurationMessage.emit(times, material_amounts) + self.printDurationMessage.emit(self._start_slice_job_build_plate, times, material_amounts) ## Called for parsing message to retrieve estimated time per feature # From e55bb1e25c94b0d2e78a53372116fa60cda99971 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 15 Nov 2017 00:35:53 +0100 Subject: [PATCH 214/764] Simplify getting material's GUID --- plugins/CuraEngineBackend/StartSliceJob.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 00db2ffa00..720aacf374 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -250,9 +250,7 @@ class StartSliceJob(Job): settings = self._buildReplacementTokens(stack) #Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. - material_instance_container = stack.findContainer({"type": "material"}) - if material_instance_container: - settings["material_guid"] = material_instance_container.getMetaDataEntry("GUID", "") + settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "") #Replace the setting tokens in start and end g-code. settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings) From 3d2868c336ff24b3c724ced18244d4b8d53b5051 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 15 Nov 2017 00:43:17 +0100 Subject: [PATCH 215/764] Added icons CURA-4527 --- resources/qml/Topbar.qml | 10 ++-- resources/themes/cura-light/icons/view_3d.svg | 56 +++++++++++++++++++ .../themes/cura-light/icons/view_fron.svg | 56 +++++++++++++++++++ .../themes/cura-light/icons/view_left.svg | 56 +++++++++++++++++++ .../themes/cura-light/icons/view_right.svg | 56 +++++++++++++++++++ .../themes/cura-light/icons/view_top.svg | 56 +++++++++++++++++++ 6 files changed, 285 insertions(+), 5 deletions(-) create mode 100644 resources/themes/cura-light/icons/view_3d.svg create mode 100644 resources/themes/cura-light/icons/view_fron.svg create mode 100644 resources/themes/cura-light/icons/view_left.svg create mode 100644 resources/themes/cura-light/icons/view_right.svg create mode 100644 resources/themes/cura-light/icons/view_top.svg diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 7e1bfeb808..bf4c8b50ac 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -237,7 +237,7 @@ Rectangle // #1 3d view Button { - iconSource: UM.Theme.getIcon("category_machine") + iconSource: UM.Theme.getIcon("view_3d") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ @@ -248,7 +248,7 @@ Rectangle // #2 Front view Button { - iconSource: UM.Theme.getIcon("category_machine") + iconSource: UM.Theme.getIcon("view_fron") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ @@ -259,7 +259,7 @@ Rectangle // #3 Top view Button { - iconSource: UM.Theme.getIcon("category_machine") + iconSource: UM.Theme.getIcon("view_top") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ @@ -270,7 +270,7 @@ Rectangle // #4 Left view Button { - iconSource: UM.Theme.getIcon("category_machine") + iconSource: UM.Theme.getIcon("view_left") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ @@ -281,7 +281,7 @@ Rectangle // #5 Left view Button { - iconSource: UM.Theme.getIcon("category_machine") + iconSource: UM.Theme.getIcon("view_right") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ diff --git a/resources/themes/cura-light/icons/view_3d.svg b/resources/themes/cura-light/icons/view_3d.svg new file mode 100644 index 0000000000..de803ab2a6 --- /dev/null +++ b/resources/themes/cura-light/icons/view_3d.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/resources/themes/cura-light/icons/view_fron.svg b/resources/themes/cura-light/icons/view_fron.svg new file mode 100644 index 0000000000..68e43c43a0 --- /dev/null +++ b/resources/themes/cura-light/icons/view_fron.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/resources/themes/cura-light/icons/view_left.svg b/resources/themes/cura-light/icons/view_left.svg new file mode 100644 index 0000000000..729a7f18cd --- /dev/null +++ b/resources/themes/cura-light/icons/view_left.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/resources/themes/cura-light/icons/view_right.svg b/resources/themes/cura-light/icons/view_right.svg new file mode 100644 index 0000000000..802da651ef --- /dev/null +++ b/resources/themes/cura-light/icons/view_right.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/resources/themes/cura-light/icons/view_top.svg b/resources/themes/cura-light/icons/view_top.svg new file mode 100644 index 0000000000..8c94744df0 --- /dev/null +++ b/resources/themes/cura-light/icons/view_top.svg @@ -0,0 +1,56 @@ + + + + + + image/svg+xml + + + + + + + + + From 8dd91519a67983b913c4d18d7ccb4dcbf3cdef82 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 15 Nov 2017 00:52:37 +0100 Subject: [PATCH 216/764] Move Support Chunk Size out of children of skip_some_zags The rule is that leaf settings are the ones that are used by the engine. The support_skip_some_zags setting is used by the engine. --- resources/definitions/fdmprinter.def.json | 54 ++++++++++++----------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ae7050a546..b17769eba2 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5075,7 +5075,8 @@ "default_value": false, "settable_per_mesh": true }, - "support_skip_some_zags": { + "support_skip_some_zags": + { "label": "Break Up Support In Chunks", "description": "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern.", "type": "bool", @@ -5083,35 +5084,36 @@ "enabled": "support_enable and (support_pattern == 'zigzag')", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_skip_zag_per_mm": + { + "label": "Support Chunk Size", + "description": "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away.", + "type": "float", + "unit": "mm", + "default_value": 20, + "minimum_value": "0", + "minimum_value_warning": "support_line_distance", + "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", + "limit_to_extruder": "support_infill_extruder_nr", + "settable_per_mesh": false, "settable_per_extruder": true, - "children": { - "support_skip_zag_per_mm": { - "label": "Support Chunk Size", - "description": "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away.", - "type": "float", - "unit": "mm", - "default_value": 20, - "minimum_value": "0", - "minimum_value_warning": "support_line_distance", + "children": + { + "support_zag_skip_count": + { + "label": "Support Chunk Line Count", + "description": "Skip one in every N connection lines to make the support structure easier to break away.", + "type": "int", + "default_value": 5, + "value": "round(support_skip_zag_per_mm / support_line_distance)", + "minimum_value": "1", + "minimum_value_warning": "3", "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true, - "children": { - "support_zag_skip_count": { - "label": "Support Chunk Line Count", - "description": "Skip one in every N connection lines to make the support structure easier to break away.", - "type": "int", - "default_value": 5, - "value": "round(support_skip_zag_per_mm / support_line_distance)", - "minimum_value": "1", - "minimum_value_warning": "3", - "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", - "limit_to_extruder": "support_infill_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": true - } - } + "settable_per_extruder": true } } }, From b2da4894b1f4eca8b39a288b6fc73ab830e69950 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 15 Nov 2017 01:21:08 +0100 Subject: [PATCH 217/764] CuraApplication: Rename file --> file_name 'file' is a built-in function! --- cura/CuraApplication.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 41358b83f5..96ca15741e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -719,8 +719,8 @@ class CuraApplication(QtApplication): if run_headless or self._engine.rootObjects: self.closeSplash() - for file in self.getCommandLineOption("file", []): - self._openFile(file) + for file_name in self.getCommandLineOption("file", []): + self._openFile(file_name) for file_name in self._open_file_queue: #Open all the files that were queued up while plug-ins were loading. self._openFile(file_name) From be6561b5754d8b13bf51b5cb990907724787797f Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 15 Nov 2017 10:28:34 +0100 Subject: [PATCH 218/764] CURA-4525 fixed material info per build plate, bugfix arrange on load --- cura/CuraApplication.py | 2 +- cura/PrintInformation.py | 29 +++++++++++-------- .../CuraEngineBackend/CuraEngineBackend.py | 1 - plugins/GCodeWriter/GCodeWriter.py | 3 +- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 46d4270da7..14b09c4902 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1428,7 +1428,7 @@ class CuraApplication(QtApplication): self.fileLoaded.emit(filename) arrange_objects_on_load = Preferences.getInstance().getValue("cura/arrange_objects_on_load") - target_build_plate = self.activeBuildPlate if arrange_objects_on_load else -1 + target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 for original_node in nodes: node = CuraSceneNode() # We want our own CuraSceneNode diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 6bf35f49c7..bbc5cd4329 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -165,13 +165,16 @@ class PrintInformation(QObject): def materialNames(self): return self._material_names[self._active_build_plate] + def printTimes(self): + return self._print_time_message_values[self._active_build_plate] + def _onPrintDurationMessage(self, build_plate_number, print_time, material_amounts): Logger.log("d", " ### print duration message for build plate %s", build_plate_number) self._updateTotalPrintTimePerFeature(build_plate_number, print_time) self.currentPrintTimeChanged.emit() self._material_amounts = material_amounts - self._calculateInformation() + self._calculateInformation(build_plate_number) def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time): total_estimated_time = 0 @@ -192,16 +195,16 @@ class PrintInformation(QObject): self._current_print_time[build_plate_number] = Duration(None, self) self._current_print_time[build_plate_number].setDuration(total_estimated_time) - def _calculateInformation(self): + def _calculateInformation(self, build_plate_number): if Application.getInstance().getGlobalContainerStack() is None: return # Material amount is sent as an amount of mm^3, so calculate length from that radius = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2 - self._material_lengths[self._active_build_plate] = [] - self._material_weights[self._active_build_plate] = [] - self._material_costs[self._active_build_plate] = [] - self._material_names[self._active_build_plate] = [] + self._material_lengths[build_plate_number] = [] + self._material_weights[build_plate_number] = [] + self._material_costs[build_plate_number] = [] + self._material_names[build_plate_number] = [] material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings")) @@ -239,10 +242,10 @@ class PrintInformation(QObject): length = round((amount / (math.pi * radius ** 2)) / 1000, 2) else: length = 0 - self._material_weights[self._active_build_plate].append(weight) - self._material_lengths[self._active_build_plate].append(length) - self._material_costs[self._active_build_plate].append(cost) - self._material_names[self._active_build_plate].append(material_name) + self._material_weights[build_plate_number].append(weight) + self._material_lengths[build_plate_number].append(length) + self._material_costs[build_plate_number].append(cost) + self._material_names[build_plate_number].append(material_name) self.materialLengthsChanged.emit() self.materialWeightsChanged.emit() @@ -253,7 +256,8 @@ class PrintInformation(QObject): if preference != "cura/material_settings": return - self._calculateInformation() + for build_plate_number in range(Application.getInstance().getBuildPlateModel().maxBuildPlate + 1): + self._calculateInformation(build_plate_number) def _onActiveMaterialChanged(self): if self._active_material_container: @@ -284,7 +288,8 @@ class PrintInformation(QObject): self.currentPrintTimeChanged.emit() def _onMaterialMetaDataChanged(self, *args, **kwargs): - self._calculateInformation() + for build_plate_number in range(Application.getInstance().getBuildPlateModel().maxBuildPlate + 1): + self._calculateInformation(build_plate_number) @pyqtSlot(str) def setJobName(self, name): diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 859578c3e9..08c89c56a6 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -433,7 +433,6 @@ class CuraEngineBackend(QObject, Backend): self._postponed_scene_change_sources.append(source) return - Logger.log("d", " going to reslice: %s", build_plate_changed) self.stopSlicing() for build_plate_number in build_plate_changed: if build_plate_number not in self._build_plates_to_be_sliced: diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 3860590ef7..192354d947 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -59,8 +59,9 @@ class GCodeWriter(MeshWriter): Logger.log("e", "GCode Writer does not support non-text mode.") return False + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate scene = Application.getInstance().getController().getScene() - gcode_list = getattr(scene, "gcode_list") + gcode_list = getattr(scene, "gcode_list")[active_build_plate] if gcode_list: for gcode in gcode_list: stream.write(gcode) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 0514c4dacf..a72c056bc9 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -162,7 +162,7 @@ class SliceInfo(Extension): data["models"].append(model) - print_times = print_information._print_time_message_values + print_times = print_information.printTimes() data["print_times"] = {"travel": int(print_times["travel"].getDisplayString(DurationFormat.Format.Seconds)), "support": int(print_times["support"].getDisplayString(DurationFormat.Format.Seconds)), "infill": int(print_times["infill"].getDisplayString(DurationFormat.Format.Seconds)), From 50308c6e39732fab609d1c5102bebb1e3e7a2227 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 15 Nov 2017 13:03:36 +0100 Subject: [PATCH 219/764] CURA-4526 Calculate the line width from the GCode --- plugins/GCodeReader/GCodeReader.py | 65 +++++++++++++++++------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 9ff4df4692..ca4042351d 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -49,7 +49,9 @@ class GCodeReader(MeshReader): Preferences.getInstance().addPreference("gcodereader/show_caution", True) def _clearValues(self): + self._filament_diameter = 2.85 self._extruder_number = 0 + self._extrusion_length_offset = [0] self._layer_type = LayerPolygon.Inset0Type self._layer_number = 0 self._previous_z = 0 @@ -97,7 +99,7 @@ class GCodeReader(MeshReader): def _createPolygon(self, layer_thickness, path, extruder_offsets): countvalid = 0 for point in path: - if point[4] > 0: + if point[5] > 0: countvalid += 1 if countvalid >= 2: # we know what to do now, no need to count further @@ -116,21 +118,22 @@ class GCodeReader(MeshReader): line_widths = numpy.empty((count - 1, 1), numpy.float32) line_thicknesses = numpy.empty((count - 1, 1), numpy.float32) line_feedrates = numpy.empty((count - 1, 1), numpy.float32) - # TODO: need to calculate actual line width based on E values line_widths[:, 0] = 0.35 # Just a guess line_thicknesses[:, 0] = layer_thickness points = numpy.empty((count, 3), numpy.float32) + extrusion_values = numpy.empty((count, 1), numpy.float32) i = 0 for point in path: points[i, :] = [point[0] + extruder_offsets[0], point[2], -point[1] - extruder_offsets[1]] + extrusion_values[i] = point[4] if i > 0: line_feedrates[i - 1] = point[3] - line_types[i - 1] = point[4] - if point[4] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + line_types[i - 1] = point[5] + if point[5] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: line_widths[i - 1] = 0.1 line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines - # else: - # line_widths[i - 1] = _calculateLineWidth(layer_thickness) + else: + line_widths[i - 1] = self._calculateLineWidth(points[i], points[i-1], extrusion_values[i], extrusion_values[i-1], layer_thickness) i += 1 this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) @@ -139,20 +142,27 @@ class GCodeReader(MeshReader): this_layer.polygons.append(this_poly) return True - def _calculateLineWidth(self, current_position, previous_position, layer_thickness): + def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): # Area of the filament - filament_diameter = 2.85 - Af = (filament_diameter / 2) ** 2 * numpy.pi + Af = (self._filament_diameter / 2) ** 2 * numpy.pi # Length of the extruded filament - de = current_position.e - previous_position.e + de = current_extrusion - previous_extrusion # Volumne of the extruded filament dVe = de * Af # Length of the printed line - dX = numpy.sqrt((current_position.x - previous_position.x)**2 + (current_position.y - previous_position.y)**2) - # Area of the printed line. This area is a ellipse + dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2) + # When the extruder recovers from a retraction, we get zero distance + if dX == 0: + return 0.1 + # Area of the printed line. This area is a rectangle Ae = dVe / dX - # This area is a ellipse with: r1 = layer_thickness, r2 = layer_width - return Ae / (layer_thickness * numpy.pi) + # This area is a rectangle with area equal to layer_thickness * layer_width + line_width = Ae / layer_thickness + + # A threshold is set to avoid weird paths in the GCode + if line_width > 1.2: + return 0.35 + return line_width def _gCode0(self, position, params, path): x, y, z, f, e = position @@ -163,9 +173,9 @@ class GCodeReader(MeshReader): if params.e is not None: if params.e > e[self._extruder_number]: - path.append([x, y, z, f, self._layer_type]) # extrusion + path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion else: - path.append([x, y, z, f, LayerPolygon.MoveRetractionType]) # retraction + path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction e[self._extruder_number] = params.e # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions @@ -174,7 +184,7 @@ class GCodeReader(MeshReader): self._current_layer_thickness = z - self._previous_z # allow a tiny overlap self._previous_z = z else: - path.append([x, y, z, f, LayerPolygon.MoveCombingType]) + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) return self._position(x, y, z, f, e) # G0 and G1 should be handled exactly the same. @@ -193,6 +203,8 @@ class GCodeReader(MeshReader): # For example: G92 X10 will set the X to 10 without any physical motion. def _gCode92(self, position, params, path): if params.e is not None: + # Sometimes a G92 E0 is introduced in the middle of the GCode so we need to keep those offsets for calculate the line_width + self._extrusion_length_offset[self._extruder_number] += position.e[self._extruder_number] - params.e position.e[self._extruder_number] = params.e return self._position( params.x if params.x is not None else position.x, @@ -231,6 +243,7 @@ class GCodeReader(MeshReader): def _processTCode(self, T, line, position, path): self._extruder_number = T if self._extruder_number + 1 > len(position.e): + self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1)) position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) return position @@ -249,6 +262,8 @@ class GCodeReader(MeshReader): def read(self, file_name): Logger.log("d", "Preparing to load %s" % file_name) self._cancelled = False + # We obtain the filament diameter from the selected printer to calculate line widths + self._filament_diameter = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") scene_node = SceneNode() # Override getBoundingBox function of the sceneNode, as this node should return a bounding box, but there is no @@ -319,6 +334,7 @@ class GCodeReader(MeshReader): else: Logger.log("w", "Encountered a unknown type (%s) while parsing g-code.", type) + # When the layer change is reached, the polygon is computed so we have just one layer per layer per extruder if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: try: layer_number = int(line[len(self._layer_keyword):]) @@ -334,17 +350,12 @@ class GCodeReader(MeshReader): G = self._getInt(line, "G") if G is not None: + # When find a movement, the new posistion is calculated and added to the current_path, but + # don't need to create a polygon until the end of the layer current_position = self._processGCode(G, line, current_position, current_path) - - # < 2 is a heuristic for a movement only, that should not be counted as a layer - if current_position.z > last_z and abs(current_position.z - last_z) < 2: - if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): - current_path.clear() - if not self._is_layers_in_file: - self._layer_number += 1 - continue + # When changing the extruder, the polygon with the stored paths is computed if line.startswith("T"): T = self._getInt(line, "T") if T is not None: @@ -353,8 +364,8 @@ class GCodeReader(MeshReader): current_position = self._processTCode(T, line, current_position, current_path) - # "Flush" leftovers - if not self._is_layers_in_file and len(current_path) > 1: + # "Flush" leftovers. Last layer paths are still stored + if len(current_path) > 1: if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): self._layer_number += 1 current_path.clear() From 7aeaf661ae4a604a583de911dabd5876748686e8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Wed, 15 Nov 2017 13:40:46 +0100 Subject: [PATCH 220/764] Change_Color_UI_elements_CURA-4548 --- resources/themes/cura-light/theme.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index ceb5b64263..f084e87da2 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -83,8 +83,8 @@ "error": [255, 140, 0, 255], "sidebar_header_bar": [31, 36, 39, 255], - "sidebar_header_active": [31, 36, 39, 255], - "sidebar_header_hover": [31, 36, 39, 255], + "sidebar_header_active": [68, 72, 75, 255], + "sidebar_header_hover": [68, 72, 75, 255], "sidebar_header_highlight": [68, 192, 255, 255], "sidebar_header_highlight_hover": [68, 192, 255, 255], "sidebar_header_text_inactive": [255, 255, 255, 255], From 864f41772355e6eef4d0170dd9090b870b8d368a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 15 Nov 2017 16:03:32 +0100 Subject: [PATCH 221/764] CURA-4525 Fix load and save projects. Not storing build plates or object names yet. --- cura/PrintInformation.py | 2 -- plugins/3MFReader/ThreeMFReader.py | 13 ++++++++++--- plugins/3MFWriter/ThreeMFWriter.py | 3 ++- resources/qml/Actions.qml | 4 ++-- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index bbc5cd4329..f2d28c9297 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -169,7 +169,6 @@ class PrintInformation(QObject): return self._print_time_message_values[self._active_build_plate] def _onPrintDurationMessage(self, build_plate_number, print_time, material_amounts): - Logger.log("d", " ### print duration message for build plate %s", build_plate_number) self._updateTotalPrintTimePerFeature(build_plate_number, print_time) self.currentPrintTimeChanged.emit() @@ -276,7 +275,6 @@ class PrintInformation(QObject): def _onActiveBuildPlateChanged(self): new_active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate if new_active_build_plate != self._active_build_plate: - Logger.log("d", " ## active build plate changed: %s", self._active_build_plate) self._active_build_plate = new_active_build_plate self._initVariablesWithBuildPlate(self._active_build_plate) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 8c4ef9d1ae..f75cf68312 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -15,8 +15,8 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Application import Application from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager -#from UM.Scene.SceneNode import SceneNode -from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.ZOffsetDecorator import ZOffsetDecorator @@ -44,6 +44,7 @@ class ThreeMFReader(MeshReader): } self._base_name = "" self._unit = None + self._object_count = 0 # Used to name objects as there is no node name yet. def _createMatrixFromTransformationString(self, transformation): if transformation == "": @@ -78,7 +79,12 @@ class ThreeMFReader(MeshReader): ## Convenience function that converts a SceneNode object (as obtained from libSavitar) to a Uranium scene node. # \returns Uranium scene node. def _convertSavitarNodeToUMNode(self, savitar_node): - um_node = SceneNode() + self._object_count += 1 + node_name = "Object %s" % self._object_count + + um_node = CuraSceneNode() + um_node.addDecorator(BuildPlateDecorator(0)) + um_node.setName(node_name) transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation()) um_node.setTransformation(transformation) mesh_builder = MeshBuilder() @@ -155,6 +161,7 @@ class ThreeMFReader(MeshReader): def read(self, file_name): result = [] + self._object_count = 0 # Used to name objects as there is no node name yet. # The base object of 3mf is a zipped archive. try: archive = zipfile.ZipFile(file_name, "r") diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index a764d30fac..8e005c47b1 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -7,6 +7,7 @@ from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application import UM.Scene.SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode import Savitar @@ -63,7 +64,7 @@ class ThreeMFWriter(MeshWriter): ## Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode # \returns Uranium Scenen node. def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): - if type(um_node) is not UM.Scene.SceneNode.SceneNode: + if type(um_node) not in [UM.Scene.SceneNode.SceneNode, CuraSceneNode]: return None savitar_node = Savitar.SceneNode() diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 89ec2cf70d..c6b0a443bb 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -304,8 +304,8 @@ Item Action { id: arrangeAllBuildPlatesAction; - text: ""; - iconName: "document-open"; + text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models To All Build Plates"); + //iconName: "document-open"; onTriggered: CuraApplication.arrangeObjectsToAllBuildPlates(); } From ce0510cee3a2e57a12c2c2ebcd83135eaa42c7ae Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 15 Nov 2017 16:34:22 +0100 Subject: [PATCH 222/764] Hide icons if they overlap monitor button CURA-4527 --- resources/qml/Topbar.qml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index bf4c8b50ac..dfc4562017 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -225,7 +225,7 @@ Rectangle { id: viewOrientationControl height: 30 - width: 155 + spacing: 2 anchors { @@ -242,7 +242,9 @@ Rectangle anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("3d", 0); + console.log("WIDTH : " + base.width) } + visible: base.width > 1100 } // #2 Front view @@ -254,6 +256,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("home", 0); } + visible: base.width > 1130 } // #3 Top view @@ -265,6 +268,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("y", 90); } + visible: base.width > 1160 } // #4 Left view @@ -276,6 +280,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("x", 90); } + visible: base.width > 1190 } // #5 Left view @@ -287,6 +292,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("x", -90); } + visible: base.width > 1210 } } From e2a663992cf9e8c5f6062114369ba63c7ab18fc9 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 15 Nov 2017 17:00:19 +0100 Subject: [PATCH 223/764] CURA-4525 Added an option to turn on the UI elements of multi build plate --- cura/CuraApplication.py | 5 ++++- resources/qml/Cura.qml | 7 ++++--- resources/qml/Menus/ContextMenu.qml | 8 ++++++-- resources/qml/Menus/ViewMenu.qml | 5 ++++- resources/qml/Preferences/GeneralPage.qml | 18 ++++++++++++++++-- 5 files changed, 34 insertions(+), 9 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 14b09c4902..056b6eaeb2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -311,6 +311,7 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/choice_on_profile_override", "always_ask") preferences.addPreference("cura/choice_on_open_project", "always_ask") preferences.addPreference("cura/arrange_objects_on_load", True) + preferences.addPreference("cura/use_multi_build_plate", False) preferences.addPreference("cura/currency", "€") preferences.addPreference("cura/material_settings", "{}") @@ -1427,7 +1428,9 @@ class CuraApplication(QtApplication): min_offset = 8 self.fileLoaded.emit(filename) - arrange_objects_on_load = Preferences.getInstance().getValue("cura/arrange_objects_on_load") + arrange_objects_on_load = ( + not Preferences.getInstance().getValue("cura/use_multi_build_plate") or + Preferences.getInstance().getValue("cura/arrange_objects_on_load")) target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 for original_node in nodes: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 1db6e2a511..254679ec53 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -324,10 +324,10 @@ UM.MainWindow } } - /* Button { id: openFileButton; + visible: !UM.Preferences.getValue("cura/use_multi_build_plate") text: catalog.i18nc("@action:button","Open File"); iconSource: UM.Theme.getIcon("load") style: UM.Theme.styles.tool_button @@ -340,12 +340,13 @@ UM.MainWindow } action: Cura.Actions.open; } - */ Button { id: objectsButton; - text: catalog.i18nc("@action:button","Objects"); + visible: UM.Preferences.getValue("cura/use_multi_build_plate") + + text: catalog.i18nc("@action:button","Objects list"); iconSource: UM.Theme.getIcon("plus") style: UM.Theme.styles.tool_button tooltip: ''; diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 2aa3bd6bdb..a52a2d46a3 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -39,7 +39,9 @@ Menu onObjectRemoved: base.removeItem(object) } - MenuSeparator {} + MenuSeparator { + visible: UM.Preferences.getValue("cura/use_multi_build_plate") + } Instantiator { model: Cura.BuildPlateModel @@ -48,15 +50,17 @@ Menu onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.getItem(index).buildPlateNumber); checkable: true checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate + visible: UM.Preferences.getValue("cura/use_multi_build_plate") } onObjectAdded: base.insertItem(index, object); - onObjectRemoved: base.removeItem(object) + onObjectRemoved: base.removeItem(object); } MenuItem { text: "New build plate"; onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.maxBuildPlate + 1); checkable: true checked: false + visible: UM.Preferences.getValue("cura/use_multi_build_plate") } // Global actions diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index a78e465c85..7c7060b1f0 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -31,7 +31,9 @@ Menu MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; } - MenuSeparator {} + MenuSeparator { + visible: UM.Preferences.getValue("cura/use_multi_build_plate") + } Instantiator { model: Cura.BuildPlateModel @@ -41,6 +43,7 @@ Menu checkable: true; checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate; exclusiveGroup: buildPlateGroup; + visible: UM.Preferences.getValue("cura/use_multi_build_plate") } onObjectAdded: base.insertItem(index, object); onObjectRemoved: base.removeItem(object) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index c74fb5720d..197e22fb53 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -454,12 +454,26 @@ UM.PreferencesPage UM.TooltipArea { width: childrenRect.width height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should newly loaded models be arranged on the build palte?") + text: catalog.i18nc("@info:tooltip","Use multi build plate functionality (EXPERIMENTAL)") + + CheckBox + { + id: useMultiBuildPlateCheckbox + text: catalog.i18nc("@option:check","Use multi build plate functionality (EXPERIMENTAL, restart)") + checked: boolCheck(UM.Preferences.getValue("cura/use_multi_build_plate")) + onCheckedChanged: UM.Preferences.setValue("cura/use_multi_build_plate", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should newly loaded models be arranged on the build plate? Used in conjunction with multi build plate (EXPERIMENTAL)") CheckBox { id: arrangeOnLoadCheckbox - text: catalog.i18nc("@option:check","Arrange objects on load") + text: catalog.i18nc("@option:check","Arrange objects on load (EXPERIMENTAL)") checked: boolCheck(UM.Preferences.getValue("cura/arrange_objects_on_load")) onCheckedChanged: UM.Preferences.setValue("cura/arrange_objects_on_load", checked) } From 228039545bb4eab3134a1fd75507e2b010749ec3 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 16 Nov 2017 09:58:53 +0100 Subject: [PATCH 224/764] CURA-4525 send active build plate to legacy UM3 with Print over network --- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 3 ++- resources/qml/Actions.qml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index d8dd780ed5..8895d1c22d 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -675,7 +675,8 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): Application.getInstance().showPrintMonitor.emit(True) self._print_finished = True self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list")[active_build_plate] print_information = Application.getInstance().getPrintInformation() warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about. diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index c6b0a443bb..e2db0171b1 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -306,7 +306,7 @@ Item id: arrangeAllBuildPlatesAction; text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models To All Build Plates"); //iconName: "document-open"; - onTriggered: CuraApplication.arrangeObjectsToAllBuildPlates(); + onTriggered: Printer.arrangeObjectsToAllBuildPlates(); } Action From b868f913c42486c8b45d1864c5ce1327da597f75 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 16 Nov 2017 10:27:52 +0100 Subject: [PATCH 225/764] CURA-4577 Adding relative positioning to GCodeReader --- plugins/GCodeReader/GCodeReader.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 9107ec3258..e49ff9d8d7 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -54,6 +54,7 @@ class GCodeReader(MeshReader): self._previous_z = 0 self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() self._center_is_zero = False + self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) @staticmethod def _getValue(line, code): @@ -166,6 +167,16 @@ class GCodeReader(MeshReader): 0, position.e) + ## Set the absolute positioning + def _gCode90(self, position, params, path): + self._is_absolute_positioning = True + return position + + ## Set the relative positioning + def _gCode91(self, position, params, path): + self._is_absolute_positioning = False + return position + ## Reset the current position to the values specified. # For example: G92 X10 will set the X to 10 without any physical motion. def _gCode92(self, position, params, path): @@ -196,7 +207,7 @@ class GCodeReader(MeshReader): z = float(item[1:]) if item[0] == "E": e = float(item[1:]) - if (x is not None and x < 0) or (y is not None and y < 0): + if self._is_absolute_positioning and ((x is not None and x < 0) or (y is not None and y < 0)): self._center_is_zero = True params = self._position(x, y, z, e) return func(position, params, path) From 579f2b5ec6b6e57766bd6a5a3c083045601d421d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 16 Nov 2017 16:34:12 +0100 Subject: [PATCH 226/764] CURA-4525 prepare for print all or single build plate question --- .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 14a60a6b22..2f56561295 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -255,7 +255,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._request_job = [nodes, file_name, filter_by_machine, file_handler, kwargs] # the build plates to be sent - self._job_list = list(getattr(Application.getInstance().getController().getScene(), "gcode_list").keys()) + gcodes = getattr(Application.getInstance().getController().getScene(), "gcode_list") + self._job_list = list(gcodes.keys()) Logger.log("d", "build plates to be sent to printer: %s", (self._job_list)) if self._stage != OutputStage.ready: @@ -268,7 +269,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte return self._add_build_plate_number = len(self._job_list) > 1 - if len(self._printers) > 1: + if len(self._printers) > 1 or len(gcodes) > 1: self.spawnPrintView() # Ask user how to print it. elif len(self._printers) == 1: # If there is only one printer, don't bother asking. From 15a50511b728a61d9aca9247f88133cc4835d91a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 16:03:28 +0100 Subject: [PATCH 227/764] Don't crash if support density is 0 Found while working on CURA-4523. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b17769eba2..6628086179 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3495,7 +3495,7 @@ "minimum_value_warning": "support_line_width", "default_value": 2.66, "enabled": "support_enable", - "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", + "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -5107,7 +5107,7 @@ "description": "Skip one in every N connection lines to make the support structure easier to break away.", "type": "int", "default_value": 5, - "value": "round(support_skip_zag_per_mm / support_line_distance)", + "value": "0 if support_line_distance == 0 else round(support_skip_zag_per_mm / support_line_distance)", "minimum_value": "1", "minimum_value_warning": "3", "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", From f27494d60acda7af5854a44817008bbda5e81c95 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 10:59:14 +0100 Subject: [PATCH 228/764] Move ironing into shell category It is no longer considered experimental. --- resources/definitions/fdmprinter.def.json | 236 +++++++++++----------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6628086179..bf65baf1d9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1340,6 +1340,124 @@ "type": "int", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true + }, + "ironing_enabled": + { + "label": "Enable Ironing", + "description": "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface.", + "type": "bool", + "default_value": false, + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_only_highest_layer": + { + "label": "Iron Only Highest Layer", + "description": "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish.", + "type": "bool", + "default_value": false, + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_pattern": + { + "label": "Ironing Pattern", + "description": "The pattern to use for ironing top surfaces.", + "type": "enum", + "options": + { + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "zigzag", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_line_spacing": + { + "label": "Ironing Line Spacing", + "description": "The distance between the lines of ironing.", + "type": "float", + "unit": "mm", + "default_value": 0.1, + "minimum_value": "0.001", + "maximum_value_warning": "machine_nozzle_tip_outer_diameter", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_flow": + { + "label": "Ironing Flow", + "description": "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface.", + "type": "float", + "unit": "%", + "default_value": 10.0, + "minimum_value": "0", + "maximum_value_warning": "50", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_inset": + { + "label": "Ironing Inset", + "description": "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print.", + "type": "float", + "unit": "mm", + "default_value": 0.35, + "value": "wall_line_width_0 / 2", + "minimum_value_warning": "0", + "maximum_value_warning": "wall_line_width_0", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "speed_ironing": + { + "label": "Ironing Speed", + "description": "The speed at which to pass over the top surface.", + "type": "float", + "unit": "mm/s", + "default_value": 20.0, + "value": "speed_topbottom * 20 / 30", + "minimum_value": "0.001", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "100", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "acceleration_ironing": + { + "label": "Ironing Acceleration", + "description": "The acceleration with which ironing is performed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_topbottom", + "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "jerk_ironing": + { + "label": "Ironing Jerk", + "description": "The maximum instantaneous velocity change while performing ironing.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_topbottom", + "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true } } }, @@ -5813,124 +5931,6 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false - }, - "ironing_enabled": - { - "label": "Enable Ironing", - "description": "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface.", - "type": "bool", - "default_value": false, - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_only_highest_layer": - { - "label": "Iron Only Highest Layer", - "description": "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish.", - "type": "bool", - "default_value": false, - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_pattern": - { - "label": "Ironing Pattern", - "description": "The pattern to use for ironing top surfaces.", - "type": "enum", - "options": - { - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "zigzag", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_line_spacing": - { - "label": "Ironing Line Spacing", - "description": "The distance between the lines of ironing.", - "type": "float", - "unit": "mm", - "default_value": 0.1, - "minimum_value": "0.001", - "maximum_value_warning": "machine_nozzle_tip_outer_diameter", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_flow": - { - "label": "Ironing Flow", - "description": "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface.", - "type": "float", - "unit": "%", - "default_value": 10.0, - "minimum_value": "0", - "maximum_value_warning": "50", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_inset": - { - "label": "Ironing Inset", - "description": "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print.", - "type": "float", - "unit": "mm", - "default_value": 0.35, - "value": "wall_line_width_0 / 2", - "minimum_value_warning": "0", - "maximum_value_warning": "wall_line_width_0", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "speed_ironing": - { - "label": "Ironing Speed", - "description": "The speed at which to pass over the top surface.", - "type": "float", - "unit": "mm/s", - "default_value": 20.0, - "value": "speed_topbottom * 20 / 30", - "minimum_value": "0.001", - "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", - "maximum_value_warning": "100", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "acceleration_ironing": - { - "label": "Ironing Acceleration", - "description": "The acceleration with which ironing is performed.", - "unit": "mm/s²", - "type": "float", - "minimum_value": "0.1", - "minimum_value_warning": "100", - "maximum_value_warning": "10000", - "default_value": 3000, - "value": "acceleration_topbottom", - "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "jerk_ironing": - { - "label": "Ironing Jerk", - "description": "The maximum instantaneous velocity change while performing ironing.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "50", - "default_value": 20, - "value": "jerk_topbottom", - "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true } } }, From cd37f91a0a29ed097832d88db9346c520e926f80 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 17 Nov 2017 10:40:13 +0100 Subject: [PATCH 229/764] Remove unnecessary code in BuildVolume CURA-4482 --- cura/BuildVolume.py | 66 +++++++++++---------------------------------- 1 file changed, 15 insertions(+), 51 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 7362a5aff2..50f63e49d5 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -876,15 +876,6 @@ class BuildVolume(SceneNode): return result - ## Private convenience function to get a setting from the adhesion - # extruder. - # - # \param setting_key The key of the setting to get. - # \param property The property to get from the setting. - # \return The property of the specified setting in the adhesion extruder. - def _getSettingFromAdhesionExtruder(self, setting_key, property = "value"): - return self._getSettingFromExtruder(setting_key, "adhesion_extruder_nr", property) - ## Private convenience function to get a setting from every extruder. # # For single extrusion machines, this gets the setting from the global @@ -899,38 +890,6 @@ class BuildVolume(SceneNode): all_values[i] = 0 return all_values - ## Private convenience function to get a setting from the support infill - # extruder. - # - # \param setting_key The key of the setting to get. - # \param property The property to get from the setting. - # \return The property of the specified setting in the support infill - # extruder. - def _getSettingFromSupportInfillExtruder(self, setting_key, property = "value"): - return self._getSettingFromExtruder(setting_key, "support_infill_extruder_nr", property) - - ## Helper function to get a setting from an extruder specified in another - # setting. - # - # \param setting_key The key of the setting to get. - # \param extruder_setting_key The key of the setting that specifies from - # which extruder to get the setting, if there are multiple extruders. - # \param property The property to get from the setting. - # \return The property of the specified setting in the specified extruder. - def _getSettingFromExtruder(self, setting_key, extruder_setting_key, prop = "value"): - extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") - extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - - value = extruder_stack.getProperty(setting_key, prop) - setting_type = extruder_stack.getProperty(setting_key, "type") - - # default 0 for numerical values - if not value and (setting_type == "int" or setting_type == "float"): - return 0 - - return value - ## Convenience function to calculate the disallowed radius around the edge. # # This disallowed radius is to allow for space around the models that is @@ -948,29 +907,32 @@ class BuildVolume(SceneNode): return 0.1 # Return a very small value, so we do draw disallowed area's near the edges. adhesion_type = container_stack.getProperty("adhesion_type", "value") - + skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value") + initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value") if adhesion_type == "skirt": - skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") - skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") - bed_adhesion_size = skirt_distance + (self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * skirt_line_count) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 + skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value") + skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value") + + bed_adhesion_size = skirt_distance + (skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 for extruder_stack in used_extruders: bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 # We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 elif adhesion_type == "brim": - bed_adhesion_size = self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 + brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value") + bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 for extruder_stack in used_extruders: bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 # We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 elif adhesion_type == "raft": - bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") + bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") elif adhesion_type == "none": bed_adhesion_size = 0 @@ -979,8 +941,10 @@ class BuildVolume(SceneNode): raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") support_expansion = 0 - if self._getSettingFromSupportInfillExtruder("support_offset") and self._global_container_stack.getProperty("support_enable", "value"): - support_expansion += self._getSettingFromSupportInfillExtruder("support_offset") + support_enabled = self._global_container_stack.getProperty("support_enable", "value") + support_offset = self._global_container_stack.getProperty("support_offset", "value") + if support_enabled and support_offset: + support_expansion += support_offset farthest_shield_distance = 0 if container_stack.getProperty("draft_shield_enabled", "value"): From 9b102f9a7ef6c5232e2be57f1cd6f2b57c7bdd46 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 17 Nov 2017 11:02:18 +0100 Subject: [PATCH 230/764] Remove unused function in StartSliceJob CURA-4482 --- plugins/CuraEngineBackend/StartSliceJob.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 49dfc71769..196b18e094 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -9,7 +9,6 @@ import time from UM.Job import Job from UM.Application import Application from UM.Logger import Logger -from UM.Decorators import deprecated from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -247,20 +246,6 @@ class StartSliceJob(Job): setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() - ## Create extruder message from global stack - @deprecated("Extruder stack is always used since version 3.1, even with single extrusion machines", "3.1") - def _buildExtruderMessageFromGlobalStack(self, stack): - message = self._slice_message.addRepeatedMessage("extruders") - - for key in stack.getAllKeys(): - # Do not send settings that are not settable_per_extruder. - if not stack.getProperty(key, "settable_per_extruder"): - continue - setting = message.getMessage("settings").addRepeatedMessage("settings") - setting.name = key - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") - Job.yieldThread() - ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any From 94dd524785d1f8965361d750fa94bded24b80a47 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 11:13:15 +0100 Subject: [PATCH 231/764] Add setting to determine whether to use firmware retraction This allows printers to determine this for themselves. By default it's based on the g-code flavour in the same way as it is now implemented in the engine. Fixes #1097. --- resources/definitions/fdmprinter.def.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bf65baf1d9..7465fdcea7 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -318,6 +318,17 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "machine_firmware_retract": + { + "label": "Firmware Retraction", + "description": "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material.", + "type": "bool", + "default_value": false, + "value": "machine_gcode_flavor == 'RepRap (Volumetric)' or machine_gcode_flavor == 'UltiGCode' or machine_gcode_flavor == 'BFB'", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "machine_disallowed_areas": { "label": "Disallowed areas", From aa92d4d0f97bcd36ccd1a7cfff30fd5fc68d843e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 11:46:55 +0100 Subject: [PATCH 232/764] Add to all installation to lib/ folders Some systems have a suffix there to indicate the address size, such as lib64. --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44b4b57f54..9296c4ce4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ find_package(PythonInterp 3.5.0 REQUIRED) install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) install(DIRECTORY plugins - DESTINATION lib/cura) + DESTINATION lib${LIB_SUFFIX}/cura) if(NOT APPLE AND NOT WIN32) install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -47,16 +47,16 @@ if(NOT APPLE AND NOT WIN32) RENAME cura) if(EXISTS /etc/debian_version) install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) else() install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) endif() install(FILES ${CMAKE_BINARY_DIR}/cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) @@ -72,8 +72,8 @@ else() DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) endif() From e246784df268224d0271e6e303858d5b1a5c500d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 17 Nov 2017 12:43:30 +0100 Subject: [PATCH 233/764] Use parseBool() for metadata bool values CURA-4482 --- cura/Settings/MachineManager.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7bbbd868f4..0daf54c018 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1175,15 +1175,14 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def hasMaterials(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_materials", False)) + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False)) return False @pyqtProperty(bool, notify = globalContainerChanged) def hasVariants(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_variants", False)) - + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variants", False)) return False ## Property to indicate if a machine has "specialized" material profiles. @@ -1191,8 +1190,7 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def filterMaterialsByMachine(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_machine_materials", False)) - + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_machine_materials", False)) return False ## Property to indicate if a machine has "specialized" quality profiles. @@ -1200,7 +1198,7 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def filterQualityByMachine(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_machine_quality", False)) + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_machine_quality", False)) return False ## Get the Definition ID of a machine (specified by ID) From 2c39612bc8d06245edb3ffdba26859480c5b0d51 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 17 Nov 2017 12:47:28 +0100 Subject: [PATCH 234/764] Fix UM2 upgrade regarding the variant CURA-4482 UM2 by default doesn't have variants, but if the user enables Olsson Block, the variant option will become available. This commit fixes the following cases: - Make sure that the variant is set on the extruder stack but not the global stack - Extruder stacks don't contain information such as has_variant. Such info should be retrieved from the global stack and not just from the definition container because they can be overriden by other containers. --- cura/Settings/CuraContainerRegistry.py | 5 ++++- cura/Settings/CuraContainerStack.py | 4 +++- cura/Settings/ExtruderStack.py | 5 +++++ plugins/UltimakerMachineActions/UM2UpgradeSelection.py | 4 ++-- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 526685465e..5cfe867bc2 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -443,7 +443,10 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setUserChanges(user_container) self.addContainer(user_container) - extruder_stack.setVariantById("default") + variant_id = "default" + if machine.variant.getId() != "empty_variant": + variant_id = machine.variant.getId() + extruder_stack.setVariantById(variant_id) extruder_stack.setMaterialById("default") extruder_stack.setQualityById("default") diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 2d3bf683f6..2a804def4d 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -396,7 +396,9 @@ class CuraContainerStack(ContainerStack): # \note This method assumes the stack has a valid machine definition. def findDefaultVariant(self) -> Optional[ContainerInterface]: definition = self._getMachineDefinition() - if not definition.getMetaDataEntry("has_variants"): + # has_variants can be overridden in other containers and stacks. + # In the case of UM2, it is overridden in the GlobalStack + if not self.getMetaDataEntry("has_variants"): # If the machine does not use variants, we should never set a variant. return None diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index d8ff6645a8..fe7068b7ea 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -115,6 +115,11 @@ class ExtruderStack(CuraContainerStack): if has_global_dependencies: self.getNextStack().propertiesChanged.emit(key, properties) + def findDefaultVariant(self): + # The default variant is defined in the machine stack and/or definition, so use the machine stack to find + # the default variant. + return self.getNextStack().findDefaultVariant() + extruder_stack_mime = MimeType( name = "application/x-cura-extruderstack", diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py index c84033a98e..db277bc485 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py @@ -37,7 +37,7 @@ class UM2UpgradeSelection(MachineAction): def setHasVariants(self, has_variants = True): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - variant_container = global_container_stack.variant + variant_container = global_container_stack.extruders["0"].variant variant_index = global_container_stack.getContainerIndex(variant_container) if has_variants: @@ -52,7 +52,7 @@ class UM2UpgradeSelection(MachineAction): search_criteria = { "type": "variant", "definition": "ultimaker2", "id": "*0.4*" } containers = self._container_registry.findInstanceContainers(**search_criteria) if containers: - global_container_stack.variant = containers[0] + global_container_stack.extruders["0"].variant = containers[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. From 0f6d65950a8ea017f17d44a019528c55752410ec Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 17 Nov 2017 13:18:44 +0100 Subject: [PATCH 235/764] CURA-4526 Add colors to themes for selected handles --- resources/themes/cura-dark/theme.json | 1 + resources/themes/cura-light/styles.qml | 1 + resources/themes/cura-light/theme.json | 1 + 3 files changed, 3 insertions(+) diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 8bf1455b60..5cfed426e5 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -133,6 +133,7 @@ "slider_groove_fill": [245, 245, 245, 255], "slider_handle": [255, 255, 255, 255], "slider_handle_hover": [77, 182, 226, 255], + "slider_handle_active": [68, 192, 255, 255], "slider_handle_border": [39, 44, 48, 255], "slider_text_background": [255, 255, 255, 255], diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 6d991c5541..ea9d184926 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -269,6 +269,7 @@ QtObject { arrowSize: Theme.getSize("button_tooltip_arrow").width color: Theme.getColor("button_tooltip") opacity: control.hovered ? 1.0 : 0.0; + visible: control.text != "" width: control.hovered ? button_tip.width + Theme.getSize("button_tooltip").width : 0 height: Theme.getSize("button_tooltip").height diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 21fd23316d..12f7df906b 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -183,6 +183,7 @@ "slider_groove_fill": [127, 127, 127, 255], "slider_handle": [0, 0, 0, 255], "slider_handle_hover": [77, 182, 226, 255], + "slider_handle_active": [68, 192, 255, 255], "slider_handle_border": [39, 44, 48, 255], "slider_text_background": [255, 255, 255, 255], From 98d48978a860d91457af87430941f57df4292066 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 17 Nov 2017 14:27:46 +0100 Subject: [PATCH 236/764] CURA-4526 Add the SimulationView plugin to Cura and deleting LayerView plugin --- cura/CuraApplication.py | 4 +- .../CuraEngineBackend/CuraEngineBackend.py | 2 +- .../ProcessSlicedLayersJob.py | 6 +- plugins/LayerView/LayerPass.py | 113 ---- plugins/LayerView/LayerViewProxy.py | 154 ----- plugins/LayerView/__init__.py | 25 - .../LayerSlider.qml | 637 +++++++++--------- plugins/SimulationView/NozzleNode.py | 49 ++ plugins/SimulationView/PathSlider.qml | 161 +++++ plugins/SimulationView/SimulationPass.py | 187 +++++ .../SimulationSliderLabel.qml} | 207 +++--- .../SimulationView.py} | 216 ++++-- .../SimulationView.qml} | 344 ++++++++-- plugins/SimulationView/SimulationViewProxy.py | 246 +++++++ plugins/SimulationView/__init__.py | 26 + .../layers.shader | 0 .../layers3d.shader | 29 + plugins/SimulationView/layers3d_shadow.shader | 256 +++++++ plugins/SimulationView/layers_shadow.shader | 156 +++++ .../{LayerView => SimulationView}/plugin.json | 4 +- plugins/SimulationView/resources/nozzle.stl | Bin 0 -> 210284 bytes .../resources/simulation_pause.svg | 79 +++ .../resources/simulation_resume.svg | 82 +++ .../simulationview_composite.shader} | 0 24 files changed, 2162 insertions(+), 821 deletions(-) delete mode 100755 plugins/LayerView/LayerPass.py delete mode 100644 plugins/LayerView/LayerViewProxy.py delete mode 100644 plugins/LayerView/__init__.py rename plugins/{LayerView => SimulationView}/LayerSlider.qml (85%) create mode 100644 plugins/SimulationView/NozzleNode.py create mode 100644 plugins/SimulationView/PathSlider.qml create mode 100644 plugins/SimulationView/SimulationPass.py rename plugins/{LayerView/LayerSliderLabel.qml => SimulationView/SimulationSliderLabel.qml} (88%) rename plugins/{LayerView/LayerView.py => SimulationView/SimulationView.py} (74%) mode change 100755 => 100644 rename plugins/{LayerView/LayerView.qml => SimulationView/SimulationView.qml} (51%) mode change 100755 => 100644 create mode 100644 plugins/SimulationView/SimulationViewProxy.py create mode 100644 plugins/SimulationView/__init__.py rename plugins/{LayerView => SimulationView}/layers.shader (100%) mode change 100755 => 100644 rename plugins/{LayerView => SimulationView}/layers3d.shader (92%) mode change 100755 => 100644 create mode 100644 plugins/SimulationView/layers3d_shadow.shader create mode 100644 plugins/SimulationView/layers_shadow.shader rename plugins/{LayerView => SimulationView}/plugin.json (54%) create mode 100644 plugins/SimulationView/resources/nozzle.stl create mode 100644 plugins/SimulationView/resources/simulation_pause.svg create mode 100644 plugins/SimulationView/resources/simulation_resume.svg rename plugins/{LayerView/layerview_composite.shader => SimulationView/simulationview_composite.shader} (100%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 41358b83f5..bfd2b0c50a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -217,7 +217,7 @@ class CuraApplication(QtApplication): "CuraEngineBackend", "UserAgreement", "SolidView", - "LayerView", + "SimulationView", "STLReader", "SelectionTool", "CameraTool", @@ -1383,7 +1383,7 @@ class CuraApplication(QtApplication): extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: - self.getController().setActiveView("LayerView") + self.getController().setActiveView("SimulationView") view = self.getController().getActiveView() view.resetLayerData() view.setLayer(9999999) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 44e028093b..a5a1a5b584 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -588,7 +588,7 @@ class CuraEngineBackend(QObject, Backend): def _onActiveViewChanged(self): if Application.getInstance().getController().getActiveView(): view = Application.getInstance().getController().getActiveView() - if view.getPluginId() in ("LayerView", "SimulationView"): # If switching to layer view, we should process the layers if that hasn't been done yet. + if view.getPluginId() == "SimulationView": # If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 30fcf6cced..14646cbac1 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -61,7 +61,7 @@ class ProcessSlicedLayersJob(Job): def run(self): start_time = time() - if Application.getInstance().getController().getActiveView().getPluginId() in ("LayerView", "SimulationView"): + if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": self._progress_message.show() Job.yieldThread() if self._abort_requested: @@ -221,7 +221,7 @@ class ProcessSlicedLayersJob(Job): self._progress_message.setProgress(100) view = Application.getInstance().getController().getActiveView() - if view.getPluginId() in ("LayerView", "SimulationView"): + if view.getPluginId() == "SimulationView": view.resetLayerData() if self._progress_message: @@ -234,7 +234,7 @@ class ProcessSlicedLayersJob(Job): def _onActiveViewChanged(self): if self.isRunning(): - if Application.getInstance().getController().getActiveView().getPluginId() in ("LayerView", "SimulationView"): + if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": if not self._progress_message: self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0, catalog.i18nc("@info:title", "Information")) if self._progress_message.getProgress() != 100: diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py deleted file mode 100755 index 963c8c75c8..0000000000 --- a/plugins/LayerView/LayerPass.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright (c) 2016 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Resources import Resources -from UM.Scene.SceneNode import SceneNode -from UM.Scene.ToolHandle import ToolHandle -from UM.Application import Application -from UM.PluginRegistry import PluginRegistry - -from UM.View.RenderPass import RenderPass -from UM.View.RenderBatch import RenderBatch -from UM.View.GL.OpenGL import OpenGL - -from cura.Settings.ExtruderManager import ExtruderManager - - -import os.path - -## RenderPass used to display g-code paths. -class LayerPass(RenderPass): - def __init__(self, width, height): - super().__init__("layerview", width, height) - - self._layer_shader = None - self._tool_handle_shader = None - self._gl = OpenGL.getInstance().getBindingsObject() - self._scene = Application.getInstance().getController().getScene() - self._extruder_manager = ExtruderManager.getInstance() - - self._layer_view = None - self._compatibility_mode = None - - def setLayerView(self, layerview): - self._layer_view = layerview - self._compatibility_mode = layerview.getCompatibilityMode() - - def render(self): - if not self._layer_shader: - if self._compatibility_mode: - shader_filename = "layers.shader" - else: - shader_filename = "layers3d.shader" - self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("LayerView"), shader_filename)) - # Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers) - self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex))) - if self._layer_view: - self._layer_shader.setUniformValue("u_layer_view_type", self._layer_view.getLayerViewType()) - self._layer_shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities()) - self._layer_shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves()) - self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) - self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) - self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) - else: - #defaults - self._layer_shader.setUniformValue("u_layer_view_type", 1) - self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1]) - self._layer_shader.setUniformValue("u_show_travel_moves", 0) - self._layer_shader.setUniformValue("u_show_helpers", 1) - self._layer_shader.setUniformValue("u_show_skin", 1) - self._layer_shader.setUniformValue("u_show_infill", 1) - - if not self._tool_handle_shader: - self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) - - self.bind() - - tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) - - for node in DepthFirstIterator(self._scene.getRoot()): - - if isinstance(node, ToolHandle): - tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): - layer_data = node.callDecoration("getLayerData") - if not layer_data: - continue - - # Render all layers below a certain number as line mesh instead of vertices. - if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): - start = 0 - end = 0 - element_counts = layer_data.getElementCounts() - for layer in sorted(element_counts.keys()): - if layer > self._layer_view._current_layer_num: - break - if self._layer_view._minimum_layer_num > layer: - start += element_counts[layer] - end += element_counts[layer] - - # This uses glDrawRangeElements internally to only draw a certain range of lines. - batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) - batch.addItem(node.getWorldTransformation(), layer_data) - batch.render(self._scene.getActiveCamera()) - - # Create a new batch that is not range-limited - batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) - - if self._layer_view.getCurrentLayerMesh(): - batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) - - if self._layer_view.getCurrentLayerJumps(): - batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) - - if len(batch.items) > 0: - batch.render(self._scene.getActiveCamera()) - - # Render toolhandles on top of the layerview - if len(tool_handle_batch.items) > 0: - tool_handle_batch.render(self._scene.getActiveCamera()) - - self.release() diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py deleted file mode 100644 index 4cbff65040..0000000000 --- a/plugins/LayerView/LayerViewProxy.py +++ /dev/null @@ -1,154 +0,0 @@ -from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty -from UM.FlameProfiler import pyqtSlot -from UM.Application import Application - -import LayerView - - -class LayerViewProxy(QObject): - def __init__(self, parent=None): - super().__init__(parent) - self._current_layer = 0 - self._controller = Application.getInstance().getController() - self._controller.activeViewChanged.connect(self._onActiveViewChanged) - self._onActiveViewChanged() - - currentLayerChanged = pyqtSignal() - maxLayersChanged = pyqtSignal() - activityChanged = pyqtSignal() - globalStackChanged = pyqtSignal() - preferencesChanged = pyqtSignal() - busyChanged = pyqtSignal() - - @pyqtProperty(bool, notify=activityChanged) - def layerActivity(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getActivity() - return False - - @pyqtProperty(int, notify=maxLayersChanged) - def numLayers(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getMaxLayers() - return 0 - - @pyqtProperty(int, notify=currentLayerChanged) - def currentLayer(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getCurrentLayer() - return 0 - - @pyqtProperty(int, notify=currentLayerChanged) - def minimumLayer(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getMinimumLayer() - return 0 - - @pyqtProperty(bool, notify=busyChanged) - def busy(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.isBusy() - return False - - @pyqtProperty(bool, notify=preferencesChanged) - def compatibilityMode(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getCompatibilityMode() - return False - - @pyqtSlot(int) - def setCurrentLayer(self, layer_num): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setLayer(layer_num) - - @pyqtSlot(int) - def setMinimumLayer(self, layer_num): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setMinimumLayer(layer_num) - - @pyqtSlot(int) - def setLayerViewType(self, layer_view_type): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setLayerViewType(layer_view_type) - - @pyqtSlot(result=int) - def getLayerViewType(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getLayerViewType() - return 0 - - # Opacity 0..1 - @pyqtSlot(int, float) - def setExtruderOpacity(self, extruder_nr, opacity): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setExtruderOpacity(extruder_nr, opacity) - - @pyqtSlot(int) - def setShowTravelMoves(self, show): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setShowTravelMoves(show) - - @pyqtSlot(int) - def setShowHelpers(self, show): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setShowHelpers(show) - - @pyqtSlot(int) - def setShowSkin(self, show): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setShowSkin(show) - - @pyqtSlot(int) - def setShowInfill(self, show): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.setShowInfill(show) - - @pyqtProperty(int, notify=globalStackChanged) - def extruderCount(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - return active_view.getExtruderCount() - return 0 - - def _layerActivityChanged(self): - self.activityChanged.emit() - - def _onLayerChanged(self): - self.currentLayerChanged.emit() - self._layerActivityChanged() - - def _onMaxLayersChanged(self): - self.maxLayersChanged.emit() - - def _onBusyChanged(self): - self.busyChanged.emit() - - def _onGlobalStackChanged(self): - self.globalStackChanged.emit() - - def _onPreferencesChanged(self): - self.preferencesChanged.emit() - - def _onActiveViewChanged(self): - active_view = self._controller.getActiveView() - if isinstance(active_view, LayerView.LayerView.LayerView): - active_view.currentLayerNumChanged.connect(self._onLayerChanged) - active_view.maxLayersChanged.connect(self._onMaxLayersChanged) - active_view.busyChanged.connect(self._onBusyChanged) - active_view.globalStackChanged.connect(self._onGlobalStackChanged) - active_view.preferencesChanged.connect(self._onPreferencesChanged) diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py deleted file mode 100644 index da1a5aed19..0000000000 --- a/plugins/LayerView/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from . import LayerView, LayerViewProxy -from PyQt5.QtQml import qmlRegisterType, qmlRegisterSingletonType - -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - -def getMetaData(): - return { - "view": { - "name": catalog.i18nc("@item:inlistbox", "Layer view"), - "view_panel": "LayerView.qml", - "weight": 2 - } - } - -def createLayerViewProxy(engine, script_engine): - return LayerViewProxy.LayerViewProxy() - -def register(app): - layer_view = LayerView.LayerView() - qmlRegisterSingletonType(LayerViewProxy.LayerViewProxy, "UM", 1, 0, "LayerView", layer_view.getProxy) - return { "view": LayerView.LayerView() } diff --git a/plugins/LayerView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml similarity index 85% rename from plugins/LayerView/LayerSlider.qml rename to plugins/SimulationView/LayerSlider.qml index 9abeb01148..22f9d91340 100644 --- a/plugins/LayerView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -1,312 +1,325 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.0 as UM -import Cura 1.0 as Cura - -Item { - id: sliderRoot - - // handle properties - property real handleSize: 10 - property real handleRadius: handleSize / 2 - property real minimumRangeHandleSize: handleSize / 2 - property color upperHandleColor: "black" - property color lowerHandleColor: "black" - property color rangeHandleColor: "black" - property real handleLabelWidth: width - property var activeHandle: upperHandle - - // track properties - property real trackThickness: 4 // width of the slider track - property real trackRadius: trackThickness / 2 - property color trackColor: "white" - property real trackBorderWidth: 1 // width of the slider track border - property color trackBorderColor: "black" - - // value properties - property real maximumValue: 100 - property real minimumValue: 0 - property real minimumRange: 0 // minimum range allowed between min and max values - property bool roundValues: true - property real upperValue: maximumValue - property real lowerValue: minimumValue - - property bool layersVisible: true - - function getUpperValueFromSliderHandle () { - return upperHandle.getValue() - } - - function setUpperValue (value) { - upperHandle.setValue(value) - updateRangeHandle() - } - - function getLowerValueFromSliderHandle () { - return lowerHandle.getValue() - } - - function setLowerValue (value) { - lowerHandle.setValue(value) - updateRangeHandle() - } - - function updateRangeHandle () { - rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) - } - - // set the active handle to show only one label at a time - function setActiveHandle (handle) { - activeHandle = handle - } - - // slider track - Rectangle { - id: track - - width: sliderRoot.trackThickness - height: sliderRoot.height - sliderRoot.handleSize - radius: sliderRoot.trackRadius - anchors.centerIn: sliderRoot - color: sliderRoot.trackColor - border.width: sliderRoot.trackBorderWidth - border.color: sliderRoot.trackBorderColor - visible: sliderRoot.layersVisible - } - - // Range handle - Item { - id: rangeHandle - - y: upperHandle.y + upperHandle.height - width: sliderRoot.handleSize - height: sliderRoot.minimumRangeHandleSize - anchors.horizontalCenter: sliderRoot.horizontalCenter - visible: sliderRoot.layersVisible - - // set the new value when dragging - function onHandleDragged () { - - upperHandle.y = y - upperHandle.height - lowerHandle.y = y + height - - var upperValue = sliderRoot.getUpperValueFromSliderHandle() - var lowerValue = sliderRoot.getLowerValueFromSliderHandle() - - // set both values after moving the handle position - UM.LayerView.setCurrentLayer(upperValue) - UM.LayerView.setMinimumLayer(lowerValue) - } - - function setValue (value) { - var range = sliderRoot.upperValue - sliderRoot.lowerValue - value = Math.min(value, sliderRoot.maximumValue) - value = Math.max(value, sliderRoot.minimumValue + range) - - UM.LayerView.setCurrentLayer(value) - UM.LayerView.setMinimumLayer(value - range) - } - - Rectangle { - width: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth - height: parent.height + sliderRoot.handleSize - anchors.centerIn: parent - color: sliderRoot.rangeHandleColor - } - - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: upperHandle.height - maximumY: sliderRoot.height - (rangeHandle.height + lowerHandle.height) - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(rangeHandle) - } - - LayerSliderLabel { - id: rangleHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.upperValue - busy: UM.LayerView.busy - setValue: rangeHandle.setValue // connect callback functions - } - } - - // Upper handle - Rectangle { - id: upperHandle - - y: sliderRoot.height - (sliderRoot.minimumRangeHandleSize + 2 * sliderRoot.handleSize) - width: sliderRoot.handleSize - height: sliderRoot.handleSize - anchors.horizontalCenter: sliderRoot.horizontalCenter - radius: sliderRoot.handleRadius - color: sliderRoot.upperHandleColor - visible: sliderRoot.layersVisible - - function onHandleDragged () { - - // don't allow the lower handle to be heigher than the upper handle - if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize) { - lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize - } - - // update the range handle - sliderRoot.updateRangeHandle() - - // set the new value after moving the handle position - UM.LayerView.setCurrentLayer(getValue()) - } - - // get the upper value based on the slider position - function getValue () { - var result = y / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) - result = sliderRoot.maximumValue + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumValue)) - result = sliderRoot.roundValues ? Math.round(result) : result - return result - } - - // set the slider position based on the upper value - function setValue (value) { - - UM.LayerView.setCurrentLayer(value) - - var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) - var newUpperYPosition = Math.round(diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) - y = newUpperYPosition - - // update the range handle - sliderRoot.updateRangeHandle() - } - - // dragging - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: 0 - maximumY: sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(upperHandle) - } - - LayerSliderLabel { - id: upperHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.upperValue - busy: UM.LayerView.busy - setValue: upperHandle.setValue // connect callback functions - } - } - - // Lower handle - Rectangle { - id: lowerHandle - - y: sliderRoot.height - sliderRoot.handleSize - width: parent.handleSize - height: parent.handleSize - anchors.horizontalCenter: parent.horizontalCenter - radius: sliderRoot.handleRadius - color: sliderRoot.lowerHandleColor - - visible: slider.layersVisible - - function onHandleDragged () { - - // don't allow the upper handle to be lower than the lower handle - if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize) { - upperHandle.y = y - (upperHandle.heigth + sliderRoot.minimumRangeHandleSize) - } - - // update the range handle - sliderRoot.updateRangeHandle() - - // set the new value after moving the handle position - UM.LayerView.setMinimumLayer(getValue()) - } - - // get the lower value from the current slider position - function getValue () { - var result = (y - (sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)); - result = sliderRoot.maximumValue - sliderRoot.minimumRange + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumRange)) - result = sliderRoot.roundValues ? Math.round(result) : result - return result - } - - // set the slider position based on the lower value - function setValue (value) { - - UM.LayerView.setMinimumLayer(value) - - var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) - var newLowerYPosition = Math.round((sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) - y = newLowerYPosition - - // update the range handle - sliderRoot.updateRangeHandle() - } - - // dragging - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: upperHandle.height + sliderRoot.minimumRangeHandleSize - maximumY: sliderRoot.height - parent.height - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(lowerHandle) - } - - LayerSliderLabel { - id: lowerHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.lowerValue - busy: UM.LayerView.busy - setValue: lowerHandle.setValue // connect callback functions - } - } -} +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +Item { + id: sliderRoot + + // handle properties + property real handleSize: 10 + property real handleRadius: handleSize / 2 + property real minimumRangeHandleSize: handleSize / 2 + property color upperHandleColor: "black" + property color lowerHandleColor: "black" + property color rangeHandleColor: "black" + property color handleActiveColor: "white" + property real handleLabelWidth: width + property var activeHandle: upperHandle + + // track properties + property real trackThickness: 4 // width of the slider track + property real trackRadius: trackThickness / 2 + property color trackColor: "white" + property real trackBorderWidth: 1 // width of the slider track border + property color trackBorderColor: "black" + + // value properties + property real maximumValue: 100 + property real minimumValue: 0 + property real minimumRange: 0 // minimum range allowed between min and max values + property bool roundValues: true + property real upperValue: maximumValue + property real lowerValue: minimumValue + + property bool layersVisible: true + + function getUpperValueFromSliderHandle () { + return upperHandle.getValue() + } + + function setUpperValue (value) { + upperHandle.setValue(value) + updateRangeHandle() + } + + function getLowerValueFromSliderHandle () { + return lowerHandle.getValue() + } + + function setLowerValue (value) { + lowerHandle.setValue(value) + updateRangeHandle() + } + + function updateRangeHandle () { + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) + } + + // set the active handle to show only one label at a time + function setActiveHandle (handle) { + activeHandle = handle + } + + // slider track + Rectangle { + id: track + + width: sliderRoot.trackThickness + height: sliderRoot.height - sliderRoot.handleSize + radius: sliderRoot.trackRadius + anchors.centerIn: sliderRoot + color: sliderRoot.trackColor + border.width: sliderRoot.trackBorderWidth + border.color: sliderRoot.trackBorderColor + visible: sliderRoot.layersVisible + } + + // Range handle + Item { + id: rangeHandle + + y: upperHandle.y + upperHandle.height + width: sliderRoot.handleSize + height: sliderRoot.minimumRangeHandleSize + anchors.horizontalCenter: sliderRoot.horizontalCenter + visible: sliderRoot.layersVisible + + // set the new value when dragging + function onHandleDragged () { + + upperHandle.y = y - upperHandle.height + lowerHandle.y = y + height + + var upperValue = sliderRoot.getUpperValueFromSliderHandle() + var lowerValue = sliderRoot.getLowerValueFromSliderHandle() + + // set both values after moving the handle position + UM.SimulationView.setCurrentLayer(upperValue) + UM.SimulationView.setMinimumLayer(lowerValue) + } + + function setValue (value) { + var range = sliderRoot.upperValue - sliderRoot.lowerValue + value = Math.min(value, sliderRoot.maximumValue) + value = Math.max(value, sliderRoot.minimumValue + range) + + UM.SimulationView.setCurrentLayer(value) + UM.SimulationView.setMinimumLayer(value - range) + } + + Rectangle { + width: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth + height: parent.height + sliderRoot.handleSize + anchors.centerIn: parent + color: sliderRoot.rangeHandleColor + } + + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: upperHandle.height + maximumY: sliderRoot.height - (rangeHandle.height + lowerHandle.height) + } + + onPositionChanged: parent.onHandleDragged() + onPressed: sliderRoot.setActiveHandle(rangeHandle) + } + + SimulationSliderLabel { + id: rangleHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.upperValue + busy: UM.SimulationView.busy + setValue: rangeHandle.setValue // connect callback functions + } + } + + // Upper handle + Rectangle { + id: upperHandle + + y: sliderRoot.height - (sliderRoot.minimumRangeHandleSize + 2 * sliderRoot.handleSize) + width: sliderRoot.handleSize + height: sliderRoot.handleSize + anchors.horizontalCenter: sliderRoot.horizontalCenter + radius: sliderRoot.handleRadius + color: upperHandleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.upperHandleColor + visible: sliderRoot.layersVisible + + function onHandleDragged () { + + // don't allow the lower handle to be heigher than the upper handle + if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize) { + lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize + } + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setCurrentLayer(getValue()) + } + + // get the upper value based on the slider position + function getValue () { + var result = y / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) + result = sliderRoot.maximumValue + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumValue)) + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the upper value + function setValue (value) { + + UM.SimulationView.setCurrentLayer(value) + + var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + var newUpperYPosition = Math.round(diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) + y = newUpperYPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onUpPressed: upperHandleLabel.setValue(upperHandleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: upperHandleLabel.setValue(upperHandleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: 0 + maximumY: sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + } + + onPositionChanged: parent.onHandleDragged() + onPressed: { + sliderRoot.setActiveHandle(upperHandle) + upperHandleLabel.forceActiveFocus() + } + } + + SimulationSliderLabel { + id: upperHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.upperValue + busy: UM.SimulationView.busy + setValue: upperHandle.setValue // connect callback functions + } + } + + // Lower handle + Rectangle { + id: lowerHandle + + y: sliderRoot.height - sliderRoot.handleSize + width: parent.handleSize + height: parent.handleSize + anchors.horizontalCenter: parent.horizontalCenter + radius: sliderRoot.handleRadius + color: lowerHandleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.lowerHandleColor + + visible: sliderRoot.layersVisible + + function onHandleDragged () { + + // don't allow the upper handle to be lower than the lower handle + if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize) { + upperHandle.y = y - (upperHandle.heigth + sliderRoot.minimumRangeHandleSize) + } + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setMinimumLayer(getValue()) + } + + // get the lower value from the current slider position + function getValue () { + var result = (y - (sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)); + result = sliderRoot.maximumValue - sliderRoot.minimumRange + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumRange)) + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the lower value + function setValue (value) { + + UM.SimulationView.setMinimumLayer(value) + + var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + var newLowerYPosition = Math.round((sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) + y = newLowerYPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onUpPressed: lowerHandleLabel.setValue(lowerHandleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: lowerHandleLabel.setValue(lowerHandleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: upperHandle.height + sliderRoot.minimumRangeHandleSize + maximumY: sliderRoot.height - parent.height + } + + onPositionChanged: parent.onHandleDragged() + onPressed: { + sliderRoot.setActiveHandle(lowerHandle) + lowerHandleLabel.forceActiveFocus() + } + } + + SimulationSliderLabel { + id: lowerHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.lowerValue + busy: UM.SimulationView.busy + setValue: lowerHandle.setValue // connect callback functions + } + } +} diff --git a/plugins/SimulationView/NozzleNode.py b/plugins/SimulationView/NozzleNode.py new file mode 100644 index 0000000000..8a29871775 --- /dev/null +++ b/plugins/SimulationView/NozzleNode.py @@ -0,0 +1,49 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Application import Application +from UM.Math.Color import Color +from UM.Math.Vector import Vector +from UM.PluginRegistry import PluginRegistry +from UM.Scene.SceneNode import SceneNode +from UM.View.GL.OpenGL import OpenGL +from UM.Resources import Resources + +import os + +class NozzleNode(SceneNode): + def __init__(self, parent = None): + super().__init__(parent) + + self._shader = None + self.setCalculateBoundingBox(False) + self._createNozzleMesh() + + def _createNozzleMesh(self): + mesh_file = "resources/nozzle.stl" + try: + path = os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), mesh_file) + except FileNotFoundError: + path = "" + + reader = Application.getInstance().getMeshFileHandler().getReaderForFile(path) + node = reader.read(path) + + if node.getMeshData(): + self.setMeshData(node.getMeshData()) + + def render(self, renderer): + # Avoid to render if it is not visible + if not self.isVisible(): + return False + + if not self._shader: + # We now misuse the platform shader, as it actually supports textures + self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + # Set the opacity to 0, so that the template is in full control. + self._shader.setUniformValue("u_opacity", 0) + + if self.getMeshData(): + renderer.queueNode(self, shader = self._shader, transparent = True) + return True diff --git a/plugins/SimulationView/PathSlider.qml b/plugins/SimulationView/PathSlider.qml new file mode 100644 index 0000000000..0a4af904aa --- /dev/null +++ b/plugins/SimulationView/PathSlider.qml @@ -0,0 +1,161 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +Item { + id: sliderRoot + + // handle properties + property real handleSize: 10 + property real handleRadius: handleSize / 2 + property color handleColor: "black" + property color handleActiveColor: "white" + property color rangeColor: "black" + property real handleLabelWidth: width + + // track properties + property real trackThickness: 4 // width of the slider track + property real trackRadius: trackThickness / 2 + property color trackColor: "white" + property real trackBorderWidth: 1 // width of the slider track border + property color trackBorderColor: "black" + + // value properties + property real maximumValue: 100 + property bool roundValues: true + property real handleValue: maximumValue + + property bool pathsVisible: true + + function getHandleValueFromSliderHandle () { + return handle.getValue() + } + + function setHandleValue (value) { + handle.setValue(value) + updateRangeHandle() + } + + function updateRangeHandle () { + rangeHandle.width = handle.x - sliderRoot.handleSize + } + + // slider track + Rectangle { + id: track + + width: sliderRoot.width - sliderRoot.handleSize + height: sliderRoot.trackThickness + radius: sliderRoot.trackRadius + anchors.centerIn: sliderRoot + color: sliderRoot.trackColor + border.width: sliderRoot.trackBorderWidth + border.color: sliderRoot.trackBorderColor + visible: sliderRoot.pathsVisible + } + + // Progress indicator + Item { + id: rangeHandle + + x: handle.width + height: sliderRoot.handleSize + width: handle.x - sliderRoot.handleSize + anchors.verticalCenter: sliderRoot.verticalCenter + visible: sliderRoot.pathsVisible + + Rectangle { + height: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth + width: parent.width + sliderRoot.handleSize + anchors.centerIn: parent + color: sliderRoot.rangeColor + } + } + + // Handle + Rectangle { + id: handle + + x: sliderRoot.handleSize + width: sliderRoot.handleSize + height: sliderRoot.handleSize + anchors.verticalCenter: sliderRoot.verticalCenter + radius: sliderRoot.handleRadius + color: handleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.handleColor + visible: sliderRoot.pathsVisible + + function onHandleDragged () { + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setCurrentPath(getValue()) + } + + // get the value based on the slider position + function getValue () { + var result = x / (sliderRoot.width - sliderRoot.handleSize) + result = result * sliderRoot.maximumValue + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the value + function setValue (value) { + + UM.SimulationView.setCurrentPath(value) + + var diff = value / sliderRoot.maximumValue + var newXPosition = Math.round(diff * (sliderRoot.width - sliderRoot.handleSize)) + x = newXPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onRightPressed: handleLabel.setValue(handleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onLeftPressed: handleLabel.setValue(handleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.XAxis + minimumX: 0 + maximumX: sliderRoot.width - sliderRoot.handleSize + } + onPressed: { + handleLabel.forceActiveFocus() + } + + onPositionChanged: parent.onHandleDragged() + } + + SimulationSliderLabel { + id: handleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + y: parent.y + sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + anchors.horizontalCenter: parent.horizontalCenter + target: Qt.point(x + width / 2, sliderRoot.height) + visible: false + startFrom: 0 + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.handleValue + busy: UM.SimulationView.busy + setValue: handle.setValue // connect callback functions + } + } +} diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py new file mode 100644 index 0000000000..4963568935 --- /dev/null +++ b/plugins/SimulationView/SimulationPass.py @@ -0,0 +1,187 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Math.Color import Color +from UM.Math.Vector import Vector +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Resources import Resources +from UM.Scene.SceneNode import SceneNode +from UM.Scene.ToolHandle import ToolHandle +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry + +from UM.View.RenderPass import RenderPass +from UM.View.RenderBatch import RenderBatch +from UM.View.GL.OpenGL import OpenGL + +from cura.Settings.ExtruderManager import ExtruderManager + + +import os.path + +## RenderPass used to display g-code paths. +from plugins.SimulationView.NozzleNode import NozzleNode + + +class SimulationPass(RenderPass): + def __init__(self, width, height): + super().__init__("simulationview", width, height) + + self._layer_shader = None + self._layer_shadow_shader = None + self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers + self._tool_handle_shader = None + self._nozzle_shader = None + self._old_current_layer = 0 + self._old_current_path = 0 + self._gl = OpenGL.getInstance().getBindingsObject() + self._scene = Application.getInstance().getController().getScene() + self._extruder_manager = ExtruderManager.getInstance() + + self._layer_view = None + self._compatibility_mode = None + + def setSimulationView(self, layerview): + self._layer_view = layerview + self._compatibility_mode = layerview.getCompatibilityMode() + + def render(self): + if not self._layer_shader: + if self._compatibility_mode: + shader_filename = "layers.shader" + shadow_shader_filename = "layers_shadow.shader" + else: + shader_filename = "layers3d.shader" + shadow_shader_filename = "layers3d_shadow.shader" + self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shader_filename)) + self._layer_shadow_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shadow_shader_filename)) + self._current_shader = self._layer_shader + # Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers) + self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex))) + if self._layer_view: + self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate()) + self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate()) + self._layer_shader.setUniformValue("u_max_thickness", self._layer_view.getMaxThickness()) + self._layer_shader.setUniformValue("u_min_thickness", self._layer_view.getMinThickness()) + self._layer_shader.setUniformValue("u_layer_view_type", self._layer_view.getSimulationViewType()) + self._layer_shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities()) + self._layer_shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves()) + self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) + self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) + self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) + else: + #defaults + self._layer_shader.setUniformValue("u_max_feedrate", 1) + self._layer_shader.setUniformValue("u_min_feedrate", 0) + self._layer_shader.setUniformValue("u_max_thickness", 1) + self._layer_shader.setUniformValue("u_min_thickness", 0) + self._layer_shader.setUniformValue("u_layer_view_type", 1) + self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1]) + self._layer_shader.setUniformValue("u_show_travel_moves", 0) + self._layer_shader.setUniformValue("u_show_helpers", 1) + self._layer_shader.setUniformValue("u_show_skin", 1) + self._layer_shader.setUniformValue("u_show_infill", 1) + + if not self._tool_handle_shader: + self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) + + if not self._nozzle_shader: + self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + + self.bind() + + tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Solid) + head_position = None # Indicates the current position of the print head + nozzle_node = None + + for node in DepthFirstIterator(self._scene.getRoot()): + + if isinstance(node, ToolHandle): + tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) + + + elif isinstance(node, NozzleNode): + nozzle_node = node + nozzle_node.setVisible(False) + + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + # Render all layers below a certain number as line mesh instead of vertices. + if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): + start = 0 + end = 0 + element_counts = layer_data.getElementCounts() + for layer in sorted(element_counts.keys()): + # In the current layer, we show just the indicated paths + if layer == self._layer_view._current_layer_num: + # We look for the position of the head, searching the point of the current path + index = self._layer_view._current_path_num + offset = 0 + for polygon in layer_data.getLayer(layer).polygons: + # The size indicates all values in the two-dimension array, and the second dimension is + # always size 3 because we have 3D points. + if index >= polygon.data.size // 3 - offset: + index -= polygon.data.size // 3 - offset + offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon + continue + # The head position is calculated and translated + head_position = Vector(polygon.data[index+offset][0], polygon.data[index+offset][1], polygon.data[index+offset][2]) + node.getWorldPosition() + break + break + if self._layer_view._minimum_layer_num > layer: + start += element_counts[layer] + end += element_counts[layer] + + # Calculate the range of paths in the last layer + current_layer_start = end + current_layer_end = end + self._layer_view._current_path_num * 2 # Because each point is used twice + + # This uses glDrawRangeElements internally to only draw a certain range of lines. + # All the layers but the current selected layer are rendered first + if self._old_current_path != self._layer_view._current_path_num: + self._current_shader = self._layer_shadow_shader + if not self._layer_view.isSimulationRunning() and self._old_current_layer != self._layer_view._current_layer_num: + self._current_shader = self._layer_shader + + layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) + layers_batch.addItem(node.getWorldTransformation(), layer_data) + layers_batch.render(self._scene.getActiveCamera()) + + # Current selected layer is rendered + current_layer_batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (current_layer_start, current_layer_end)) + current_layer_batch.addItem(node.getWorldTransformation(), layer_data) + current_layer_batch.render(self._scene.getActiveCamera()) + + self._old_current_layer = self._layer_view._current_layer_num + self._old_current_path = self._layer_view._current_path_num + + # Create a new batch that is not range-limited + batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) + + if self._layer_view.getCurrentLayerMesh(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) + + if self._layer_view.getCurrentLayerJumps(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) + + if len(batch.items) > 0: + batch.render(self._scene.getActiveCamera()) + + # The nozzle is drawn once we know the correct position + if self._layer_view.getActivity() and nozzle_node is not None: + if head_position is not None: + nozzle_node.setVisible(True) + nozzle_node.setPosition(head_position) + nozzle_batch = RenderBatch(self._nozzle_shader, type = RenderBatch.RenderType.Solid) + nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) + nozzle_batch.render(self._scene.getActiveCamera()) + + # Render toolhandles on top of the layerview + if len(tool_handle_batch.items) > 0: + tool_handle_batch.render(self._scene.getActiveCamera()) + + self.release() diff --git a/plugins/LayerView/LayerSliderLabel.qml b/plugins/SimulationView/SimulationSliderLabel.qml similarity index 88% rename from plugins/LayerView/LayerSliderLabel.qml rename to plugins/SimulationView/SimulationSliderLabel.qml index c989679285..1c8daf867f 100644 --- a/plugins/LayerView/LayerSliderLabel.qml +++ b/plugins/SimulationView/SimulationSliderLabel.qml @@ -1,103 +1,104 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.0 as UM -import Cura 1.0 as Cura - -UM.PointingRectangle { - id: sliderLabelRoot - - // custom properties - property real maximumValue: 100 - property real value: 0 - property var setValue // Function - property bool busy: false - - target: Qt.point(parent.width, y + height / 2) - arrowSize: UM.Theme.getSize("default_arrow").width - height: parent.height - width: valueLabel.width + UM.Theme.getSize("default_margin").width - visible: false - - // make sure the text field is focussed when pressing the parent handle - // needed to connect the key bindings when switching active handle - onVisibleChanged: if (visible) valueLabel.forceActiveFocus() - - color: UM.Theme.getColor("tool_panel_background") - borderColor: UM.Theme.getColor("lining") - borderWidth: UM.Theme.getSize("default_lining").width - - Behavior on height { - NumberAnimation { - duration: 50 - } - } - - // catch all mouse events so they're not handled by underlying 3D scene - MouseArea { - anchors.fill: parent - } - - TextField { - id: valueLabel - - anchors { - left: parent.left - leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - verticalCenter: parent.verticalCenter - } - - width: 40 * screenScaleFactor - text: sliderLabelRoot.value + 1 // the current handle value, add 1 because layers is an array - horizontalAlignment: TextInput.AlignRight - - // key bindings, work when label is currenctly focused (active handle in LayerSlider) - Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) - Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) - - style: TextFieldStyle { - textColor: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - background: Item { } - } - - onEditingFinished: { - - // Ensure that the cursor is at the first position. On some systems the text isn't fully visible - // Seems to have to do something with different dpi densities that QML doesn't quite handle. - // Another option would be to increase the size even further, but that gives pretty ugly results. - cursorPosition = 0 - - if (valueLabel.text != "") { - // -1 because we need to convert back to an array structure - sliderLabelRoot.setValue(parseInt(valueLabel.text) - 1) - } - } - - validator: IntValidator { - bottom: 1 - top: sliderLabelRoot.maximumValue + 1 // +1 because actual layers is an array - } - } - - BusyIndicator { - id: busyIndicator - - anchors { - left: parent.right - leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - verticalCenter: parent.verticalCenter - } - - width: sliderLabelRoot.height - height: width - - visible: sliderLabelRoot.busy - running: sliderLabelRoot.busy - } -} +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +UM.PointingRectangle { + id: sliderLabelRoot + + // custom properties + property real maximumValue: 100 + property real value: 0 + property var setValue // Function + property bool busy: false + property int startFrom: 1 + + target: Qt.point(parent.width, y + height / 2) + arrowSize: UM.Theme.getSize("default_arrow").width + height: parent.height + width: valueLabel.width + UM.Theme.getSize("default_margin").width + visible: false + + // make sure the text field is focussed when pressing the parent handle + // needed to connect the key bindings when switching active handle + onVisibleChanged: if (visible) valueLabel.forceActiveFocus() + + color: UM.Theme.getColor("tool_panel_background") + borderColor: UM.Theme.getColor("lining") + borderWidth: UM.Theme.getSize("default_lining").width + + Behavior on height { + NumberAnimation { + duration: 50 + } + } + + // catch all mouse events so they're not handled by underlying 3D scene + MouseArea { + anchors.fill: parent + } + + TextField { + id: valueLabel + + anchors { + left: parent.left + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + verticalCenter: parent.verticalCenter + } + + width: 40 * screenScaleFactor + text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array + horizontalAlignment: TextInput.AlignRight + + // key bindings, work when label is currenctly focused (active handle in LayerSlider) + Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + style: TextFieldStyle { + textColor: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + background: Item { } + } + + onEditingFinished: { + + // Ensure that the cursor is at the first position. On some systems the text isn't fully visible + // Seems to have to do something with different dpi densities that QML doesn't quite handle. + // Another option would be to increase the size even further, but that gives pretty ugly results. + cursorPosition = 0 + + if (valueLabel.text != "") { + // -startFrom because we need to convert back to an array structure + sliderLabelRoot.setValue(parseInt(valueLabel.text) - startFrom) + } + } + + validator: IntValidator { + bottom:startFrom + top: sliderLabelRoot.maximumValue + startFrom // +startFrom because maybe we want to start in a different value rather than 0 + } + } + + BusyIndicator { + id: busyIndicator + + anchors { + left: parent.right + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + verticalCenter: parent.verticalCenter + } + + width: sliderLabelRoot.height + height: width + + visible: sliderLabelRoot.busy + running: sliderLabelRoot.busy + } +} diff --git a/plugins/LayerView/LayerView.py b/plugins/SimulationView/SimulationView.py old mode 100755 new mode 100644 similarity index 74% rename from plugins/LayerView/LayerView.py rename to plugins/SimulationView/SimulationView.py index 04be97b747..90f64a8224 --- a/plugins/LayerView/LayerView.py +++ b/plugins/SimulationView/SimulationView.py @@ -1,46 +1,46 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import sys -from UM.PluginRegistry import PluginRegistry -from UM.View.View import View -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Resources import Resources -from UM.Event import Event, KeyEvent -from UM.Signal import Signal -from UM.Scene.Selection import Selection -from UM.Math.Color import Color -from UM.Mesh.MeshBuilder import MeshBuilder -from UM.Job import Job -from UM.Preferences import Preferences -from UM.Logger import Logger -from UM.View.GL.OpenGL import OpenGL -from UM.Message import Message -from UM.Application import Application -from UM.View.GL.OpenGLContext import OpenGLContext - -from cura.ConvexHullNode import ConvexHullNode -from cura.Settings.ExtruderManager import ExtruderManager - from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QApplication -from . import LayerViewProxy - +from UM.Application import Application +from UM.Event import Event, KeyEvent +from UM.Job import Job +from UM.Logger import Logger +from UM.Math.Color import Color +from UM.Math.Vector import Vector +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Message import Message +from UM.PluginRegistry import PluginRegistry +from UM.Preferences import Preferences +from UM.Resources import Resources +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection +from UM.Signal import Signal +from UM.View.GL.OpenGL import OpenGL +from UM.View.GL.OpenGLContext import OpenGLContext +from UM.View.View import View from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") +from cura.ConvexHullNode import ConvexHullNode +from plugins.SimulationView.NozzleNode import NozzleNode +from . import SimulationPass, SimulationViewProxy -from . import LayerPass +catalog = i18nCatalog("cura") import numpy import os.path ## View used to display g-code paths. -class LayerView(View): - # Must match LayerView.qml +class SimulationView(View): + # Must match SimulationView.qml LAYER_VIEW_TYPE_MATERIAL_TYPE = 0 LAYER_VIEW_TYPE_LINE_TYPE = 1 + LAYER_VIEW_TYPE_FEEDRATE = 2 + LAYER_VIEW_TYPE_THICKNESS = 3 def __init__(self): super().__init__() @@ -54,22 +54,29 @@ class LayerView(View): self._activity = False self._old_max_layers = 0 + self._max_paths = 0 + self._current_path_num = 0 + self._minimum_path_num = 0 + self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) + self._busy = False + self._simulation_running = False self._ghost_shader = None self._layer_pass = None self._composite_pass = None self._old_layer_bindings = None - self._layerview_composite_shader = None + self._simulationview_composite_shader = None self._old_composite_shader = None self._global_container_stack = None - self._proxy = LayerViewProxy.LayerViewProxy() + self._proxy = SimulationViewProxy.SimulationViewProxy() self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._resetSettings() self._legend_items = None self._show_travel_moves = False + self._nozzle_node = None Preferences.getInstance().addPreference("view/top_layer_count", 5) Preferences.getInstance().addPreference("view/only_show_top_layers", False) @@ -91,7 +98,7 @@ class LayerView(View): self._compatibility_mode = True # for safety self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), - title = catalog.i18nc("@info:title", "Layer View")) + title = catalog.i18nc("@info:title", "Simulation View")) def _resetSettings(self): self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed @@ -101,17 +108,24 @@ class LayerView(View): self._show_helpers = 1 self._show_skin = 1 self._show_infill = 1 + self.resetLayerData() def getActivity(self): return self._activity - def getLayerPass(self): + def setActivity(self, activity): + if self._activity == activity: + return + self._activity = activity + self.activityChanged.emit() + + def getSimulationPass(self): if not self._layer_pass: # Currently the RenderPass constructor requires a size > 0 # This should be fixed in RenderPass's constructor. - self._layer_pass = LayerPass.LayerPass(1, 1) + self._layer_pass = SimulationPass.SimulationPass(1, 1) self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) - self._layer_pass.setLayerView(self) + self._layer_pass.setSimulationView(self) return self._layer_pass def getCurrentLayer(self): @@ -120,13 +134,26 @@ class LayerView(View): def getMinimumLayer(self): return self._minimum_layer_num - def _onSceneChanged(self, node): - self.calculateMaxLayers() - def getMaxLayers(self): return self._max_layers - busyChanged = Signal() + def getCurrentPath(self): + return self._current_path_num + + def getMinimumPath(self): + return self._minimum_path_num + + def getMaxPaths(self): + return self._max_paths + + def getNozzleNode(self): + if not self._nozzle_node: + self._nozzle_node = NozzleNode() + return self._nozzle_node + + def _onSceneChanged(self, node): + self.setActivity(False) + self.calculateMaxLayers() def isBusy(self): return self._busy @@ -136,9 +163,19 @@ class LayerView(View): self._busy = busy self.busyChanged.emit() + def isSimulationRunning(self): + return self._simulation_running + + def setSimulationRunning(self, running): + self._simulation_running = running + def resetLayerData(self): self._current_layer_mesh = None self._current_layer_jumps = None + self._max_feedrate = sys.float_info.min + self._min_feedrate = sys.float_info.max + self._max_thickness = sys.float_info.min + self._min_thickness = sys.float_info.max def beginRendering(self): scene = self.getController().getScene() @@ -186,15 +223,43 @@ class LayerView(View): self.currentLayerNumChanged.emit() + def setPath(self, value): + if self._current_path_num != value: + self._current_path_num = value + if self._current_path_num < 0: + self._current_path_num = 0 + if self._current_path_num > self._max_paths: + self._current_path_num = self._max_paths + if self._current_path_num < self._minimum_path_num: + self._minimum_path_num = self._current_path_num + + self._startUpdateTopLayers() + + self.currentPathNumChanged.emit() + + def setMinimumPath(self, value): + if self._minimum_path_num != value: + self._minimum_path_num = value + if self._minimum_path_num < 0: + self._minimum_path_num = 0 + if self._minimum_path_num > self._max_layers: + self._minimum_path_num = self._max_layers + if self._minimum_path_num > self._current_path_num: + self._current_path_num = self._minimum_path_num + + self._startUpdateTopLayers() + + self.currentPathNumChanged.emit() + ## Set the layer view type # - # \param layer_view_type integer as in LayerView.qml and this class - def setLayerViewType(self, layer_view_type): + # \param layer_view_type integer as in SimulationView.qml and this class + def setSimulationViewType(self, layer_view_type): self._layer_view_type = layer_view_type self.currentLayerNumChanged.emit() - ## Return the layer view type, integer as in LayerView.qml and this class - def getLayerViewType(self): + ## Return the layer view type, integer as in SimulationView.qml and this class + def getSimulationViewType(self): return self._layer_view_type ## Set the extruder opacity @@ -243,9 +308,20 @@ class LayerView(View): def getExtruderCount(self): return self._extruder_count + def getMinFeedrate(self): + return self._min_feedrate + + def getMaxFeedrate(self): + return self._max_feedrate + + def getMinThickness(self): + return self._min_thickness + + def getMaxThickness(self): + return self._max_thickness + def calculateMaxLayers(self): scene = self.getController().getScene() - self._activity = True self._old_max_layers = self._max_layers ## Recalculate num max layers @@ -255,9 +331,16 @@ class LayerView(View): if not layer_data: continue + self.setActivity(True) min_layer_number = sys.maxsize max_layer_number = -sys.maxsize for layer_id in layer_data.getLayers(): + # Store the max and min feedrates and thicknesses for display purposes + for p in layer_data.getLayer(layer_id).polygons: + self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate) + self._min_feedrate = min(float(p.lineFeedrates.min()), self._min_feedrate) + self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) + self._min_thickness = min(float(p.lineThicknesses.min()), self._min_thickness) if max_layer_number < layer_id: max_layer_number = layer_id if min_layer_number > layer_id: @@ -281,10 +364,32 @@ class LayerView(View): self.maxLayersChanged.emit() self._startUpdateTopLayers() + def calculateMaxPathsOnLayer(self, layer_num): + # Update the currentPath + scene = self.getController().getScene() + for node in DepthFirstIterator(scene.getRoot()): + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + layer = layer_data.getLayer(layer_num) + if layer is None: + return + new_max_paths = layer.lineMeshElementCount() + if new_max_paths > 0 and new_max_paths != self._max_paths: + self._max_paths = new_max_paths + self.maxPathsChanged.emit() + + self.setPath(int(new_max_paths)) + maxLayersChanged = Signal() + maxPathsChanged = Signal() currentLayerNumChanged = Signal() + currentPathNumChanged = Signal() globalStackChanged = Signal() preferencesChanged = Signal() + busyChanged = Signal() + activityChanged = Signal() ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created # as this caused some issues. @@ -308,26 +413,31 @@ class LayerView(View): return True if event.type == Event.ViewActivateEvent: - # Make sure the LayerPass is created - layer_pass = self.getLayerPass() + # Make sure the SimulationPass is created + layer_pass = self.getSimulationPass() self.getRenderer().addRenderPass(layer_pass) + # Make sure the NozzleNode is add to the root + nozzle = self.getNozzleNode() + nozzle.setParent(self.getController().getScene().getRoot()) + nozzle.setVisible(False) + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() - if not self._layerview_composite_shader: - self._layerview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("LayerView"), "layerview_composite.shader")) + if not self._simulationview_composite_shader: + self._simulationview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), "simulationview_composite.shader")) theme = Application.getInstance().getTheme() - self._layerview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._layerview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + self._simulationview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) + self._simulationview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) if not self._composite_pass: self._composite_pass = self.getRenderer().getRenderPass("composite") self._old_layer_bindings = self._composite_pass.getLayerBindings()[:] # make a copy so we can restore to it later - self._composite_pass.getLayerBindings().append("layerview") + self._composite_pass.getLayerBindings().append("simulationview") self._old_composite_shader = self._composite_pass.getCompositeShader() - self._composite_pass.setCompositeShader(self._layerview_composite_shader) + self._composite_pass.setCompositeShader(self._simulationview_composite_shader) elif event.type == Event.ViewDeactivateEvent: self._wireprint_warning_message.hide() @@ -335,6 +445,7 @@ class LayerView(View): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) + self._nozzle_node.setParent(None) self.getRenderer().removeRenderPass(self._layer_pass) self._composite_pass.setLayerBindings(self._old_layer_bindings) self._composite_pass.setCompositeShader(self._old_composite_shader) @@ -364,6 +475,9 @@ class LayerView(View): else: self._wireprint_warning_message.hide() + def _onCurrentLayerNumChanged(self): + self.calculateMaxPathsOnLayer(self._current_layer_num) + def _startUpdateTopLayers(self): if not self._compatibility_mode: return @@ -397,7 +511,7 @@ class LayerView(View): self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool( Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) - self.setLayerViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); + self.setSimulationViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); for extruder_nr, extruder_opacity in enumerate(Preferences.getInstance().getValue("layerview/extruder_opacities").split("|")): try: diff --git a/plugins/LayerView/LayerView.qml b/plugins/SimulationView/SimulationView.qml old mode 100755 new mode 100644 similarity index 51% rename from plugins/LayerView/LayerView.qml rename to plugins/SimulationView/SimulationView.qml index 7261926bc5..e2e0dc3aed --- a/plugins/LayerView/LayerView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -13,19 +13,19 @@ Item { id: base width: { - if (UM.LayerView.compatibilityMode) { + if (UM.SimulationView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").width; } else { return UM.Theme.getSize("layerview_menu_size").width; } } height: { - if (UM.LayerView.compatibilityMode) { + if (UM.SimulationView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").height; } else if (UM.Preferences.getValue("layerview/layer_view_type") == 0) { - return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) + return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } else { - return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) + return UM.Theme.getSize("layerview_menu_size").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } } @@ -46,7 +46,7 @@ Item anchors.top: parent.top width: parent.width height: parent.height - z: slider.z - 1 + z: layerSlider.z - 1 color: UM.Theme.getColor("tool_panel_background") borderWidth: UM.Theme.getSize("default_lining").width borderColor: UM.Theme.getColor("lining") @@ -61,7 +61,8 @@ Item property bool show_skin: UM.Preferences.getValue("layerview/show_skin") property bool show_infill: UM.Preferences.getValue("layerview/show_infill") // if we are in compatibility mode, we only show the "line type" - property bool show_legend: UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type") == 1 + property bool show_legend: UM.SimulationView.compatibilityMode ? true : UM.Preferences.getValue("layerview/layer_view_type") == 1 + property bool show_gradient: UM.SimulationView.compatibilityMode ? false : UM.Preferences.getValue("layerview/layer_view_type") == 2 || UM.Preferences.getValue("layerview/layer_view_type") == 3 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") @@ -79,12 +80,12 @@ Item anchors.left: parent.left text: catalog.i18nc("@label","Color scheme") font: UM.Theme.getFont("default"); - visible: !UM.LayerView.compatibilityMode + visible: !UM.SimulationView.compatibilityMode Layout.fillWidth: true color: UM.Theme.getColor("setting_control_text") } - ListModel // matches LayerView.py + ListModel // matches SimulationView.py { id: layerViewTypes } @@ -97,7 +98,15 @@ Item }) layerViewTypes.append({ text: catalog.i18nc("@label:listbox", "Line Type"), - type_id: 1 // these ids match the switching in the shader + type_id: 1 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Feedrate"), + type_id: 2 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Layer thickness"), + type_id: 3 // these ids match the switching in the shader }) } @@ -108,7 +117,7 @@ Item Layout.fillWidth: true Layout.preferredWidth: UM.Theme.getSize("layerview_row").width model: layerViewTypes - visible: !UM.LayerView.compatibilityMode + visible: !UM.SimulationView.compatibilityMode style: UM.Theme.styles.combobox anchors.right: parent.right anchors.rightMargin: 10 * screenScaleFactor @@ -120,14 +129,14 @@ Item Component.onCompleted: { - currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); + currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); updateLegends(currentIndex); } function updateLegends(type_id) { // update visibility of legends - view_settings.show_legend = UM.LayerView.compatibilityMode || (type_id == 1); + view_settings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); } } @@ -139,7 +148,7 @@ Item text: catalog.i18nc("@label","Compatibility Mode") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") - visible: UM.LayerView.compatibilityMode + visible: UM.SimulationView.compatibilityMode Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width @@ -157,7 +166,7 @@ Item target: UM.Preferences onPreferenceChanged: { - layerTypeCombobox.currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); + layerTypeCombobox.currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); @@ -178,7 +187,7 @@ Item view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); } - visible: !UM.LayerView.compatibilityMode + visible: !UM.SimulationView.compatibilityMode enabled: index + 1 <= 4 Rectangle { anchors.verticalCenter: parent.verticalCenter @@ -190,7 +199,7 @@ Item radius: width / 2 border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: !view_settings.show_legend + visible: !view_settings.show_legend & !view_settings.show_gradient } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -213,28 +222,28 @@ Item Repeater { model: ListModel { - id: typesLegenModel + id: typesLegendModel Component.onCompleted: { - typesLegenModel.append({ + typesLegendModel.append({ label: catalog.i18nc("@label", "Show Travels"), initialValue: view_settings.show_travel_moves, preference: "layerview/show_travel_moves", colorId: "layerview_move_combing" }); - typesLegenModel.append({ + typesLegendModel.append({ label: catalog.i18nc("@label", "Show Helpers"), initialValue: view_settings.show_helpers, preference: "layerview/show_helpers", colorId: "layerview_support" }); - typesLegenModel.append({ + typesLegendModel.append({ label: catalog.i18nc("@label", "Show Shell"), initialValue: view_settings.show_skin, preference: "layerview/show_skin", colorId: "layerview_inset_0" }); - typesLegenModel.append({ + typesLegendModel.append({ label: catalog.i18nc("@label", "Show Infill"), initialValue: view_settings.show_infill, preference: "layerview/show_infill", @@ -285,7 +294,7 @@ Item UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); } text: catalog.i18nc("@label", "Only Show Top Layers") - visible: UM.LayerView.compatibilityMode + visible: UM.SimulationView.compatibilityMode style: UM.Theme.styles.checkbox } CheckBox { @@ -294,20 +303,20 @@ Item UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); } text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") - visible: UM.LayerView.compatibilityMode + visible: UM.SimulationView.compatibilityMode style: UM.Theme.styles.checkbox } Repeater { model: ListModel { - id: typesLegenModelNoCheck + id: typesLegendModelNoCheck Component.onCompleted: { - typesLegenModelNoCheck.append({ + typesLegendModelNoCheck.append({ label: catalog.i18nc("@label", "Top / Bottom"), colorId: "layerview_skin", }); - typesLegenModelNoCheck.append({ + typesLegendModelNoCheck.append({ label: catalog.i18nc("@label", "Inner Wall"), colorId: "layerview_inset_x", }); @@ -336,47 +345,272 @@ Item font: UM.Theme.getFont("default") } } + + // Text for the minimum, maximum and units for the feedrates and layer thickness + Rectangle { + id: gradientLegend + visible: view_settings.show_gradient + width: parent.width + height: UM.Theme.getSize("layerview_row").height + anchors { + topMargin: UM.Theme.getSize("slider_layerview_margin").height + horizontalCenter: parent.horizontalCenter + } + + Label { + text: minText() + anchors.left: parent.left + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function minText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return parseFloat(UM.SimulationView.getMinFeedrate()).toFixed(2) + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return parseFloat(UM.SimulationView.getMinThickness()).toFixed(2) + } + } + return catalog.i18nc("@label","min") + } + } + + Label { + text: unitsText() + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function unitsText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return "mm/s" + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return "mm" + } + } + return "" + } + } + + Label { + text: maxText() + anchors.right: parent.right + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function maxText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return parseFloat(UM.SimulationView.getMaxFeedrate()).toFixed(2) + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return parseFloat(UM.SimulationView.getMaxThickness()).toFixed(2) + } + } + return catalog.i18nc("@label","max") + } + } + } + + // Gradient colors for feedrate and thickness + Rectangle { // In QML 5.9 can be changed by LinearGradient + // Invert values because then the bar is rotated 90 degrees + id: gradient + visible: view_settings.show_gradient + anchors.left: parent.right + height: parent.width + width: UM.Theme.getSize("layerview_row").height * 1.5 + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + transform: Rotation {origin.x: 0; origin.y: 0; angle: 90} + gradient: Gradient { + GradientStop { + position: 0.000 + color: Qt.rgba(1, 0, 0, 1) + } + GradientStop { + position: 0.25 + color: Qt.rgba(0.75, 0.5, 0.25, 1) + } + GradientStop { + position: 0.5 + color: Qt.rgba(0.5, 1, 0.5, 1) + } + GradientStop { + position: 0.75 + color: Qt.rgba(0.25, 0.5, 0.75, 1) + } + GradientStop { + position: 1.0 + color: Qt.rgba(0, 0, 1, 1) + } + } + } } - LayerSlider { - id: slider + Item { + id: slidersBox - width: UM.Theme.getSize("slider_handle").width - height: UM.Theme.getSize("layerview_menu_size").height + width: parent.width + visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity anchors { top: parent.bottom topMargin: UM.Theme.getSize("slider_layerview_margin").height - right: layerViewMenu.right - rightMargin: UM.Theme.getSize("slider_layerview_margin").width + left: parent.left } - // custom properties - upperValue: UM.LayerView.currentLayer - lowerValue: UM.LayerView.minimumLayer - maximumValue: UM.LayerView.numLayers - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - upperHandleColor: UM.Theme.getColor("slider_handle") - lowerHandleColor: UM.Theme.getColor("slider_handle") - rangeHandleColor: UM.Theme.getColor("slider_groove_fill") - handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - layersVisible: UM.LayerView.layerActivity && CuraApplication.platformActivity ? true : false + PathSlider { + id: pathSlider - // update values when layer data changes - Connections { - target: UM.LayerView - onMaxLayersChanged: slider.setUpperValue(UM.LayerView.currentLayer) - onMinimumLayerChanged: slider.setLowerValue(UM.LayerView.minimumLayer) - onCurrentLayerChanged: slider.setUpperValue(UM.LayerView.currentLayer) + width: parent.width + height: UM.Theme.getSize("slider_handle").width + anchors.left: parent.left + visible: !UM.SimulationView.compatibilityMode + + // custom properties + handleValue: UM.SimulationView.currentPath + maximumValue: UM.SimulationView.numPaths + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + handleColor: UM.Theme.getColor("slider_handle") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + rangeColor: UM.Theme.getColor("slider_groove_fill") + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + pathSlider.setHandleValue(UM.SimulationView.currentPath) + } } - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - slider.setLowerValue(UM.LayerView.minimumLayer) - slider.setUpperValue(UM.LayerView.currentLayer) + LayerSlider { + id: layerSlider + + width: UM.Theme.getSize("slider_handle").width + height: UM.Theme.getSize("layerview_menu_size").height + + anchors { + top: pathSlider.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").height + right: parent.right + rightMargin: UM.Theme.getSize("slider_layerview_margin").width + } + + // custom properties + upperValue: UM.SimulationView.currentLayer + lowerValue: UM.SimulationView.minimumLayer + maximumValue: UM.SimulationView.numLayers + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + upperHandleColor: UM.Theme.getColor("slider_handle") + lowerHandleColor: UM.Theme.getColor("slider_handle") + rangeHandleColor: UM.Theme.getColor("slider_groove_fill") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + } + + // Play simulation button + Button { + id: playButton + implicitWidth: UM.Theme.getSize("button").width * 0.75; + implicitHeight: UM.Theme.getSize("button").height * 0.75; + iconSource: "./resources/simulation_resume.svg" + style: UM.Theme.styles.tool_button + visible: !UM.SimulationView.compatibilityMode + anchors { + horizontalCenter: layerSlider.horizontalCenter + top: layerSlider.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").width + } + + property var status: 0 // indicates if it's stopped (0) or playing (1) + + onClicked: { + switch(status) { + case 0: { + resumeSimulation() + break + } + case 1: { + pauseSimulation() + break + } + } + } + + function pauseSimulation() { + UM.SimulationView.setSimulationRunning(false) + iconSource = "./resources/simulation_resume.svg" + simulationTimer.stop() + status = 0 + } + + function resumeSimulation() { + UM.SimulationView.setSimulationRunning(true) + iconSource = "./resources/simulation_pause.svg" + simulationTimer.start() + status = 1 + } + } + } + + Timer + { + id: simulationTimer + interval: 250 + running: false + repeat: true + onTriggered: { + var currentPath = UM.SimulationView.currentPath + var numPaths = UM.SimulationView.numPaths + var currentLayer = UM.SimulationView.currentLayer + var numLayers = UM.SimulationView.numLayers + if (currentPath >= numPaths) { + if (currentLayer >= numLayers) { + playButton.pauseSimulation() + } + else { + UM.SimulationView.setCurrentLayer(currentLayer+1) + UM.SimulationView.setCurrentPath(0) + } + } + else { + UM.SimulationView.setCurrentPath(currentPath+1) + } } } } diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py new file mode 100644 index 0000000000..21a962104d --- /dev/null +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -0,0 +1,246 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty +from UM.FlameProfiler import pyqtSlot +from UM.Application import Application + +import SimulationView + + +class SimulationViewProxy(QObject): + def __init__(self, parent=None): + super().__init__(parent) + self._current_layer = 0 + self._controller = Application.getInstance().getController() + self._controller.activeViewChanged.connect(self._onActiveViewChanged) + self._onActiveViewChanged() + + currentLayerChanged = pyqtSignal() + currentPathChanged = pyqtSignal() + maxLayersChanged = pyqtSignal() + maxPathsChanged = pyqtSignal() + activityChanged = pyqtSignal() + globalStackChanged = pyqtSignal() + preferencesChanged = pyqtSignal() + busyChanged = pyqtSignal() + + @pyqtProperty(bool, notify=activityChanged) + def layerActivity(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getActivity() + return False + + @pyqtProperty(int, notify=maxLayersChanged) + def numLayers(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxLayers() + return 0 + + @pyqtProperty(int, notify=currentLayerChanged) + def currentLayer(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCurrentLayer() + return 0 + + @pyqtProperty(int, notify=currentLayerChanged) + def minimumLayer(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinimumLayer() + return 0 + + @pyqtProperty(int, notify=maxPathsChanged) + def numPaths(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxPaths() + return 0 + + @pyqtProperty(int, notify=currentPathChanged) + def currentPath(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCurrentPath() + return 0 + + @pyqtProperty(int, notify=currentPathChanged) + def minimumPath(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinimumPath() + return 0 + + @pyqtProperty(bool, notify=busyChanged) + def busy(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.isBusy() + return False + + @pyqtProperty(bool, notify=preferencesChanged) + def compatibilityMode(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCompatibilityMode() + return False + + @pyqtSlot(int) + def setCurrentLayer(self, layer_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setLayer(layer_num) + + @pyqtSlot(int) + def setMinimumLayer(self, layer_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setMinimumLayer(layer_num) + + @pyqtSlot(int) + def setCurrentPath(self, path_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setPath(path_num) + + @pyqtSlot(int) + def setMinimumPath(self, path_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setMinimumPath(path_num) + + @pyqtSlot(int) + def setSimulationViewType(self, layer_view_type): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setSimulationViewisinstance(layer_view_type) + + @pyqtSlot(result=int) + def getSimulationViewType(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getSimulationViewType() + return 0 + + @pyqtSlot(bool) + def setSimulationRunning(self, running): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setSimulationRunning(running) + + @pyqtSlot(result=bool) + def getSimulationRunning(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.isSimulationRunning() + return False + + @pyqtSlot(result=float) + def getMinFeedrate(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinFeedrate() + return 0 + + @pyqtSlot(result=float) + def getMaxFeedrate(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxFeedrate() + return 0 + + @pyqtSlot(result=float) + def getMinThickness(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinThickness() + return 0 + + @pyqtSlot(result=float) + def getMaxThickness(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxThickness() + return 0 + + # Opacity 0..1 + @pyqtSlot(int, float) + def setExtruderOpacity(self, extruder_nr, opacity): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setExtruderOpacity(extruder_nr, opacity) + + @pyqtSlot(int) + def setShowTravelMoves(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowTravelMoves(show) + + @pyqtSlot(int) + def setShowHelpers(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowHelpers(show) + + @pyqtSlot(int) + def setShowSkin(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowSkin(show) + + @pyqtSlot(int) + def setShowInfill(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowInfill(show) + + @pyqtProperty(int, notify=globalStackChanged) + def extruderCount(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getExtruderCount() + return 0 + + def _layerActivityChanged(self): + self.activityChanged.emit() + + def _onLayerChanged(self): + self.currentLayerChanged.emit() + self._layerActivityChanged() + + def _onPathChanged(self): + self.currentPathChanged.emit() + self._layerActivityChanged() + + def _onMaxLayersChanged(self): + self.maxLayersChanged.emit() + + def _onMaxPathsChanged(self): + self.maxPathsChanged.emit() + + def _onBusyChanged(self): + self.busyChanged.emit() + + def _onActivityChanged(self): + self.activityChanged.emit() + + def _onGlobalStackChanged(self): + self.globalStackChanged.emit() + + def _onPreferencesChanged(self): + self.preferencesChanged.emit() + + def _onActiveViewChanged(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.currentLayerNumChanged.connect(self._onLayerChanged) + active_view.currentPathNumChanged.connect(self._onPathChanged) + active_view.maxLayersChanged.connect(self._onMaxLayersChanged) + active_view.maxPathsChanged.connect(self._onMaxPathsChanged) + active_view.busyChanged.connect(self._onBusyChanged) + active_view.activityChanged.connect(self._onActivityChanged) + active_view.globalStackChanged.connect(self._onGlobalStackChanged) + active_view.preferencesChanged.connect(self._onPreferencesChanged) diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py new file mode 100644 index 0000000000..f7ccf41acc --- /dev/null +++ b/plugins/SimulationView/__init__.py @@ -0,0 +1,26 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtQml import qmlRegisterSingletonType + +from UM.i18n import i18nCatalog +from . import SimulationViewProxy, SimulationView + +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "view": { + "name": catalog.i18nc("@item:inlistbox", "Simulation view"), + "view_panel": "SimulationView.qml", + "weight": 2 + } + } + +def createSimulationViewProxy(engine, script_engine): + return SimulationViewProxy.SimulatorViewProxy() + +def register(app): + simulation_view = SimulationView.SimulationView() + qmlRegisterSingletonType(SimulationViewProxy.SimulationViewProxy, "UM", 1, 0, "SimulationView", simulation_view.getProxy) + return { "view": SimulationView.SimulationView()} diff --git a/plugins/LayerView/layers.shader b/plugins/SimulationView/layers.shader old mode 100755 new mode 100644 similarity index 100% rename from plugins/LayerView/layers.shader rename to plugins/SimulationView/layers.shader diff --git a/plugins/LayerView/layers3d.shader b/plugins/SimulationView/layers3d.shader old mode 100755 new mode 100644 similarity index 92% rename from plugins/LayerView/layers3d.shader rename to plugins/SimulationView/layers3d.shader index e8fe425c70..f377fca055 --- a/plugins/LayerView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -6,6 +6,10 @@ vertex41core = uniform highp mat4 u_modelMatrix; uniform highp mat4 u_viewProjectionMatrix; uniform lowp float u_active_extruder; + uniform lowp float u_max_feedrate; + uniform lowp float u_min_feedrate; + uniform lowp float u_max_thickness; + uniform lowp float u_min_thickness; uniform lowp int u_layer_view_type; uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible @@ -18,6 +22,8 @@ vertex41core = in highp vec2 a_line_dim; // line width and thickness in highp float a_extruder; in highp float a_line_type; + in highp float a_feedrate; + in highp float a_thickness; out lowp vec4 v_color; @@ -32,6 +38,15 @@ vertex41core = out highp vec3 f_vertex; out highp vec3 f_normal; + vec4 gradientColor(float abs_value, float min_value, float max_value) + { + float value = (abs_value - min_value)/(max_value - min_value); + float red = value; + float green = 1-abs(1-2*value); + float blue = 1-value; + return vec4(red, green, blue, 1.0); + } + void main() { vec4 v1_vertex = a_vertex; @@ -48,6 +63,12 @@ vertex41core = case 1: // "Line type" v_color = a_color; break; + case 2: // "Feedrate" + v_color = gradientColor(a_feedrate, u_min_feedrate, u_max_feedrate); + break; + case 3: // "Layer thickness" + v_color = gradientColor(a_line_dim.y, u_min_thickness, u_max_thickness); + break; } v_vertex = world_space_vert.xyz; @@ -247,6 +268,12 @@ u_show_helpers = 1 u_show_skin = 1 u_show_infill = 1 +u_min_feedrate = 0 +u_max_feedrate = 1 + +u_min_thickness = 0 +u_max_thickness = 1 + [bindings] u_modelViewProjectionMatrix = model_view_projection_matrix u_modelMatrix = model_matrix @@ -262,3 +289,5 @@ a_line_dim = line_dim a_extruder = extruder a_material_color = material_color a_line_type = line_type +a_feedrate = feedrate +a_thickness = thickness diff --git a/plugins/SimulationView/layers3d_shadow.shader b/plugins/SimulationView/layers3d_shadow.shader new file mode 100644 index 0000000000..ad75fcf9d0 --- /dev/null +++ b/plugins/SimulationView/layers3d_shadow.shader @@ -0,0 +1,256 @@ +[shaders] +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + + uniform highp mat4 u_modelMatrix; + uniform highp mat4 u_viewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible + + uniform highp mat4 u_normalMatrix; + + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_grayColor; + in lowp vec4 a_material_color; + in highp vec4 a_normal; + in highp vec2 a_line_dim; // line width and thickness + in highp float a_extruder; + in highp float a_line_type; + + out lowp vec4 v_color; + + out highp vec3 v_vertex; + out highp vec3 v_normal; + out lowp vec2 v_line_dim; + out highp int v_extruder; + out highp vec4 v_extruder_opacity; + out float v_line_type; + + out lowp vec4 f_color; + out highp vec3 f_vertex; + out highp vec3 f_normal; + + void main() + { + vec4 v1_vertex = a_vertex; + v1_vertex.y -= a_line_dim.y / 2; // half layer down + + vec4 world_space_vert = u_modelMatrix * v1_vertex; + gl_Position = world_space_vert; + // shade the color depending on the extruder index stored in the alpha component of the color + + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer + v_vertex = world_space_vert.xyz; + v_normal = (u_normalMatrix * normalize(a_normal)).xyz; + v_line_dim = a_line_dim; + v_extruder = int(a_extruder); + v_line_type = a_line_type; + v_extruder_opacity = u_extruder_opacity; + + // for testing without geometry shader + f_color = v_color; + f_vertex = v_vertex; + f_normal = v_normal; + } + +geometry41core = + #version 410 + + uniform highp mat4 u_viewProjectionMatrix; + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + layout(lines) in; + layout(triangle_strip, max_vertices = 26) out; + + in vec4 v_color[]; + in vec3 v_vertex[]; + in vec3 v_normal[]; + in vec2 v_line_dim[]; + in int v_extruder[]; + in vec4 v_extruder_opacity[]; + in float v_line_type[]; + + out vec4 f_color; + out vec3 f_normal; + out vec3 f_vertex; + + // Set the set of variables and EmitVertex + void myEmitVertex(vec3 vertex, vec4 color, vec3 normal, vec4 pos) { + f_vertex = vertex; + f_color = color; + f_normal = normal; + gl_Position = pos; + EmitVertex(); + } + + void main() + { + vec4 g_vertex_delta; + vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers + vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position + vec3 g_vertex_normal_vert; + vec4 g_vertex_offset_vert; + vec3 g_vertex_normal_horz_head; + vec4 g_vertex_offset_horz_head; + + float size_x; + float size_y; + + if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { + return; + } + // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType + if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { + return; + } + if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10))) { + return; + } + if ((u_show_skin == 0) && ((v_line_type[0] == 1) || (v_line_type[0] == 2) || (v_line_type[0] == 3))) { + return; + } + if ((u_show_infill == 0) && (v_line_type[0] == 6)) { + return; + } + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // fixed size for movements + size_x = 0.05; + } else { + size_x = v_line_dim[1].x / 2 + 0.01; // radius, and make it nicely overlapping + } + size_y = v_line_dim[1].y / 2 + 0.01; + + g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; + g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); + g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); + + g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); + + g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //size * g_vertex_normal_horz; + g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); + g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // Travels: flat plane with pointy ends + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); + + EndPrimitive(); + } else { + // All normal lines are rendered as 3d tubes. + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // left side + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // right side + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + } + } + +fragment41core = + #version 410 + in lowp vec4 f_color; + in lowp vec3 f_normal; + in lowp vec3 f_vertex; + + out vec4 frag_color; + + uniform mediump vec4 u_ambientColor; + uniform highp vec3 u_lightPosition; + + void main() + { + mediump vec4 finalColor = vec4(0.0); + float alpha = f_color.a; + + finalColor.rgb += f_color.rgb * 0.3; + + highp vec3 normal = normalize(f_normal); + highp vec3 light_dir = normalize(u_lightPosition - f_vertex); + + // Diffuse Component + highp float NdotL = clamp(dot(normal, light_dir), 0.0, 1.0); + finalColor += (NdotL * f_color); + finalColor.a = alpha; // Do not change alpha in any way + + frag_color = finalColor; + } + + +[defaults] +u_active_extruder = 0.0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_ambientColor = [0.3, 0.3, 0.3, 0.0] +u_diffuseColor = [1.0, 0.79, 0.14, 1.0] +u_shininess = 20.0 + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix +u_modelMatrix = model_matrix +u_viewProjectionMatrix = view_projection_matrix +u_normalMatrix = normal_matrix +u_lightPosition = light_0_position + +[attributes] +a_vertex = vertex +a_color = color +a_grayColor = vec4(0.87, 0.12, 0.45, 1.0) +a_normal = normal +a_line_dim = line_dim +a_extruder = extruder +a_material_color = material_color +a_line_type = line_type diff --git a/plugins/SimulationView/layers_shadow.shader b/plugins/SimulationView/layers_shadow.shader new file mode 100644 index 0000000000..972f18c921 --- /dev/null +++ b/plugins/SimulationView/layers_shadow.shader @@ -0,0 +1,156 @@ +[shaders] +vertex = + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + attribute highp float a_extruder; + attribute highp float a_line_type; + attribute highp vec4 a_vertex; + attribute lowp vec4 a_color; + attribute lowp vec4 a_material_color; + + varying lowp vec4 v_color; + varying float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + // shade the color depending on the extruder index + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer; + // 8 and 9 are travel moves + // if ((a_line_type != 8.0) && (a_line_type != 9.0)) { + // v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + // } + + v_line_type = a_line_type; + } + +fragment = + varying lowp vec4 v_color; + varying float v_line_type; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // support: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + gl_FragColor = v_color; + } + +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + in highp float a_extruder; + in highp float a_line_type; + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_material_color; + + out lowp vec4 v_color; + out float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer + // if ((a_line_type != 8) && (a_line_type != 9)) { + // v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + // } + + v_line_type = a_line_type; + } + +fragment41core = + #version 410 + in lowp vec4 v_color; + in float v_line_type; + out vec4 frag_color; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // helpers: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + frag_color = v_color; + } + +[defaults] +u_active_extruder = 0.0 +u_shade_factor = 0.60 +u_layer_view_type = 0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix + +[attributes] +a_vertex = vertex +a_color = color +a_extruder = extruder +a_line_type = line_type +a_material_color = material_color diff --git a/plugins/LayerView/plugin.json b/plugins/SimulationView/plugin.json similarity index 54% rename from plugins/LayerView/plugin.json rename to plugins/SimulationView/plugin.json index 232fe9c361..0e7bec0626 100644 --- a/plugins/LayerView/plugin.json +++ b/plugins/SimulationView/plugin.json @@ -1,8 +1,8 @@ { - "name": "Layer View", + "name": "Simulation View", "author": "Ultimaker B.V.", "version": "1.0.0", - "description": "Provides the Layer view.", + "description": "Provides the Simulation view.", "api": 4, "i18n-catalog": "cura" } diff --git a/plugins/SimulationView/resources/nozzle.stl b/plugins/SimulationView/resources/nozzle.stl new file mode 100644 index 0000000000000000000000000000000000000000..7f4b22804aab6768ed2b9c0ccdc2f89847e38125 GIT binary patch literal 210284 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%0AbuZy#5DmdXLV_bm} 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 MV-kv + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/plugins/SimulationView/resources/simulation_resume.svg b/plugins/SimulationView/resources/simulation_resume.svg new file mode 100644 index 0000000000..a8ed8e79a3 --- /dev/null +++ b/plugins/SimulationView/resources/simulation_resume.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/plugins/LayerView/layerview_composite.shader b/plugins/SimulationView/simulationview_composite.shader similarity index 100% rename from plugins/LayerView/layerview_composite.shader rename to plugins/SimulationView/simulationview_composite.shader From a0304255d1f9bf9a6b1e220fcef2643df819fd95 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 17 Nov 2017 15:05:08 +0100 Subject: [PATCH 237/764] CURA-4577 Take into account relative movements in GCodes --- plugins/GCodeReader/GCodeReader.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index e49ff9d8d7..1254efd4f2 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -136,16 +136,22 @@ class GCodeReader(MeshReader): def _gCode0(self, position, params, path): x, y, z, e = position - x = params.x if params.x is not None else x - y = params.y if params.y is not None else y - z = params.z if params.z is not None else position.z + if self._is_absolute_positioning: + x = params.x if params.x is not None else x + y = params.y if params.y is not None else y + z = params.z if params.z is not None else position.z + else: + x = x + params.x if params.x is not None else x + y = y + params.y if params.y is not None else y + z = z + params.z if params.z is not None else position.z if params.e is not None: - if params.e > e[self._extruder_number]: + new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e + if new_extrusion_value > e[self._extruder_number]: path.append([x, y, z, self._layer_type]) # extrusion else: path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction - e[self._extruder_number] = params.e + e[self._extruder_number] = new_extrusion_value # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. From 93de0062717bd28d0ea24d6126f346418c7714ea Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 17 Nov 2017 15:22:29 +0100 Subject: [PATCH 238/764] Remove suffix .curaproject for case "import models" --- cura/PrintInformation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index d3bcc10781..2cf589bfa4 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -305,6 +305,9 @@ class PrintInformation(QObject): # name is "" when I first had some meshes and afterwards I deleted them so the naming should start again if name == "" or (self._base_name == "" and self._base_name != name): + # remove ".curaproject" suffix from (imported) the file name + if name.endswith(".curaproject"): + name = name[:name.rfind(".curaproject")] self._base_name = name self._updateJobName() From 37163ec0b4014fa9ab3b41136c80e755a48e9d81 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 16:30:57 +0100 Subject: [PATCH 239/764] Add Japanese translation of cura.po It's quite bad though so let's see what improvements we can make. --- resources/i18n/ja_JP/cura.po | 4395 ++++++++++++++++++++++++++++++++++ 1 file changed, 4395 insertions(+) create mode 100644 resources/i18n/ja_JP/cura.po diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po new file mode 100644 index 0000000000..c29e0b709b --- /dev/null +++ b/resources/i18n/ja_JP/cura.po @@ -0,0 +1,4395 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-11-10 20:08+0900\n" +"Language-Team: TEAM\n" +"Language: xx_XX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.0.4\n" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Print aborted" +msgstr "プリント中止" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Blocked" +msgstr "ブロックされました" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Action required" +msgstr "アクションが必要です。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Can't start print" +msgstr "プリントを開始できません。" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Ultimaker3のグループをホストするために設定されていません。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label" +msgid "Finishes at: " +msgstr "この層で終了します:" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "このプリンターがUltimaker3のグループのホストプリンターです。" + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。" + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Print finished" +msgstr "プリント終了" + +#: Manually added for resources/Cura/Cura.qml +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "プラグイン" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "プラグインをみる" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "インストールされたプラグイン" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "X-Rayビューイング" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "X3Dファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "GCodeファイル" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Boxでプリントする" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Boxでプリント" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "Doodle3D Connectに接続する" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +msgctxt "@action:button" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "Doodle3D Connectにデータを送信" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "Doodle3D Connectにデータを送れませんでした。他のジョブはまだアクティブですか?" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "Doodle3D Connectにデータを保存" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "Doodle3D Connectにファイル送信完了" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect.." +msgstr "Connect..を開く" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "Doodle3D Connect web interfaceを開く" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "Changelogの表示" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +#, fuzzy +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "アクティブ設定を平らにします。" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +#, fuzzy +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "プロファイルが平らになり、アクティベートされました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "USBプリンティング" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "USBを使ってプリントする" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "USBを使ってプリントする" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "USBにて接続する" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "新しいプリントジョブをはじめることができません。プリンターが使用中または接続できていません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:title" +msgid "Print Details" +msgstr "プリント詳細" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "UltiGCodeを使用中のため、USBからのプリントができません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "USBプリント" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer does not support usb printing." +msgstr "USBでの印刷ができないため、新しいプリントジョブができません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +msgctxt "@info:title" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "プリンターが未接続のため、ファームウェアをアップデートできません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "プリンターに必要なファームウェアを探せませんでした。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "ファームウェア" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "リムーバブルドライブに保存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "保存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "保存できませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "デバイスに書き出すためのファイル名が見つかりませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "リムーバブルドライブに保存することができませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +msgctxt "@info:title" +msgid "Error" +msgstr "エラー" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "ファイル保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "取り出す" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "リムーバブルデバイスを取り出す" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "取り出し完了。デバイスを安全に取り外せます。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "ハードウェアを安全に取り外します。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "取り出し失敗。他のプログラムがデバイスを使用しているため。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "リムーバブルドライブ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "ネットワーク上のプリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "ネットワークのプリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "Access to the printer requested. Please approve the request on the printer" +msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:title" +msgid "Connection status" +msgstr "コネクションのステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "コネクションステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@action:button" +msgid "Retry" +msgstr "再試行" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "アクセスリクエストを再送信" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "プリンターへのアクセスが承認されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "このプリンターへのアクセスが許可されていないため、プリントジョブの送信ができませんでした。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "アクセスのリクエスト" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "アクセスのリクエスト送信" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +msgctxt "@info:status" +msgid "Connected over the network. Please approve the access request on the printer." +msgstr "ネットワーク上で接続。プリンタへのリクエストを承認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "ネットワーク上で接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "ネットワーク上で接続。プリントを操作するアクセス権がありません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "プリンターへのアクセス権" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "時間制限によりアクセスが却下されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "ネットワークへの接続が切断されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +msgctxt "@info:status" +msgid "The connection with the printer was lost. Check your printer to see if it is connected." +msgstr "ネットワークへの接続が切断されました。プリンターの接続状態を確認ください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#, python-format +msgctxt "@info:status" +msgid "Unable to start a new print job, printer is busy. Current printer status is %s." +msgstr "プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在の印刷状況は%です。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "プリンターのステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "プリントコアがスロットに入っていません。プリントジョブを開始できません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "フィラメントがスロットに入っていません。プリントジョブを開始できません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "フィラメントの残量が足りません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "異なるプリントコアが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "異なるフィラメントが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#, python-brace-format +msgctxt "@label" +msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." +msgstr "プリントコア{0}が適切にカリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "選択された構成にてプリントを開始してもいいですか。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice " +"for the PrintCores and materials that are inserted in your printer." +msgstr "" +"プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメント" +"を元にCuraをスライスすることで最良の印刷結果を出すことができます。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "ミスマッチの構成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "プリンターにプリントデータを送信中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "プリントデータを送信中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "データをプリンターに送ることができません。他のプリントジョブは進行中ですか?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "プリントを停止します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "プリントを中止しました。プリンターを確認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "プリントを一時停止します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "プリント再開します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "プリンターと同期する" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "Curaで設定しているプリンタ構成を使用されますか?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +msgctxt "@label" +msgid "" +"The PrintCores and/or materials on your printer differ from those within your current project. For the best result, " +"always slice for the PrintCores and materials that are inserted in your printer." +msgstr "" +"プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプ" +"リントコア、フィラメントに合わせてスライスして頂くことをお勧めします。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "ネットワーク上にて接続" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." +msgstr "このプリンターは{台数}繋がっているUltimaker3プリンターのグループのホストプリンターです。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#, python-brace-format +msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." +msgstr "{printer_name}は ‘{job_name}’印刷を終了しました。造形物を確認し、ビルドプレートから取り出してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#, python-brace-format +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to " +"start printing." +msgstr "{printer_name} は '{job_name}'.を印刷予定です。印刷を開始するためにジョブに合わせた構成に変更してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +msgctxt "@info:status" +msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." +msgstr "" +"新しいプリントジョブをお送りできません。この3Dプリンターは繋がっているUltimaker3のグループをホストするために設定されていま" +"せん。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "グループに送信中{file_name} {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "グループに送信完了{file_name} {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "プリントジョブのインターフェイスをブラウザーで開く" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "プリントジョブをグループに送ることができません。{cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#, python-brace-format +msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +msgid "" +"To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware " +"regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +msgstr "" +"{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネット" +"ワーク上で接続)またはUSBにて行ってください。 " + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "新しい利用可能なファームウェアのアップデートがあります。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "ダウンロード" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +msgctxt "@info" +msgid "Could not access update information." +msgstr "必要なアップデートの情報にアクセスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "" +"Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in " +"SolidWorks itself without any problems as well!" +msgstr "" +"ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "ソリッドワークスパートファイル" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "ソリッドワークスアセンブリーファイル" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "構成" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr " %を開始中にエラーが発生" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "G-codeを修正" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +msgstr "Curaが非特定なスライスされた数字を集めました。プレファレンス内で無効にできます。" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "データを収集中" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "却下する" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Cura 15.04 プロファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "G-codeファイル" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "レイヤービュー" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 +msgctxt "@info:title" +msgid "Layer View" +msgstr "レイヤービュー" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "JPG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "JPEG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "PNG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "BMP画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "GIF画像" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." +msgstr "選ばれたプリンターまたは選ばれたプリント構成が異なるため進行中の材料にてスライスを完了できません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "スライスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" +msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります。{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +msgctxt "@info:status" +msgid "Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "プライムタワーまたはプライム位置が無効なためスライスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +msgctxt "@info:status" +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "" +"モデルのデータがビルトボリュームに入っていないためスライスできるものがありません。スケールやローテーションにて合うように設" +"定してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "レイヤーを処理しています。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:title" +msgid "Information" +msgstr "インフォメーション" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "各モデル設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "各モデル構成設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "推奨" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +msgctxt "@title:tab" +msgid "Custom" +msgstr "カスタム" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "3MF ファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +msgctxt "@label" +msgid "Nozzle" +msgstr "ノズル" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 +msgctxt "@menuitem" +msgid "Browse plugins" +msgstr "プラグインを見る" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "プラグインIDを{0}取得することに失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +msgctxt "@info:tile" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "プラグインブラウザー" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "ソリッドビュー" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "Gファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "G-codeを解析" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "G-codeの詳細" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +msgctxt "@info:generic" +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code " +"representation may not be accurate." +msgstr "" +"データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が" +"適切でない場合があります。" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Curaプロファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "3MFファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Curaが3MF fileを算出します。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "アップグレードを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "ファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "チェックアップ" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "ビルドプレートを調整する" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "アウターウォール" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "インナーウォール" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Skin" +msgstr "スキン" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Infill" +msgstr "インフィル" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "サポートイルフィル" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "サポートインターフェイス" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support" +msgstr "サポート" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "スカート" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Travel" +msgstr "移動" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "退却" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Other" +msgstr "他" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "スライス前ファイル {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "フィラメントがロードされていません。" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "未確認のフィラメント" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "造形物のために新しい位置を探索中" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "位置確認" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "位置を確保できません。" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "すでに存在するファイルです。" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" +msgstr "{0} は既に存在します。ファイルを上書きしますか? " + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "カスタム" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "カスタムフィラメント" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +msgctxt "@info:status" +msgid "The selected material is incompatible with the selected machine or configuration." +msgstr "選択されたフィラメントはプリンターとそのプリント構成に適応しておりません。" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "不適合フィラメント" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "The selected material diameter causes the material to become incompatible with the current printer." +msgstr "選択したフィラメントの直径が、現在選択中のプリンターに適応していません。" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "取り消す" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "フィラメント直径を変更を取り消す" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to export profile to {0}: {1}" +msgstr "{0}: {1}にプロファイルを書き出すのに失敗しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Failed to export profile to {0}: Writer plugin reported failure." +msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "{0}にプロファイルを書き出しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +msgctxt "@info:title" +msgid "Export Details" +msgstr "詳細を書き出す" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to import profile from {0}: {1}" +msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "プロファイルの取り込み完了" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "プロファイル{0}は不特定なファイルまたは破損があります。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +msgctxt "@label" +msgid "Custom profile" +msgstr "カスタムプロファイル" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "プロファイルはクオリティータイプが不足しています。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "進行中のプリント構成にあったクオリティータイプ{0}が見つかりませんでした。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from " +"colliding with printed models." +msgstr "プリントシークエンス設定値により、ガントリーと造形物の衝突を避けるため印刷データの高さを低くしました。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "造形サイズ" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "造形データを増やす、配置する。" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "造形データを配置" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "クラッシュ報告" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" +msgid "" +"

A fatal exception has occurred that we could not recover from!

\n" +"
\n" +" " +msgstr "" +"

不可解なエラーが発生しリカバリーできませんでした。

\n" +"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" +"Cura/issues

\n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "ウェブページを開く" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "プリンターを読み込み中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "シーンをセットアップ中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "インターフェイスを読み込み中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#, python-format +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " +"mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(幅).1f x %(奥行き).1f x %(高さ).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "一度に一つのG-codeしか読み取れません。取り込みをスキップしました{0}。" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "G-codeを読み込み中は他のファイルを開くことができません。取り込みをスキップしました{0}。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +msgctxt "@title:tab" +msgid "Printer" +msgstr "プリンター" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +msgctxt "@label" +msgid "Printer Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +msgctxt "@label" +msgid "X (Width)" +msgstr "X(幅)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (奥行き)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (高さ)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +msgctxt "@label" +msgid "Build plate shape" +msgstr "ビルドプレート形" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "センターを出します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "ヒーテッドドベッド" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "Gcodeフレーバー" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "プリントヘッド設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +msgctxt "@label" +msgid "X min" +msgstr "X分" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +msgctxt "@label" +msgid "Y min" +msgstr "Y分" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +msgctxt "@label" +msgid "X max" +msgstr "最大X" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +msgctxt "@label" +msgid "Y max" +msgstr "最大Y" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +msgctxt "@label" +msgid "Gantry height" +msgstr "ガントリーの高さ" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions " +"between previous prints and the gantry when printing \"One at a Time\"." +msgstr "" +"(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるた" +"めに “1プリントづつ”印刷を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "エクストルーダーの数" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or " +"the profile." +msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +msgctxt "@label" +msgid "Material diameter" +msgstr "フィラメント直径" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +msgctxt "@label" +msgid "Nozzle size" +msgstr "ノズルサイズ" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +msgctxt "@label" +msgid "Start Gcode" +msgstr "G-codeをスタートします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "G-codeが最初に起動するようにします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +msgctxt "@label" +msgid "End Gcode" +msgstr "G-codeを終了" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "G-codeが最後にに起動するようにします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "ノズル設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "ノズルオフセットX" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "ノズルオフセットY" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "エクストルーダーがGcodeを開始します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "エクストルーダーがGcodeを終了します。" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "Changelogの表示" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "やめる" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "ファームウェアアップデート" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "ファームウェアアップデート完了" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "ファームウェアアップデートを開始します、時間が少しかかるかもしれません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "ファームウェアアップデート中" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "不特定なエラーの発生によりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "コミュニケーションエラーによりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "インプット/アウトプットエラーによりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "ファームウェアが見つからず、ファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "不特定エラーコード: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "ネットワーク上で繋がったプリンターに接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a " +"network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can " +"still use a USB drive to transfer g-code files to your printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。" +"Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "追加" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "編集" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "取り除く" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "更新" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +msgctxt "@label" +msgid "If your printer is not listed, read the network printing troubleshooting guide" +msgstr "" +"お持ちのプリンターがリストにない場合、ネットワークプリンティングトラブルシューティングガイドを読んでくだ" +"さい。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +msgctxt "@label" +msgid "Type" +msgstr "タイプ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Extended" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "不明" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +msgctxt "@label" +msgid "Firmware version" +msgstr "ファームウェアバージョン" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +msgctxt "@label" +msgid "Address" +msgstr "アドレス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "このアドレスのプリンターは応答していません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "プリンターアドレス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +msgctxt "@action:button" +msgid "Ok" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "プリンターにつなぐ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "プリンターの構成をCuraに取り入れる。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "プリント構成をアクティベートする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 +msgctxt "@label" +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 +msgctxt "@label" +msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +msgstr "このプリンターは繋がっているUltimaker3プリンターのグループのホストです。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "ネットワーク上のプリント" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "プリント" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1は、繋がっているUltimaker3プリンターのグループをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 +msgctxt "@label:status" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 +msgctxt "@label:status" +msgid "Reserved" +msgstr "予約済み" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 +msgctxt "@label:status" +msgid "Finished" +msgstr "終了" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 +msgctxt "@label:status" +msgid "Preparing" +msgstr "準備中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 +msgctxt "@label:status" +msgid "Available" +msgstr "利用可能" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 +msgctxt "@label" +msgid "Completed on: " +msgstr "完了:" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 +msgctxt "@label" +msgid "Clear build plate" +msgstr "ビルドプレートをクリアにする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 +msgctxt "@label" +msgid "Preparing to print" +msgstr "プリントの準備をする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "プリントデータを確認できない" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "デフォルトのウェブブラウザーにてプリントジョブを開く" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 +msgctxt "@label" +msgid "PRINTER GROUP" +msgstr "プリンターグループ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 +msgctxt "@title" +msgid "Print jobs" +msgstr "プリントジョブ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 +msgctxt "@label" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 +msgctxt "@label" +msgid "Queued" +msgstr "順番を待つ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "プリント構成の変更を待っている" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 +msgctxt "@label:title" +msgid "Printers" +msgstr "複数のプリンター" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 +msgctxt "@action:button" +msgid "View printers" +msgstr "複数のプリンターをみる" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Curaソリッドワークスプラグインコンフィグレーション" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "書き出されたSTLのクオリティーデフォルト" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "毎回確認" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "常にファインクオリティーを使用する" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "常に粗めのクオリティーを使用する" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "ソリッドワークスのファイルをSTLとして取り込む" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "書き出されたSTLのクオリティー" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "クオリティー" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "粗い" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "ファイン" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "選択を記憶させる" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "プラグイン処理後" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "スクリプトの処理後" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "スクリプトを加える" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "処理したスクリプトを変更する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 +msgctxt "@label" +msgid "Color scheme" +msgstr "カラースキーム" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "フィラメントの色" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "ラインタイプ" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "コンパティビリティモード" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 +msgctxt "@label" +msgid "Show Travels" +msgstr "移動を表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 +msgctxt "@label" +msgid "Show Helpers" +msgstr "ヘルプを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 +msgctxt "@label" +msgid "Show Shell" +msgstr "シェルを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 +msgctxt "@label" +msgid "Show Infill" +msgstr "インフィルを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "トップのレイヤーを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "トップの5レイヤーの詳細を表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "トップ/ボトム" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 +msgctxt "@label" +msgid "Inner Wall" +msgstr "インナーウォール" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "画像を変換する…" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "“ベース”から各ピクセルへの最大距離" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "高さ(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "ミリメートルでビルドプレートからベースの高さ" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "ベース(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "ビルドプレート上の幅ミリメートル" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "幅(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "ビルドプレート上の奥行きミリメートル" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "深さ(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this " +"option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low " +"points on the mesh." +msgstr "" +"デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリ" +"バースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "薄いほうを高く" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "暗いほうを高く" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "画像に適応したスムージング量" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "スムージング" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "設定を選択する" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "このモデルをカスタマイズする設定を選択する" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "フィルター…" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "すべて表示する" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "existingをアップデートする" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "新しいものを作成する" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "サマリーCuraプロジェクト" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "このプリンターの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +msgctxt "@action:label" +msgid "Type" +msgstr "タイプ" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +msgctxt "@action:label" +msgid "Name" +msgstr "ネーム" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "プロファイル設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "このプロファイルの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "プロファイル内にない" + +# Can’t edit the Japanese text +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#, fuzzy +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "プロファイルを無効にする" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "次から引き出す" + +# can’t inset the japanese text +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +msgctxt "@action:label" +msgid "Material settings" +msgstr "フィラメント設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "このフィラメントの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "視野設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +msgctxt "@action:label" +msgid "Mode" +msgstr "モード" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "ビジブル設定:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%2のうち%1" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "プロジェクトを入れることでビルド上のモデルがすべて消滅します。" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +msgctxt "@action:button" +msgid "Open" +msgstr "開く" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "探す&アップデートプラグイン" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "サードパーティのプラグインのリストをここで見つけることができます。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "アップグレード" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "インストールした" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "プラグインライセンス同意書" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +" plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "" +"プラグインがライセンスを保持しています。\n" +"このライセンスを承認しプラグインをインストールしてください。\n" +"下記項目に賛成しますか?" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "承認する" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "拒否する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "プリンターアップグレードを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "このUltimaker2に施したアップグレードを選択してください。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Olsson Block" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "ビルドプレートのレベリング" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' " +"the nozzle will move to the different positions that can be adjusted." +msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build " +"plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgstr "すべてのポジションに;" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "ビルドプレートのレベリングを開始する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "次のポジションに移動" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "ファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates " +"the temperature and ultimately makes your printer work." +msgstr "" +"ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管" +"理し、プリンターとして成すべき点を補います。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." +msgstr "" +"配達時のファームウェアで動かすことはできますが、新しいバージョンの方がより改善され、便利なフィーチャーがついてきます。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "自動でファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "カスタムファームウェアをアップロードする" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "カスタムファームウェアを選択する。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "このUltimaker Originalに施されたアップグレートを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "ヒーティッドビルドプレート(オフィシャルキットまたはセルフビルド)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "プリンターチェック" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is " +"functional" +msgstr "" +"お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップし" +"てください。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "プリンターチェックを開始する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "コネクション:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "接続済" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "プリンターにつながっていません。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +#, fuzzy +msgctxt "@label" +msgid "Min endstop X: " +msgstr "エンドストップ X:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "作品" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "チェックされていません。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +#, fuzzy +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "エンドストップ Y:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +#, fuzzy +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "エンドストップ Z:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "ノズル温度チェック:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "ヒーティングストップ" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "ヒーティング開始" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "ビルドプレートの温度チェック:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "チェック済" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "すべてに異常はありません。チェックアップを終了しました。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "プリンターにつながっていません。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "今プリンタはコマンドを処理できません。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "メンテナンス。プリンターをチェックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "プリンターへの接続が切断されました。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "一時停止しました" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "準備中" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "造形物を取り出してください。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "再開" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "一時停止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "プリント中止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "プリント中止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "本当にプリントを中止してもいいですか。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "変更を取り消すか保存するか" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "プロファイル設定をカスタマイズしました。この設定をキープしますか、キャンセルしますか。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "プロファイル設定" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "デフォルト" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "カスタマイズ" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "毎回確認する" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "取り消し、再度確認しない。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "キープし、再度確認しない。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "取り消す" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "キープする" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "新しいプロファイルを作る" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "インフォメーション" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "ディスプレイ名" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "ブランド" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "フィラメントタイプ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "色" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "プロパティ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "密度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "直径" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "フィラメントコスト" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "フィラメントの重さ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "フィラメントの長さ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "毎メーターコスト" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "このフィラメントは %1にリンクすプロパティーを共有する。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "フィラメントをリンクを外す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "記述" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "接着のインフォメーション" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "プリント設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "視野設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "すべて確認する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "計算された" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "現在" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "ユニット" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +msgctxt "@title:tab" +msgid "General" +msgstr "一般" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "インターフェイス" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "言語:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "通貨:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "テーマ:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "You will need to restart the application for these changes to have effect." +msgstr "それらの変更を有効にするためにはアプリケーションを再起動しなけらばなりません。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "セッティングを変更すると自動にスライスします。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "自動的にスライスする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "ビューポイント機能" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." +msgstr "赤でサポートができないエリアをハイライトしてください。サポートがない場合、正確にプリントができない場合があります。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "ディスプレイオーバーハング" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "Moves the camera so the model is in the center of the view when a model is selected" +msgstr "モデルの選択時にモデルがカメラの中心に見えるようにカメラを移動する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "アイテムを選択するとカメラが中心にきます" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "Curaのデフォルトのズーム機能は変更できるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "カメラのズーム方向を反転する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "ズームはマウスの方向に動くべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "マウスの方向にズームする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved so that they no longer intersect?" +msgstr "交差を避けるためにプラットホーム上のモデルを移動するべきですか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "モデルの距離が離れているように確認する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "プラットホーム上のモデルはブルドプレートに触れるように下げるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "自動的にモデルをビルドプレートに落とす" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "gcodeリーダーに注意メッセージを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "gcodeリーダーの注意メッセージ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "レイヤーはコンパティビリティモードに強制されるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "レイヤービューコンパティビリティモードを強制する。(再起動が必要)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "ファイルを開くまた保存" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "モデルがビルドボリュームに対して大きすぎる場合はスケールされるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "大きなモデルをスケールする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be " +"scaled up?" +msgstr "" +"ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべき" +"ですか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "極端に小さなモデルをスケールアップする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" +msgstr "プリンター名の敬称はプリントジョブの名前に自動的に加えられるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "プリンターの敬称をジョブネームに加える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "プロジェクトファイルを保存時にサマリーを表示するべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "プロジェクトを保存時にダイアログサマリーを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "プロジェクトファイルを開く際のデフォルト機能" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "プロジェクトファイル開く際のデフォルト機能:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "いつもお尋ねください。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "常にプロジェクトとして開く" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "常にモデルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "" +"When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want " +"to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "" +"プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダ" +"イアログが表示されないようにデフォルト機能を選ぶことができます。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "プロファイルを無効にする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "プライバシー" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "Curaのプログラム開始時にアップデートがあるかチェックしますか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "スタート時にアップデートあるかどうかのチェック" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally " +"identifiable information is sent or stored." +msgstr "" +"プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしま" +"せん。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr " (不特定な) プリントインフォメーションを送信" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +msgctxt "@title:tab" +msgid "Printers" +msgstr "プリンター" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "アクティベート" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "名を変える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +msgctxt "@label" +msgid "Printer type:" +msgstr "プリンタータイプ:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +msgctxt "@label" +msgid "Connection:" +msgstr "コネクション:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "このプリンターはつながっていません。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +msgctxt "@label" +msgid "State:" +msgstr "ステート:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "ビルドプレートの掃除を待つ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "プリントジョブの待機中" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "保護されたプロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "カスタムプロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "作成する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "プリンター: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "プロファイルを現在のセッティング/" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "今の変更を破棄する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." +msgstr "" +"このプロファイルはプリンターによりデフォルトを使用、従いこのプロファイルはセッティング/書き換えが以下のリストにありませ" +"ん。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "設定は選択したプロファイルにマッチしています。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "グローバル設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "プロファイル名を変える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "プロファイルを作る" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "プロファイルを複製する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "プロファイルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "プロファイルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "プロファイルを書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +msgctxt "@title:tab" +msgid "Materials" +msgstr "マテリアル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" +msgid "Printer: %1, %2: %3" +msgstr "プリンター: %1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "プリンター:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "作成する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "フィラメントを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not import material %1: %2" +msgstr " %1: %2フィラメントを取り込むことができない。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "フィラメントの取り込みに成功しました。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "フィラメントを書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "Failed to export material to %1: %2" +msgstr "フィラメントの書き出しに失敗しました <ファイルネーム>%1: <メッセージ>%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "無事に%1にフィラメントを書き出しました。" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "プリンターを追加する" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "プリンター名:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "プリンターについて" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "Curaについて" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "熱溶解積層型3Dプリンティングのエンドtoエンドソリューション" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "CuraはUltimakerB.Vのコミュニティの協力によって開発され、Curaはオープンソースで使えることを誇りに思います:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "グラフィックユーザーインターフェイス" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "アプリケーションフレームワーク" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "Gcodeジェネレーター" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "インタープロセスコミュニケーションライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "プログラミング用語" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "GUIフレームワーク" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "GUIフレームワークバインディング" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C/C++ バインディングライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "データインターフェイスフォーマット" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "サイエンスコンピューティングを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "ファターマスを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "STLファイルを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "3MFファイルを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "シリアルコミュニケーションライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "ZeroConfディスカバリーライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "ポリゴンクリッピングライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "フォント" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "SVG icons" +msgstr "SVGアイコン" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "プロファイル:" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" +"プロファイルマネージャーをクリックして開いてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "検索…" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "すべてのエクストルーダーの値をコピーする" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "この設定を非表示にする" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "この設定を表示しない" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "常に見えるように設定する" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "視野のセッティングを構成する" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" +"表示されるようにクリックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "影響" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "次によって影響を受ける" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "この値は各エクストルーダーの値から取得します。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"この設定にプロファイルと異なった値があります。\n" +"プロファイルの値を戻すためにクリックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"このセッティングは通常計算されます、今は絶対値に固定されています。\n" +"計算された値に変更するためにクリックを押してください。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "プリントセットアップ" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" +"プリントセットアップが無効\n" +"G-codeファイルを修正することができません。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 +msgctxt "@label" +msgid "00h 00min" +msgstr "00h 00min" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +msgctxt "@tooltip" +msgid "Time information" +msgstr "Time information" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 +msgctxt "@description" +msgid "Print time" +msgstr "プリント時間" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +msgctxt "@label" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "%1分 / ~ %2g / ~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 +msgctxt "@label" +msgid "%1m / ~ %2g" +msgstr "%1分/ ~ %2g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

Print with the recommended settings for the selected printer, material and " +"quality." +msgstr "" +"おすすめプリントセットアップ

選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてくだ" +"さい。 " + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +msgctxt "@tooltip" +msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." +msgstr "カスタムプリントセットアップ

スライス処理のきめ細かなコントロールにてプリントする" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "自動: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "&ビュー" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "自動: %1" + +# can’t enter japanese texts +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "" +msgstr[1] "" + +# can’t eneter japanese texts +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "コピーの数" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "最近開いたファイルを開く" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "接続中のプリンターはありません。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +msgctxt "@label" +msgid "Extruder" +msgstr "エクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the " +"hotend heating is turned off." +msgstr "" +"ホットエンドの目標温度。ホットエンドはこの温度に向けて上がったり下がったりします。これが0の場合、ホットエンドの加熱はオフ" +"になっています。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "現在のエクストルーダーの温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "エクストルーダーのマテリアルの色" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "エクストルーダー入ったフィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "ノズルが入ったエクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +msgctxt "@label" +msgid "Build plate" +msgstr "ビルドプレート" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +msgctxt "@tooltip" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the " +"bed heating is turned off." +msgstr "" +"ヒーティッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっ" +"ています。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "現在のヒーティッドベッドの温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "ベッドのプリヒート温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button" +msgid "Pre-heat" +msgstr "プレヒート" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +msgctxt "@tooltip of pre-heat" +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to " +"wait for the bed to heat up when you're ready to print." +msgstr "" +"プリント開始前にベッドを加熱します。加熱中もプリントの調整を行えます、またべットが加熱するまでプリント開始を待つ必要もあり" +"ません。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +msgctxt "@label" +msgid "Active print" +msgstr "プリントをアクティベートする" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +msgctxt "@label" +msgid "Job Name" +msgstr "ジョブネーム" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +msgctxt "@label" +msgid "Printing Time" +msgstr "プリント時間" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +msgctxt "@label" +msgid "Estimated time left" +msgstr "残り時間" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "留め金 フルスクリーン" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "&取り消す" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "&やりなおす" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "&やめる" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "Curaを構成する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "&プリンターを追加する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "プリンターを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "フィラメントを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "&現在の設定/無効にプロファイルをアップデートする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "&変更を破棄する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "&今の設定/無効からプロファイルを作成する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "プロファイルを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "オンラインドキュメントを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "報告&バグ" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "アバウト..." + +# can’t enter japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "" +msgstr[1] "" + +# can’t enter japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "" +msgstr[1] "" + +# can’t edit japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "モデルを消去する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "プラットホームの中心にモデルを配置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "&モデルグループ" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "モデルを非グループ化" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "&モデルの合体" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "&モデルを増倍する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "&すべてのモデル選択" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "&ビルドプレート上のクリア" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "すべてのモデルを読み込む" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "すべてのモデルをアレンジする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "選択をアレンジする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "すべてのモデルのポジションをリセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "すべてのモデル&変更点をリセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "&ファイルを開く(s)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "&新しいプロジェクト…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "エンジン&ログを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "コンフィグレーションのフォルダーを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "視野のセッティングを構成する" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "3Dモデルをロードしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "スライスの準備ができました。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "スライス中…" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "準備に%1" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "スライスできません。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "スライスが利用不可能" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "準備する" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "アクティブなアウトプットデバイスを選択する" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "ファイルを開く(s)" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "" +"We have found one or more project file(s) within the files you have selected. You can open only one project file at a " +"time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "" +"選択したファイルの中に複数のプロジェクトが存在します。1ファイルのみ一度に開けます。ファイルからモデルを先に取り込むことを" +"お勧めします。続けますか?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "すべてをモデルとして取り入れる" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "&ファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "&ファイルに選択したものを保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "名前をつけて保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "プロジェクトを保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "&編集" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +msgctxt "@title:menu" +msgid "&View" +msgstr "&ビュー" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "&設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "&プリンター" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +msgctxt "@title:menu" +msgid "&Material" +msgstr "&フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "&プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "アクティブエクストルーダーとしてセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "拡張子" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "プレファレンス" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "ヘルプ" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +msgctxt "@action:button" +msgid "Open File" +msgstr "ファイルを開く" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +msgctxt "@title:window" +msgid "New project" +msgstr "新しいプロジェクト…" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +msgctxt "@info:question" +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." +msgstr "新しいプロジェクトを開始しますか?この作業では保存していない設定やビルドプレートをクリアします。" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "プラグインをインストール" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "ファイルを開く(s)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +msgctxt "@text:window" +msgid "" +"We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. " +"If you want to open a G-Code file, please just select only one." +msgstr "" +"選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでく" +"ださい。" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "プロジェクトを保存" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "エクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "保存中のプロジェクトサマリーを非表示にする" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +msgctxt "@action:button" +msgid "Save" +msgstr "保存" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "準備する" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "モニター" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +msgctxt "@label" +msgid "Layer Height" +msgstr "レイヤーの高さ" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +msgctxt "@label" +msgid "Print Speed" +msgstr "プリントスピード" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +msgctxt "@label" +msgid "Slower" +msgstr "ゆっくり" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +msgctxt "@label" +msgid "Faster" +msgstr "早く" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +msgctxt "@label" +msgid "Infill" +msgstr "インフィル" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +msgctxt "@label" +msgid "Gradual infill will gradually increase the amount of infill towards the top." +msgstr "グラデュアルインフィルはトップに向かうに従ってインフィルの量を増やします。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +msgctxt "@label" +msgid "Enable gradual" +msgstr "グラデュアルを有効にする" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +msgctxt "@label" +msgid "Generate Support" +msgstr "サポートを生成します。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +msgctxt "@label" +msgid "" +"Generate structures to support parts of the model which have overhangs. Without these structures, such parts would " +"collapse during printing." +msgstr "" +"オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してし" +"まいます。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +msgctxt "@label" +msgid "Support Extruder" +msgstr "サポートエクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting structures below the model to prevent the model " +"from sagging or printing in mid air." +msgstr "" +"サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成し" +"ます。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "ビルドプレートの接着" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、プリントの周り、また造形物の下に底面を加え切り取りやすくします。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +msgctxt "@label" +msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" +msgstr "プリントにヘルプが必要ですか?
読んでください。 Ultimakerトラブルシューティングガイド" + +# can’t enter japanese +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +msgctxt "@text:window" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" +msgstr "これはCuraのプロジェクトファイルです。プロジェクトとしてあけますか、それともモデルのみ取り込みますか?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +msgctxt "@action:button" +msgid "Open as project" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +msgctxt "@action:button" +msgid "Import models" +msgstr "モデルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "エンジンログ" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +msgctxt "@label" +msgid "Material" +msgstr "フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +msgctxt "@label" +msgid "Check material compatibility" +msgstr "マテリアルのコンパティビリティを確認" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック" + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgstr "プリンターの設定を変更(印刷ボリューム、ノズルサイズ、その他)" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "プリンターの設定アクション" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "X-Rayビューイング" + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "X-Rayビュー" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "X3Dファイルを読むこむためのサポートを供給する" + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "X3Dリーダー" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "ファイルにGCodeを書く" + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "GCodeライター" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "HTMLファイルに設定内容を放置する" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "Godモード" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "G-codeを承認し、Doodle3D WiFi-ボックスにWifi上にて送る" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Box" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "最新の更新バージョンの変更点を表示する" + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "Changelog" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "プロファイルを変更するフラットエンドクオリティーを作成する" + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "プロファイルフラットナー" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "G-codeを承認し、プリンターに送信する。またプラグインはファームウェアをアップデートできます。" + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "USBプリンティング" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "取り外し可能なドライブアウトプットデバイスプラグイン" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "Ultimaker3のプリンターのネットワーク接続を管理する。" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "UM3ネットワークコネクション" + +#: CuraPrintClusterUpload/plugin.json +msgctxt "name" +msgid "UM3 Network Connection (Cluster)" +msgstr "UM3 ネットワークコネクション(クラスター)" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "ファームウェアアップデートをチェックする" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "ファームウェアアップデートチェッカー" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +msgstr "ソリッドワークスにて特定のファイルを開くことが可能です。その後変換され、Curaに取り込めます。" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "ソリッドワークスインタグレーション" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "後処理のためにユーザーが作成したスクリプト用拡張子" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "後処理" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "変更後プリンターやプロファイルプレファレンスを自動的に保存します、" + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "自動保存" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "不特定なスライス情報を提出。プレファレンスの中で無効になる可能性もある。" + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "スライスインフォメーション" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "XMLベースフィラメントのプロファイルを読み書きするための機能を供給する。" + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "フィラメントプロファイル" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する" + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "レガシーCuraプロファイルリーダー" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "g-codeファイルからプロファイルを読み込むサポートを供給する。" + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "GCodeプロファイルリーダー" + +#: LayerView/plugin.json +msgctxt "description" +msgid "Provides the Layer view." +msgstr "レイヤービューを供給する" + +#: LayerView/plugin.json +msgctxt "name" +msgid "Layer View" +msgstr "レイヤービュー" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "2.5から2.6にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "2.7から3.0にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "2.6から2.7にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "2.1 から2.2にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "2.2 から2.4にバージョンアップグレート" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする" + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "画像リーダー" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "CuraEngineスライシングバックエンドにリンクを供給する" + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "Curaエンジンバックエンド" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "各モデル設定を与える" + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "各モデル設定ツール" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "3MFファイルを読むこむためのサポートを供給する" + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "3MFリーダー" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "探す、新しいプラグインを管理、インストール" + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "プラグインブラウザー" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "ノーマルなソリットメッシュビューを供給する" + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "ソリッドビュー" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "G-codeファイルの読み込み、表示を許可する" + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "G-codeリーダー" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "Curaプロファイルを書き出すためのサポートを供給する" + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "Curaプロファイルライター" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "3MFファイルを読むこむためのサポートを供給する" + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "3MFリーダー" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgstr "Ultimakerのプリンターのアクションを供給する(ベッドレベリングウィザード、アップグレードの選択、他)" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "Ultimkerプリンターのアクション" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "Curaプロファイルを取り込むためのサポートを供給する" + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "Curaプロファイルリーダー" From fb2ffb7270076877b7dd6403948965df6dd8a755 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 17 Nov 2017 16:31:16 +0100 Subject: [PATCH 240/764] Simplify relative positioning xyz value updates - CURA-4577 --- plugins/GCodeReader/GCodeReader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 1254efd4f2..a0b44bbaaa 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -141,9 +141,9 @@ class GCodeReader(MeshReader): y = params.y if params.y is not None else y z = params.z if params.z is not None else position.z else: - x = x + params.x if params.x is not None else x - y = y + params.y if params.y is not None else y - z = z + params.z if params.z is not None else position.z + x += params.x if params.x is not None else x + y += params.y if params.y is not None else y + z += params.z if params.z is not None else position.z if params.e is not None: new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e From 91621497f0a4d8d7ebeb25c98c0f9fc3c16ebc8c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 16:38:02 +0100 Subject: [PATCH 241/764] Fix technical mistakes of Japanese translation There's a lot of keys that weren't added to the Japanese translation. Our program crashes on these because it can't find where it needs to fill in the argument. --- resources/i18n/ja_JP/cura.po | 120 +++++++++++++++++------------------ 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index c29e0b709b..1b77006b0c 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-10 20:08+0900\n" +"PO-Revision-Date: 2017-11-17 15:52+0100\n" "Language-Team: TEAM\n" "Language: xx_XX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "Last-Translator: \n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 1.8.7.1\n" #: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml msgctxt "@label:status" @@ -51,7 +51,7 @@ msgstr "この層で終了します:" #: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml msgctxt "@label" msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "このプリンターがUltimaker3のグループのホストプリンターです。" +msgstr "このプリンターはUltimaker3 %1グループのホストプリンターです。" #: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py msgctxt "@info:status" @@ -86,7 +86,7 @@ msgstr "プリンターの設定" #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 msgctxt "@item:inlistbox" msgid "X-Ray view" -msgstr "X-Rayビューイング" +msgstr "透視ビューイング" #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 msgctxt "@item:inlistbox" @@ -243,7 +243,7 @@ msgstr "プリンターが未接続のため、ファームウェアをアップ #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." -msgstr "プリンターに必要なファームウェアを探せませんでした。" +msgstr "プリンター(%s)に必要なファームウェアを探せませんでした。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 msgctxt "@info:title" @@ -259,13 +259,13 @@ msgstr "リムーバブルドライブに保存" #, python-brace-format msgctxt "@item:inlistbox" msgid "Save to Removable Drive {0}" -msgstr "リムーバブルドライブに保存" +msgstr "リムーバブルドライブ{0}に保存" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 #, python-brace-format msgctxt "@info:progress Don't translate the XML tags !" msgid "Saving to Removable Drive {0}" -msgstr "リムーバブルドライブに保存中" +msgstr "リムーバブルドライブ{0}に保存中" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 msgctxt "@info:title" @@ -277,20 +277,20 @@ msgstr "保存中" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not save to {0}: {1}" -msgstr "保存できませんでした。" +msgstr "{0}を保存できませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 #, python-brace-format msgctxt "@info:status Don't translate the tag {device}!" msgid "Could not find a file name when trying to write to {device}." -msgstr "デバイスに書き出すためのファイル名が見つかりませんでした。" +msgstr "デバイス{device}に書き出すためのファイル名が見つかりませんでした。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #, python-brace-format msgctxt "@info:status" msgid "Could not save to removable drive {0}: {1}" -msgstr "リムーバブルドライブに保存することができませんでした。" +msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 @@ -306,7 +306,7 @@ msgstr "エラー" #, python-brace-format msgctxt "@info:status" msgid "Saved to Removable Drive {0} as {1}" -msgstr "リムーバブルドライブに保存" +msgstr "リムーバブルドライブ{0}に {1}として保存" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 msgctxt "@info:title" @@ -322,13 +322,13 @@ msgstr "取り出す" #, python-brace-format msgctxt "@action" msgid "Eject removable device {0}" -msgstr "リムーバブルデバイスを取り出す" +msgstr "リムーバブルデバイス{0}を取り出す" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 #, python-brace-format msgctxt "@info:status" msgid "Ejected {0}. You can now safely remove the drive." -msgstr "取り出し完了。デバイスを安全に取り外せます。" +msgstr "{0}取り出し完了。デバイスを安全に取り外せます。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 msgctxt "@info:title" @@ -339,7 +339,7 @@ msgstr "ハードウェアを安全に取り外します。" #, python-brace-format msgctxt "@info:status" msgid "Failed to eject {0}. Another program may be using the drive." -msgstr "取り出し失敗。他のプログラムがデバイスを使用しているため。" +msgstr "{0}取り出し失敗。他のプログラムがデバイスを使用しているため。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 msgctxt "@item:intext" @@ -476,7 +476,8 @@ msgstr "ネットワークへの接続が切断されました。プリンター #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." -msgstr "プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在の印刷状況は%です。" +msgstr "" +"プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在のプリンターのステータスは%sです。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 msgctxt "@info:title" @@ -488,42 +489,42 @@ msgstr "プリンターのステータス" #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" -msgstr "プリントコアがスロットに入っていません。プリントジョブを開始できません。" +msgstr "プリントコアがスロット{0}に入っていません。プリントジョブを開始できません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" -msgstr "フィラメントがスロットに入っていません。プリントジョブを開始できません。" +msgstr "フィラメントがスロット{0}に入っていません。プリントジョブを開始できません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." -msgstr "フィラメントの残量が足りません。" +msgstr "フィラメント{0}の残量が足りません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "異なるプリントコアが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" +msgstr "異なるプリントコアが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "異なるフィラメントが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" +msgstr "異なるフィラメントが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." -msgstr "プリントコア{0}が適切にカリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" +msgstr "プリントコア{0}が適切にキャリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 @@ -625,7 +626,7 @@ msgstr "このプリンターは、繋がっているUltimaker3プリンター #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." -msgstr "このプリンターは{台数}繋がっているUltimaker3プリンターのグループのホストプリンターです。" +msgstr "このプリンターは{count}繋がっているUltimaker3プリンターのグループのホストプリンターです。" #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 #, python-brace-format @@ -693,7 +694,7 @@ msgstr "" #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" -msgstr "新しい利用可能なファームウェアのアップデートがあります。" +msgstr "新しい利用可能な%sファームウェアのアップデートがあります。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 @@ -732,7 +733,7 @@ msgstr "構成" #, python-format msgctxt "@info:status" msgid "Error while starting %s!" -msgstr " %を開始中にエラーが発生" +msgstr "%sを開始中にエラーが発生" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 msgid "Modify G-Code" @@ -821,7 +822,7 @@ msgstr "スライスできません。" #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" -msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります。{0}" +msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります: {0}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 msgctxt "@info:status" @@ -888,7 +889,7 @@ msgstr "プラグインを見る" #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" -msgstr "プラグインIDを{0}取得することに失敗しました。" +msgstr "{0}からプラグインIDを取得することに失敗しました。" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 msgctxt "@info:tile" @@ -1069,7 +1070,7 @@ msgstr "すでに存在するファイルです。" #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" -msgstr "{0} は既に存在します。ファイルを上書きしますか? " +msgstr "{0} は既に存在します。ファイルを上書きしますか?" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 msgctxt "@label" @@ -1111,7 +1112,7 @@ msgstr "フィラメント直径を変更を取り消す" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" -msgstr "{0}: {1}にプロファイルを書き出すのに失敗しました。" +msgstr "{0}にプロファイルを書き出すのに失敗しました: {1}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 #, python-brace-format @@ -1144,7 +1145,7 @@ msgstr "{0}: {1}からプロファイル #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" -msgstr "プロファイルの取り込み完了" +msgstr "プロファイル {0}の取り込み完了" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 #, python-brace-format @@ -1204,7 +1205,7 @@ msgid "" " " msgstr "" "

不可解なエラーが発生しリカバリーできませんでした。

\n" -"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" +"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" "Cura/issues

\n" " " @@ -1234,19 +1235,19 @@ msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " "mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(幅).1f x %(奥行き).1f x %(高さ).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" -msgstr "一度に一つのG-codeしか読み取れません。取り込みをスキップしました{0}。" +msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" -msgstr "G-codeを読み込み中は他のファイルを開くことができません。取り込みをスキップしました{0}。" +msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1571,8 +1572,8 @@ msgstr "更新" msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "" -"お持ちのプリンターがリストにない場合、ネットワークプリンティングトラブルシューティングガイドを読んでくだ" -"さい。" +"お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読ん" +"でください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 @@ -1668,7 +1669,7 @@ msgstr "このプリンターは、繋がっているUltimaker3プリンター #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 msgctxt "@label" msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "このプリンターは繋がっているUltimaker3プリンターのグループのホストです。" +msgstr "このプリンターは繋がっているUltimaker3プリンターの%1グループのホストです。" #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 msgctxt "@title:window" @@ -2087,12 +2088,10 @@ msgstr "プロファイル内にない" # Can’t edit the Japanese text #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 -#, fuzzy msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" -msgstr[0] "プロファイルを無効にする" -msgstr[1] "" +msgstr[0] "%1個の設定を上書き" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 msgctxt "@action:label" @@ -2100,12 +2099,13 @@ msgid "Derivative from" msgstr "次から引き出す" # can’t inset the japanese text +# %1: print quality profile name +# %2: number of overridden ssettings #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%2の%1個の設定を上書き" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 msgctxt "@action:label" @@ -2138,7 +2138,7 @@ msgstr "ビジブル設定:" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 msgctxt "@action:label" msgid "%1 out of %2" -msgstr "%2のうち%1" +msgstr "%2のうち%1" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 msgctxt "@action:warning" @@ -3063,12 +3063,12 @@ msgstr "フィラメントを取り込む" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" -msgstr " %1: %2フィラメントを取り込むことができない。" +msgstr " %1フィラメントを取り込むことができない: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" -msgstr "フィラメントの取り込みに成功しました。" +msgstr "フィラメント%1の取り込みに成功しました。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 @@ -3079,12 +3079,12 @@ msgstr "フィラメントを書き出す" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" -msgstr "フィラメントの書き出しに失敗しました <ファイルネーム>%1: <メッセージ>%2" +msgstr "フィラメントの書き出しに失敗しました %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" -msgstr "無事に%1にフィラメントを書き出しました。" +msgstr "フィラメントの%1への書き出しが完了ました。" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 msgctxt "@title:window" @@ -3359,7 +3359,7 @@ msgstr "カスタムプリントセットアップ

スライス #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" -msgstr "自動: %1" +msgstr "自動選択: %1" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 msgctxt "@title:menu menubar:toplevel" @@ -3369,7 +3369,7 @@ msgstr "&ビュー" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" -msgstr "自動: %1" +msgstr "自動選択: %1" # can’t enter japanese texts #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 @@ -3377,7 +3377,6 @@ msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "" -msgstr[1] "" # can’t eneter japanese texts #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 @@ -3385,7 +3384,6 @@ msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" -msgstr[1] "" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 msgctxt "@label" @@ -3580,7 +3578,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "" -msgstr[1] "" # can’t enter japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 @@ -3588,7 +3585,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "" -msgstr[1] "" # can’t edit japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 @@ -3596,7 +3592,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" -msgstr[1] "" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 msgctxt "@action:inmenu" @@ -3706,7 +3701,7 @@ msgstr "スライス中…" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" -msgstr "準備に%1" +msgstr "%1の準備完了" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" @@ -3875,12 +3870,12 @@ msgstr "プロジェクトを保存" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 msgctxt "@action:label" msgid "Extruder %1" -msgstr "エクストルーダー" +msgstr "エクストルーダー%1" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 msgctxt "@action:label" msgid "%1 & material" -msgstr "フィラメント" +msgstr "%1とフィラメント" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 msgctxt "@action:label" @@ -3979,15 +3974,14 @@ msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 msgctxt "@label" msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" -msgstr "プリントにヘルプが必要ですか?
読んでください。 Ultimakerトラブルシューティングガイド" +msgstr "プリントにヘルプが必要ですか?
Ultimakerトラブルシューティングガイドを読んでください。" # can’t enter japanese #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" msgid "Print Selected Model with %1" msgid_plural "Print Selected Models with %1" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "選択したモデルを%1で印刷する" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 msgctxt "@title:window" @@ -4022,7 +4016,7 @@ msgstr "フィラメント" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 msgctxt "@label" msgid "Check material compatibility" -msgstr "マテリアルのコンパティビリティを確認" +msgstr "マテリアルのコンパティビリティを確認" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 msgctxt "@tooltip" @@ -4042,12 +4036,12 @@ msgstr "プリンターの設定アクション" #: XRayView/plugin.json msgctxt "description" msgid "Provides the X-Ray view." -msgstr "X-Rayビューイング" +msgstr "透視ビューイング" #: XRayView/plugin.json msgctxt "name" msgid "X-Ray View" -msgstr "X-Rayビュー" +msgstr "透視ビュー" #: X3DReader/plugin.json msgctxt "description" From 568e18f664bdaf8640013400ec9b6b21a2e93955 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 16:30:57 +0100 Subject: [PATCH 242/764] Add Japanese translation of cura.po It's quite bad though so let's see what improvements we can make. --- resources/i18n/ja_JP/cura.po | 4395 ++++++++++++++++++++++++++++++++++ 1 file changed, 4395 insertions(+) create mode 100644 resources/i18n/ja_JP/cura.po diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po new file mode 100644 index 0000000000..c29e0b709b --- /dev/null +++ b/resources/i18n/ja_JP/cura.po @@ -0,0 +1,4395 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-11-10 20:08+0900\n" +"Language-Team: TEAM\n" +"Language: xx_XX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Last-Translator: \n" +"X-Generator: Poedit 2.0.4\n" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Print aborted" +msgstr "プリント中止" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Blocked" +msgstr "ブロックされました" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Action required" +msgstr "アクションが必要です。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Can't start print" +msgstr "プリントを開始できません。" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Ultimaker3のグループをホストするために設定されていません。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label" +msgid "Finishes at: " +msgstr "この層で終了します:" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "このプリンターがUltimaker3のグループのホストプリンターです。" + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。" + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Print finished" +msgstr "プリント終了" + +#: Manually added for resources/Cura/Cura.qml +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "プラグイン" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "プラグインをみる" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "インストールされたプラグイン" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "X-Rayビューイング" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "X3Dファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "GCodeファイル" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Boxでプリントする" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Boxでプリント" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "Doodle3D Connectに接続する" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +msgctxt "@action:button" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "Doodle3D Connectにデータを送信" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "Doodle3D Connectにデータを送れませんでした。他のジョブはまだアクティブですか?" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "Doodle3D Connectにデータを保存" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "Doodle3D Connectにファイル送信完了" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect.." +msgstr "Connect..を開く" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "Doodle3D Connect web interfaceを開く" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "Changelogの表示" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +#, fuzzy +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "アクティブ設定を平らにします。" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +#, fuzzy +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "プロファイルが平らになり、アクティベートされました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "USBプリンティング" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "USBを使ってプリントする" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "USBを使ってプリントする" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "USBにて接続する" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "新しいプリントジョブをはじめることができません。プリンターが使用中または接続できていません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:title" +msgid "Print Details" +msgstr "プリント詳細" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "UltiGCodeを使用中のため、USBからのプリントができません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "USBプリント" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer does not support usb printing." +msgstr "USBでの印刷ができないため、新しいプリントジョブができません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +msgctxt "@info:title" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "プリンターが未接続のため、ファームウェアをアップデートできません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "プリンターに必要なファームウェアを探せませんでした。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "ファームウェア" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "リムーバブルドライブに保存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "保存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "保存できませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "デバイスに書き出すためのファイル名が見つかりませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "リムーバブルドライブに保存することができませんでした。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +msgctxt "@info:title" +msgid "Error" +msgstr "エラー" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "リムーバブルドライブに保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "ファイル保存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "取り出す" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "リムーバブルデバイスを取り出す" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "取り出し完了。デバイスを安全に取り外せます。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "ハードウェアを安全に取り外します。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "取り出し失敗。他のプログラムがデバイスを使用しているため。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "リムーバブルドライブ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "ネットワーク上のプリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "ネットワークのプリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "Access to the printer requested. Please approve the request on the printer" +msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:title" +msgid "Connection status" +msgstr "コネクションのステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "コネクションステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@action:button" +msgid "Retry" +msgstr "再試行" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "アクセスリクエストを再送信" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "プリンターへのアクセスが承認されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "このプリンターへのアクセスが許可されていないため、プリントジョブの送信ができませんでした。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "アクセスのリクエスト" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "アクセスのリクエスト送信" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +msgctxt "@info:status" +msgid "Connected over the network. Please approve the access request on the printer." +msgstr "ネットワーク上で接続。プリンタへのリクエストを承認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "ネットワーク上で接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "ネットワーク上で接続。プリントを操作するアクセス権がありません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "プリンターへのアクセス権" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "時間制限によりアクセスが却下されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "ネットワークへの接続が切断されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +msgctxt "@info:status" +msgid "The connection with the printer was lost. Check your printer to see if it is connected." +msgstr "ネットワークへの接続が切断されました。プリンターの接続状態を確認ください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#, python-format +msgctxt "@info:status" +msgid "Unable to start a new print job, printer is busy. Current printer status is %s." +msgstr "プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在の印刷状況は%です。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "プリンターのステータス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "プリントコアがスロットに入っていません。プリントジョブを開始できません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "フィラメントがスロットに入っていません。プリントジョブを開始できません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "フィラメントの残量が足りません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "異なるプリントコアが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "異なるフィラメントが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#, python-brace-format +msgctxt "@label" +msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." +msgstr "プリントコア{0}が適切にカリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "選択された構成にてプリントを開始してもいいですか。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice " +"for the PrintCores and materials that are inserted in your printer." +msgstr "" +"プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメント" +"を元にCuraをスライスすることで最良の印刷結果を出すことができます。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "ミスマッチの構成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "プリンターにプリントデータを送信中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "プリントデータを送信中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "データをプリンターに送ることができません。他のプリントジョブは進行中ですか?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "プリントを停止します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "プリントを中止しました。プリンターを確認してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "プリントを一時停止します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "プリント再開します…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "プリンターと同期する" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "Curaで設定しているプリンタ構成を使用されますか?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +msgctxt "@label" +msgid "" +"The PrintCores and/or materials on your printer differ from those within your current project. For the best result, " +"always slice for the PrintCores and materials that are inserted in your printer." +msgstr "" +"プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプ" +"リントコア、フィラメントに合わせてスライスして頂くことをお勧めします。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "ネットワーク上にて接続" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." +msgstr "このプリンターは{台数}繋がっているUltimaker3プリンターのグループのホストプリンターです。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#, python-brace-format +msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." +msgstr "{printer_name}は ‘{job_name}’印刷を終了しました。造形物を確認し、ビルドプレートから取り出してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#, python-brace-format +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to " +"start printing." +msgstr "{printer_name} は '{job_name}'.を印刷予定です。印刷を開始するためにジョブに合わせた構成に変更してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +msgctxt "@info:status" +msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." +msgstr "" +"新しいプリントジョブをお送りできません。この3Dプリンターは繋がっているUltimaker3のグループをホストするために設定されていま" +"せん。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "グループに送信中{file_name} {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "グループに送信完了{file_name} {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "プリントジョブのインターフェイスをブラウザーで開く" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "プリントジョブをグループに送ることができません。{cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#, python-brace-format +msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +msgid "" +"To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware " +"regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +msgstr "" +"{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネット" +"ワーク上で接続)またはUSBにて行ってください。 " + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "新しい利用可能なファームウェアのアップデートがあります。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "ダウンロード" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +msgctxt "@info" +msgid "Could not access update information." +msgstr "必要なアップデートの情報にアクセスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "" +"Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in " +"SolidWorks itself without any problems as well!" +msgstr "" +"ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "ソリッドワークスパートファイル" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "ソリッドワークスアセンブリーファイル" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "構成" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr " %を開始中にエラーが発生" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "G-codeを修正" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +msgstr "Curaが非特定なスライスされた数字を集めました。プレファレンス内で無効にできます。" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "データを収集中" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "却下する" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Cura 15.04 プロファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "G-codeファイル" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "レイヤービュー" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 +msgctxt "@info:title" +msgid "Layer View" +msgstr "レイヤービュー" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "JPG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "JPEG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "PNG画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "BMP画像" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "GIF画像" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." +msgstr "選ばれたプリンターまたは選ばれたプリント構成が異なるため進行中の材料にてスライスを完了できません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "スライスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" +msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります。{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +msgctxt "@info:status" +msgid "Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "プライムタワーまたはプライム位置が無効なためスライスできません。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +msgctxt "@info:status" +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "" +"モデルのデータがビルトボリュームに入っていないためスライスできるものがありません。スケールやローテーションにて合うように設" +"定してください。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "レイヤーを処理しています。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:title" +msgid "Information" +msgstr "インフォメーション" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "各モデル設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "各モデル構成設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "推奨" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +msgctxt "@title:tab" +msgid "Custom" +msgstr "カスタム" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "3MF ファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +msgctxt "@label" +msgid "Nozzle" +msgstr "ノズル" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 +msgctxt "@menuitem" +msgid "Browse plugins" +msgstr "プラグインを見る" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "プラグインIDを{0}取得することに失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +msgctxt "@info:tile" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "プラグインブラウザー" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "ソリッドビュー" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "Gファイル" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "G-codeを解析" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "G-codeの詳細" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +msgctxt "@info:generic" +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code " +"representation may not be accurate." +msgstr "" +"データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が" +"適切でない場合があります。" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Curaプロファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "3MFファイル" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Curaが3MF fileを算出します。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "アップグレードを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "ファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "チェックアップ" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "ビルドプレートを調整する" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "アウターウォール" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "インナーウォール" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Skin" +msgstr "スキン" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Infill" +msgstr "インフィル" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "サポートイルフィル" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "サポートインターフェイス" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support" +msgstr "サポート" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "スカート" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Travel" +msgstr "移動" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "退却" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Other" +msgstr "他" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "スライス前ファイル {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "フィラメントがロードされていません。" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "未確認のフィラメント" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "造形物のために新しい位置を探索中" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "位置確認" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "位置を確保できません。" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "すでに存在するファイルです。" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" +msgstr "{0} は既に存在します。ファイルを上書きしますか? " + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "カスタム" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "カスタムフィラメント" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +msgctxt "@info:status" +msgid "The selected material is incompatible with the selected machine or configuration." +msgstr "選択されたフィラメントはプリンターとそのプリント構成に適応しておりません。" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "不適合フィラメント" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "The selected material diameter causes the material to become incompatible with the current printer." +msgstr "選択したフィラメントの直径が、現在選択中のプリンターに適応していません。" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "取り消す" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "フィラメント直径を変更を取り消す" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to export profile to {0}: {1}" +msgstr "{0}: {1}にプロファイルを書き出すのに失敗しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Failed to export profile to {0}: Writer plugin reported failure." +msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "{0}にプロファイルを書き出しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +msgctxt "@info:title" +msgid "Export Details" +msgstr "詳細を書き出す" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to import profile from {0}: {1}" +msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "プロファイルの取り込み完了" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "プロファイル{0}は不特定なファイルまたは破損があります。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +msgctxt "@label" +msgid "Custom profile" +msgstr "カスタムプロファイル" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "プロファイルはクオリティータイプが不足しています。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "進行中のプリント構成にあったクオリティータイプ{0}が見つかりませんでした。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from " +"colliding with printed models." +msgstr "プリントシークエンス設定値により、ガントリーと造形物の衝突を避けるため印刷データの高さを低くしました。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "造形サイズ" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "造形データを増やす、配置する。" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "造形データを配置" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "クラッシュ報告" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" +msgid "" +"

A fatal exception has occurred that we could not recover from!

\n" +"

Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

\n" +" " +msgstr "" +"

不可解なエラーが発生しリカバリーできませんでした。

\n" +"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" +"Cura/issues

\n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "ウェブページを開く" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "プリンターを読み込み中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "シーンをセットアップ中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "インターフェイスを読み込み中…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#, python-format +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " +"mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(幅).1f x %(奥行き).1f x %(高さ).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "一度に一つのG-codeしか読み取れません。取り込みをスキップしました{0}。" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "G-codeを読み込み中は他のファイルを開くことができません。取り込みをスキップしました{0}。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +msgctxt "@title:tab" +msgid "Printer" +msgstr "プリンター" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +msgctxt "@label" +msgid "Printer Settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +msgctxt "@label" +msgid "X (Width)" +msgstr "X(幅)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (奥行き)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (高さ)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +msgctxt "@label" +msgid "Build plate shape" +msgstr "ビルドプレート形" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "センターを出します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "ヒーテッドドベッド" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "Gcodeフレーバー" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "プリントヘッド設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +msgctxt "@label" +msgid "X min" +msgstr "X分" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +msgctxt "@label" +msgid "Y min" +msgstr "Y分" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +msgctxt "@label" +msgid "X max" +msgstr "最大X" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +msgctxt "@label" +msgid "Y max" +msgstr "最大Y" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" +"を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +msgctxt "@label" +msgid "Gantry height" +msgstr "ガントリーの高さ" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions " +"between previous prints and the gantry when printing \"One at a Time\"." +msgstr "" +"(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるた" +"めに “1プリントづつ”印刷を使用。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "エクストルーダーの数" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or " +"the profile." +msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +msgctxt "@label" +msgid "Material diameter" +msgstr "フィラメント直径" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +msgctxt "@label" +msgid "Nozzle size" +msgstr "ノズルサイズ" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +msgctxt "@label" +msgid "Start Gcode" +msgstr "G-codeをスタートします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "G-codeが最初に起動するようにします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +msgctxt "@label" +msgid "End Gcode" +msgstr "G-codeを終了" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "G-codeが最後にに起動するようにします。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "ノズル設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "ノズルオフセットX" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "ノズルオフセットY" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "エクストルーダーがGcodeを開始します。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "エクストルーダーがGcodeを終了します。" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "Changelogの表示" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "やめる" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "ファームウェアアップデート" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "ファームウェアアップデート完了" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "ファームウェアアップデートを開始します、時間が少しかかるかもしれません。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "ファームウェアアップデート中" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "不特定なエラーの発生によりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "コミュニケーションエラーによりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "インプット/アウトプットエラーによりファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "ファームウェアが見つからず、ファームウェアアップデート失敗しました。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "不特定エラーコード: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "ネットワーク上で繋がったプリンターに接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a " +"network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can " +"still use a USB drive to transfer g-code files to your printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。" +"Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "追加" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "編集" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "取り除く" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "更新" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +msgctxt "@label" +msgid "If your printer is not listed, read the network printing troubleshooting guide" +msgstr "" +"お持ちのプリンターがリストにない場合、ネットワークプリンティングトラブルシューティングガイドを読んでくだ" +"さい。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +msgctxt "@label" +msgid "Type" +msgstr "タイプ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Extended" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "不明" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +msgctxt "@label" +msgid "Firmware version" +msgstr "ファームウェアバージョン" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +msgctxt "@label" +msgid "Address" +msgstr "アドレス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "このアドレスのプリンターは応答していません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "接続" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "プリンターアドレス" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +msgctxt "@action:button" +msgid "Ok" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "プリンターにつなぐ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "プリンターの構成をCuraに取り入れる。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "プリント構成をアクティベートする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 +msgctxt "@label" +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 +msgctxt "@label" +msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +msgstr "このプリンターは繋がっているUltimaker3プリンターのグループのホストです。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "ネットワーク上のプリント" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "プリント" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1は、繋がっているUltimaker3プリンターのグループをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 +msgctxt "@label:status" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 +msgctxt "@label:status" +msgid "Reserved" +msgstr "予約済み" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 +msgctxt "@label:status" +msgid "Finished" +msgstr "終了" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 +msgctxt "@label:status" +msgid "Preparing" +msgstr "準備中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 +msgctxt "@label:status" +msgid "Available" +msgstr "利用可能" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 +msgctxt "@label" +msgid "Completed on: " +msgstr "完了:" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 +msgctxt "@label" +msgid "Clear build plate" +msgstr "ビルドプレートをクリアにする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 +msgctxt "@label" +msgid "Preparing to print" +msgstr "プリントの準備をする" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "プリントデータを確認できない" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "デフォルトのウェブブラウザーにてプリントジョブを開く" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 +msgctxt "@label" +msgid "PRINTER GROUP" +msgstr "プリンターグループ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 +msgctxt "@title" +msgid "Print jobs" +msgstr "プリントジョブ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 +msgctxt "@label" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 +msgctxt "@label" +msgid "Queued" +msgstr "順番を待つ" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "プリント構成の変更を待っている" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 +msgctxt "@label:title" +msgid "Printers" +msgstr "複数のプリンター" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 +msgctxt "@action:button" +msgid "View printers" +msgstr "複数のプリンターをみる" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Curaソリッドワークスプラグインコンフィグレーション" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "書き出されたSTLのクオリティーデフォルト" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "毎回確認" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "常にファインクオリティーを使用する" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "常に粗めのクオリティーを使用する" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "ソリッドワークスのファイルをSTLとして取り込む" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "書き出されたSTLのクオリティー" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "クオリティー" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "粗い" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "ファイン" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "選択を記憶させる" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "プラグイン処理後" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "スクリプトの処理後" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "スクリプトを加える" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "処理したスクリプトを変更する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 +msgctxt "@label" +msgid "Color scheme" +msgstr "カラースキーム" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "フィラメントの色" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "ラインタイプ" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "コンパティビリティモード" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 +msgctxt "@label" +msgid "Show Travels" +msgstr "移動を表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 +msgctxt "@label" +msgid "Show Helpers" +msgstr "ヘルプを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 +msgctxt "@label" +msgid "Show Shell" +msgstr "シェルを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 +msgctxt "@label" +msgid "Show Infill" +msgstr "インフィルを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "トップのレイヤーを表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "トップの5レイヤーの詳細を表示する" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "トップ/ボトム" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 +msgctxt "@label" +msgid "Inner Wall" +msgstr "インナーウォール" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "画像を変換する…" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "“ベース”から各ピクセルへの最大距離" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "高さ(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "ミリメートルでビルドプレートからベースの高さ" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "ベース(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "ビルドプレート上の幅ミリメートル" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "幅(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "ビルドプレート上の奥行きミリメートル" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "深さ(mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this " +"option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low " +"points on the mesh." +msgstr "" +"デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリ" +"バースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "薄いほうを高く" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "暗いほうを高く" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "画像に適応したスムージング量" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "スムージング" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "設定を選択する" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "このモデルをカスタマイズする設定を選択する" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "フィルター…" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "すべて表示する" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "existingをアップデートする" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "新しいものを作成する" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "サマリーCuraプロジェクト" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "プリンターの設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "このプリンターの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +msgctxt "@action:label" +msgid "Type" +msgstr "タイプ" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +msgctxt "@action:label" +msgid "Name" +msgstr "ネーム" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "プロファイル設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "このプロファイルの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "プロファイル内にない" + +# Can’t edit the Japanese text +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#, fuzzy +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "プロファイルを無効にする" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "次から引き出す" + +# can’t inset the japanese text +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +msgctxt "@action:label" +msgid "Material settings" +msgstr "フィラメント設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "このフィラメントの問題をどのように解決すればいいか?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "視野設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +msgctxt "@action:label" +msgid "Mode" +msgstr "モード" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "ビジブル設定:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%2のうち%1" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "プロジェクトを入れることでビルド上のモデルがすべて消滅します。" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +msgctxt "@action:button" +msgid "Open" +msgstr "開く" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "探す&アップデートプラグイン" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "サードパーティのプラグインのリストをここで見つけることができます。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "アップグレード" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "インストールした" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "プラグインライセンス同意書" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +" plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "" +"プラグインがライセンスを保持しています。\n" +"このライセンスを承認しプラグインをインストールしてください。\n" +"下記項目に賛成しますか?" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "承認する" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "拒否する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "プリンターアップグレードを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "このUltimaker2に施したアップグレードを選択してください。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Olsson Block" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "ビルドプレートのレベリング" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' " +"the nozzle will move to the different positions that can be adjusted." +msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build " +"plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgstr "すべてのポジションに;" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "ビルドプレートのレベリングを開始する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "次のポジションに移動" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "ファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates " +"the temperature and ultimately makes your printer work." +msgstr "" +"ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管" +"理し、プリンターとして成すべき点を補います。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." +msgstr "" +"配達時のファームウェアで動かすことはできますが、新しいバージョンの方がより改善され、便利なフィーチャーがついてきます。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "自動でファームウェアをアップグレード" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "カスタムファームウェアをアップロードする" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "カスタムファームウェアを選択する。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "このUltimaker Originalに施されたアップグレートを選択する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "ヒーティッドビルドプレート(オフィシャルキットまたはセルフビルド)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "プリンターチェック" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is " +"functional" +msgstr "" +"お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップし" +"てください。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "プリンターチェックを開始する" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "コネクション:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "接続済" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "プリンターにつながっていません。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +#, fuzzy +msgctxt "@label" +msgid "Min endstop X: " +msgstr "エンドストップ X:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "作品" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "チェックされていません。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +#, fuzzy +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "エンドストップ Y:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +#, fuzzy +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "エンドストップ Z:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "ノズル温度チェック:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "ヒーティングストップ" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "ヒーティング開始" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "ビルドプレートの温度チェック:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "チェック済" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "すべてに異常はありません。チェックアップを終了しました。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "プリンターにつながっていません。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "今プリンタはコマンドを処理できません。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "メンテナンス。プリンターをチェックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "プリンターへの接続が切断されました。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "一時停止しました" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "準備中" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "造形物を取り出してください。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "再開" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "一時停止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "プリント中止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "プリント中止" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "本当にプリントを中止してもいいですか。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "変更を取り消すか保存するか" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "プロファイル設定をカスタマイズしました。この設定をキープしますか、キャンセルしますか。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "プロファイル設定" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "デフォルト" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "カスタマイズ" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "毎回確認する" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "取り消し、再度確認しない。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "キープし、再度確認しない。" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "取り消す" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "キープする" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "新しいプロファイルを作る" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "インフォメーション" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "ディスプレイ名" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "ブランド" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "フィラメントタイプ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "色" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "プロパティ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "密度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "直径" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "フィラメントコスト" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "フィラメントの重さ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "フィラメントの長さ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "毎メーターコスト" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "このフィラメントは %1にリンクすプロパティーを共有する。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "フィラメントをリンクを外す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "記述" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "接着のインフォメーション" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "プリント設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "視野設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "すべて確認する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "計算された" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "現在" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "ユニット" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +msgctxt "@title:tab" +msgid "General" +msgstr "一般" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "インターフェイス" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "言語:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "通貨:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "テーマ:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "You will need to restart the application for these changes to have effect." +msgstr "それらの変更を有効にするためにはアプリケーションを再起動しなけらばなりません。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "セッティングを変更すると自動にスライスします。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "自動的にスライスする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "ビューポイント機能" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." +msgstr "赤でサポートができないエリアをハイライトしてください。サポートがない場合、正確にプリントができない場合があります。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "ディスプレイオーバーハング" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "Moves the camera so the model is in the center of the view when a model is selected" +msgstr "モデルの選択時にモデルがカメラの中心に見えるようにカメラを移動する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "アイテムを選択するとカメラが中心にきます" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "Curaのデフォルトのズーム機能は変更できるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "カメラのズーム方向を反転する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "ズームはマウスの方向に動くべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "マウスの方向にズームする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved so that they no longer intersect?" +msgstr "交差を避けるためにプラットホーム上のモデルを移動するべきですか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "モデルの距離が離れているように確認する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "プラットホーム上のモデルはブルドプレートに触れるように下げるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "自動的にモデルをビルドプレートに落とす" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "gcodeリーダーに注意メッセージを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "gcodeリーダーの注意メッセージ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "レイヤーはコンパティビリティモードに強制されるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "レイヤービューコンパティビリティモードを強制する。(再起動が必要)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "ファイルを開くまた保存" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "モデルがビルドボリュームに対して大きすぎる場合はスケールされるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "大きなモデルをスケールする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be " +"scaled up?" +msgstr "" +"ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべき" +"ですか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "極端に小さなモデルをスケールアップする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" +msgstr "プリンター名の敬称はプリントジョブの名前に自動的に加えられるべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "プリンターの敬称をジョブネームに加える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "プロジェクトファイルを保存時にサマリーを表示するべきか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "プロジェクトを保存時にダイアログサマリーを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "プロジェクトファイルを開く際のデフォルト機能" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "プロジェクトファイル開く際のデフォルト機能:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "いつもお尋ねください。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "常にプロジェクトとして開く" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "常にモデルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "" +"When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want " +"to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "" +"プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダ" +"イアログが表示されないようにデフォルト機能を選ぶことができます。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "プロファイルを無効にする" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "プライバシー" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "Curaのプログラム開始時にアップデートがあるかチェックしますか?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "スタート時にアップデートあるかどうかのチェック" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally " +"identifiable information is sent or stored." +msgstr "" +"プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしま" +"せん。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr " (不特定な) プリントインフォメーションを送信" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +msgctxt "@title:tab" +msgid "Printers" +msgstr "プリンター" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "アクティベート" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "名を変える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +msgctxt "@label" +msgid "Printer type:" +msgstr "プリンタータイプ:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +msgctxt "@label" +msgid "Connection:" +msgstr "コネクション:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "このプリンターはつながっていません。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +msgctxt "@label" +msgid "State:" +msgstr "ステート:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "ビルドプレートの掃除を待つ" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "プリントジョブの待機中" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "保護されたプロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "カスタムプロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "作成する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "プリンター: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "プロファイルを現在のセッティング/" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "今の変更を破棄する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." +msgstr "" +"このプロファイルはプリンターによりデフォルトを使用、従いこのプロファイルはセッティング/書き換えが以下のリストにありませ" +"ん。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "設定は選択したプロファイルにマッチしています。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "グローバル設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "プロファイル名を変える" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "プロファイルを作る" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "プロファイルを複製する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "プロファイルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "プロファイルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "プロファイルを書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +msgctxt "@title:tab" +msgid "Materials" +msgstr "マテリアル" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" +msgid "Printer: %1, %2: %3" +msgstr "プリンター: %1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "プリンター:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "作成する" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "フィラメントを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not import material %1: %2" +msgstr " %1: %2フィラメントを取り込むことができない。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "フィラメントの取り込みに成功しました。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "フィラメントを書き出す" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "Failed to export material to %1: %2" +msgstr "フィラメントの書き出しに失敗しました <ファイルネーム>%1: <メッセージ>%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "無事に%1にフィラメントを書き出しました。" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "プリンターを追加する" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "プリンター名:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "プリンターについて" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "Curaについて" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "熱溶解積層型3Dプリンティングのエンドtoエンドソリューション" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "CuraはUltimakerB.Vのコミュニティの協力によって開発され、Curaはオープンソースで使えることを誇りに思います:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "グラフィックユーザーインターフェイス" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "アプリケーションフレームワーク" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "Gcodeジェネレーター" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "インタープロセスコミュニケーションライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "プログラミング用語" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "GUIフレームワーク" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "GUIフレームワークバインディング" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C/C++ バインディングライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "データインターフェイスフォーマット" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "サイエンスコンピューティングを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "ファターマスを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "STLファイルを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "3MFファイルを操作するためのライブラリーサポート" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "シリアルコミュニケーションライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "ZeroConfディスカバリーライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "ポリゴンクリッピングライブラリー" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "フォント" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "SVG icons" +msgstr "SVGアイコン" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "プロファイル:" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" +"プロファイルマネージャーをクリックして開いてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "検索…" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "すべてのエクストルーダーの値をコピーする" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "この設定を非表示にする" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "この設定を表示しない" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "常に見えるように設定する" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "視野のセッティングを構成する" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" +"表示されるようにクリックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "影響" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "次によって影響を受ける" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "この値は各エクストルーダーの値から取得します。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"この設定にプロファイルと異なった値があります。\n" +"プロファイルの値を戻すためにクリックしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"このセッティングは通常計算されます、今は絶対値に固定されています。\n" +"計算された値に変更するためにクリックを押してください。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "プリントセットアップ" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" +"プリントセットアップが無効\n" +"G-codeファイルを修正することができません。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 +msgctxt "@label" +msgid "00h 00min" +msgstr "00h 00min" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +msgctxt "@tooltip" +msgid "Time information" +msgstr "Time information" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 +msgctxt "@description" +msgid "Print time" +msgstr "プリント時間" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +msgctxt "@label" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "%1分 / ~ %2g / ~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 +msgctxt "@label" +msgid "%1m / ~ %2g" +msgstr "%1分/ ~ %2g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

Print with the recommended settings for the selected printer, material and " +"quality." +msgstr "" +"おすすめプリントセットアップ

選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてくだ" +"さい。 " + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +msgctxt "@tooltip" +msgid "Custom Print Setup

Print with finegrained control over every last bit of the slicing process." +msgstr "カスタムプリントセットアップ

スライス処理のきめ細かなコントロールにてプリントする" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "自動: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "&ビュー" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "自動: %1" + +# can’t enter japanese texts +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "" +msgstr[1] "" + +# can’t eneter japanese texts +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "コピーの数" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "最近開いたファイルを開く" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "接続中のプリンターはありません。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +msgctxt "@label" +msgid "Extruder" +msgstr "エクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the " +"hotend heating is turned off." +msgstr "" +"ホットエンドの目標温度。ホットエンドはこの温度に向けて上がったり下がったりします。これが0の場合、ホットエンドの加熱はオフ" +"になっています。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "現在のエクストルーダーの温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "エクストルーダーのマテリアルの色" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "エクストルーダー入ったフィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "ノズルが入ったエクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +msgctxt "@label" +msgid "Build plate" +msgstr "ビルドプレート" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +msgctxt "@tooltip" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the " +"bed heating is turned off." +msgstr "" +"ヒーティッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっ" +"ています。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "現在のヒーティッドベッドの温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "ベッドのプリヒート温度" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button" +msgid "Pre-heat" +msgstr "プレヒート" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +msgctxt "@tooltip of pre-heat" +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to " +"wait for the bed to heat up when you're ready to print." +msgstr "" +"プリント開始前にベッドを加熱します。加熱中もプリントの調整を行えます、またべットが加熱するまでプリント開始を待つ必要もあり" +"ません。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +msgctxt "@label" +msgid "Active print" +msgstr "プリントをアクティベートする" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +msgctxt "@label" +msgid "Job Name" +msgstr "ジョブネーム" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +msgctxt "@label" +msgid "Printing Time" +msgstr "プリント時間" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +msgctxt "@label" +msgid "Estimated time left" +msgstr "残り時間" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "留め金 フルスクリーン" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "&取り消す" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "&やりなおす" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "&やめる" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "Curaを構成する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "&プリンターを追加する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "プリンターを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "フィラメントを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "&現在の設定/無効にプロファイルをアップデートする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "&変更を破棄する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "&今の設定/無効からプロファイルを作成する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "プロファイルを管理する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "オンラインドキュメントを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "報告&バグ" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "アバウト..." + +# can’t enter japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "" +msgstr[1] "" + +# can’t enter japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "" +msgstr[1] "" + +# can’t edit japanese text +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "モデルを消去する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "プラットホームの中心にモデルを配置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "&モデルグループ" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "モデルを非グループ化" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "&モデルの合体" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "&モデルを増倍する…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "&すべてのモデル選択" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "&ビルドプレート上のクリア" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "すべてのモデルを読み込む" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "すべてのモデルをアレンジする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "選択をアレンジする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "すべてのモデルのポジションをリセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "すべてのモデル&変更点をリセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "&ファイルを開く(s)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "&新しいプロジェクト…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "エンジン&ログを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "コンフィグレーションのフォルダーを表示する" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "視野のセッティングを構成する" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "3Dモデルをロードしてください。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "スライスの準備ができました。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "スライス中…" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "準備に%1" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "スライスできません。" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "スライスが利用不可能" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "準備する" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "キャンセル" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "アクティブなアウトプットデバイスを選択する" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "ファイルを開く(s)" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "" +"We have found one or more project file(s) within the files you have selected. You can open only one project file at a " +"time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "" +"選択したファイルの中に複数のプロジェクトが存在します。1ファイルのみ一度に開けます。ファイルからモデルを先に取り込むことを" +"お勧めします。続けますか?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "すべてをモデルとして取り入れる" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "&ファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "&ファイルに選択したものを保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "名前をつけて保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "プロジェクトを保存" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "&編集" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +msgctxt "@title:menu" +msgid "&View" +msgstr "&ビュー" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "&設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "&プリンター" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +msgctxt "@title:menu" +msgid "&Material" +msgstr "&フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "&プロファイル" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "アクティブエクストルーダーとしてセットする" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "拡張子" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "プレファレンス" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "ヘルプ" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +msgctxt "@action:button" +msgid "Open File" +msgstr "ファイルを開く" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +msgctxt "@title:window" +msgid "New project" +msgstr "新しいプロジェクト…" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +msgctxt "@info:question" +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." +msgstr "新しいプロジェクトを開始しますか?この作業では保存していない設定やビルドプレートをクリアします。" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "プラグインをインストール" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "ファイルを開く(s)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +msgctxt "@text:window" +msgid "" +"We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. " +"If you want to open a G-Code file, please just select only one." +msgstr "" +"選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでく" +"ださい。" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "プロジェクトを保存" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "エクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "保存中のプロジェクトサマリーを非表示にする" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +msgctxt "@action:button" +msgid "Save" +msgstr "保存" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "準備する" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "モニター" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +msgctxt "@label" +msgid "Layer Height" +msgstr "レイヤーの高さ" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +msgctxt "@label" +msgid "Print Speed" +msgstr "プリントスピード" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +msgctxt "@label" +msgid "Slower" +msgstr "ゆっくり" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +msgctxt "@label" +msgid "Faster" +msgstr "早く" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +msgctxt "@label" +msgid "Infill" +msgstr "インフィル" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +msgctxt "@label" +msgid "Gradual infill will gradually increase the amount of infill towards the top." +msgstr "グラデュアルインフィルはトップに向かうに従ってインフィルの量を増やします。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +msgctxt "@label" +msgid "Enable gradual" +msgstr "グラデュアルを有効にする" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +msgctxt "@label" +msgid "Generate Support" +msgstr "サポートを生成します。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +msgctxt "@label" +msgid "" +"Generate structures to support parts of the model which have overhangs. Without these structures, such parts would " +"collapse during printing." +msgstr "" +"オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してし" +"まいます。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +msgctxt "@label" +msgid "Support Extruder" +msgstr "サポートエクストルーダー" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting structures below the model to prevent the model " +"from sagging or printing in mid air." +msgstr "" +"サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成し" +"ます。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "ビルドプレートの接着" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、プリントの周り、また造形物の下に底面を加え切り取りやすくします。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +msgctxt "@label" +msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" +msgstr "プリントにヘルプが必要ですか?
読んでください。 Ultimakerトラブルシューティングガイド" + +# can’t enter japanese +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +msgctxt "@text:window" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" +msgstr "これはCuraのプロジェクトファイルです。プロジェクトとしてあけますか、それともモデルのみ取り込みますか?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +msgctxt "@action:button" +msgid "Open as project" +msgstr "プロジェクトを開く" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +msgctxt "@action:button" +msgid "Import models" +msgstr "モデルを取り込む" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "エンジンログ" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +msgctxt "@label" +msgid "Material" +msgstr "フィラメント" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +msgctxt "@label" +msgid "Check material compatibility" +msgstr "マテリアルのコンパティビリティを確認" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック" + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgstr "プリンターの設定を変更(印刷ボリューム、ノズルサイズ、その他)" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "プリンターの設定アクション" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "X-Rayビューイング" + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "X-Rayビュー" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "X3Dファイルを読むこむためのサポートを供給する" + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "X3Dリーダー" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "ファイルにGCodeを書く" + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "GCodeライター" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "HTMLファイルに設定内容を放置する" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "Godモード" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "G-codeを承認し、Doodle3D WiFi-ボックスにWifi上にて送る" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "Doodle3D WiFi-Box" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "最新の更新バージョンの変更点を表示する" + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "Changelog" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "プロファイルを変更するフラットエンドクオリティーを作成する" + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "プロファイルフラットナー" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "G-codeを承認し、プリンターに送信する。またプラグインはファームウェアをアップデートできます。" + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "USBプリンティング" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "取り外し可能なドライブアウトプットデバイスプラグイン" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "Ultimaker3のプリンターのネットワーク接続を管理する。" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "UM3ネットワークコネクション" + +#: CuraPrintClusterUpload/plugin.json +msgctxt "name" +msgid "UM3 Network Connection (Cluster)" +msgstr "UM3 ネットワークコネクション(クラスター)" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "ファームウェアアップデートをチェックする" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "ファームウェアアップデートチェッカー" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +msgstr "ソリッドワークスにて特定のファイルを開くことが可能です。その後変換され、Curaに取り込めます。" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "ソリッドワークスインタグレーション" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "後処理のためにユーザーが作成したスクリプト用拡張子" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "後処理" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "変更後プリンターやプロファイルプレファレンスを自動的に保存します、" + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "自動保存" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "不特定なスライス情報を提出。プレファレンスの中で無効になる可能性もある。" + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "スライスインフォメーション" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "XMLベースフィラメントのプロファイルを読み書きするための機能を供給する。" + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "フィラメントプロファイル" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する" + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "レガシーCuraプロファイルリーダー" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "g-codeファイルからプロファイルを読み込むサポートを供給する。" + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "GCodeプロファイルリーダー" + +#: LayerView/plugin.json +msgctxt "description" +msgid "Provides the Layer view." +msgstr "レイヤービューを供給する" + +#: LayerView/plugin.json +msgctxt "name" +msgid "Layer View" +msgstr "レイヤービュー" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "2.5から2.6にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "2.7から3.0にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "2.6から2.7にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "2.1 から2.2にバージョンアップグレート" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "2.2 から2.4にバージョンアップグレート" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする" + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "画像リーダー" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "CuraEngineスライシングバックエンドにリンクを供給する" + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "Curaエンジンバックエンド" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "各モデル設定を与える" + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "各モデル設定ツール" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "3MFファイルを読むこむためのサポートを供給する" + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "3MFリーダー" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "探す、新しいプラグインを管理、インストール" + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "プラグインブラウザー" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "ノーマルなソリットメッシュビューを供給する" + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "ソリッドビュー" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "G-codeファイルの読み込み、表示を許可する" + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "G-codeリーダー" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "Curaプロファイルを書き出すためのサポートを供給する" + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "Curaプロファイルライター" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "3MFファイルを読むこむためのサポートを供給する" + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "3MFリーダー" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgstr "Ultimakerのプリンターのアクションを供給する(ベッドレベリングウィザード、アップグレードの選択、他)" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "Ultimkerプリンターのアクション" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "Curaプロファイルを取り込むためのサポートを供給する" + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "Curaプロファイルリーダー" From 7a42c5bcceb389b7ecb5e1cbd0f4847a78b49c2b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 16:38:02 +0100 Subject: [PATCH 243/764] Fix technical mistakes of Japanese translation There's a lot of keys that weren't added to the Japanese translation. Our program crashes on these because it can't find where it needs to fill in the argument. --- resources/i18n/ja_JP/cura.po | 120 +++++++++++++++++------------------ 1 file changed, 57 insertions(+), 63 deletions(-) diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index c29e0b709b..1b77006b0c 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -8,15 +8,15 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-10 20:08+0900\n" +"PO-Revision-Date: 2017-11-17 15:52+0100\n" "Language-Team: TEAM\n" "Language: xx_XX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "Last-Translator: \n" -"X-Generator: Poedit 2.0.4\n" +"X-Generator: Poedit 1.8.7.1\n" #: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml msgctxt "@label:status" @@ -51,7 +51,7 @@ msgstr "この層で終了します:" #: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml msgctxt "@label" msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "このプリンターがUltimaker3のグループのホストプリンターです。" +msgstr "このプリンターはUltimaker3 %1グループのホストプリンターです。" #: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py msgctxt "@info:status" @@ -86,7 +86,7 @@ msgstr "プリンターの設定" #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 msgctxt "@item:inlistbox" msgid "X-Ray view" -msgstr "X-Rayビューイング" +msgstr "透視ビューイング" #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 msgctxt "@item:inlistbox" @@ -243,7 +243,7 @@ msgstr "プリンターが未接続のため、ファームウェアをアップ #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." -msgstr "プリンターに必要なファームウェアを探せませんでした。" +msgstr "プリンター(%s)に必要なファームウェアを探せませんでした。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 msgctxt "@info:title" @@ -259,13 +259,13 @@ msgstr "リムーバブルドライブに保存" #, python-brace-format msgctxt "@item:inlistbox" msgid "Save to Removable Drive {0}" -msgstr "リムーバブルドライブに保存" +msgstr "リムーバブルドライブ{0}に保存" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 #, python-brace-format msgctxt "@info:progress Don't translate the XML tags !" msgid "Saving to Removable Drive {0}" -msgstr "リムーバブルドライブに保存中" +msgstr "リムーバブルドライブ{0}に保存中" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 msgctxt "@info:title" @@ -277,20 +277,20 @@ msgstr "保存中" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not save to {0}: {1}" -msgstr "保存できませんでした。" +msgstr "{0}を保存できませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 #, python-brace-format msgctxt "@info:status Don't translate the tag {device}!" msgid "Could not find a file name when trying to write to {device}." -msgstr "デバイスに書き出すためのファイル名が見つかりませんでした。" +msgstr "デバイス{device}に書き出すためのファイル名が見つかりませんでした。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #, python-brace-format msgctxt "@info:status" msgid "Could not save to removable drive {0}: {1}" -msgstr "リムーバブルドライブに保存することができませんでした。" +msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 @@ -306,7 +306,7 @@ msgstr "エラー" #, python-brace-format msgctxt "@info:status" msgid "Saved to Removable Drive {0} as {1}" -msgstr "リムーバブルドライブに保存" +msgstr "リムーバブルドライブ{0}に {1}として保存" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 msgctxt "@info:title" @@ -322,13 +322,13 @@ msgstr "取り出す" #, python-brace-format msgctxt "@action" msgid "Eject removable device {0}" -msgstr "リムーバブルデバイスを取り出す" +msgstr "リムーバブルデバイス{0}を取り出す" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 #, python-brace-format msgctxt "@info:status" msgid "Ejected {0}. You can now safely remove the drive." -msgstr "取り出し完了。デバイスを安全に取り外せます。" +msgstr "{0}取り出し完了。デバイスを安全に取り外せます。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 msgctxt "@info:title" @@ -339,7 +339,7 @@ msgstr "ハードウェアを安全に取り外します。" #, python-brace-format msgctxt "@info:status" msgid "Failed to eject {0}. Another program may be using the drive." -msgstr "取り出し失敗。他のプログラムがデバイスを使用しているため。" +msgstr "{0}取り出し失敗。他のプログラムがデバイスを使用しているため。" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 msgctxt "@item:intext" @@ -476,7 +476,8 @@ msgstr "ネットワークへの接続が切断されました。プリンター #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." -msgstr "プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在の印刷状況は%です。" +msgstr "" +"プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在のプリンターのステータスは%sです。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 msgctxt "@info:title" @@ -488,42 +489,42 @@ msgstr "プリンターのステータス" #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" -msgstr "プリントコアがスロットに入っていません。プリントジョブを開始できません。" +msgstr "プリントコアがスロット{0}に入っていません。プリントジョブを開始できません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" -msgstr "フィラメントがスロットに入っていません。プリントジョブを開始できません。" +msgstr "フィラメントがスロット{0}に入っていません。プリントジョブを開始できません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." -msgstr "フィラメントの残量が足りません。" +msgstr "フィラメント{0}の残量が足りません。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "異なるプリントコアが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" +msgstr "異なるプリントコアが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "異なるフィラメントが入っています。(Cura:{0}, プリンター{1})エクストルーダー{2}" +msgstr "異なるフィラメントが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." -msgstr "プリントコア{0}が適切にカリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" +msgstr "プリントコア{0}が適切にキャリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 @@ -625,7 +626,7 @@ msgstr "このプリンターは、繋がっているUltimaker3プリンター #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." -msgstr "このプリンターは{台数}繋がっているUltimaker3プリンターのグループのホストプリンターです。" +msgstr "このプリンターは{count}繋がっているUltimaker3プリンターのグループのホストプリンターです。" #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 #, python-brace-format @@ -693,7 +694,7 @@ msgstr "" #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" -msgstr "新しい利用可能なファームウェアのアップデートがあります。" +msgstr "新しい利用可能な%sファームウェアのアップデートがあります。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 @@ -732,7 +733,7 @@ msgstr "構成" #, python-format msgctxt "@info:status" msgid "Error while starting %s!" -msgstr " %を開始中にエラーが発生" +msgstr "%sを開始中にエラーが発生" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 msgid "Modify G-Code" @@ -821,7 +822,7 @@ msgstr "スライスできません。" #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" -msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります。{0}" +msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります: {0}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 msgctxt "@info:status" @@ -888,7 +889,7 @@ msgstr "プラグインを見る" #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" -msgstr "プラグインIDを{0}取得することに失敗しました。" +msgstr "{0}からプラグインIDを取得することに失敗しました。" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 msgctxt "@info:tile" @@ -1069,7 +1070,7 @@ msgstr "すでに存在するファイルです。" #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" -msgstr "{0} は既に存在します。ファイルを上書きしますか? " +msgstr "{0} は既に存在します。ファイルを上書きしますか?" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 msgctxt "@label" @@ -1111,7 +1112,7 @@ msgstr "フィラメント直径を変更を取り消す" #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" -msgstr "{0}: {1}にプロファイルを書き出すのに失敗しました。" +msgstr "{0}にプロファイルを書き出すのに失敗しました: {1}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 #, python-brace-format @@ -1144,7 +1145,7 @@ msgstr "{0}: {1}からプロファイル #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" -msgstr "プロファイルの取り込み完了" +msgstr "プロファイル {0}の取り込み完了" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 #, python-brace-format @@ -1204,7 +1205,7 @@ msgid "" " " msgstr "" "

不可解なエラーが発生しリカバリーできませんでした。

\n" -"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" +"

この情報をバグとして報告してください。 http://github.com/Ultimaker/" "Cura/issues

\n" " " @@ -1234,19 +1235,19 @@ msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " "mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(幅).1f x %(奥行き).1f x %(高さ).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" -msgstr "一度に一つのG-codeしか読み取れません。取り込みをスキップしました{0}。" +msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" -msgstr "G-codeを読み込み中は他のファイルを開くことができません。取り込みをスキップしました{0}。" +msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1571,8 +1572,8 @@ msgstr "更新" msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "" -"お持ちのプリンターがリストにない場合、ネットワークプリンティングトラブルシューティングガイドを読んでくだ" -"さい。" +"お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読ん" +"でください。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 @@ -1668,7 +1669,7 @@ msgstr "このプリンターは、繋がっているUltimaker3プリンター #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 msgctxt "@label" msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "このプリンターは繋がっているUltimaker3プリンターのグループのホストです。" +msgstr "このプリンターは繋がっているUltimaker3プリンターの%1グループのホストです。" #: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 msgctxt "@title:window" @@ -2087,12 +2088,10 @@ msgstr "プロファイル内にない" # Can’t edit the Japanese text #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 -#, fuzzy msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" -msgstr[0] "プロファイルを無効にする" -msgstr[1] "" +msgstr[0] "%1個の設定を上書き" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 msgctxt "@action:label" @@ -2100,12 +2099,13 @@ msgid "Derivative from" msgstr "次から引き出す" # can’t inset the japanese text +# %1: print quality profile name +# %2: number of overridden ssettings #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%2の%1個の設定を上書き" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 msgctxt "@action:label" @@ -2138,7 +2138,7 @@ msgstr "ビジブル設定:" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 msgctxt "@action:label" msgid "%1 out of %2" -msgstr "%2のうち%1" +msgstr "%2のうち%1" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 msgctxt "@action:warning" @@ -3063,12 +3063,12 @@ msgstr "フィラメントを取り込む" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" -msgstr " %1: %2フィラメントを取り込むことができない。" +msgstr " %1フィラメントを取り込むことができない: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" -msgstr "フィラメントの取り込みに成功しました。" +msgstr "フィラメント%1の取り込みに成功しました。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 @@ -3079,12 +3079,12 @@ msgstr "フィラメントを書き出す" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" -msgstr "フィラメントの書き出しに失敗しました <ファイルネーム>%1: <メッセージ>%2" +msgstr "フィラメントの書き出しに失敗しました %1: %2" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" -msgstr "無事に%1にフィラメントを書き出しました。" +msgstr "フィラメントの%1への書き出しが完了ました。" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 msgctxt "@title:window" @@ -3359,7 +3359,7 @@ msgstr "カスタムプリントセットアップ

スライス #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" -msgstr "自動: %1" +msgstr "自動選択: %1" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 msgctxt "@title:menu menubar:toplevel" @@ -3369,7 +3369,7 @@ msgstr "&ビュー" #: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" -msgstr "自動: %1" +msgstr "自動選択: %1" # can’t enter japanese texts #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 @@ -3377,7 +3377,6 @@ msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "" -msgstr[1] "" # can’t eneter japanese texts #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 @@ -3385,7 +3384,6 @@ msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" -msgstr[1] "" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 msgctxt "@label" @@ -3580,7 +3578,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "" -msgstr[1] "" # can’t enter japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 @@ -3588,7 +3585,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "" -msgstr[1] "" # can’t edit japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 @@ -3596,7 +3592,6 @@ msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" -msgstr[1] "" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 msgctxt "@action:inmenu" @@ -3706,7 +3701,7 @@ msgstr "スライス中…" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" -msgstr "準備に%1" +msgstr "%1の準備完了" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus" @@ -3875,12 +3870,12 @@ msgstr "プロジェクトを保存" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 msgctxt "@action:label" msgid "Extruder %1" -msgstr "エクストルーダー" +msgstr "エクストルーダー%1" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 msgctxt "@action:label" msgid "%1 & material" -msgstr "フィラメント" +msgstr "%1とフィラメント" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 msgctxt "@action:label" @@ -3979,15 +3974,14 @@ msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 msgctxt "@label" msgid "Need help improving your prints?
Read the Ultimaker Troubleshooting Guides" -msgstr "プリントにヘルプが必要ですか?
読んでください。 Ultimakerトラブルシューティングガイド" +msgstr "プリントにヘルプが必要ですか?
Ultimakerトラブルシューティングガイドを読んでください。" # can’t enter japanese #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" msgid "Print Selected Model with %1" msgid_plural "Print Selected Models with %1" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "選択したモデルを%1で印刷する" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 msgctxt "@title:window" @@ -4022,7 +4016,7 @@ msgstr "フィラメント" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 msgctxt "@label" msgid "Check material compatibility" -msgstr "マテリアルのコンパティビリティを確認" +msgstr "マテリアルのコンパティビリティを確認" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 msgctxt "@tooltip" @@ -4042,12 +4036,12 @@ msgstr "プリンターの設定アクション" #: XRayView/plugin.json msgctxt "description" msgid "Provides the X-Ray view." -msgstr "X-Rayビューイング" +msgstr "透視ビューイング" #: XRayView/plugin.json msgctxt "name" msgid "X-Ray View" -msgstr "X-Rayビュー" +msgstr "透視ビュー" #: X3DReader/plugin.json msgctxt "description" From f484467f8685ca2b186360628cd16543bd60393d Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 17 Nov 2017 18:11:22 +0100 Subject: [PATCH 244/764] Clean project name in PrintInformation after removing the last model CURA-4581 --- cura/PrintInformation.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index d3bcc10781..3e1ed2f8fa 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -264,10 +264,12 @@ class PrintInformation(QObject): def jobName(self): return self._job_name - def _updateJobName(self): + def _updateJobName(self, empty_name = False): # if the project name is set, we use the project name as the job name, so the job name should not get updated # if a model file is loaded after that. if self._project_name != "": + if empty_name: + self._project_name = "" return if self._base_name == "": @@ -304,9 +306,10 @@ class PrintInformation(QObject): name = os.path.splitext(name)[0] # name is "" when I first had some meshes and afterwards I deleted them so the naming should start again - if name == "" or (self._base_name == "" and self._base_name != name): + is_empty = name == "" + if is_empty or (self._base_name == "" and self._base_name != name): self._base_name = name - self._updateJobName() + self._updateJobName( empty_name = is_empty) ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched From c7f190bb262df1c97eb21f066df2ff3da0cfacd6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 18 Nov 2017 11:30:17 +0100 Subject: [PATCH 245/764] Remove (ancient) commented out code --- plugins/SolidView/SolidView.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 2c9f44a254..73a41bb0ec 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -124,7 +124,3 @@ class SolidView(View): def endRendering(self): pass - - #def _onPreferenceChanged(self, preference): - #if preference == "view/show_overhang": ## Todo: This a printer only setting. Should be removed from Uranium. - #self._enabled_material = None From 6d2bcd9b3e6acc7ae690c18758e9f6b6dd8beabb Mon Sep 17 00:00:00 2001 From: Ruben D Date: Mon, 20 Nov 2017 01:55:57 +0100 Subject: [PATCH 246/764] Fix error message when slicing with per-object setting errors The message was generating a list of settings that had an error state by going through all extruder stacks and the global stack, but didn't bother to check the per-object stacks. I could've added it to the regular message but then the user would be confused because he can't find any errors either. So instead I opted to specify that it happened in per-model settings. It's not perfect, but should narrow down the user's search considerably. Fixes #2427. --- .../CuraEngineBackend/CuraEngineBackend.py | 20 +++++++++++++++++++ plugins/CuraEngineBackend/StartSliceJob.py | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 0c1fc6f4ad..14c1c10b90 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -301,6 +301,26 @@ class CuraEngineBackend(QObject, Backend): self.backendStateChange.emit(BackendState.NotStarted) return + elif job.getResult() == StartSliceJob.StartJobResult.ObjectSettingError: + errors = {} + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + stack = node.callDecoration("getStack") + if not stack: + continue + for key in stack.getErrorKeys(): + definition = self._global_container_stack.getBottom().findDefinitions(key = key) + if not definition: + Logger.log("e", "When checking settings for errors, unable to find definition for key {key} in per-object stack.".format(key = key)) + continue + definition = definition[0] + errors[key] = definition.label + error_labels = ", ".join(errors.values()) + self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}").format(error_labels = error_labels), + title = catalog.i18nc("@info:title", "Unable to slice")) + self._error_message.show() + self.backendStateChange.emit(BackendState.Error) + return + if job.getResult() == StartSliceJob.StartJobResult.BuildPlateError: if Application.getInstance().platformActivity: self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because the prime tower or prime position(s) are invalid."), diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index a53daa4e63..eb0337c4f2 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -26,6 +26,7 @@ class StartJobResult(IntEnum): NothingToSlice = 4 MaterialIncompatible = 5 BuildPlateError = 6 + ObjectSettingError = 7 #When an error occurs in per-object settings. ## Formatter class that handles token expansion in start/end gcod @@ -105,7 +106,7 @@ class StartSliceJob(Job): continue if self._checkStackForErrors(node.callDecoration("getStack")): - self.setResult(StartJobResult.SettingError) + self.setResult(StartJobResult.ObjectSettingError) return with self._scene.getSceneLock(): From 217fb606c474ad1d1a120e666a87e2ad3db323bf Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 20 Nov 2017 09:04:07 +0100 Subject: [PATCH 247/764] CURA-4577 Fix the previous change --- plugins/GCodeReader/GCodeReader.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index a0b44bbaaa..1b2795800e 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -139,11 +139,11 @@ class GCodeReader(MeshReader): if self._is_absolute_positioning: x = params.x if params.x is not None else x y = params.y if params.y is not None else y - z = params.z if params.z is not None else position.z + z = params.z if params.z is not None else z else: - x += params.x if params.x is not None else x - y += params.y if params.y is not None else y - z += params.z if params.z is not None else position.z + x += params.x if params.x is not None else 0 + y += params.y if params.y is not None else 0 + z += params.z if params.z is not None else 0 if params.e is not None: new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e From 571ebccb89d7496c64c390730cb656cabce1c331 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 17 Nov 2017 15:22:29 +0100 Subject: [PATCH 248/764] Fix merge conflict in print information - CURA-4581 --- cura/PrintInformation.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 3e1ed2f8fa..46d9a61254 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -308,8 +308,11 @@ class PrintInformation(QObject): # name is "" when I first had some meshes and afterwards I deleted them so the naming should start again is_empty = name == "" if is_empty or (self._base_name == "" and self._base_name != name): + # remove ".curaproject" suffix from (imported) the file name + if name.endswith(".curaproject"): + name = name[:name.rfind(".curaproject")] self._base_name = name - self._updateJobName( empty_name = is_empty) + self._updateJobName(empty_name = is_empty) ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched From 05b4689bd6e34a3c5eb792020eac94be1be260d4 Mon Sep 17 00:00:00 2001 From: orel Windows Date: Wed, 15 Nov 2017 11:39:54 +0100 Subject: [PATCH 249/764] Improve discoeasy200 profile, especially the machine gcode start as it uses 'print_temperature' which is an invalid Cura setting. --- .../definitions/dagoma_discoeasy200.def.json | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 8f1a792bc0..ef9a6084c8 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -8,7 +8,7 @@ "author": "Dagoma", "manufacturer": "Dagoma", "file_formats": "text/x-gcode", - "icon": "icon_ultimaker2.png", + "icon": "icon_discoeasy200.png", "platform": "discoeasy200.stl", "platform_offset": [ 105, -59, 280] }, @@ -30,24 +30,23 @@ }, "machine_head_with_fans_polygon": { "default_value": [ - [16, 37], - [16, -65], - [-16, -65], - [16, 37] + [17, 70], + [17, -40], + [-17, -40], + [17, 70] ] }, "gantry_height": { - "default_value": 55 - }, - "machine_gcode_flavor": { - "default_value": "RepRap" + "default_value": 10 }, "machine_start_gcode": { - "default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{print_temperature}\nM140 S{material_bed_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F3000\n" + "default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_initial_print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_initial_print_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F6000" }, "machine_end_gcode": { - "default_value": "\nM104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F{retraction_speed} ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors\n" + "default_value": "M104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors" + }, + "material_diameter": { + "default_value": 1.75 } } } - From 6932194df75d81d76df9174e8372e26468a77918 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Nov 2017 10:51:51 +0100 Subject: [PATCH 250/764] Add setting to set the maximum mesh resolution Implements issue CURA-4590. --- resources/definitions/fdmprinter.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b17769eba2..5847b67816 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4827,6 +4827,18 @@ "default_value": false, "settable_per_mesh": true }, + "meshfix_maximum_resolution": + { + "label": "Maximum Resolution", + "description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.", + "type": "float", + "unit": "mm", + "default_value": 0.01, + "minimum_value": "0.001", + "minimum_value_warning": "0.005", + "maximum_value_warning": "0.1", + "settable_per_mesh": true + }, "multiple_mesh_overlap": { "label": "Merged Meshes Overlap", From 565574a18365089cd47ffa5e814a46dd2837cf7d Mon Sep 17 00:00:00 2001 From: orel Windows Date: Mon, 20 Nov 2017 10:59:57 +0100 Subject: [PATCH 251/764] Replace the print temperature setting used in gstart code as layer 0 print temperature seems more relevant. --- resources/definitions/dagoma_discoeasy200.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index ef9a6084c8..3b62ff042f 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -40,7 +40,7 @@ "default_value": 10 }, "machine_start_gcode": { - "default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_initial_print_temperature}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_initial_print_temperature}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F6000" + "default_value": ";Gcode by Cura\nG90 ;absolute positioning\nM106 S250 ;fan on for the palpeur\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_print_temperature_layer_0}\n;Activation palpeur\n;bloc palpeur\nG29 ;Auto level\nM107 ;start with the fan off\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82 ;set extruder to absolute mode\nG92 E0 ;zero the extruded length\nG1 F200 E10 ;extrude 10mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 Z3\nG1 F6000" }, "machine_end_gcode": { "default_value": "M104 S0\nM106 S255 ;start fan full power\nM140 S0 ;heated bed heater off (if you have it)\n;Home machine\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+3 F3000 ;move Z up a bit and retract filament even more\nG90\nG28 X Y\n;Ventilation forcee\nM107 ;stop fan\n;Shut down motor\nM84 ;shut down motors" From 56db10d9cb9315f20dc1ba92223dd76725db0df1 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 20 Nov 2017 11:24:25 +0100 Subject: [PATCH 252/764] CURA-4526 Change simulation behavior when clicking on Play button --- plugins/SimulationView/SimulationView.qml | 41 ++++++++++++++++++----- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index e2e0dc3aed..4c7d99deec 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -583,7 +583,6 @@ Item UM.SimulationView.setSimulationRunning(true) iconSource = "./resources/simulation_pause.svg" simulationTimer.start() - status = 1 } } } @@ -599,18 +598,42 @@ Item var numPaths = UM.SimulationView.numPaths var currentLayer = UM.SimulationView.currentLayer var numLayers = UM.SimulationView.numLayers - if (currentPath >= numPaths) { - if (currentLayer >= numLayers) { - playButton.pauseSimulation() - } - else { - UM.SimulationView.setCurrentLayer(currentLayer+1) + // When the user plays the simulation, if the path slider is at the end of this layer, we start + // the simulation at the beginning of the current layer. + if (playButton.status == 0) + { + if (currentPath >= numPaths) + { UM.SimulationView.setCurrentPath(0) } + else + { + UM.SimulationView.setCurrentPath(currentPath+1) + } } - else { - UM.SimulationView.setCurrentPath(currentPath+1) + // If the simulation is already playing and we reach the end of a layer, then it automatically + // starts at the beginning of the next layer. + else + { + if (currentPath >= numPaths) + { + // At the end of the model, the simulation stops + if (currentLayer >= numLayers) + { + playButton.pauseSimulation() + } + else + { + UM.SimulationView.setCurrentLayer(currentLayer+1) + UM.SimulationView.setCurrentPath(0) + } + } + else + { + UM.SimulationView.setCurrentPath(currentPath+1) + } } + playButton.status = 1 } } } From 74eb17203d0fb528894c8ed50c098db39823f5c8 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 20 Nov 2017 13:04:46 +0100 Subject: [PATCH 253/764] Fix empty containers in stack upgrade --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 4672cb1488..7064da09ad 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -45,6 +45,15 @@ _OLD_NOT_SUPPORTED_PROFILES = [ ] +# Some containers have their specific empty containers, those need to be set correctly. +_EMPTY_CONTAINER_DICT = { + "1": "empty_quality_changes", + "2": "empty_quality", + "3": "empty_material", + "4": "empty_variant", +} + + class VersionUpgrade30to31(VersionUpgrade): ## Gets the version number from a CFG file in Uranium's 3.0 format. # @@ -126,6 +135,11 @@ class VersionUpgrade30to31(VersionUpgrade): if quality_profile_id in _OLD_NOT_SUPPORTED_PROFILES: parser["containers"]["2"] = "empty_quality" + # fix empty containers + for key, specific_empty_container in _EMPTY_CONTAINER_DICT: + if parser.has_option("containers", key) and parser["containers"][key] == "empty": + parser["containers"][key] = specific_empty_container + # Update version numbers if "general" not in parser: parser["general"] = {} From 23f2d9ddfc7ac92526480f75ae3fc64e255864de Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 20 Nov 2017 13:06:02 +0100 Subject: [PATCH 254/764] Fix for loop --- .../VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 7064da09ad..7130871d8e 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -136,7 +136,7 @@ class VersionUpgrade30to31(VersionUpgrade): parser["containers"]["2"] = "empty_quality" # fix empty containers - for key, specific_empty_container in _EMPTY_CONTAINER_DICT: + for key, specific_empty_container in _EMPTY_CONTAINER_DICT.items(): if parser.has_option("containers", key) and parser["containers"][key] == "empty": parser["containers"][key] = specific_empty_container From a5a15df08dc2a4a99b5188b7c4dd4f78d964e468 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Nov 2017 10:51:51 +0100 Subject: [PATCH 255/764] Add setting to set the maximum mesh resolution Implements issue CURA-4590. --- resources/definitions/fdmprinter.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b17769eba2..5847b67816 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4827,6 +4827,18 @@ "default_value": false, "settable_per_mesh": true }, + "meshfix_maximum_resolution": + { + "label": "Maximum Resolution", + "description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.", + "type": "float", + "unit": "mm", + "default_value": 0.01, + "minimum_value": "0.001", + "minimum_value_warning": "0.005", + "maximum_value_warning": "0.1", + "settable_per_mesh": true + }, "multiple_mesh_overlap": { "label": "Merged Meshes Overlap", From 20c21d6e79259804ba3684f193514cec8d5b5587 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 20 Nov 2017 13:52:22 +0100 Subject: [PATCH 256/764] Added "Signal.disconect" after changing views CURA-4526 --- plugins/SimulationView/SimulationViewProxy.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py index 21a962104d..2bd707293f 100644 --- a/plugins/SimulationView/SimulationViewProxy.py +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -16,6 +16,8 @@ class SimulationViewProxy(QObject): self._controller.activeViewChanged.connect(self._onActiveViewChanged) self._onActiveViewChanged() + self.is_simulationView_selected = False + currentLayerChanged = pyqtSignal() currentPathChanged = pyqtSignal() maxLayersChanged = pyqtSignal() @@ -236,6 +238,19 @@ class SimulationViewProxy(QObject): def _onActiveViewChanged(self): active_view = self._controller.getActiveView() if isinstance(active_view, SimulationView.SimulationView.SimulationView): + + # remove other connection if once the SimulationView was created. + if self.is_simulationView_selected: + active_view.currentLayerNumChanged.disconnect(self._onLayerChanged) + active_view.currentPathNumChanged.disconnect(self._onPathChanged) + active_view.maxLayersChanged.disconnect(self._onMaxLayersChanged) + active_view.maxPathsChanged.disconnect(self._onMaxPathsChanged) + active_view.busyChanged.disconnect(self._onBusyChanged) + active_view.activityChanged.disconnect(self._onActivityChanged) + active_view.globalStackChanged.disconnect(self._onGlobalStackChanged) + active_view.preferencesChanged.disconnect(self._onPreferencesChanged) + + self.is_simulationView_selected = True active_view.currentLayerNumChanged.connect(self._onLayerChanged) active_view.currentPathNumChanged.connect(self._onPathChanged) active_view.maxLayersChanged.connect(self._onMaxLayersChanged) From 12bee471eb43ddbd8eb2170414850e775e720748 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 20 Nov 2017 13:01:09 +0100 Subject: [PATCH 257/764] CURA-4104 added settings for flow rate compensated extrusion --- resources/definitions/fdmprinter.def.json | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 5847b67816..8a35839f55 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5471,6 +5471,36 @@ } } }, + "flow_rate_max_extrusion_offset": + { + "label": "Flow rate compensation max extrusion offset", + "description": "The maximum distance in mm to compensate for pressure in the bowden tube.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0, + "value": "0", + "enabled": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "flow_rate_extrusion_offset_factor": + { + "label": "Flow rate compensation factor", + "description": "The multiplication factor for the flow rate -> distance translation.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 100, + "value": "100", + "enabled": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "wireframe_enabled": { "label": "Wire Printing", From c1733dd908392d12c968cdddf86e2ea234531d20 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 20 Nov 2017 14:19:58 +0100 Subject: [PATCH 258/764] Update fdmprinter.def.json --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8a35839f55..a9d7800173 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5474,7 +5474,7 @@ "flow_rate_max_extrusion_offset": { "label": "Flow rate compensation max extrusion offset", - "description": "The maximum distance in mm to compensate for pressure in the bowden tube.", + "description": "The maximum distance in mm to compensate.", "unit": "mm", "type": "float", "minimum_value": "0", From 604105752ddd5d6c9d94ee2adda2c2b67ae085d6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Nov 2017 15:36:54 +0100 Subject: [PATCH 259/764] Fix import in plugin subdirectory Contributes to issue CURA-4526. --- plugins/SimulationView/SimulationView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 90f64a8224..1794822ad2 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -26,7 +26,7 @@ from UM.View.GL.OpenGLContext import OpenGLContext from UM.View.View import View from UM.i18n import i18nCatalog from cura.ConvexHullNode import ConvexHullNode -from plugins.SimulationView.NozzleNode import NozzleNode +from . import NozzleNode from . import SimulationPass, SimulationViewProxy catalog = i18nCatalog("cura") From 775271faac36283156d509630d1efd757baf38f0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 20 Nov 2017 15:57:20 +0100 Subject: [PATCH 260/764] Fix module importing in SimulationView CURA-4526 --- plugins/SimulationView/SimulationView.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 1794822ad2..2751ea4f60 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -11,14 +11,12 @@ from UM.Event import Event, KeyEvent from UM.Job import Job from UM.Logger import Logger from UM.Math.Color import Color -from UM.Math.Vector import Vector from UM.Mesh.MeshBuilder import MeshBuilder from UM.Message import Message from UM.PluginRegistry import PluginRegistry from UM.Preferences import Preferences from UM.Resources import Resources from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Signal import Signal from UM.View.GL.OpenGL import OpenGL @@ -26,8 +24,10 @@ from UM.View.GL.OpenGLContext import OpenGLContext from UM.View.View import View from UM.i18n import i18nCatalog from cura.ConvexHullNode import ConvexHullNode -from . import NozzleNode -from . import SimulationPass, SimulationViewProxy + +from .NozzleNode import NozzleNode +from .SimulationPass import SimulationPass +from .SimulationViewProxy import SimulationViewProxy catalog = i18nCatalog("cura") @@ -70,7 +70,7 @@ class SimulationView(View): self._old_composite_shader = None self._global_container_stack = None - self._proxy = SimulationViewProxy.SimulationViewProxy() + self._proxy = SimulationViewProxy() self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) self._resetSettings() @@ -123,7 +123,7 @@ class SimulationView(View): if not self._layer_pass: # Currently the RenderPass constructor requires a size > 0 # This should be fixed in RenderPass's constructor. - self._layer_pass = SimulationPass.SimulationPass(1, 1) + self._layer_pass = SimulationPass(1, 1) self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) self._layer_pass.setSimulationView(self) return self._layer_pass From 148368399224e22b3b61c8df15a3fa48f03bc1f6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Nov 2017 17:17:16 +0100 Subject: [PATCH 261/764] Move play button to path slider --- plugins/SimulationView/SimulationView.qml | 14 +++++++------- resources/themes/cura-light/theme.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 4c7d99deec..8f6dcf0af0 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -472,8 +472,9 @@ Item PathSlider { id: pathSlider - width: parent.width height: UM.Theme.getSize("slider_handle").width + anchors.right: playButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.left: parent.left visible: !UM.SimulationView.compatibilityMode @@ -508,8 +509,8 @@ Item height: UM.Theme.getSize("layerview_menu_size").height anchors { - top: pathSlider.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").height + top: playButton.bottom + topMargin: UM.Theme.getSize("default_margin").height right: parent.right rightMargin: UM.Theme.getSize("slider_layerview_margin").width } @@ -546,15 +547,14 @@ Item // Play simulation button Button { id: playButton - implicitWidth: UM.Theme.getSize("button").width * 0.75; - implicitHeight: UM.Theme.getSize("button").height * 0.75; + implicitWidth: Math.floor(UM.Theme.getSize("button").width * 0.75) + implicitHeight: Math.floor(UM.Theme.getSize("button").height * 0.75) iconSource: "./resources/simulation_resume.svg" style: UM.Theme.styles.tool_button visible: !UM.SimulationView.compatibilityMode anchors { horizontalCenter: layerSlider.horizontalCenter - top: layerSlider.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").width + verticalCenter: pathSlider.verticalCenter } property var status: 0 // indicates if it's stopped (0) or playing (1) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 4197285dd8..76f4ab9fc6 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -344,7 +344,7 @@ "slider_handle": [1.0, 1.0], "slider_layerview_size": [1.0, 22.0], "slider_layerview_background": [4.0, 0.0], - "slider_layerview_margin": [1.0, 1.0], + "slider_layerview_margin": [1.0, 1.5], "layerview_menu_size": [15, 19.5], "layerview_menu_size_material_color_mode": [15, 15.5], From df1a11ca07631842cda34ac4518c6fde7f0e8afa Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 16:03:28 +0100 Subject: [PATCH 262/764] Don't crash if support density is 0 Found while working on CURA-4523. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b17769eba2..6628086179 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3495,7 +3495,7 @@ "minimum_value_warning": "support_line_width", "default_value": 2.66, "enabled": "support_enable", - "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", + "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -5107,7 +5107,7 @@ "description": "Skip one in every N connection lines to make the support structure easier to break away.", "type": "int", "default_value": 5, - "value": "round(support_skip_zag_per_mm / support_line_distance)", + "value": "0 if support_line_distance == 0 else round(support_skip_zag_per_mm / support_line_distance)", "minimum_value": "1", "minimum_value_warning": "3", "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", From 085e933e344e71848ca9a02c228b33064537d2f9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 10:59:14 +0100 Subject: [PATCH 263/764] Move ironing into shell category It is no longer considered experimental. --- resources/definitions/fdmprinter.def.json | 236 +++++++++++----------- 1 file changed, 118 insertions(+), 118 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6628086179..bf65baf1d9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1340,6 +1340,124 @@ "type": "int", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true + }, + "ironing_enabled": + { + "label": "Enable Ironing", + "description": "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface.", + "type": "bool", + "default_value": false, + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_only_highest_layer": + { + "label": "Iron Only Highest Layer", + "description": "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish.", + "type": "bool", + "default_value": false, + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_pattern": + { + "label": "Ironing Pattern", + "description": "The pattern to use for ironing top surfaces.", + "type": "enum", + "options": + { + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "zigzag", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_line_spacing": + { + "label": "Ironing Line Spacing", + "description": "The distance between the lines of ironing.", + "type": "float", + "unit": "mm", + "default_value": 0.1, + "minimum_value": "0.001", + "maximum_value_warning": "machine_nozzle_tip_outer_diameter", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_flow": + { + "label": "Ironing Flow", + "description": "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface.", + "type": "float", + "unit": "%", + "default_value": 10.0, + "minimum_value": "0", + "maximum_value_warning": "50", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "ironing_inset": + { + "label": "Ironing Inset", + "description": "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print.", + "type": "float", + "unit": "mm", + "default_value": 0.35, + "value": "wall_line_width_0 / 2", + "minimum_value_warning": "0", + "maximum_value_warning": "wall_line_width_0", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "speed_ironing": + { + "label": "Ironing Speed", + "description": "The speed at which to pass over the top surface.", + "type": "float", + "unit": "mm/s", + "default_value": 20.0, + "value": "speed_topbottom * 20 / 30", + "minimum_value": "0.001", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "100", + "enabled": "ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "acceleration_ironing": + { + "label": "Ironing Acceleration", + "description": "The acceleration with which ironing is performed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_topbottom", + "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "jerk_ironing": + { + "label": "Ironing Jerk", + "description": "The maximum instantaneous velocity change while performing ironing.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_topbottom", + "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true } } }, @@ -5813,124 +5931,6 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false - }, - "ironing_enabled": - { - "label": "Enable Ironing", - "description": "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface.", - "type": "bool", - "default_value": false, - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_only_highest_layer": - { - "label": "Iron Only Highest Layer", - "description": "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish.", - "type": "bool", - "default_value": false, - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_pattern": - { - "label": "Ironing Pattern", - "description": "The pattern to use for ironing top surfaces.", - "type": "enum", - "options": - { - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default_value": "zigzag", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_line_spacing": - { - "label": "Ironing Line Spacing", - "description": "The distance between the lines of ironing.", - "type": "float", - "unit": "mm", - "default_value": 0.1, - "minimum_value": "0.001", - "maximum_value_warning": "machine_nozzle_tip_outer_diameter", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_flow": - { - "label": "Ironing Flow", - "description": "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface.", - "type": "float", - "unit": "%", - "default_value": 10.0, - "minimum_value": "0", - "maximum_value_warning": "50", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "ironing_inset": - { - "label": "Ironing Inset", - "description": "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print.", - "type": "float", - "unit": "mm", - "default_value": 0.35, - "value": "wall_line_width_0 / 2", - "minimum_value_warning": "0", - "maximum_value_warning": "wall_line_width_0", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "speed_ironing": - { - "label": "Ironing Speed", - "description": "The speed at which to pass over the top surface.", - "type": "float", - "unit": "mm/s", - "default_value": 20.0, - "value": "speed_topbottom * 20 / 30", - "minimum_value": "0.001", - "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", - "maximum_value_warning": "100", - "enabled": "ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "acceleration_ironing": - { - "label": "Ironing Acceleration", - "description": "The acceleration with which ironing is performed.", - "unit": "mm/s²", - "type": "float", - "minimum_value": "0.1", - "minimum_value_warning": "100", - "maximum_value_warning": "10000", - "default_value": 3000, - "value": "acceleration_topbottom", - "enabled": "resolveOrValue('acceleration_enabled') and ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true - }, - "jerk_ironing": - { - "label": "Ironing Jerk", - "description": "The maximum instantaneous velocity change while performing ironing.", - "unit": "mm/s", - "type": "float", - "minimum_value": "0", - "maximum_value_warning": "50", - "default_value": 20, - "value": "jerk_topbottom", - "enabled": "resolveOrValue('jerk_enabled') and ironing_enabled", - "limit_to_extruder": "top_bottom_extruder_nr", - "settable_per_mesh": true } } }, From da14ce5bef7b2ad56dc9942a26e1cffcd854f38e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 11:46:55 +0100 Subject: [PATCH 264/764] Add to all installation to lib/ folders Some systems have a suffix there to indicate the address size, such as lib64. --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 44b4b57f54..9296c4ce4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ find_package(PythonInterp 3.5.0 REQUIRED) install(DIRECTORY resources DESTINATION ${CMAKE_INSTALL_DATADIR}/cura) install(DIRECTORY plugins - DESTINATION lib/cura) + DESTINATION lib${LIB_SUFFIX}/cura) if(NOT APPLE AND NOT WIN32) install(FILES cura_app.py DESTINATION ${CMAKE_INSTALL_BINDIR} @@ -47,16 +47,16 @@ if(NOT APPLE AND NOT WIN32) RENAME cura) if(EXISTS /etc/debian_version) install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}/dist-packages/cura) else() install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) endif() install(FILES ${CMAKE_BINARY_DIR}/cura.desktop DESTINATION ${CMAKE_INSTALL_DATADIR}/applications) @@ -72,8 +72,8 @@ else() DESTINATION ${CMAKE_INSTALL_BINDIR} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE) install(DIRECTORY cura - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages FILES_MATCHING PATTERN *.py) install(FILES ${CMAKE_BINARY_DIR}/CuraVersion.py - DESTINATION lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) + DESTINATION lib${LIB_SUFFIX}/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/site-packages/cura) endif() From 657a91c525ee7743bce7b51fd1dfbbf3ac54a67e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 17 Nov 2017 13:09:54 +0100 Subject: [PATCH 265/764] Merge pull request #2685 from Ultimaker/container_stack_improvements Container stack improvements --- .gitignore | 1 + cura/BuildVolume.py | 94 ++---- cura/ConvexHullDecorator.py | 21 +- cura/CuraApplication.py | 29 +- cura/Settings/CuraContainerRegistry.py | 74 ++++- cura/Settings/CuraContainerStack.py | 4 +- cura/Settings/CuraStackBuilder.py | 45 ++- cura/Settings/ExtruderManager.py | 298 +++++------------- cura/Settings/ExtruderStack.py | 5 + cura/Settings/ExtrudersModel.py | 70 ++-- cura/Settings/GlobalStack.py | 11 +- cura/Settings/MachineManager.py | 206 ++++++------ cura/Settings/ProfilesModel.py | 69 ++-- cura/Settings/QualityAndUserProfilesModel.py | 42 +-- cura/Settings/QualitySettingsModel.py | 1 - cura/Settings/SettingInheritanceManager.py | 25 +- cura/Settings/SettingOverrideDecorator.py | 6 +- cura/Settings/UserProfilesModel.py | 42 +-- plugins/3MFReader/ThreeMFReader.py | 17 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 31 +- plugins/3MFWriter/ThreeMFWriter.py | 2 +- plugins/CuraEngineBackend/StartSliceJob.py | 23 +- .../MachineSettingsAction.py | 104 ++---- .../PerObjectSettingsTool.py | 37 +-- plugins/SliceInfoPlugin/SliceInfo.py | 11 +- plugins/SolidView/SolidView.py | 46 +-- .../UM2UpgradeSelection.py | 4 +- .../XmlMaterialProfile/XmlMaterialProfile.py | 2 +- resources/definitions/101Hero.def.json | 4 - resources/definitions/3dator.def.json | 7 +- resources/definitions/fdmextruder.def.json | 3 +- resources/qml/Cura.qml | 2 +- resources/qml/ExtruderButton.qml | 2 +- resources/qml/Menus/ContextMenu.qml | 2 +- resources/qml/Menus/MaterialMenu.qml | 16 +- resources/qml/Menus/NozzleMenu.qml | 14 +- resources/qml/Menus/ProfileMenu.qml | 2 +- resources/qml/Preferences/ProfilesPage.qml | 2 +- resources/qml/PrintMonitor.qml | 2 +- resources/qml/Settings/SettingItem.qml | 2 +- resources/qml/Settings/SettingView.qml | 8 +- resources/qml/SidebarHeader.qml | 4 +- resources/qml/SidebarSimple.qml | 2 +- 43 files changed, 556 insertions(+), 836 deletions(-) diff --git a/.gitignore b/.gitignore index 570c932d28..ac1e8eba92 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,7 @@ plugins/ProfileFlattener plugins/cura-god-mode-plugin plugins/cura-big-flame-graph plugins/cura-siemensnx-plugin +plugins/CuraVariSlicePlugin #Build stuff CMakeCache.txt diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e87bfebd94..50f63e49d5 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -876,15 +876,6 @@ class BuildVolume(SceneNode): return result - ## Private convenience function to get a setting from the adhesion - # extruder. - # - # \param setting_key The key of the setting to get. - # \param property The property to get from the setting. - # \return The property of the specified setting in the adhesion extruder. - def _getSettingFromAdhesionExtruder(self, setting_key, property = "value"): - return self._getSettingFromExtruder(setting_key, "adhesion_extruder_nr", property) - ## Private convenience function to get a setting from every extruder. # # For single extrusion machines, this gets the setting from the global @@ -899,44 +890,6 @@ class BuildVolume(SceneNode): all_values[i] = 0 return all_values - ## Private convenience function to get a setting from the support infill - # extruder. - # - # \param setting_key The key of the setting to get. - # \param property The property to get from the setting. - # \return The property of the specified setting in the support infill - # extruder. - def _getSettingFromSupportInfillExtruder(self, setting_key, property = "value"): - return self._getSettingFromExtruder(setting_key, "support_infill_extruder_nr", property) - - ## Helper function to get a setting from an extruder specified in another - # setting. - # - # \param setting_key The key of the setting to get. - # \param extruder_setting_key The key of the setting that specifies from - # which extruder to get the setting, if there are multiple extruders. - # \param property The property to get from the setting. - # \return The property of the specified setting in the specified extruder. - def _getSettingFromExtruder(self, setting_key, extruder_setting_key, property = "value"): - multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 - - if not multi_extrusion: - stack = self._global_container_stack - else: - extruder_index = self._global_container_stack.getProperty(extruder_setting_key, "value") - - if str(extruder_index) == "-1": # If extruder index is -1 use global instead - stack = self._global_container_stack - else: - extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] - stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - - value = stack.getProperty(setting_key, property) - setting_type = stack.getProperty(setting_key, "type") - if not value and (setting_type == "int" or setting_type == "float"): - return 0 - return value - ## Convenience function to calculate the disallowed radius around the edge. # # This disallowed radius is to allow for space around the models that is @@ -945,6 +898,7 @@ class BuildVolume(SceneNode): def _getEdgeDisallowedSize(self): if not self._global_container_stack: return 0 + container_stack = self._global_container_stack used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks() @@ -953,32 +907,44 @@ class BuildVolume(SceneNode): return 0.1 # Return a very small value, so we do draw disallowed area's near the edges. adhesion_type = container_stack.getProperty("adhesion_type", "value") + skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value") + initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value") if adhesion_type == "skirt": - skirt_distance = self._getSettingFromAdhesionExtruder("skirt_gap") - skirt_line_count = self._getSettingFromAdhesionExtruder("skirt_line_count") - bed_adhesion_size = skirt_distance + (self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * skirt_line_count) * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 - if len(used_extruders) > 1: - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - #We don't create an additional line for the extruder we're printing the skirt with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value") + skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value") + + bed_adhesion_size = skirt_distance + (skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the skirt with. + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 + elif adhesion_type == "brim": - bed_adhesion_size = self._getSettingFromAdhesionExtruder("skirt_brim_line_width") * self._getSettingFromAdhesionExtruder("brim_line_count") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor") / 100.0 - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in used_extruders: - bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 - #We don't create an additional line for the extruder we're printing the brim with. - bed_adhesion_size -= self._getSettingFromAdhesionExtruder("skirt_brim_line_width", "value") * self._getSettingFromAdhesionExtruder("initial_layer_line_width_factor", "value") / 100.0 + brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value") + bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0 + + for extruder_stack in used_extruders: + bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0 + + # We don't create an additional line for the extruder we're printing the brim with. + bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0 + elif adhesion_type == "raft": - bed_adhesion_size = self._getSettingFromAdhesionExtruder("raft_margin") + bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value") + elif adhesion_type == "none": bed_adhesion_size = 0 + else: raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?") support_expansion = 0 - if self._getSettingFromSupportInfillExtruder("support_offset") and self._global_container_stack.getProperty("support_enable", "value"): - support_expansion += self._getSettingFromSupportInfillExtruder("support_offset") + support_enabled = self._global_container_stack.getProperty("support_enable", "value") + support_offset = self._global_container_stack.getProperty("support_offset", "value") + if support_enabled and support_offset: + support_expansion += support_offset farthest_shield_distance = 0 if container_stack.getProperty("draft_shield_enabled", "value"): diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index bfeb690192..50fa8ce7f6 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -302,24 +302,23 @@ class ConvexHullDecorator(SceneNodeDecorator): self._onChanged() ## Private convenience function to get a setting from the correct extruder (as defined by limit_to_extruder property). - def _getSettingProperty(self, setting_key, property = "value"): + def _getSettingProperty(self, setting_key, prop = "value"): per_mesh_stack = self._node.callDecoration("getStack") if per_mesh_stack: - return per_mesh_stack.getProperty(setting_key, property) - - multi_extrusion = self._global_stack.getProperty("machine_extruder_count", "value") > 1 - if not multi_extrusion: - return self._global_stack.getProperty(setting_key, property) + return per_mesh_stack.getProperty(setting_key, prop) extruder_index = self._global_stack.getProperty(setting_key, "limit_to_extruder") - if extruder_index == "-1": #No limit_to_extruder. + if extruder_index == "-1": + # No limit_to_extruder extruder_stack_id = self._node.callDecoration("getActiveExtruder") - if not extruder_stack_id: #Decoration doesn't exist. + if not extruder_stack_id: + # Decoration doesn't exist extruder_stack_id = ExtruderManager.getInstance().extruderIds["0"] extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - return extruder_stack.getProperty(setting_key, property) - else: #Limit_to_extruder is set. The global stack handles this then. - return self._global_stack.getProperty(setting_key, property) + return extruder_stack.getProperty(setting_key, prop) + else: + # Limit_to_extruder is set. The global stack handles this then + return self._global_stack.getProperty(setting_key, prop) ## Returns true if node is a descendant or the same as the root node. def __isDescendant(self, root, node): diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 96ca15741e..8c1ee8fc36 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -200,6 +200,7 @@ class CuraApplication(QtApplication): self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. + self._extruder_manager = None self._material_manager = None self._setting_inheritance_manager = None self._simple_mode_settings_manager = None @@ -260,14 +261,17 @@ class CuraApplication(QtApplication): # Since they are empty, they should never be serialized and instead just programmatically created. # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) empty_variant_container._id = "empty_variant" empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) + empty_material_container = copy.deepcopy(empty_container) empty_material_container._id = "empty_material" empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) + empty_quality_container = copy.deepcopy(empty_container) empty_quality_container._id = "empty_quality" empty_quality_container.setName("Not Supported") @@ -275,6 +279,7 @@ class CuraApplication(QtApplication): empty_quality_container.addMetaDataEntry("type", "quality") empty_quality_container.addMetaDataEntry("supported", False) ContainerRegistry.getInstance().addContainer(empty_quality_container) + empty_quality_changes_container = copy.deepcopy(empty_container) empty_quality_changes_container._id = "empty_quality_changes" empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") @@ -425,7 +430,7 @@ class CuraApplication(QtApplication): def discardOrKeepProfileChangesClosed(self, option): if option == "discard": global_stack = self.getGlobalContainerStack() - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in self._extruder_manager.getMachineExtruders(global_stack.getId()): extruder.getTop().clear() global_stack.getTop().clear() @@ -433,7 +438,7 @@ class CuraApplication(QtApplication): # before slicing. To ensure that slicer uses right settings values elif option == "keep": global_stack = self.getGlobalContainerStack() - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + for extruder in self._extruder_manager.getMachineExtruders(global_stack.getId()): user_extruder_container = extruder.getTop() if user_extruder_container: user_extruder_container.update() @@ -699,16 +704,13 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) - # Initialise extruder so as to listen to global container stack changes before the first global container stack is set. - ExtruderManager.getInstance() + qmlRegisterSingletonType(ExtruderManager, "Cura", 1, 0, "ExtruderManager", self.getExtruderManager) qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, "MachineManager", self.getMachineManager) qmlRegisterSingletonType(MaterialManager, "Cura", 1, 0, "MaterialManager", self.getMaterialManager) - qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", - self.getSettingInheritanceManager) - qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", - self.getSimpleModeSettingsManager) - + qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, "SettingInheritanceManager", self.getSettingInheritanceManager) + qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) + self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) @@ -733,6 +735,11 @@ class CuraApplication(QtApplication): self._machine_manager = MachineManager.createMachineManager() return self._machine_manager + def getExtruderManager(self, *args): + if self._extruder_manager is None: + self._extruder_manager = ExtruderManager.createExtruderManager() + return self._extruder_manager + def getMaterialManager(self, *args): if self._material_manager is None: self._material_manager = MaterialManager.createMaterialManager() @@ -783,7 +790,6 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") - qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) qmlRegisterType(MaterialsModel, "Cura", 1, 0, "MaterialsModel") @@ -793,15 +799,12 @@ class CuraApplication(QtApplication): qmlRegisterType(QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") - qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) qmlRegisterSingletonType(actions_url, "Cura", 1, 0, "Actions") - engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.getInstance()) - for path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.QmlFiles): type_name = os.path.splitext(os.path.basename(path))[0] if type_name in ("Cura", "Actions"): diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index e623bd860b..5cfe867bc2 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -17,7 +17,7 @@ from UM.Application import Application from UM.Logger import Logger from UM.Message import Message from UM.Platform import Platform -from UM.PluginRegistry import PluginRegistry #For getting the possible profile writers to write with. +from UM.PluginRegistry import PluginRegistry # For getting the possible profile writers to write with. from UM.Util import parseBool from . import ExtruderStack @@ -42,12 +42,13 @@ class CuraContainerRegistry(ContainerRegistry): # Global stack based on metadata information. @override(ContainerRegistry) def addContainer(self, container): + # Note: Intentional check with type() because we want to ignore subclasses if type(container) == ContainerStack: container = self._convertContainerStack(container) if isinstance(container, InstanceContainer) and type(container) != type(self.getEmptyInstanceContainer()): - #Check against setting version of the definition. + # Check against setting version of the definition. required_setting_version = CuraApplication.SettingVersion actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0)) if required_setting_version != actual_setting_version: @@ -256,7 +257,8 @@ class CuraContainerRegistry(ContainerRegistry): @override(ContainerRegistry) def load(self): super().load() - self._fixupExtruders() + self._registerSingleExtrusionMachinesExtruderStacks() + self._connectUpgradedExtruderStacksToMachines() ## Update an imported profile to match the current machine configuration. # @@ -299,10 +301,13 @@ class CuraContainerRegistry(ContainerRegistry): machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() del quality_type_criteria["definition"] - materials = None + + # materials = None + if "material" in quality_type_criteria: - materials = ContainerRegistry.getInstance().findInstanceContainers(id = quality_type_criteria["material"]) + # materials = ContainerRegistry.getInstance().findInstanceContainers(id = quality_type_criteria["material"]) del quality_type_criteria["material"] + # Do not filter quality containers here with materials because we are trying to import a profile, so it should # NOT be restricted by the active materials on the current machine. materials = None @@ -360,8 +365,8 @@ class CuraContainerRegistry(ContainerRegistry): return global_container_stack.material.getId() return "" - ## Returns true if the current machien requires its own quality profiles - # \return true if the current machien requires its own quality profiles + ## Returns true if the current machine requires its own quality profiles + # \return true if the current machine requires its own quality profiles def _machineHasOwnQualities(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: @@ -394,12 +399,65 @@ class CuraContainerRegistry(ContainerRegistry): return new_stack + def _registerSingleExtrusionMachinesExtruderStacks(self): + machines = ContainerRegistry.getInstance().findContainerStacks(machine_extruder_trains = {"0": "fdmextruder"}) + for machine in machines: + self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): + new_extruder_id = extruder_id + extruder_stack = None + + # if extruders are defined in the machine definition use those instead + if machine.extruders and len(machine.extruders) > 0: + new_extruder_id = machine.extruders["0"].getId() + extruder_stack = machine.extruders["0"] + + # if the extruder stack doesn't exist yet we create and add it + if not extruder_stack: + extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) + if not extruder_definitions: + Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) + return + + extruder_definition = extruder_definitions[0] + unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) + + extruder_stack = ExtruderStack.ExtruderStack(unique_name) + extruder_stack.setName(extruder_definition.getName()) + extruder_stack.setDefinition(extruder_definition) + extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) + extruder_stack.setNextStack(machine) + + if machine.userChanges: + # set existing user changes if found + extruder_stack.setUserChanges(machine.userChanges) + else: + # create empty user changes container otherwise + user_container = InstanceContainer(extruder_stack.id + "_user") + user_container.addMetaDataEntry("type", "user") + user_container.addMetaDataEntry("machine", extruder_stack.getId()) + from cura.CuraApplication import CuraApplication + user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + user_container.setDefinition(extruder_definition) + extruder_stack.setUserChanges(user_container) + self.addContainer(user_container) + + variant_id = "default" + if machine.variant.getId() != "empty_variant": + variant_id = machine.variant.getId() + extruder_stack.setVariantById(variant_id) + extruder_stack.setMaterialById("default") + extruder_stack.setQualityById("default") + + self.addContainer(extruder_stack) + # Fix the extruders that were upgraded to ExtruderStack instances during addContainer. # The stacks are now responsible for setting the next stack on deserialize. However, # due to problems with loading order, some stacks may not have the proper next stack # set after upgrading, because the proper global stack was not yet loaded. This method # makes sure those extruders also get the right stack set. - def _fixupExtruders(self): + def _connectUpgradedExtruderStacksToMachines(self): extruder_stacks = self.findContainers(ExtruderStack.ExtruderStack) for extruder_stack in extruder_stacks: if extruder_stack.getNextStack(): diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 2d3bf683f6..2a804def4d 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -396,7 +396,9 @@ class CuraContainerStack(ContainerStack): # \note This method assumes the stack has a valid machine definition. def findDefaultVariant(self) -> Optional[ContainerInterface]: definition = self._getMachineDefinition() - if not definition.getMetaDataEntry("has_variants"): + # has_variants can be overridden in other containers and stacks. + # In the case of UM2, it is overridden in the GlobalStack + if not self.getMetaDataEntry("has_variants"): # If the machine does not use variants, we should never set a variant. return None diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 09815da319..a661237722 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -47,21 +47,40 @@ class CuraStackBuilder: new_global_stack.setName(generated_name) - for extruder_definition in registry.findDefinitionContainers(machine = machine_definition.id): - position = extruder_definition.getMetaDataEntry("position", None) - if not position: - Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.id) + extruder_definition = registry.findDefinitionContainers(machine = machine_definition.getId()) - new_extruder_id = registry.uniqueName(extruder_definition.id) + if not extruder_definition: + # create extruder stack for single extrusion machines that have no separate extruder definition files + extruder_definition = registry.findDefinitionContainers(id = "fdmextruder")[0] + new_extruder_id = registry.uniqueName(machine_definition.getName() + " " + extruder_definition.id) new_extruder = cls.createExtruderStack( new_extruder_id, - definition = extruder_definition, - machine_definition = machine_definition, - quality = "default", - material = "default", - variant = "default", - next_stack = new_global_stack + definition=extruder_definition, + machine_definition=machine_definition, + quality="default", + material="default", + variant="default", + next_stack=new_global_stack ) + new_global_stack.addExtruder(new_extruder) + else: + # create extruder stack for each found extruder definition + for extruder_definition in registry.findDefinitionContainers(machine = machine_definition.id): + position = extruder_definition.getMetaDataEntry("position", None) + if not position: + Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.id) + + new_extruder_id = registry.uniqueName(extruder_definition.id) + new_extruder = cls.createExtruderStack( + new_extruder_id, + definition = extruder_definition, + machine_definition = machine_definition, + quality = "default", + material = "default", + variant = "default", + next_stack = new_global_stack + ) + new_global_stack.addExtruder(new_extruder) return new_global_stack @@ -79,7 +98,9 @@ class CuraStackBuilder: stack.setName(definition.getName()) stack.setDefinition(definition) stack.addMetaDataEntry("position", definition.getMetaDataEntry("position")) - if "next_stack" in kwargs: #Add stacks before containers are added, since they may trigger a setting update. + + if "next_stack" in kwargs: + # Add stacks before containers are added, since they may trigger a setting update. stack.setNextStack(kwargs["next_stack"]) user_container = InstanceContainer(new_stack_id + "_user") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index c8daca7f92..34b283107d 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -1,21 +1,18 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant #For communicating data and events to Qt. +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant # For communicating data and events to Qt. from UM.FlameProfiler import pyqtSlot -from UM.Application import Application #To get the global container stack to find the current machine. +from UM.Application import Application # To get the global container stack to find the current machine. from UM.Logger import Logger -from UM.Decorators import deprecated from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator -from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers by ID. -from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID. from UM.Settings.SettingFunction import SettingFunction from UM.Settings.ContainerStack import ContainerStack -from UM.Settings.Interfaces import DefinitionContainerInterface from UM.Settings.PropertyEvaluationContext import PropertyEvaluationContext from typing import Optional, List, TYPE_CHECKING, Union @@ -28,6 +25,20 @@ if TYPE_CHECKING: # # This keeps a list of extruder stacks for each machine. class ExtruderManager(QObject): + + ## Registers listeners and such to listen to changes to the extruders. + def __init__(self, parent = None): + super().__init__(parent) + + self._extruder_trains = {} # Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. + self._active_extruder_index = -1 # Indicates the index of the active extruder stack. -1 means no active extruder stack + self._selected_object_extruders = [] + self._global_container_stack_definition_id = None + self._addCurrentMachineExtruders() + + Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) + Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) + ## Signal to notify other components when the list of extruders for a machine definition changes. extrudersChanged = pyqtSignal(QVariant) @@ -38,18 +49,6 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() - ## Registers listeners and such to listen to changes to the extruders. - def __init__(self, parent = None): - super().__init__(parent) - self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. Only for separately defined extruders. - self._active_extruder_index = -1 # Indicates the index of the active extruder stack. -1 means no active extruder stack - self._selected_object_extruders = [] - Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) - self._global_container_stack_definition_id = None - self._addCurrentMachineExtruders() - - Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) - ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -59,10 +58,10 @@ class ExtruderManager(QObject): @pyqtProperty(str, notify = activeExtruderChanged) def activeExtruderStackId(self) -> Optional[str]: if not Application.getInstance().getGlobalContainerStack(): - return None # No active machine, so no active extruder. + return None # No active machine, so no active extruder. try: return self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][str(self._active_extruder_index)].getId() - except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. + except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. return None ## Return extruder count according to extruder trains. @@ -76,23 +75,23 @@ class ExtruderManager(QObject): return 0 ## Gets a dict with the extruder stack ids with the extruder number as the key. - # The key "-1" indicates the global stack id. - # @pyqtProperty("QVariantMap", notify = extrudersChanged) def extruderIds(self): extruder_stack_ids = {} + global_stack_id = Application.getInstance().getGlobalContainerStack().getId() - extruder_stack_ids["-1"] = global_stack_id + if global_stack_id in self._extruder_trains: for position in self._extruder_trains[global_stack_id]: extruder_stack_ids[position] = self._extruder_trains[global_stack_id][position].getId() + return extruder_stack_ids @pyqtSlot(str, result = str) - def getQualityChangesIdByExtruderStackId(self, id: str) -> str: + def getQualityChangesIdByExtruderStackId(self, extruder_stack_id: str) -> str: for position in self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()]: extruder = self._extruder_trains[Application.getInstance().getGlobalContainerStack().getId()][position] - if extruder.getId() == id: + if extruder.getId() == extruder_stack_id: return extruder.qualityChanges.getId() ## The instance of the singleton pattern. @@ -100,6 +99,10 @@ class ExtruderManager(QObject): # It's None if the extruder manager hasn't been created yet. __instance = None + @staticmethod + def createExtruderManager(): + return ExtruderManager().getInstance() + ## Gets an instance of the extruder manager, or creates one if no instance # exists yet. # @@ -185,6 +188,7 @@ class ExtruderManager(QObject): if global_container_stack.getId() in self._extruder_trains: if str(self._active_extruder_index) in self._extruder_trains[global_container_stack.getId()]: return self._extruder_trains[global_container_stack.getId()][str(self._active_extruder_index)] + return None ## Get an extruder stack by index @@ -203,40 +207,6 @@ class ExtruderManager(QObject): result.append(self.getExtruderStack(i)) return result - ## Adds all extruders of a specific machine definition to the extruder - # manager. - # - # \param machine_definition The machine definition to add the extruders for. - # \param machine_id The machine_id to add the extruders for. - @deprecated("Use CuraStackBuilder", "2.6") - def addMachineExtruders(self, machine_definition: DefinitionContainerInterface, machine_id: str) -> None: - changed = False - machine_definition_id = machine_definition.getId() - if machine_id not in self._extruder_trains: - self._extruder_trains[machine_id] = { } - changed = True - container_registry = ContainerRegistry.getInstance() - if container_registry: - # Add the extruder trains that don't exist yet. - for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition_id): - position = extruder_definition.getMetaDataEntry("position", None) - if not position: - Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) - if not container_registry.findContainerStacks(machine = machine_id, position = position): # Doesn't exist yet. - self.createExtruderTrain(extruder_definition, machine_definition, position, machine_id) - changed = True - - # Gets the extruder trains that we just created as well as any that still existed. - extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_id) - for extruder_train in extruder_trains: - self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train - - # regardless of what the next stack is, we have to set it again, because of signal routing. - extruder_train.setNextStack(Application.getInstance().getGlobalContainerStack()) - changed = True - if changed: - self.extrudersChanged.emit(machine_id) - def registerExtruder(self, extruder_train, machine_id): changed = False @@ -256,138 +226,6 @@ class ExtruderManager(QObject): if changed: self.extrudersChanged.emit(machine_id) - ## Creates a container stack for an extruder train. - # - # The container stack has an extruder definition at the bottom, which is - # linked to a machine definition. Then it has a variant profile, a material - # profile, a quality profile and a user profile, in that order. - # - # The resulting container stack is added to the registry. - # - # \param extruder_definition The extruder to create the extruder train for. - # \param machine_definition The machine that the extruder train belongs to. - # \param position The position of this extruder train in the extruder slots of the machine. - # \param machine_id The id of the "global" stack this extruder is linked to. - @deprecated("Use CuraStackBuilder::createExtruderStack", "2.6") - def createExtruderTrain(self, extruder_definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, - position, machine_id: str) -> None: - # Cache some things. - container_registry = ContainerRegistry.getInstance() - machine_definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_definition) - - # Create a container stack for this extruder. - extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) - container_stack = ContainerStack(extruder_stack_id) - container_stack.setName(extruder_definition.getName()) # Take over the display name to display the stack with. - container_stack.addMetaDataEntry("type", "extruder_train") - container_stack.addMetaDataEntry("machine", machine_id) - container_stack.addMetaDataEntry("position", position) - container_stack.addContainer(extruder_definition) - - # Find the variant to use for this extruder. - variant = container_registry.findInstanceContainers(id = "empty_variant")[0] - if machine_definition.getMetaDataEntry("has_variants"): - # First add any variant. Later, overwrite with preference if the preference is valid. - variants = container_registry.findInstanceContainers(definition = machine_definition_id, type = "variant") - if len(variants) >= 1: - variant = variants[0] - preferred_variant_id = machine_definition.getMetaDataEntry("preferred_variant") - if preferred_variant_id: - preferred_variants = container_registry.findInstanceContainers(id = preferred_variant_id, definition = machine_definition_id, type = "variant") - if len(preferred_variants) >= 1: - variant = preferred_variants[0] - else: - Logger.log("w", "The preferred variant \"%s\" of machine %s doesn't exist or is not a variant profile.", preferred_variant_id, machine_id) - # And leave it at the default variant. - container_stack.addContainer(variant) - - # Find a material to use for this variant. - material = container_registry.findInstanceContainers(id = "empty_material")[0] - if machine_definition.getMetaDataEntry("has_materials"): - # First add any material. Later, overwrite with preference if the preference is valid. - machine_has_variant_materials = machine_definition.getMetaDataEntry("has_variant_materials", default = False) - if machine_has_variant_materials or machine_has_variant_materials == "True": - materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id, variant = variant.getId()) - else: - materials = container_registry.findInstanceContainers(type = "material", definition = machine_definition_id) - if len(materials) >= 1: - material = materials[0] - preferred_material_id = machine_definition.getMetaDataEntry("preferred_material") - if preferred_material_id: - global_stack = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - if global_stack: - approximate_material_diameter = str(round(global_stack[0].getProperty("material_diameter", "value"))) - else: - approximate_material_diameter = str(round(machine_definition.getProperty("material_diameter", "value"))) - - search_criteria = { "type": "material", "id": preferred_material_id, "approximate_diameter": approximate_material_diameter} - if machine_definition.getMetaDataEntry("has_machine_materials"): - search_criteria["definition"] = machine_definition_id - - if machine_definition.getMetaDataEntry("has_variants") and variant: - search_criteria["variant"] = variant.id - else: - search_criteria["definition"] = "fdmprinter" - - preferred_materials = container_registry.findInstanceContainers(**search_criteria) - if len(preferred_materials) >= 1: - # In some cases we get multiple materials. In that case, prefer materials that are marked as read only. - read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if preferred_material.isReadOnly()] - if len(read_only_preferred_materials) >= 1: - material = read_only_preferred_materials[0] - else: - material = preferred_materials[0] - else: - Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) - # And leave it at the default material. - container_stack.addContainer(material) - - # Find a quality to use for this extruder. - quality = container_registry.getEmptyInstanceContainer() - - search_criteria = { "type": "quality" } - if machine_definition.getMetaDataEntry("has_machine_quality"): - search_criteria["definition"] = machine_definition_id - if machine_definition.getMetaDataEntry("has_materials") and material: - search_criteria["material"] = material.id - else: - search_criteria["definition"] = "fdmprinter" - - preferred_quality = machine_definition.getMetaDataEntry("preferred_quality") - if preferred_quality: - search_criteria["id"] = preferred_quality - - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if not containers and preferred_quality: - Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) - search_criteria.pop("id", None) - containers = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if containers: - quality = containers[0] - - container_stack.addContainer(quality) - - empty_quality_changes = container_registry.findInstanceContainers(id = "empty_quality_changes")[0] - container_stack.addContainer(empty_quality_changes) - - user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) - if user_profile: # There was already a user profile, loaded from settings. - user_profile = user_profile[0] - else: - user_profile = InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile. - user_profile.addMetaDataEntry("type", "user") - user_profile.addMetaDataEntry("extruder", extruder_stack_id) - from cura.CuraApplication import CuraApplication - user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_profile.setDefinition(machine_definition) - container_registry.addContainer(user_profile) - container_stack.addContainer(user_profile) - - # regardless of what the next stack is, we have to set it again, because of signal routing. - container_stack.setNextStack(Application.getInstance().getGlobalContainerStack()) - - container_registry.addContainer(container_stack) - def getAllExtruderValues(self, setting_key): return self.getAllExtruderSettings(setting_key, "value") @@ -396,16 +234,12 @@ class ExtruderManager(QObject): # \param setting_key \type{str} The setting to get the property of. # \param property \type{str} The property to get. # \return \type{List} the list of results - def getAllExtruderSettings(self, setting_key, property): - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack.getProperty("machine_extruder_count", "value") <= 1: - return [global_container_stack.getProperty(setting_key, property)] - + def getAllExtruderSettings(self, setting_key: str, prop: str): result = [] for index in self.extruderIds: extruder_stack_id = self.extruderIds[str(index)] - stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] - result.append(stack.getProperty(setting_key, property)) + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + result.append(extruder_stack.getProperty(setting_key, prop)) return result ## Gets the extruder stacks that are actually being used at the moment. @@ -422,20 +256,25 @@ class ExtruderManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() container_registry = ContainerRegistry.getInstance() - if global_stack.getProperty("machine_extruder_count", "value") <= 1: #For single extrusion. - return [global_stack] - used_extruder_stack_ids = set() - #Get the extruders of all meshes in the scene. + # Get the extruders of all meshes in the scene support_enabled = False support_bottom_enabled = False support_roof_enabled = False + scene_root = Application.getInstance().getController().getScene().getRoot() - meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. + + # If no extruders are registered in the extruder manager yet, return an empty array + if len(self.extruderIds) == 0: + return [] + + # Get the extruders of all printable meshes in the scene + meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] for mesh in meshes: extruder_stack_id = mesh.callDecoration("getActiveExtruder") - if not extruder_stack_id: #No per-object settings for this node. + if not extruder_stack_id: + # No per-object settings for this node extruder_stack_id = self.extruderIds["0"] used_extruder_stack_ids.add(extruder_stack_id) @@ -471,9 +310,10 @@ class ExtruderManager(QObject): if support_roof_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) - #The platform adhesion extruder. Not used if using none. + # The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("adhesion_extruder_nr", "value"))]) + try: return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids] except IndexError: # One or more of the extruders was not found. @@ -520,10 +360,6 @@ class ExtruderManager(QObject): result = [] machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") - # In case the printer is using one extruder, shouldn't exist active extruder stacks - if machine_extruder_count == 1: - return result - if global_stack and global_stack.getId() in self._extruder_trains: for extruder in sorted(self._extruder_trains[global_stack.getId()]): result.append(self._extruder_trains[global_stack.getId()][extruder]) @@ -536,24 +372,39 @@ class ExtruderManager(QObject): self._global_container_stack_definition_id = global_container_stack.getBottom().getId() self.globalContainerStackDefinitionChanged.emit() - # If the global container changed, the number of extruders could be changed and so the active_extruder_index is updated - extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - if extruder_count > 1: - if self._active_extruder_index == -1: - self.setActiveExtruderIndex(0) - else: - if self._active_extruder_index != -1: - self.setActiveExtruderIndex(-1) - - self.activeExtruderChanged.emit() + # If the global container changed, the machine changed and might have extruders that were not registered yet + self._addCurrentMachineExtruders() self.resetSelectedObjectExtruders() ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self) -> None: global_stack = Application.getInstance().getGlobalContainerStack() - if global_stack and global_stack.getBottom(): - self.addMachineExtruders(global_stack.getBottom(), global_stack.getId()) + extruders_changed = False + + if global_stack: + container_registry = ContainerRegistry.getInstance() + global_stack_id = global_stack.getId() + + # Gets the extruder trains that we just created as well as any that still existed. + extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = global_stack_id) + + # Make sure the extruder trains for the new machine can be placed in the set of sets + if global_stack_id not in self._extruder_trains: + self._extruder_trains[global_stack_id] = {} + extruders_changed = True + + # Register the extruder trains by position + for extruder_train in extruder_trains: + self._extruder_trains[global_stack_id][extruder_train.getMetaDataEntry("position")] = extruder_train + + # regardless of what the next stack is, we have to set it again, because of signal routing. ??? + extruder_train.setNextStack(global_stack) + extruders_changed = True + + if extruders_changed: + self.extrudersChanged.emit(global_stack_id) + self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. # @@ -632,7 +483,7 @@ class ExtruderManager(QObject): # # This is exposed to qml for display purposes # - # \param key The key of the setting to retieve values for. + # \param key The key of the setting to retrieve values for. # # \return String representing the extruder values @pyqtSlot(str, result="QVariant") @@ -656,7 +507,8 @@ class ExtruderManager(QObject): value = extruder.getRawProperty(key, "value") if isinstance(value, SettingFunction): value = value(extruder) - else: #Just a value from global. + else: + # Just a value from global. value = Application.getInstance().getGlobalContainerStack().getProperty(key, "value") return value diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index d8ff6645a8..fe7068b7ea 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -115,6 +115,11 @@ class ExtruderStack(CuraContainerStack): if has_global_dependencies: self.getNextStack().propertiesChanged.emit(key, properties) + def findDefaultVariant(self): + # The default variant is defined in the machine stack and/or definition, so use the machine stack to find + # the default variant. + return self.getNextStack().findDefaultVariant() + extruder_stack_mime = MimeType( name = "application/x-cura-extruderstack", diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index b13e51723b..40d13461cc 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -71,13 +71,13 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self._add_global = False self._simple_names = False - self._active_machine_extruders = [] # type: Iterable[ExtruderStack] + self._active_machine_extruders = [] # type: Iterable[ExtruderStack] self._add_optional_extruder = False - #Listen to changes. - Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) #When the machine is swapped we must update the active machine extruders. - ExtruderManager.getInstance().extrudersChanged.connect(self._extrudersChanged) #When the extruders change we must link to the stack-changed signal of the new extruder. - self._extrudersChanged() #Also calls _updateExtruders. + # Listen to changes + Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) # When the machine is swapped we must update the active machine extruders + ExtruderManager.getInstance().extrudersChanged.connect(self._extrudersChanged) # When the extruders change we must link to the stack-changed signal of the new extruder + self._extrudersChanged() # Also calls _updateExtruders def setAddGlobal(self, add): if add != self._add_global: @@ -128,21 +128,24 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): def _extrudersChanged(self, machine_id = None): if machine_id is not None: if Application.getInstance().getGlobalContainerStack() is None: - return #No machine, don't need to update the current machine's extruders. + # No machine, don't need to update the current machine's extruders + return if machine_id != Application.getInstance().getGlobalContainerStack().getId(): - return #Not the current machine. - #Unlink from old extruders. + # Not the current machine + return + + # Unlink from old extruders for extruder in self._active_machine_extruders: extruder.containersChanged.disconnect(self._onExtruderStackContainersChanged) - #Link to new extruders. + # Link to new extruders self._active_machine_extruders = [] extruder_manager = ExtruderManager.getInstance() for extruder in extruder_manager.getExtruderStacks(): extruder.containersChanged.connect(self._onExtruderStackContainersChanged) self._active_machine_extruders.append(extruder) - self._updateExtruders() #Since the new extruders may have different properties, update our own model. + self._updateExtruders() # Since the new extruders may have different properties, update our own model. def _onExtruderStackContainersChanged(self, container): # Update when there is an empty container or material change @@ -150,7 +153,6 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # The ExtrudersModel needs to be updated when the material-name or -color changes, because the user identifies extruders by material-name self._updateExtruders() - modelChanged = pyqtSignal() def _updateExtruders(self): @@ -161,14 +163,17 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # This should be called whenever the list of extruders changes. @UM.FlameProfiler.profile def __updateExtruders(self): - changed = False + extruders_changed = False if self.rowCount() != 0: - changed = True + extruders_changed = True items = [] + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: + + # TODO: remove this - CURA-4482 if self._add_global: material = global_container_stack.material color = material.getMetaDataEntry("color_code", default = self.defaultColors[0]) if material else self.defaultColors[0] @@ -180,40 +185,44 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "definition": "" } items.append(item) - changed = True + extruders_changed = True + # get machine extruder count for verification machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - manager = ExtruderManager.getInstance() - for extruder in manager.getMachineExtruders(global_container_stack.getId()): + + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()): position = extruder.getMetaDataEntry("position", default = "0") # Get the position try: position = int(position) - except ValueError: #Not a proper int. + except ValueError: + # Not a proper int. position = -1 if position >= machine_extruder_count: continue - extruder_name = extruder.getName() - material = extruder.material - variant = extruder.variant - default_color = self.defaultColors[position] if position >= 0 and position < len(self.defaultColors) else self.defaultColors[0] - color = material.getMetaDataEntry("color_code", default = default_color) if material else default_color - item = { #Construct an item with only the relevant information. + default_color = self.defaultColors[position] if 0 <= position < len(self.defaultColors) else self.defaultColors[0] + color = extruder.material.getMetaDataEntry("color_code", default = default_color) if extruder.material else default_color + + # construct an item with only the relevant information + item = { "id": extruder.getId(), - "name": extruder_name, + "name": extruder.getName(), "color": color, "index": position, "definition": extruder.getBottom().getId(), - "material": material.getName() if material else "", - "variant": variant.getName() if variant else "", + "material": extruder.material.getName() if extruder.material else "", + "variant": extruder.variant.getName() if extruder.variant else "", # e.g. print core } - items.append(item) - changed = True - if changed: + items.append(item) + extruders_changed = True + + if extruders_changed: + # sort by extruder index items.sort(key = lambda i: i["index"]) + # We need optional extruder to be last, so add it after we do sorting. - # This way we can simply intrepret the -1 of the index as the last item (which it now always is) + # This way we can simply interpret the -1 of the index as the last item (which it now always is) if self._add_optional_extruder: item = { "id": "", @@ -223,5 +232,6 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "definition": "" } items.append(item) + self.setItems(items) self.modelChanged.emit() diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 88218c2f1e..2f27c4ab72 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -23,9 +23,9 @@ class GlobalStack(CuraContainerStack): def __init__(self, container_id: str, *args, **kwargs): super().__init__(container_id, *args, **kwargs) - self.addMetaDataEntry("type", "machine") # For backward compatibility + self.addMetaDataEntry("type", "machine") # For backward compatibility - self._extruders = {} + self._extruders = {} # type: Dict[str, "ExtruderStack"] # This property is used to track which settings we are calculating the "resolve" for # and if so, to bypass the resolve to prevent an infinite recursion that would occur @@ -61,13 +61,6 @@ class GlobalStack(CuraContainerStack): # \throws Exceptions.TooManyExtrudersError Raised when trying to add an extruder while we # already have the maximum number of extruders. def addExtruder(self, extruder: ContainerStack) -> None: - extruder_count = self.getProperty("machine_extruder_count", "value") - - if extruder_count <= 1: - Logger.log("i", "Not adding extruder[%s] to [%s] because it is a single-extrusion machine.", - extruder.id, self.id) - return - position = extruder.getMetaDataEntry("position") if position is None: Logger.log("w", "No position defined for extruder {extruder}, cannot add it to stack {stack}", extruder = extruder.id, stack = self.id) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f85acc164d..0daf54c018 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -107,9 +107,8 @@ class MachineManager(QObject): if active_machine_id != "" and ContainerRegistry.getInstance().findContainerStacks(id = active_machine_id): # An active machine was saved, so restore it. self.setActiveMachine(active_machine_id) - if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - # Make sure _active_container_stack is properly initiated - ExtruderManager.getInstance().setActiveExtruderIndex(0) + # Make sure _active_container_stack is properly initiated + ExtruderManager.getInstance().setActiveExtruderIndex(0) self._auto_materials_changed = {} self._auto_hotends_changed = {} @@ -162,7 +161,7 @@ class MachineManager(QObject): @pyqtProperty(int, constant=True) def totalNumberOfSettings(self) -> int: - return len(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0].getAllKeys()) + return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) def _onHotendIdChanged(self, index: Union[str, int], hotend_id: str) -> None: if not self._global_container_stack: @@ -258,13 +257,13 @@ class MachineManager(QObject): if old_index is not None: extruder_manager.setActiveExtruderIndex(old_index) - self._auto_hotends_changed = {} #Processed all of them now. + self._auto_hotends_changed = {} # Processed all of them now. def _onGlobalContainerChanged(self): if self._global_container_stack: try: self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged) - except TypeError: #pyQtSignal gives a TypeError when disconnecting from something that was already disconnected. + except TypeError: # pyQtSignal gives a TypeError when disconnecting from something that was already disconnected. pass try: self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) @@ -274,52 +273,38 @@ class MachineManager(QObject): self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) except TypeError: pass - material = self._global_container_stack.material - material.nameChanged.disconnect(self._onMaterialNameChanged) - quality = self._global_container_stack.quality - quality.nameChanged.disconnect(self._onQualityNameChanged) - - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): - extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) - extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): + extruder_stack.propertyChanged.disconnect(self._onPropertyChanged) + extruder_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + # update the local global container stack reference self._global_container_stack = Application.getInstance().getGlobalContainerStack() self.globalContainerChanged.emit() + # after switching the global stack we reconnect all the signals and set the variant and material references if self._global_container_stack: Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) + self._global_container_stack.nameChanged.connect(self._onMachineNameChanged) self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) - if self._global_container_stack.getProperty("machine_extruder_count", "value") > 1: - # For multi-extrusion machines, we do not want variant or material profiles in the stack, - # because these are extruder specific and may cause wrong values to be used for extruders - # that did not specify a value in the extruder. - global_variant = self._global_container_stack.variant - if global_variant != self._empty_variant_container: - self._global_container_stack.setVariant(self._empty_variant_container) + # set the global variant to empty as we now use the extruder stack at all times - CURA-4482 + global_variant = self._global_container_stack.variant + if global_variant != self._empty_variant_container: + self._global_container_stack.setVariant(self._empty_variant_container) - global_material = self._global_container_stack.material - if global_material != self._empty_material_container: - self._global_container_stack.setMaterial(self._empty_material_container) + # set the global material to empty as we now use the extruder stack at all times - CURA-4482 + global_material = self._global_container_stack.material + if global_material != self._empty_material_container: + self._global_container_stack.setMaterial(self._empty_material_container) - for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): #Listen for changes on all extruder stacks. - extruder_stack.propertyChanged.connect(self._onPropertyChanged) - extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) - - else: - material = self._global_container_stack.material - material.nameChanged.connect(self._onMaterialNameChanged) - - quality = self._global_container_stack.quality - quality.nameChanged.connect(self._onQualityNameChanged) - - self._active_container_stack = self._global_container_stack - self.activeStackChanged.emit() + # Listen for changes on all extruder stacks + for extruder_stack in ExtruderManager.getInstance().getActiveExtruderStacks(): + extruder_stack.propertyChanged.connect(self._onPropertyChanged) + extruder_stack.containersChanged.connect(self._onInstanceContainersChanged) self._error_check_timer.start() @@ -336,8 +321,6 @@ class MachineManager(QObject): old_active_container_stack = self._active_container_stack self._active_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if not self._active_container_stack: - self._active_container_stack = self._global_container_stack self._error_check_timer.start() @@ -384,15 +367,6 @@ class MachineManager(QObject): else: Logger.log("w", "Failed creating a new machine!") - ## Create a name that is not empty and unique - # \param container_type \type{string} Type of the container (machine, quality, ...) - # \param current_name \type{} Current name of the container, which may be an acceptable option - # \param new_name \type{string} Base name, which may not be unique - # \param fallback_name \type{string} Name to use when (stripped) new_name is empty - # \return \type{string} Name that is unique for the specified type and name/id - def _createUniqueName(self, container_type: str, current_name: str, new_name: str, fallback_name: str) -> str: - return ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name) - def _checkStacksHaveErrors(self) -> bool: if self._global_container_stack is None: #No active machine. return False @@ -732,15 +706,13 @@ class MachineManager(QObject): ## Copy the value of the setting of the current extruder to all other extruders as well as the global container. @pyqtSlot(str) def copyValueToExtruders(self, key: str): - if not self._active_container_stack or self._global_container_stack.getProperty("machine_extruder_count", "value") <= 1: - return - new_value = self._active_container_stack.getProperty(key, "value") - stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] - stacks.append(self._global_container_stack) - for extruder_stack in stacks: + extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())] + + # check in which stack the value has to be replaced + for extruder_stack in extruder_stacks: if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value: - extruder_stack.getTop().setProperty(key, "value", new_value) + extruder_stack.userChanges.setProperty(key, "value", new_value) # TODO: nested property access, should be improved ## Set the active material by switching out a container # Depending on from/to material+current variant, a quality profile is chosen and set. @@ -947,35 +919,46 @@ class MachineManager(QObject): global_container_stack = self._global_container_stack if not global_container_stack: return [] + global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - if extruder_stacks: - stacks = extruder_stacks - else: - stacks = [global_container_stack] - for stack in stacks: - material = stack.material + # find qualities for extruders + for extruder_stack in extruder_stacks: + material = extruder_stack.material # TODO: fix this - if self._new_material_container and stack.getId() == self._active_container_stack.getId(): + if self._new_material_container and extruder_stack.getId() == self._active_container_stack.getId(): material = self._new_material_container quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) + if not quality: # No quality profile is found for this quality type. quality = self._empty_quality_container - result.append({"stack": stack, "quality": quality, "quality_changes": empty_quality_changes}) - if extruder_stacks: - # Add an extra entry for the global stack. - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True") + result.append({ + "stack": extruder_stack, + "quality": quality, + "quality_changes": empty_quality_changes + }) - if not global_quality: - global_quality = self._empty_quality_container + # also find a global quality for the machine + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = "True") - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": empty_quality_changes}) + # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 + if not global_quality and len(extruder_stacks) == 1: + global_quality = result[0]["quality"] + + # if there is still no global quality, set it to empty (not supported) + if not global_quality: + global_quality = self._empty_quality_container + + result.append({ + "stack": global_container_stack, + "quality": global_quality, + "quality_changes": empty_quality_changes + }) return result @@ -988,10 +971,8 @@ class MachineManager(QObject): quality_manager = QualityManager.getInstance() global_container_stack = self._global_container_stack - global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) - - quality_changes_profiles = quality_manager.findQualityChangesByName(quality_changes_name, - global_machine_definition) + global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) + quality_changes_profiles = quality_manager.findQualityChangesByName(quality_changes_name, global_machine_definition) global_quality_changes = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") is None] if global_quality_changes: @@ -1002,27 +983,22 @@ class MachineManager(QObject): material = global_container_stack.material + # find a quality type that matches both machine and materials if self._new_material_container and self._active_container_stack.getId() == global_container_stack.getId(): material = self._new_material_container # For the global stack, find a quality which matches the quality_type in # the quality changes profile and also satisfies any material constraints. quality_type = global_quality_changes.getMetaDataEntry("quality_type") - if global_container_stack.getProperty("machine_extruder_count", "value") > 1: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [], global_quality = True) - else: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not global_quality: - global_quality = self._empty_quality_container - # Find the values for each extruder. extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - for stack in extruder_stacks: - extruder_definition = quality_manager.getParentMachineDefinition(stack.getBottom()) + # append the extruder quality changes + for extruder_stack in extruder_stacks: + extruder_definition = quality_manager.getParentMachineDefinition(extruder_stack.definition) + + quality_changes_list = [qcp for qcp in quality_changes_profiles if qcp.getMetaDataEntry("extruder") == extruder_definition.getId()] - quality_changes_list = [qcp for qcp in quality_changes_profiles - if qcp.getMetaDataEntry("extruder") == extruder_definition.getId()] if quality_changes_list: quality_changes = quality_changes_list[0] else: @@ -1030,24 +1006,39 @@ class MachineManager(QObject): if not quality_changes: quality_changes = self._empty_quality_changes_container - material = stack.material + material = extruder_stack.material - if self._new_material_container and self._active_container_stack.getId() == stack.getId(): + if self._new_material_container and self._active_container_stack.getId() == extruder_stack.getId(): material = self._new_material_container quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) - if not quality: #No quality profile found for this quality type. + + if not quality: + # No quality profile found for this quality type. quality = self._empty_quality_container - result.append({"stack": stack, "quality": quality, "quality_changes": quality_changes}) + result.append({ + "stack": extruder_stack, + "quality": quality, + "quality_changes": quality_changes + }) - if extruder_stacks: - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True") - if not global_quality: - global_quality = self._empty_quality_container - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes}) - else: - result.append({"stack": global_container_stack, "quality": global_quality, "quality_changes": global_quality_changes}) + # append the global quality changes + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True") + + # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 + if not global_quality and len(extruder_stacks) == 1: + global_quality = result[0]["quality"] + + # if still no global quality changes are found we set it to empty (not supported) + if not global_quality: + global_quality = self._empty_quality_container + + result.append({ + "stack": global_container_stack, + "quality": global_quality, + "quality_changes": global_quality_changes + }) return result @@ -1156,10 +1147,11 @@ class MachineManager(QObject): @pyqtSlot(str, str) def renameMachine(self, machine_id: str, new_name: str): - containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - if containers: - new_name = self._createUniqueName("machine", containers[0].getName(), new_name, containers[0].getBottom().getName()) - containers[0].setName(new_name) + container_registry = ContainerRegistry.getInstance() + machine_stack = container_registry.findContainerStacks(id = machine_id) + if machine_stack: + new_name = container_registry.createUniqueName("machine", machine_stack[0].getName(), new_name, machine_stack[0].getBottom().getName()) + machine_stack[0].setName(new_name) self.globalContainerChanged.emit() @pyqtSlot(str) @@ -1183,15 +1175,14 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def hasMaterials(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_materials", False)) + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False)) return False @pyqtProperty(bool, notify = globalContainerChanged) def hasVariants(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_variants", False)) - + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_variants", False)) return False ## Property to indicate if a machine has "specialized" material profiles. @@ -1199,8 +1190,7 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def filterMaterialsByMachine(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_machine_materials", False)) - + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_machine_materials", False)) return False ## Property to indicate if a machine has "specialized" quality profiles. @@ -1208,7 +1198,7 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = globalContainerChanged) def filterQualityByMachine(self) -> bool: if self._global_container_stack: - return bool(self._global_container_stack.getMetaDataEntry("has_machine_quality", False)) + return Util.parseBool(self._global_container_stack.getMetaDataEntry("has_machine_quality", False)) return False ## Get the Definition ID of a machine (specified by ID) @@ -1221,7 +1211,7 @@ class MachineManager(QObject): return containers[0].getBottom().getId() @staticmethod - def createMachineManager(engine=None, script_engine=None): + def createMachineManager(): return MachineManager() @deprecated("Use ExtruderStack.material = ... and it won't be necessary", "2.7") diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 6353d3ce84..2b75cf1bd2 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -12,6 +12,11 @@ from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel from cura.QualityManager import QualityManager from cura.Settings.ExtruderManager import ExtruderManager +from typing import List, TYPE_CHECKING + +if TYPE_CHECKING: + from cura.Settings.ExtruderStack import ExtruderStack + ## QML Model for listing the current list of valid quality profiles. # @@ -27,7 +32,6 @@ class ProfilesModel(InstanceContainersModel): self.addRoleName(self.AvailableRole, "available") Application.getInstance().globalContainerStackChanged.connect(self._update) - Application.getInstance().getMachineManager().activeVariantChanged.connect(self._update) Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) @@ -54,18 +58,12 @@ class ProfilesModel(InstanceContainersModel): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: return [] - global_stack_definition = global_container_stack.getBottom() + + global_stack_definition = global_container_stack.definition # Get the list of extruders and place the selected extruder at the front of the list. - extruder_manager = ExtruderManager.getInstance() - active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - materials = [global_container_stack.material] - - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - extruder_stacks = [active_extruder] + extruder_stacks - materials = [extruder.material for extruder in extruder_stacks] + extruder_stacks = self._getOrderedExtruderStacksList() + materials = [extruder.material for extruder in extruder_stacks] # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. @@ -100,32 +98,12 @@ class ProfilesModel(InstanceContainersModel): if global_container_stack is None: return - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - - # Get the list of extruders and place the selected extruder at the front of the list. - extruder_manager = ExtruderManager.getInstance() - active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - extruder_stacks = new_extruder_stacks + extruder_stacks + extruder_stacks = self._getOrderedExtruderStacksList() + container_registry = ContainerRegistry.getInstance() # Get a list of usable/available qualities for this machine and material qualities = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - container_registry = ContainerRegistry.getInstance() - machine_manager = Application.getInstance().getMachineManager() - unit = global_container_stack.getBottom().getProperty("layer_height", "unit") if not unit: unit = "" @@ -190,6 +168,8 @@ class ProfilesModel(InstanceContainersModel): yield item continue + machine_manager = Application.getInstance().getMachineManager() + # Quality-changes profile that has no value for layer height. Get the corresponding quality profile and ask that profile. quality_type = profile.getMetaDataEntry("quality_type", None) if quality_type: @@ -201,7 +181,8 @@ class ProfilesModel(InstanceContainersModel): else: # No global container stack in the results: if quality_results: - quality = quality_results[0]["quality"] # Take any of the extruders. + # Take any of the extruders. + quality = quality_results[0]["quality"] else: quality = None if quality and quality.hasProperty("layer_height", "value"): @@ -211,13 +192,27 @@ class ProfilesModel(InstanceContainersModel): # Quality has no value for layer height either. Get the layer height from somewhere lower in the stack. skip_until_container = global_container_stack.material - if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No material in stack. + if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): # No material in stack. skip_until_container = global_container_stack.variant - if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): #No variant in stack. + if not skip_until_container or skip_until_container == ContainerRegistry.getInstance().getEmptyInstanceContainer(): # No variant in stack. skip_until_container = global_container_stack.getBottom() self._setItemLayerHeight(item, global_container_stack.getRawProperty("layer_height", "value", skip_until_container = skip_until_container.getId()), unit) # Fall through to the currently loaded material. yield item - def _setItemLayerHeight(self, item, value, unit): + ## Get a list of extruder stacks with the active extruder at the front of the list. + @staticmethod + def _getOrderedExtruderStacksList() -> List["ExtruderStack"]: + extruder_manager = ExtruderManager.getInstance() + extruder_stacks = extruder_manager.getActiveExtruderStacks() + active_extruder = extruder_manager.getActiveExtruderStack() + + if active_extruder in extruder_stacks: + extruder_stacks.remove(active_extruder) + extruder_stacks = [active_extruder] + extruder_stacks + + return extruder_stacks + + @staticmethod + def _setItemLayerHeight(item, value, unit): item["layer_height"] = str(value) + unit item["layer_height_without_unit"] = str(value) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 9d7d913d5e..2e181c6031 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -22,47 +22,23 @@ class QualityAndUserProfilesModel(ProfilesModel): # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() - machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - else: - # if there is no active extruder, use the first one in the active extruder stacks - active_extruder = extruder_stacks[0] - extruder_stacks = new_extruder_stacks + extruder_stacks + extruder_stacks = self._getOrderedExtruderStacksList() - # Fetch the list of useable qualities across all extruders. + # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. - quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - - if multiple_extrusion: - # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is not None and - (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] - else: - # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return quality_list + filtered_quality_changes diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 2ab4e2a9b5..d0379dc510 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -224,7 +224,6 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if self._extruder_id == "" and settable_per_extruder: continue - label = definition.label if self._i18n_catalog: label = self._i18n_catalog.i18nc(definition.key + " label", label) diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 8c9f5b20d6..0d4cd02cdb 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -47,21 +47,20 @@ class SettingInheritanceManager(QObject): @pyqtSlot(str, str, result = "QStringList") def getOverridesForExtruder(self, key, extruder_index): - multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 - if not multi_extrusion: - return self._settings_with_inheritance_warning - extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) - if not extruder: - Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) - return [] + result = [] - definitions = self._global_container_stack.definition.findDefinitions(key=key) + extruder_stack = ExtruderManager.getInstance().getExtruderStack(extruder_index) + if not extruder_stack: + Logger.log("w", "Unable to find extruder for current machine with index %s", extruder_index) + return result + + definitions = self._global_container_stack.definition.findDefinitions(key = key) if not definitions: Logger.log("w", "Could not find definition for key [%s] (2)", key) - return [] - result = [] + return result + for key in definitions[0].getAllKeys(): - if self._settingIsOverwritingInheritance(key, extruder): + if self._settingIsOverwritingInheritance(key, extruder_stack): result.append(key) return result @@ -78,8 +77,8 @@ class SettingInheritanceManager(QObject): def _onActiveExtruderChanged(self): new_active_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if not new_active_stack: - new_active_stack = self._global_container_stack + # if not new_active_stack: + # new_active_stack = self._global_container_stack if new_active_stack != self._active_container_stack: # Check if changed if self._active_container_stack: # Disconnect signal from old container (if any) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 4e0893a35f..5026f9760d 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -27,11 +27,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._stack = PerObjectContainerStack(stack_id = id(self)) self._stack.setDirty(False) # This stack does not need to be saved. self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) - - if ExtruderManager.getInstance().extruderCount > 1: - self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() - else: - self._extruder_stack = None + self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() self._stack.propertyChanged.connect(self._onSettingChanged) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index aa815ef4aa..5ae9055759 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -22,47 +22,23 @@ class UserProfilesModel(ProfilesModel): # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() - machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - # Detecting if the machine has multiple extrusion - multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders and place the selected extruder at the front of the list. extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() - extruder_stacks = extruder_manager.getActiveExtruderStacks() - if multiple_extrusion: - # Place the active extruder at the front of the list. - # This is a workaround checking if there is an active_extruder or not before moving it to the front of the list. - # Actually, when a printer has multiple extruders, should exist always an active_extruder. However, in some - # cases the active_extruder is still None. - if active_extruder in extruder_stacks: - extruder_stacks.remove(active_extruder) - new_extruder_stacks = [] - if active_extruder is not None: - new_extruder_stacks = [active_extruder] - else: - # if there is no active extruder, use the first one in the active extruder stacks - active_extruder = extruder_stacks[0] - extruder_stacks = new_extruder_stacks + extruder_stacks + extruder_stacks = self._getOrderedExtruderStacksList() - # Fetch the list of useable qualities across all extruders. + # Fetch the list of usable qualities across all extruders. # The actual list of quality profiles come from the first extruder in the extruder list. - quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, - extruder_stacks) + quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - - if multiple_extrusion: - # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is not None and - (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] - else: - # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return filtered_quality_changes diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index a34bf771d7..786226ae61 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -107,20 +107,13 @@ class ThreeMFReader(MeshReader): um_node.addDecorator(SettingOverrideDecorator()) global_container_stack = Application.getInstance().getGlobalContainerStack() + # Ensure the correct next container for the SettingOverride decorator is set. if global_container_stack: - multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 + default_stack = ExtruderManager.getInstance().getExtruderStack(0) - # Ensure that all extruder data is reset - if not multi_extrusion: - default_stack_id = global_container_stack.getId() - else: - default_stack = ExtruderManager.getInstance().getExtruderStack(0) - if default_stack: - default_stack_id = default_stack.getId() - else: - default_stack_id = global_container_stack.getId() - um_node.callDecoration("setActiveExtruder", default_stack_id) + if default_stack: + um_node.callDecoration("setActiveExtruder", default_stack.getId()) # Get the definition & set it definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom()) @@ -139,7 +132,7 @@ class ThreeMFReader(MeshReader): else: Logger.log("w", "Unable to find extruder in position %s", setting_value) continue - setting_container.setProperty(key,"value", setting_value) + setting_container.setProperty(key, "value", setting_value) if len(um_node.getChildren()) > 0: group_decorator = GroupDecorator() diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 28d12bf2d5..a3aadc79b8 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -644,9 +644,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Get the stack(s) saved in the workspace. Logger.log("d", "Workspace loading is checking stacks containers...") - # -- # load global stack file try: + stack = None + if self._resolve_strategies["machine"] == "override": container_stacks = self._container_registry.findContainerStacks(id = global_stack_id_original) stack = container_stacks[0] @@ -682,12 +683,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.addContainer(stack) containers_added.append(stack) else: - Logger.log("e", "Resolve strategy of %s for machine is not supported", - self._resolve_strategies["machine"]) + Logger.log("e", "Resolve strategy of %s for machine is not supported", self._resolve_strategies["machine"]) # Create a new definition_changes container if it was empty if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer(): - stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings")) + stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack.getId() + "_settings")) global_stack = stack Job.yieldThread() except: @@ -697,16 +697,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return - # - # Use the number of extruders from the global stack instead of the number of extruder stacks this project file - # contains. The Custom FDM Printer can have multiple extruders, but the actual number of extruders in used is - # defined in the global stack. - # Because for single-extrusion machines, there won't be an extruder stack, so relying on the the extruder count - # in the global stack can avoid problems in those cases. - # - extruder_count_from_global_stack = global_stack.getProperty("machine_extruder_count", "value") - - # -- # load extruder stack files try: for extruder_stack_file in extruder_stack_files: @@ -749,9 +739,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Create a new definition_changes container if it was empty if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer(): - stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings")) - if global_stack.getProperty("machine_extruder_count", "value") > 1: - extruder_stacks.append(stack) + stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack.getId() + "_settings")) + + extruder_stacks.append(stack) + + # If not extruder stacks were saved in the project file (pre 3.1) create one manually + # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this + if not extruder_stacks: + self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") # Something went really wrong. Try to remove any data that we added. @@ -784,7 +780,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for stack in [global_stack] + extruder_stacks: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) - # # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those # MUST get updated too. diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index a764d30fac..6254bef03a 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -87,7 +87,7 @@ class ThreeMFWriter(MeshWriter): if stack is not None: changed_setting_keys = set(stack.getTop().getAllKeys()) - # Ensure that we save the extruder used for this object. + # Ensure that we save the extruder used for this object in a multi-extrusion setup if stack.getProperty("machine_extruder_count", "value") > 1: changed_setting_keys.add("extruder_nr") diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index eb0337c4f2..b922baea52 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -159,13 +159,9 @@ class StartSliceJob(Job): self._buildGlobalSettingsMessage(stack) self._buildGlobalInheritsStackMessage(stack) - # Only add extruder stacks if there are multiple extruders - # Single extruder machines only use the global stack to store setting values - if stack.getProperty("machine_extruder_count", "value") > 1: - for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): - self._buildExtruderMessage(extruder_stack) - else: - self._buildExtruderMessageFromGlobalStack(stack) + # Build messages for extruder stacks + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): + self._buildExtruderMessage(extruder_stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") @@ -251,19 +247,6 @@ class StartSliceJob(Job): setting.value = str(stack.getProperty(key, "value")).encode("utf-8") Job.yieldThread() - ## Create extruder message from global stack - def _buildExtruderMessageFromGlobalStack(self, stack): - message = self._slice_message.addRepeatedMessage("extruders") - - for key in stack.getAllKeys(): - # Do not send settings that are not settable_per_extruder. - if not stack.getProperty(key, "settable_per_extruder"): - continue - setting = message.getMessage("settings").addRepeatedMessage("settings") - setting.name = key - setting.value = str(stack.getProperty(key, "value")).encode("utf-8") - Job.yieldThread() - ## Sends all global settings to the engine. # # The settings are taken from the global stack. This does not include any diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 360dae7a2c..2de5b6e9b8 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -116,8 +116,7 @@ class MachineSettingsAction(MachineAction): @pyqtSlot(int) def setMachineExtruderCount(self, extruder_count): - machine_manager = Application.getInstance().getMachineManager() - extruder_manager = ExtruderManager.getInstance() + extruder_manager = Application.getInstance().getExtruderManager() definition_changes_container = self._global_container_stack.definitionChanges if not self._global_container_stack or definition_changes_container == self._empty_container: @@ -127,34 +126,6 @@ class MachineSettingsAction(MachineAction): if extruder_count == previous_extruder_count: return - extruder_material_id = None - extruder_variant_id = None - if extruder_count == 1: - # Get the material and variant of the first extruder before setting the number extruders to 1 - if machine_manager.hasMaterials: - extruder_material_id = machine_manager.allActiveMaterialIds[extruder_manager.extruderIds["0"]] - if machine_manager.hasVariants: - extruder_variant_id = machine_manager.allActiveVariantIds[extruder_manager.extruderIds["0"]] - - # Copy any settable_per_extruder setting value from the extruders to the global stack - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - extruder_stacks.reverse() # make sure the first extruder is done last, so its settings override any higher extruder settings - - global_user_container = self._global_container_stack.getTop() - for extruder_stack in extruder_stacks: - extruder_index = extruder_stack.getMetaDataEntry("position") - extruder_user_container = extruder_stack.getTop() - for setting_instance in extruder_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - - if settable_per_extruder: - limit_to_extruder = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") - - if limit_to_extruder == "-1" or limit_to_extruder == extruder_index: - global_user_container.setProperty(setting_key, "value", extruder_user_container.getProperty(setting_key, "value")) - extruder_user_container.removeInstance(setting_key) - # reset all extruder number settings whose value is no longer valid for setting_instance in self._global_container_stack.userChanges.findInstances(): setting_key = setting_instance.definition.key @@ -177,52 +148,29 @@ class MachineSettingsAction(MachineAction): definition_changes_container.setProperty("machine_extruder_count", "value", extruder_count) - if extruder_count > 1: - # Multiextrusion + # Make sure one of the extruder stacks is active + extruder_manager.setActiveExtruderIndex(0) - # Make sure one of the extruder stacks is active - if extruder_manager.activeExtruderIndex == -1: - extruder_manager.setActiveExtruderIndex(0) + # Move settable_per_extruder values out of the global container + # After CURA-4482 this should not be the case anymore, but we still want to support older project files. + global_user_container = self._global_container_stack.getTop() - # Move settable_per_extruder values out of the global container - if previous_extruder_count == 1: - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - global_user_container = self._global_container_stack.getTop() + if previous_extruder_count == 1: + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + global_user_container = self._global_container_stack.getTop() - for setting_instance in global_user_container.findInstances(): - setting_key = setting_instance.definition.key - settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - if settable_per_extruder: - limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) - extruder_stack = extruder_stacks[max(0, limit_to_extruder)] - extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) - global_user_container.removeInstance(setting_key) - else: - # Single extrusion + for setting_instance in global_user_container.findInstances(): + setting_key = setting_instance.definition.key + settable_per_extruder = self._global_container_stack.getProperty(setting_key, "settable_per_extruder") - # Make sure the machine stack is active - if extruder_manager.activeExtruderIndex > -1: - extruder_manager.setActiveExtruderIndex(-1) - - # Restore material and variant on global stack - # MachineManager._onGlobalContainerChanged removes the global material and variant of multiextruder machines - if extruder_material_id or extruder_variant_id: - # Prevent the DiscardOrKeepProfileChangesDialog from popping up (twice) if there are user changes - # The dialog is not relevant here, since we're restoring the previous situation as good as possible - preferences = Preferences.getInstance() - choice_on_profile_override = preferences.getValue("cura/choice_on_profile_override") - preferences.setValue("cura/choice_on_profile_override", "always_keep") - - if extruder_material_id: - machine_manager.setActiveMaterial(extruder_material_id) - if extruder_variant_id: - machine_manager.setActiveVariant(extruder_variant_id) - - preferences.setValue("cura/choice_on_profile_override", choice_on_profile_override) + if settable_per_extruder: + limit_to_extruder = int(self._global_container_stack.getProperty(setting_key, "limit_to_extruder")) + extruder_stack = extruder_stacks[max(0, limit_to_extruder)] + extruder_stack.getTop().setProperty(setting_key, "value", global_user_container.getProperty(setting_key, "value")) + global_user_container.removeInstance(setting_key) self.forceUpdate() - @pyqtSlot() def forceUpdate(self): # Force rebuilding the build volume by reloading the global container stack. @@ -275,16 +223,13 @@ class MachineSettingsAction(MachineAction): if not self._global_container_stack.getMetaDataEntry("has_materials", False): return - machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") - if machine_extruder_count > 1: - material = ExtruderManager.getInstance().getActiveExtruderStack().material - else: - material = self._global_container_stack.material + material = ExtruderManager.getInstance().getActiveExtruderStack().material material_diameter = material.getProperty("material_diameter", "value") - if not material_diameter: # in case of "empty" material + if not material_diameter: + # in case of "empty" material material_diameter = 0 - material_approximate_diameter = str(round(material_diameter)) + material_approximate_diameter = str(round(material_diameter)) definition_changes = self._global_container_stack.definitionChanges machine_diameter = definition_changes.getProperty("material_diameter", "value") if not machine_diameter: @@ -294,10 +239,7 @@ class MachineSettingsAction(MachineAction): if material_approximate_diameter != machine_approximate_diameter: Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.") - if machine_extruder_count > 1: - stacks = ExtruderManager.getInstance().getExtruderStacks() - else: - stacks = [self._global_container_stack] + stacks = ExtruderManager.getInstance().getExtruderStacks() if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): materials_definition = self._global_container_stack.definition.getId() @@ -338,7 +280,7 @@ class MachineSettingsAction(MachineAction): search_criteria["id"] = stack.getMetaDataEntry("preferred_material") materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: - # Preferrd material with new diameter is not found, search for any material + # Preferred material with new diameter is not found, search for any material search_criteria.pop("id", None) materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index d0cb53c4f8..dc6efafa13 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -78,31 +78,26 @@ class PerObjectSettingsTool(Tool): def _onGlobalContainerChanged(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: + + # used for enabling or disabling per extruder settings per object self._multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Ensure that all extruder data is reset - if not self._multi_extrusion: - default_stack_id = global_container_stack.getId() - else: - default_stack = ExtruderManager.getInstance().getExtruderStack(0) - if default_stack: - default_stack_id = default_stack.getId() - else: - default_stack_id = global_container_stack.getId() + extruder_stack = ExtruderManager.getInstance().getExtruderStack(0) - root_node = Application.getInstance().getController().getScene().getRoot() - for node in DepthFirstIterator(root_node): - new_stack_id = default_stack_id - # Get position of old extruder stack for this node - old_extruder_pos = node.callDecoration("getActiveExtruderPosition") - if old_extruder_pos is not None: - # Fetch current (new) extruder stack at position - new_stack = ExtruderManager.getInstance().getExtruderStack(old_extruder_pos) - if new_stack: - new_stack_id = new_stack.getId() - node.callDecoration("setActiveExtruder", new_stack_id) + if extruder_stack: + root_node = Application.getInstance().getController().getScene().getRoot() + for node in DepthFirstIterator(root_node): + new_stack_id = extruder_stack.getId() + # Get position of old extruder stack for this node + old_extruder_pos = node.callDecoration("getActiveExtruderPosition") + if old_extruder_pos is not None: + # Fetch current (new) extruder stack at position + new_stack = ExtruderManager.getInstance().getExtruderStack(old_extruder_pos) + if new_stack: + new_stack_id = new_stack.getId() + node.callDecoration("setActiveExtruder", new_stack_id) - self._updateEnabled() + self._updateEnabled() def _updateEnabled(self): selected_objects = Selection.getAllSelectedObjects() diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 0514c4dacf..79963a4740 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -87,15 +87,10 @@ class SliceInfo(Extension): data["active_machine"] = {"definition_id": global_container_stack.definition.getId(), "manufacturer": global_container_stack.definition.getMetaData().get("manufacturer","")} + # add extruder specific data to slice info data["extruders"] = [] - extruder_count = len(global_container_stack.extruders) - extruders = [] - if extruder_count > 1: - extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) - extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) - - if not extruders: - extruders = [global_container_stack] + extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId())) + extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) for extruder in extruders: extruder_dict = dict() diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8f0c9a4dc1..bc1b08cc5e 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -46,19 +46,10 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*theme.getColor("model_unslicable_alt").getRgb())) self._disabled_shader.setUniformValue("u_width", 50.0) - multi_extrusion = False - global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - - if multi_extrusion: - support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") - support_angle_stack = ExtruderManager.getInstance().getExtruderStack(support_extruder_nr) - if not support_angle_stack: - support_angle_stack = global_container_stack - else: - support_angle_stack = global_container_stack + support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") + support_angle_stack = ExtruderManager.getInstance().getExtruderStack(support_extruder_nr) if Preferences.getInstance().getValue("view/show_overhang"): angle = support_angle_stack.getProperty("support_angle", "value") @@ -71,33 +62,26 @@ class SolidView(View): else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - for node in DepthFirstIterator(scene.getRoot()): if not node.render(renderer): if node.getMeshData() and node.isVisible(): uniforms = {} shade_factor = 1.0 - if not multi_extrusion: - if global_container_stack: - material = global_container_stack.findContainer({ "type": "material" }) - material_color = material.getMetaDataEntry("color_code", default = self._extruders_model.defaultColors[0]) if material else self._extruders_model.defaultColors[0] - else: - material_color = self._extruders_model.defaultColors[0] - else: - # Get color to render this mesh in from ExtrudersModel - extruder_index = 0 - extruder_id = node.callDecoration("getActiveExtruder") - if extruder_id: - extruder_index = max(0, self._extruders_model.find("id", extruder_id)) - try: - material_color = self._extruders_model.getItem(extruder_index)["color"] - except KeyError: - material_color = self._extruders_model.defaultColors[0] + # Get color to render this mesh in from ExtrudersModel + extruder_index = 0 + extruder_id = node.callDecoration("getActiveExtruder") + if extruder_id: + extruder_index = max(0, self._extruders_model.find("id", extruder_id)) + try: + material_color = self._extruders_model.getItem(extruder_index)["color"] + except KeyError: + material_color = self._extruders_model.defaultColors[0] + + if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: + # Shade objects that are printed with the non-active extruder 25% darker + shade_factor = 0.6 - if extruder_index != ExtruderManager.getInstance().activeExtruderIndex: - # Shade objects that are printed with the non-active extruder 25% darker - shade_factor = 0.6 try: # Colors are passed as rgb hex strings (eg "#ffffff"), and the shader needs # an rgba list of floats (eg [1.0, 1.0, 1.0, 1.0]) diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py index c84033a98e..db277bc485 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py @@ -37,7 +37,7 @@ class UM2UpgradeSelection(MachineAction): def setHasVariants(self, has_variants = True): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - variant_container = global_container_stack.variant + variant_container = global_container_stack.extruders["0"].variant variant_index = global_container_stack.getContainerIndex(variant_container) if has_variants: @@ -52,7 +52,7 @@ class UM2UpgradeSelection(MachineAction): search_criteria = { "type": "variant", "definition": "ultimaker2", "id": "*0.4*" } containers = self._container_registry.findInstanceContainers(**search_criteria) if containers: - global_container_stack.variant = containers[0] + global_container_stack.extruders["0"].variant = containers[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 86f90e8970..fa40819eeb 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -549,7 +549,7 @@ class XmlMaterialProfile(InstanceContainer): definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) if not definitions: - Logger.log("w", "No definition found for machine ID %s", machine_id) + # Logger.log("w", "No definition found for machine ID %s", machine_id) continue definition = definitions[0] diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json index 3d19aef626..aaea743b47 100644 --- a/resources/definitions/101Hero.def.json +++ b/resources/definitions/101Hero.def.json @@ -7,10 +7,6 @@ "visible": true, "author": "rikky", "manufacturer": "101Hero", - "machine_extruder_trains": - { - "0": "fdmextruder" - }, "file_formats": "text/x-gcode", "platform": "101hero-platform.stl", "supports_usb_connection": true diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index b72a49a35b..513ee8f0e1 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -10,11 +10,7 @@ "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "supports_usb_connection": true, - "platform": "3dator_platform.stl", - "machine_extruder_trains": - { - "0": "fdmextruder" - } + "platform": "3dator_platform.stl" }, "overrides": { @@ -29,7 +25,6 @@ "layer_height": { "default_value": 0.2 }, "speed_print": { "default_value": 50 }, "speed_infill": { "default_value": 60 }, - "machine_extruder_count": { "default_value": 1 }, "machine_heated_bed": { "default_value": true }, "machine_center_is_zero": { "default_value": false }, "machine_height": { "default_value": 260 }, diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 8ed194fc2d..ada35fafe0 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -8,7 +8,8 @@ "author": "Ultimaker", "manufacturer": "Unknown", "setting_version": 1, - "visible": false + "visible": false, + "position": "0" }, "settings": { diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 2fd19a8a03..fb2bd3bff2 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -177,7 +177,7 @@ UM.MainWindow MenuSeparator { } - MenuItem { text: catalog.i18nc("@action:inmenu", "Set as Active Extruder"); onTriggered: ExtruderManager.setActiveExtruderIndex(model.index) } + MenuItem { text: catalog.i18nc("@action:inmenu", "Set as Active Extruder"); onTriggered: Cura.ExtruderManager.setActiveExtruderIndex(model.index) } } onObjectAdded: settingsMenu.insertItem(index, object) onObjectRemoved: settingsMenu.removeItem(object) diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml index 99196b0c9f..9212c705f7 100644 --- a/resources/qml/ExtruderButton.qml +++ b/resources/qml/ExtruderButton.qml @@ -18,7 +18,7 @@ Button style: UM.Theme.styles.tool_button; iconSource: UM.Theme.getIcon("extruder_button") - checked: ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 + checked: Cura.ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 enabled: UM.Selection.hasSelection property color customColor: base.hovered ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("button"); diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 39d497722f..b2c95ebcd8 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -31,7 +31,7 @@ Menu visible: base.shouldShowExtruders enabled: UM.Selection.hasSelection checkable: true - checked: ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 + checked: Cura.ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 onTriggered: CuraActions.setExtruderForSelection(model.id) shortcut: "Ctrl+" + (model.index + 1) } diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index d3ecfb69fe..a6666b67f4 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -78,16 +78,16 @@ Menu { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveMaterialIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { // This workaround is done because of the application menus for materials and variants for multiextrusion printers. // The extruder menu would always act on the correspoding extruder only, instead of acting on the extruder selected in the UI. - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: menu.insertItem(index, object) @@ -121,16 +121,16 @@ Menu { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveMaterialIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { // This workaround is done because of the application menus for materials and variants for multiextrusion printers. // The extruder menu would always act on the correspoding extruder only, instead of acting on the extruder selected in the UI. - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: brandMaterialsMenu.insertItem(index, object) diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index e9f2df1f38..f70e639872 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -44,15 +44,15 @@ Menu visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex && !isClusterPrinter onTriggered: { - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); var hotendId = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; var itemIndex = nozzleInstantiator.model.find("name", hotendId); if(itemIndex > -1) { Cura.MachineManager.setActiveVariant(nozzleInstantiator.model.getItem(itemIndex).id); } - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } @@ -75,14 +75,14 @@ Menu MenuItem { text: model.name checkable: true - checked: model.id == Cura.MachineManager.allActiveVariantIds[ExtruderManager.extruderIds[extruderIndex]] + checked: model.id == Cura.MachineManager.allActiveVariantIds[Cura.ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group onTriggered: { - var activeExtruderIndex = ExtruderManager.activeExtruderIndex; - ExtruderManager.setActiveExtruderIndex(extruderIndex); + var activeExtruderIndex = Cura.ExtruderManager.activeExtruderIndex; + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveVariant(model.id); - ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + Cura.ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: menu.insertItem(index, object) diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index fecea5ef99..edce2641af 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -41,7 +41,7 @@ Menu MenuItem { - text: model.name + " - " + model.layer_height + text: model.name checkable: true checked: Cura.MachineManager.activeQualityChangesId == model.id exclusiveGroup: group diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index c7b6b3e933..e3ba9b23a4 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -208,7 +208,7 @@ UM.ManagementPage anchors.right: parent.right anchors.bottom: parent.bottom - currentIndex: ExtruderManager.extruderCount > 0 ? ExtruderManager.activeExtruderIndex + 1 : 0 + currentIndex: Cura.ExtruderManager.extruderCount > 0 ? Cura.ExtruderManager.activeExtruderIndex + 1 : 0 ProfileTab { diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index ce169ba714..e69f7cf4fd 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -87,7 +87,7 @@ Column Label //Extruder name. { - text: ExtruderManager.getExtruderName(index) != "" ? ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") + text: Cura.ExtruderManager.getExtruderName(index) != "" ? Cura.ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") color: UM.Theme.getColor("text") font: UM.Theme.getFont("default") anchors.left: parent.left diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 2bf2c17273..6234e5f1f7 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -157,7 +157,7 @@ Item { var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. - tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; + tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + Cura.ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; } base.showTooltip(tooltipText); } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index c116fa933a..d1c8ae2c51 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -275,7 +275,7 @@ Item Behavior on opacity { NumberAnimation { duration: 100 } } enabled: { - if(!ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1) + if (!Cura.ExtruderManager.activeExtruderStackId && machineExtruderCount.properties.value > 1) { // disable all controls on the global tab, except categories return model.type == "category" @@ -345,12 +345,12 @@ Item if(inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0) { //We have limit_to_extruder, so pick that stack. - return ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; + return Cura.ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; } - if(ExtruderManager.activeExtruderStackId) + if(Cura.ExtruderManager.activeExtruderStackId) { //We're on an extruder tab. Pick the current extruder. - return ExtruderManager.activeExtruderStackId; + return Cura.ExtruderManager.activeExtruderStackId; } //No extruder tab is selected. Pick the global stack. Shouldn't happen any more since we removed the global tab. return activeMachineId; diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 78e21f3a68..8bba4cf6fd 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -14,7 +14,7 @@ Column { id: base; - property int currentExtruderIndex: ExtruderManager.activeExtruderIndex; + property int currentExtruderIndex: Cura.ExtruderManager.activeExtruderIndex; property bool currentExtruderVisible: extrudersList.visible; spacing: Math.floor(UM.Theme.getSize("sidebar_margin").width * 0.9) @@ -93,7 +93,7 @@ Column onClicked: { forceActiveFocus() // Changing focus applies the currently-being-typed values so it can change the displayed setting values. - ExtruderManager.setActiveExtruderIndex(index); + Cura.ExtruderManager.setActiveExtruderIndex(index); } style: ButtonStyle diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 549d203c4d..020b75e3ce 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -19,7 +19,7 @@ Item property Action configureSettings; property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime; - property bool settingsEnabled: ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 + property bool settingsEnabled: Cura.ExtruderManager.activeExtruderStackId || machineExtruderCount.properties.value == 1 Component.onCompleted: PrintInformation.enabled = true Component.onDestruction: PrintInformation.enabled = false From dd8e5e2c6e83581137e5dc13910b299b96ac669e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 17 Nov 2017 15:05:08 +0100 Subject: [PATCH 266/764] CURA-4577 Take into account relative movements in GCodes --- plugins/GCodeReader/GCodeReader.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 9107ec3258..b8e6a8f009 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -135,16 +135,22 @@ class GCodeReader(MeshReader): def _gCode0(self, position, params, path): x, y, z, e = position - x = params.x if params.x is not None else x - y = params.y if params.y is not None else y - z = params.z if params.z is not None else position.z + if self._is_absolute_positioning: + x = params.x if params.x is not None else x + y = params.y if params.y is not None else y + z = params.z if params.z is not None else position.z + else: + x = x + params.x if params.x is not None else x + y = y + params.y if params.y is not None else y + z = z + params.z if params.z is not None else position.z if params.e is not None: - if params.e > e[self._extruder_number]: + new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e + if new_extrusion_value > e[self._extruder_number]: path.append([x, y, z, self._layer_type]) # extrusion else: path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction - e[self._extruder_number] = params.e + e[self._extruder_number] = new_extrusion_value # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. From a42d05450587813f47342275547a3fae7748b40d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Nov 2017 17:49:00 +0100 Subject: [PATCH 267/764] Tweak simulation view panel margins --- plugins/SimulationView/SimulationView.qml | 16 +++++----------- resources/themes/cura-light/theme.json | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 8f6dcf0af0..45d0e22d58 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -70,9 +70,9 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getSize("layerview_row_spacing").height anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("layerview_row_spacing").height Label { @@ -120,7 +120,6 @@ Item visible: !UM.SimulationView.compatibilityMode style: UM.Theme.styles.combobox anchors.right: parent.right - anchors.rightMargin: 10 * screenScaleFactor onActivated: { @@ -154,12 +153,10 @@ Item Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } - Label + Item { - id: space2Label - anchors.left: parent.left - text: " " - font.pointSize: 0.5 + height: Math.floor(UM.Theme.getSize("default_margin").width / 2) + width: width } Connections { @@ -192,7 +189,6 @@ Item Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: extrudersModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: model.color @@ -261,7 +257,6 @@ Item Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: legendModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: UM.Theme.getColor(model.colorId) @@ -330,7 +325,6 @@ Item Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: typesLegendModelLabel.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: UM.Theme.getColor(model.colorId) @@ -347,7 +341,7 @@ Item } // Text for the minimum, maximum and units for the feedrates and layer thickness - Rectangle { + Item { id: gradientLegend visible: view_settings.show_gradient width: parent.width diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 76f4ab9fc6..703ffe7082 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -346,8 +346,8 @@ "slider_layerview_background": [4.0, 0.0], "slider_layerview_margin": [1.0, 1.5], - "layerview_menu_size": [15, 19.5], - "layerview_menu_size_material_color_mode": [15, 15.5], + "layerview_menu_size": [15, 20], + "layerview_menu_size_material_color_mode": [15, 16], "layerview_menu_size_compatibility": [22, 22.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], From 10b5a19043d730431cb68d346f02df56452d67b8 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 17 Nov 2017 15:22:29 +0100 Subject: [PATCH 268/764] Fix merge conflict --- cura/PrintInformation.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 3e1ed2f8fa..3353cc176e 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -308,6 +308,9 @@ class PrintInformation(QObject): # name is "" when I first had some meshes and afterwards I deleted them so the naming should start again is_empty = name == "" if is_empty or (self._base_name == "" and self._base_name != name): + # remove ".curaproject" suffix from (imported) the file name + if name.endswith(".curaproject"): + name = name[:name.rfind(".curaproject")] self._base_name = name self._updateJobName( empty_name = is_empty) From 85eab3606b459489db6a546598afe5f65419156f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 17 Nov 2017 16:31:16 +0100 Subject: [PATCH 269/764] Simplify relative positioning xyz value updates - CURA-4577 --- plugins/GCodeReader/GCodeReader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index b8e6a8f009..3243a1623e 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -140,9 +140,9 @@ class GCodeReader(MeshReader): y = params.y if params.y is not None else y z = params.z if params.z is not None else position.z else: - x = x + params.x if params.x is not None else x - y = y + params.y if params.y is not None else y - z = z + params.z if params.z is not None else position.z + x += params.x if params.x is not None else x + y += params.y if params.y is not None else y + z += params.z if params.z is not None else position.z if params.e is not None: new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e From a4ed3bb2c6ac08470c3d5d5541268e2328af0e90 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 20 Nov 2017 09:04:07 +0100 Subject: [PATCH 270/764] CURA-4577 Fix the previous change --- plugins/GCodeReader/GCodeReader.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 3243a1623e..e8c2a4e0fd 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -138,11 +138,11 @@ class GCodeReader(MeshReader): if self._is_absolute_positioning: x = params.x if params.x is not None else x y = params.y if params.y is not None else y - z = params.z if params.z is not None else position.z + z = params.z if params.z is not None else z else: - x += params.x if params.x is not None else x - y += params.y if params.y is not None else y - z += params.z if params.z is not None else position.z + x += params.x if params.x is not None else 0 + y += params.y if params.y is not None else 0 + z += params.z if params.z is not None else 0 if params.e is not None: new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e From b875f06bafe01413261c8ee6e5b69e087efbac83 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Nov 2017 10:51:51 +0100 Subject: [PATCH 271/764] Add setting to set the maximum mesh resolution Implements issue CURA-4590. --- resources/definitions/fdmprinter.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index bf65baf1d9..0fedc4accc 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4945,6 +4945,18 @@ "default_value": false, "settable_per_mesh": true }, + "meshfix_maximum_resolution": + { + "label": "Maximum Resolution", + "description": "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway.", + "type": "float", + "unit": "mm", + "default_value": 0.01, + "minimum_value": "0.001", + "minimum_value_warning": "0.005", + "maximum_value_warning": "0.1", + "settable_per_mesh": true + }, "multiple_mesh_overlap": { "label": "Merged Meshes Overlap", From 8cad79831acbc63d11956396a9050ebab7b84e80 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 20 Nov 2017 13:04:46 +0100 Subject: [PATCH 272/764] Fix empty containers in stack upgrade --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 4672cb1488..7064da09ad 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -45,6 +45,15 @@ _OLD_NOT_SUPPORTED_PROFILES = [ ] +# Some containers have their specific empty containers, those need to be set correctly. +_EMPTY_CONTAINER_DICT = { + "1": "empty_quality_changes", + "2": "empty_quality", + "3": "empty_material", + "4": "empty_variant", +} + + class VersionUpgrade30to31(VersionUpgrade): ## Gets the version number from a CFG file in Uranium's 3.0 format. # @@ -126,6 +135,11 @@ class VersionUpgrade30to31(VersionUpgrade): if quality_profile_id in _OLD_NOT_SUPPORTED_PROFILES: parser["containers"]["2"] = "empty_quality" + # fix empty containers + for key, specific_empty_container in _EMPTY_CONTAINER_DICT: + if parser.has_option("containers", key) and parser["containers"][key] == "empty": + parser["containers"][key] = specific_empty_container + # Update version numbers if "general" not in parser: parser["general"] = {} From d00f3ba79b0fbcb470f9574813aad8067bad6677 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 20 Nov 2017 13:06:02 +0100 Subject: [PATCH 273/764] Fix for loop --- .../VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 7064da09ad..7130871d8e 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -136,7 +136,7 @@ class VersionUpgrade30to31(VersionUpgrade): parser["containers"]["2"] = "empty_quality" # fix empty containers - for key, specific_empty_container in _EMPTY_CONTAINER_DICT: + for key, specific_empty_container in _EMPTY_CONTAINER_DICT.items(): if parser.has_option("containers", key) and parser["containers"][key] == "empty": parser["containers"][key] = specific_empty_container From f197508694e965603e7326c274c610341e98c88c Mon Sep 17 00:00:00 2001 From: jack Date: Mon, 20 Nov 2017 13:35:15 +0100 Subject: [PATCH 274/764] Merge pull request #2814 from Ultimaker/feature_maximum_resolution Maximum mesh resolution --- cura/PrintInformation.py | 2 +- plugins/GCodeReader/GCodeReader.py | 13 ++++++++++++- resources/definitions/cartesio.def.json | 9 ++++++--- resources/extruders/cartesio_extruder_0.def.json | 2 +- resources/extruders/cartesio_extruder_1.def.json | 2 +- resources/extruders/cartesio_extruder_2.def.json | 2 +- resources/extruders/cartesio_extruder_3.def.json | 2 +- .../cartesio/pc/cartesio_0.25_pc_high.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.25_pc_normal.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.4_pc_high.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.4_pc_normal.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg | 2 +- .../pc/cartesio_0.8_pc_extra_coarse.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_high.inst.cfg | 2 +- .../cartesio/pc/cartesio_0.8_pc_normal.inst.cfg | 2 +- 15 files changed, 31 insertions(+), 17 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 3353cc176e..46d9a61254 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -312,7 +312,7 @@ class PrintInformation(QObject): if name.endswith(".curaproject"): name = name[:name.rfind(".curaproject")] self._base_name = name - self._updateJobName( empty_name = is_empty) + self._updateJobName(empty_name = is_empty) ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index e8c2a4e0fd..1b2795800e 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -54,6 +54,7 @@ class GCodeReader(MeshReader): self._previous_z = 0 self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() self._center_is_zero = False + self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) @staticmethod def _getValue(line, code): @@ -172,6 +173,16 @@ class GCodeReader(MeshReader): 0, position.e) + ## Set the absolute positioning + def _gCode90(self, position, params, path): + self._is_absolute_positioning = True + return position + + ## Set the relative positioning + def _gCode91(self, position, params, path): + self._is_absolute_positioning = False + return position + ## Reset the current position to the values specified. # For example: G92 X10 will set the X to 10 without any physical motion. def _gCode92(self, position, params, path): @@ -202,7 +213,7 @@ class GCodeReader(MeshReader): z = float(item[1:]) if item[0] == "E": e = float(item[1:]) - if (x is not None and x < 0) or (y is not None and y < 0): + if self._is_absolute_positioning and ((x is not None and x < 0) or (y is not None and y < 0)): self._center_is_zero = True params = self._position(x, y, z, e) return func(position, params, path) diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index 45b0111209..5d6a0fca16 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -47,21 +47,24 @@ "material_bed_temp_wait": { "default_value": false }, "prime_tower_enable": { "default_value": true }, "prime_tower_wall_thickness": { "resolve": 0.7 }, - "prime_tower_position_x": { "value": "50" }, - "prime_tower_position_y": { "value": "150" }, + "prime_tower_size": { "value": 24.0 }, + "prime_tower_position_x": { "value": 125 }, + "prime_tower_position_y": { "value": 70 }, "prime_blob_enable": { "default_value": false }, "machine_max_feedrate_z": { "default_value": 20 }, "machine_disallowed_areas": { "default_value": [ [[215, 135], [-215, 135], [-215, 75], [215, 75]] ]}, "machine_start_gcode": { - "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" + "default_value": "\nM92 E159 ;2288 for V5 extruder\n\nM140 S{material_bed_temperature_layer_0}\nM104 S120 T1\nM104 S120 T2\nM104 S120 T3\n\nG21\nG90\nM42 S255 P13 ;chamber lights\nM42 S255 P12 ;fume extraction\nM204 S300 ;default acceleration\nM205 X10 ;default jerk\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\nG1 Z10 F600\nG1 X70 Y20 F9000;go to wipe point\n\nM190 S{material_bed_temperature_layer_0}\n\nM117 Heating for 50 sec.\nG4 S20\nM117 Heating for 30 sec.\nG4 S20\nM117 Heating for 10 sec.\nM300 S1200 P1000\nG4 S9\n\nM117 purging nozzle....\nT0\nG92 E0;set E\nG1 E10 F100\nG92 E0\nG1 E-1 F600\n\nM117 wiping nozzle....\nG1 X1 Y24 F3000\nG1 X70 F9000\nG1 Z10 F900\n\nM104 S21 T1\nM104 S21 T2\nM104 S21 T3\n\nM117 Printing .....\n" }, "machine_end_gcode": { "default_value": "; -- END GCODE --\nM117 cooling down....\nM106 S255\nM140 S5\nM104 S5 T0\nM104 S5 T1\nM104 S5 T2\nM104 S5 T3\n\nG91\nG1 Z1 F900\nG90\n\nG1 X20.0 Y260.0 F6000\nG4 S7\nM84\nG4 S90\nM107\nM42 P12 S0\nM42 P13 S0\nM84\nT0\nM117 Finished.\n; -- end of GCODE --" }, "layer_height": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, "layer_height_0": { "maximum_value": "(0.8 * min(extruderValues('machine_nozzle_size')))" }, + "retraction_extra_prime_amount": { "minimum_value_warning": "-2.0" }, + "optimize_wall_printing_order": { "default_value": true }, "machine_nozzle_heat_up_speed": {"default_value": 20}, "machine_nozzle_cool_down_speed": {"default_value": 20}, "machine_min_cool_heat_time_window": {"default_value": 5} diff --git a/resources/extruders/cartesio_extruder_0.def.json b/resources/extruders/cartesio_extruder_0.def.json index f1423f3530..5558d9325e 100644 --- a/resources/extruders/cartesio_extruder_0.def.json +++ b/resources/extruders/cartesio_extruder_0.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_0", "version": 2, - "name": "Extruder 0", + "name": "Extruder 1", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_1.def.json b/resources/extruders/cartesio_extruder_1.def.json index 402553ff96..f8350f8091 100644 --- a/resources/extruders/cartesio_extruder_1.def.json +++ b/resources/extruders/cartesio_extruder_1.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_1", "version": 2, - "name": "Extruder 1", + "name": "Extruder 2", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_2.def.json b/resources/extruders/cartesio_extruder_2.def.json index e8f47772cb..bfc10e75c3 100644 --- a/resources/extruders/cartesio_extruder_2.def.json +++ b/resources/extruders/cartesio_extruder_2.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_2", "version": 2, - "name": "Extruder 2", + "name": "Extruder 3", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/extruders/cartesio_extruder_3.def.json b/resources/extruders/cartesio_extruder_3.def.json index a3e435470a..f0be53e564 100644 --- a/resources/extruders/cartesio_extruder_3.def.json +++ b/resources/extruders/cartesio_extruder_3.def.json @@ -1,7 +1,7 @@ { "id": "cartesio_extruder_3", "version": 2, - "name": "Extruder 3", + "name": "Extruder 4", "inherits": "fdmextruder", "metadata": { "machine": "cartesio", diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg index 2f401556d4..ff6547dd91 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg index 225b0ec5cf..f3faa9c129 100644 --- a/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.25_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg index 53e61a81a2..3aa808fab5 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg index e7b179dfe1..f9be12da3a 100644 --- a/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.4_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg index baa3a1fdce..597187437b 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_coarse.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 30 +speed_print = 15 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg index 81f939f800..6d1fa196ec 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_extra_coarse.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 25 +speed_print = 15 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg index 41b2cc70f0..c570b65350 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_high.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) diff --git a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg index e5ae6aff1d..0d73b24197 100644 --- a/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg +++ b/resources/quality/cartesio/pc/cartesio_0.8_pc_normal.inst.cfg @@ -31,7 +31,7 @@ switch_extruder_retraction_amount = 2 switch_extruder_retraction_speeds = =retraction_speed switch_extruder_prime_speed = =retraction_prime_speed -speed_print = 50 +speed_print = 20 speed_infill = =speed_print speed_layer_0 = =round(speed_print / 5 * 4) speed_wall = =round(speed_print / 2) From 7219d84b913d094d3d91aff9862891eece053e24 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 20 Nov 2017 13:01:09 +0100 Subject: [PATCH 275/764] CURA-4104 added settings for flow rate compensated extrusion --- resources/definitions/fdmprinter.def.json | 30 +++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0fedc4accc..b7f5bc8352 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5589,6 +5589,36 @@ } } }, + "flow_rate_max_extrusion_offset": + { + "label": "Flow rate compensation max extrusion offset", + "description": "The maximum distance in mm to compensate for pressure in the bowden tube.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0, + "value": "0", + "enabled": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "flow_rate_extrusion_offset_factor": + { + "label": "Flow rate compensation factor", + "description": "The multiplication factor for the flow rate -> distance translation.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 100, + "value": "100", + "enabled": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "wireframe_enabled": { "label": "Wire Printing", From 43f339f927c120fedcff6bfd893692c4d06ff371 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 20 Nov 2017 14:19:58 +0100 Subject: [PATCH 276/764] Update fdmprinter.def.json --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b7f5bc8352..be2c5d9757 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5592,7 +5592,7 @@ "flow_rate_max_extrusion_offset": { "label": "Flow rate compensation max extrusion offset", - "description": "The maximum distance in mm to compensate for pressure in the bowden tube.", + "description": "The maximum distance in mm to compensate.", "unit": "mm", "type": "float", "minimum_value": "0", From 532331bd44342da8d6ce767e6423efa66fd663f3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Nov 2017 20:24:38 +0100 Subject: [PATCH 277/764] Add a collapse button to the Simulation View panel See https://github.com/Ultimaker/Cura/pull/2732 --- plugins/SimulationView/SimulationView.qml | 311 ++++++++++++---------- resources/themes/cura-light/theme.json | 1 + 2 files changed, 172 insertions(+), 140 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 45d0e22d58..0387d0b85e 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -20,7 +20,9 @@ Item } } height: { - if (UM.SimulationView.compatibilityMode) { + if (viewSettings.collapsed) { + return UM.Theme.getSize("layerview_menu_size_collapsed").height; + } else if (UM.SimulationView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").height; } else if (UM.Preferences.getValue("layerview/layer_view_type") == 0) { return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) @@ -28,6 +30,7 @@ Item return UM.Theme.getSize("layerview_menu_size").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } } + Behavior on height { NumberAnimation { duration: 100 } } property var buttonTarget: { if(parent != null) @@ -40,21 +43,49 @@ Item visible: parent != null ? !parent.parent.monitoringPrint: true - UM.PointingRectangle { + Rectangle { id: layerViewMenu anchors.right: parent.right anchors.top: parent.top width: parent.width height: parent.height + clip: true z: layerSlider.z - 1 color: UM.Theme.getColor("tool_panel_background") - borderWidth: UM.Theme.getSize("default_lining").width - borderColor: UM.Theme.getColor("lining") - arrowSize: 0 // hide arrow until weird issue with first time rendering is fixed + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + + Button { + id: collapseButton + anchors.top: parent.top + anchors.topMargin: Math.floor(UM.Theme.getSize("default_margin").height + (UM.Theme.getSize("layerview_row").height - UM.Theme.getSize("default_margin").height) / 2) + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + + onClicked: viewSettings.collapsed = !viewSettings.collapsed + + style: ButtonStyle + { + background: UM.RecolorImage + { + width: control.width + height: control.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("setting_control_text") + source: viewSettings.collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom") + } + label: Label{ } + } + } ColumnLayout { - id: view_settings + id: viewSettings + property bool collapsed: false property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") @@ -135,7 +166,7 @@ Item function updateLegends(type_id) { // update visibility of legends - view_settings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); + viewSettings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); } } @@ -165,13 +196,13 @@ Item { layerTypeCombobox.currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); - view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); - view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); + viewSettings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); + viewSettings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); + viewSettings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); + viewSettings.show_skin = UM.Preferences.getValue("layerview/show_skin"); + viewSettings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + viewSettings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); + viewSettings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } } @@ -179,10 +210,10 @@ Item model: Cura.ExtrudersModel{} CheckBox { id: extrudersModelCheckBox - checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" + checked: viewSettings.extruder_opacities[index] > 0.5 || viewSettings.extruder_opacities[index] == undefined || viewSettings.extruder_opacities[index] == "" onClicked: { - view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 - UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); + viewSettings.extruder_opacities[index] = checked ? 1.0 : 0.0 + UM.Preferences.setValue("layerview/extruder_opacities", viewSettings.extruder_opacities.join("|")); } visible: !UM.SimulationView.compatibilityMode enabled: index + 1 <= 4 @@ -195,7 +226,7 @@ Item radius: width / 2 border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: !view_settings.show_legend & !view_settings.show_gradient + visible: !viewSettings.show_legend & !viewSettings.show_gradient } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -223,25 +254,25 @@ Item { typesLegendModel.append({ label: catalog.i18nc("@label", "Show Travels"), - initialValue: view_settings.show_travel_moves, + initialValue: viewSettings.show_travel_moves, preference: "layerview/show_travel_moves", colorId: "layerview_move_combing" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Helpers"), - initialValue: view_settings.show_helpers, + initialValue: viewSettings.show_helpers, preference: "layerview/show_helpers", colorId: "layerview_support" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Shell"), - initialValue: view_settings.show_skin, + initialValue: viewSettings.show_skin, preference: "layerview/show_skin", colorId: "layerview_inset_0" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Infill"), - initialValue: view_settings.show_infill, + initialValue: viewSettings.show_infill, preference: "layerview/show_infill", colorId: "layerview_infill" }); @@ -262,7 +293,7 @@ Item color: UM.Theme.getColor(model.colorId) border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + visible: viewSettings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -284,7 +315,7 @@ Item } CheckBox { - checked: view_settings.only_show_top_layers + checked: viewSettings.only_show_top_layers onClicked: { UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); } @@ -293,7 +324,7 @@ Item style: UM.Theme.styles.checkbox } CheckBox { - checked: view_settings.top_layer_count == 5 + checked: viewSettings.top_layer_count == 5 onClicked: { UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); } @@ -320,7 +351,7 @@ Item Label { text: label - visible: view_settings.show_legend + visible: viewSettings.show_legend id: typesLegendModelLabel Rectangle { anchors.verticalCenter: parent.verticalCenter @@ -330,7 +361,7 @@ Item color: UM.Theme.getColor(model.colorId) border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + visible: viewSettings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -343,7 +374,7 @@ Item // Text for the minimum, maximum and units for the feedrates and layer thickness Item { id: gradientLegend - visible: view_settings.show_gradient + visible: viewSettings.show_gradient width: parent.width height: UM.Theme.getSize("layerview_row").height anchors { @@ -419,7 +450,7 @@ Item Rectangle { // In QML 5.9 can be changed by LinearGradient // Invert values because then the bar is rotated 90 degrees id: gradient - visible: view_settings.show_gradient + visible: viewSettings.show_gradient anchors.left: parent.right height: parent.width width: UM.Theme.getSize("layerview_row").height * 1.5 @@ -450,134 +481,134 @@ Item } } } + } - Item { - id: slidersBox + Item { + id: slidersBox - width: parent.width - visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity + width: parent.width + visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity + + anchors { + top: parent.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").height + left: parent.left + } + + PathSlider { + id: pathSlider + + height: UM.Theme.getSize("slider_handle").width + anchors.right: playButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.left: parent.left + visible: !UM.SimulationView.compatibilityMode + + // custom properties + handleValue: UM.SimulationView.currentPath + maximumValue: UM.SimulationView.numPaths + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + handleColor: UM.Theme.getColor("slider_handle") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + rangeColor: UM.Theme.getColor("slider_groove_fill") + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + } + + LayerSlider { + id: layerSlider + + width: UM.Theme.getSize("slider_handle").width + height: UM.Theme.getSize("layerview_menu_size").height anchors { - top: parent.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").height - left: parent.left + top: playButton.bottom + topMargin: UM.Theme.getSize("default_margin").height + right: parent.right + rightMargin: UM.Theme.getSize("slider_layerview_margin").width } - PathSlider { - id: pathSlider + // custom properties + upperValue: UM.SimulationView.currentLayer + lowerValue: UM.SimulationView.minimumLayer + maximumValue: UM.SimulationView.numLayers + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + upperHandleColor: UM.Theme.getColor("slider_handle") + lowerHandleColor: UM.Theme.getColor("slider_handle") + rangeHandleColor: UM.Theme.getColor("slider_groove_fill") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - height: UM.Theme.getSize("slider_handle").width - anchors.right: playButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.left: parent.left - visible: !UM.SimulationView.compatibilityMode - - // custom properties - handleValue: UM.SimulationView.currentPath - maximumValue: UM.SimulationView.numPaths - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - handleColor: UM.Theme.getColor("slider_handle") - handleActiveColor: UM.Theme.getColor("slider_handle_active") - rangeColor: UM.Theme.getColor("slider_groove_fill") - - // update values when layer data changes - Connections { - target: UM.SimulationView - onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) - onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) - } - - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - pathSlider.setHandleValue(UM.SimulationView.currentPath) - } + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) } - LayerSlider { - id: layerSlider + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + } - width: UM.Theme.getSize("slider_handle").width - height: UM.Theme.getSize("layerview_menu_size").height - - anchors { - top: playButton.bottom - topMargin: UM.Theme.getSize("default_margin").height - right: parent.right - rightMargin: UM.Theme.getSize("slider_layerview_margin").width - } - - // custom properties - upperValue: UM.SimulationView.currentLayer - lowerValue: UM.SimulationView.minimumLayer - maximumValue: UM.SimulationView.numLayers - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - upperHandleColor: UM.Theme.getColor("slider_handle") - lowerHandleColor: UM.Theme.getColor("slider_handle") - rangeHandleColor: UM.Theme.getColor("slider_groove_fill") - handleActiveColor: UM.Theme.getColor("slider_handle_active") - handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - - // update values when layer data changes - Connections { - target: UM.SimulationView - onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) - onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) - onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) - } - - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - layerSlider.setLowerValue(UM.SimulationView.minimumLayer) - layerSlider.setUpperValue(UM.SimulationView.currentLayer) - } + // Play simulation button + Button { + id: playButton + implicitWidth: Math.floor(UM.Theme.getSize("button").width * 0.75) + implicitHeight: Math.floor(UM.Theme.getSize("button").height * 0.75) + iconSource: "./resources/simulation_resume.svg" + style: UM.Theme.styles.tool_button + visible: !UM.SimulationView.compatibilityMode + anchors { + horizontalCenter: layerSlider.horizontalCenter + verticalCenter: pathSlider.verticalCenter } - // Play simulation button - Button { - id: playButton - implicitWidth: Math.floor(UM.Theme.getSize("button").width * 0.75) - implicitHeight: Math.floor(UM.Theme.getSize("button").height * 0.75) - iconSource: "./resources/simulation_resume.svg" - style: UM.Theme.styles.tool_button - visible: !UM.SimulationView.compatibilityMode - anchors { - horizontalCenter: layerSlider.horizontalCenter - verticalCenter: pathSlider.verticalCenter - } + property var status: 0 // indicates if it's stopped (0) or playing (1) - property var status: 0 // indicates if it's stopped (0) or playing (1) - - onClicked: { - switch(status) { - case 0: { - resumeSimulation() - break - } - case 1: { - pauseSimulation() - break - } + onClicked: { + switch(status) { + case 0: { + resumeSimulation() + break + } + case 1: { + pauseSimulation() + break } } + } - function pauseSimulation() { - UM.SimulationView.setSimulationRunning(false) - iconSource = "./resources/simulation_resume.svg" - simulationTimer.stop() - status = 0 - } + function pauseSimulation() { + UM.SimulationView.setSimulationRunning(false) + iconSource = "./resources/simulation_resume.svg" + simulationTimer.stop() + status = 0 + } - function resumeSimulation() { - UM.SimulationView.setSimulationRunning(true) - iconSource = "./resources/simulation_pause.svg" - simulationTimer.start() - } + function resumeSimulation() { + UM.SimulationView.setSimulationRunning(true) + iconSource = "./resources/simulation_pause.svg" + simulationTimer.start() } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 703ffe7082..08ff3013c9 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -348,6 +348,7 @@ "layerview_menu_size": [15, 20], "layerview_menu_size_material_color_mode": [15, 16], + "layerview_menu_size_collapsed": [15, 6], "layerview_menu_size_compatibility": [22, 22.0], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], From b4b39f0949fcea6a9d7e171a582542e3ea7a4830 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 20 Nov 2017 20:32:45 +0100 Subject: [PATCH 278/764] Tweak compatibility mode collapsed view panel --- plugins/SimulationView/SimulationView.qml | 7 +++++-- resources/themes/cura-light/theme.json | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 0387d0b85e..add8e6ebb0 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -21,6 +21,9 @@ Item } height: { if (viewSettings.collapsed) { + if (UM.SimulationView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility_collapsed").height; + } return UM.Theme.getSize("layerview_menu_size_collapsed").height; } else if (UM.SimulationView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").height; @@ -535,8 +538,8 @@ Item height: UM.Theme.getSize("layerview_menu_size").height anchors { - top: playButton.bottom - topMargin: UM.Theme.getSize("default_margin").height + top: !UM.SimulationView.compatibilityMode ? playButton.bottom : parent.top + topMargin: !UM.SimulationView.compatibilityMode ? UM.Theme.getSize("default_margin").height : 0 right: parent.right rightMargin: UM.Theme.getSize("slider_layerview_margin").width } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 08ff3013c9..09f93d413e 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -350,6 +350,7 @@ "layerview_menu_size_material_color_mode": [15, 16], "layerview_menu_size_collapsed": [15, 6], "layerview_menu_size_compatibility": [22, 22.0], + "layerview_menu_size_compatibility_collapsed": [15, 3.5], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], "layerview_row_spacing": [0.0, 0.5], From b6e997c88d5d8ac846f550b2e2ef1a6efeb7a288 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 10:47:29 +0100 Subject: [PATCH 279/764] CURA-4526 Delete LayerView plugin because it will be replaced with the SimulationView. This commit also adapts the code in order to accept the messages coming from the engine, with information about feedrates and line thicknesses. Add also some changes in the GCodeReader that reads feedrates and line thickness from the gcode file. --- cura/CuraApplication.py | 4 +- cura/Layer.py | 4 +- cura/LayerDataBuilder.py | 12 +- cura/LayerPolygon.py | 20 +- plugins/CuraEngineBackend/Cura.proto | 4 + .../CuraEngineBackend/CuraEngineBackend.py | 2 +- .../ProcessSlicedLayersJob.py | 18 +- plugins/GCodeReader/GCodeReader.py | 91 +++- plugins/LayerView/LayerPass.py | 113 ---- plugins/LayerView/LayerSlider.qml | 312 ----------- plugins/LayerView/LayerSliderLabel.qml | 103 ---- plugins/LayerView/LayerView.py | 495 ------------------ plugins/LayerView/LayerView.qml | 388 -------------- plugins/LayerView/LayerViewProxy.py | 151 ------ plugins/LayerView/__init__.py | 25 - plugins/LayerView/layers.shader | 156 ------ plugins/LayerView/layers3d.shader | 264 ---------- plugins/LayerView/layerview_composite.shader | 148 ------ plugins/LayerView/plugin.json | 8 - resources/themes/cura-dark/theme.json | 2 + resources/themes/cura-light/styles.qml | 1 + resources/themes/cura-light/theme.json | 4 +- 22 files changed, 116 insertions(+), 2209 deletions(-) delete mode 100755 plugins/LayerView/LayerPass.py delete mode 100644 plugins/LayerView/LayerSlider.qml delete mode 100644 plugins/LayerView/LayerSliderLabel.qml delete mode 100755 plugins/LayerView/LayerView.py delete mode 100755 plugins/LayerView/LayerView.qml delete mode 100644 plugins/LayerView/LayerViewProxy.py delete mode 100644 plugins/LayerView/__init__.py delete mode 100755 plugins/LayerView/layers.shader delete mode 100755 plugins/LayerView/layers3d.shader delete mode 100644 plugins/LayerView/layerview_composite.shader delete mode 100644 plugins/LayerView/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8c1ee8fc36..caa39cc703 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -218,7 +218,7 @@ class CuraApplication(QtApplication): "CuraEngineBackend", "UserAgreement", "SolidView", - "LayerView", + "SimulationView", "STLReader", "SelectionTool", "CameraTool", @@ -1386,7 +1386,7 @@ class CuraApplication(QtApplication): extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: - self.getController().setActiveView("LayerView") + self.getController().setActiveView("SimulationView") view = self.getController().getActiveView() view.resetLayerData() view.setLayer(9999999) diff --git a/cura/Layer.py b/cura/Layer.py index d5ef5c9bb4..9cd45380fc 100644 --- a/cura/Layer.py +++ b/cura/Layer.py @@ -47,12 +47,12 @@ class Layer: return result - def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices): + def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices): result_vertex_offset = vertex_offset result_index_offset = index_offset self._element_count = 0 for polygon in self._polygons: - polygon.build(result_vertex_offset, result_index_offset, vertices, colors, line_dimensions, extruders, line_types, indices) + polygon.build(result_vertex_offset, result_index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices) result_vertex_offset += polygon.lineMeshVertexCount() result_index_offset += polygon.lineMeshElementCount() self._element_count += polygon.elementCount diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py index 6e50611e64..d6cc81a4e9 100755 --- a/cura/LayerDataBuilder.py +++ b/cura/LayerDataBuilder.py @@ -20,11 +20,11 @@ class LayerDataBuilder(MeshBuilder): if layer not in self._layers: self._layers[layer] = Layer(layer) - def addPolygon(self, layer, polygon_type, data, line_width): + def addPolygon(self, layer, polygon_type, data, line_width, line_thickness, line_feedrate): if layer not in self._layers: self.addLayer(layer) - p = LayerPolygon(self, polygon_type, data, line_width) + p = LayerPolygon(self, polygon_type, data, line_width, line_thickness, line_feedrate) self._layers[layer].polygons.append(p) def getLayer(self, layer): @@ -64,13 +64,14 @@ class LayerDataBuilder(MeshBuilder): line_dimensions = numpy.empty((vertex_count, 2), numpy.float32) colors = numpy.empty((vertex_count, 4), numpy.float32) indices = numpy.empty((index_count, 2), numpy.int32) + feedrates = numpy.empty((vertex_count), numpy.float32) extruders = numpy.empty((vertex_count), numpy.float32) line_types = numpy.empty((vertex_count), numpy.float32) vertex_offset = 0 index_offset = 0 for layer, data in sorted(self._layers.items()): - ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices) + ( vertex_offset, index_offset ) = data.build( vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices) self._element_counts[layer] = data.elementCount self.addVertices(vertices) @@ -107,6 +108,11 @@ class LayerDataBuilder(MeshBuilder): "value": line_types, "opengl_name": "a_line_type", "opengl_type": "float" + }, + "feedrates": { + "value": feedrates, + "opengl_name": "a_feedrate", + "opengl_type": "float" } } diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py index 7f41351b7f..9766e0c82a 100644 --- a/cura/LayerPolygon.py +++ b/cura/LayerPolygon.py @@ -28,7 +28,8 @@ class LayerPolygon: # \param data new_points # \param line_widths array with line widths # \param line_thicknesses: array with type as index and thickness as value - def __init__(self, extruder, line_types, data, line_widths, line_thicknesses): + # \param line_feedrates array with line feedrates + def __init__(self, extruder, line_types, data, line_widths, line_thicknesses, line_feedrates): self._extruder = extruder self._types = line_types for i in range(len(self._types)): @@ -37,6 +38,7 @@ class LayerPolygon: self._data = data self._line_widths = line_widths self._line_thicknesses = line_thicknesses + self._line_feedrates = line_feedrates self._vertex_begin = 0 self._vertex_end = 0 @@ -84,10 +86,11 @@ class LayerPolygon: # \param vertices : vertex numpy array to be filled # \param colors : vertex numpy array to be filled # \param line_dimensions : vertex numpy array to be filled + # \param feedrates : vertex numpy array to be filled # \param extruders : vertex numpy array to be filled # \param line_types : vertex numpy array to be filled # \param indices : index numpy array to be filled - def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, extruders, line_types, indices): + def build(self, vertex_offset, index_offset, vertices, colors, line_dimensions, feedrates, extruders, line_types, indices): if self._build_cache_line_mesh_mask is None or self._build_cache_needed_points is None: self.buildCache() @@ -109,10 +112,13 @@ class LayerPolygon: # Create an array with colors for each vertex and remove the color data for the points that has been thrown away. colors[self._vertex_begin:self._vertex_end, :] = numpy.tile(self._colors, (1, 2)).reshape((-1, 4))[needed_points_list.ravel()] - # Create an array with line widths for each vertex. + # Create an array with line widths and thicknesses for each vertex. line_dimensions[self._vertex_begin:self._vertex_end, 0] = numpy.tile(self._line_widths, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] line_dimensions[self._vertex_begin:self._vertex_end, 1] = numpy.tile(self._line_thicknesses, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] + # Create an array with feedrates for each line + feedrates[self._vertex_begin:self._vertex_end] = numpy.tile(self._line_feedrates, (1, 2)).reshape((-1, 1))[needed_points_list.ravel()][:, 0] + extruders[self._vertex_begin:self._vertex_end] = self._extruder # Convert type per vertex to type per line @@ -166,6 +172,14 @@ class LayerPolygon: @property def lineWidths(self): return self._line_widths + + @property + def lineThicknesses(self): + return self._line_thicknesses + + @property + def lineFeedrates(self): + return self._line_feedrates @property def jumpMask(self): diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index c2e4e5bb5f..69612210ec 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -61,6 +61,8 @@ message Polygon { Type type = 1; // Type of move bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) float line_width = 3; // The width of the line being laid down + float line_thickness = 4; // The thickness of the line being laid down + float line_feedrate = 5; // The feedrate of the line being laid down } message LayerOptimized { @@ -82,6 +84,8 @@ message PathSegment { bytes points = 3; // The points defining the line segments, bytes of float[2/3] array of length N+1 bytes line_type = 4; // Type of line segment as an unsigned char array of length 1 or N, where N is the number of line segments in this path bytes line_width = 5; // The widths of the line segments as bytes of a float array of length 1 or N + bytes line_thickness = 6; // The thickness of the line segments as bytes of a float array of length 1 or N + bytes line_feedrate = 7; // The feedrate of the line segments as bytes of a float array of length 1 or N } diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 14c1c10b90..d35df967b2 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -608,7 +608,7 @@ class CuraEngineBackend(QObject, Backend): def _onActiveViewChanged(self): if Application.getInstance().getController().getActiveView(): view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": # If switching to layer view, we should process the layers if that hasn't been done yet. + if view.getPluginId() == "SimulationView": # If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index a352564bc2..14646cbac1 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -61,7 +61,7 @@ class ProcessSlicedLayersJob(Job): def run(self): start_time = time() - if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": self._progress_message.show() Job.yieldThread() if self._abort_requested: @@ -109,6 +109,7 @@ class ProcessSlicedLayersJob(Job): layer_data.addLayer(abs_layer_number) this_layer = layer_data.getLayer(abs_layer_number) layer_data.setLayerHeight(abs_layer_number, layer.height) + layer_data.setLayerThickness(abs_layer_number, layer.thickness) for p in range(layer.repeatedMessageCount("path_segment")): polygon = layer.getRepeatedMessage("path_segment", p) @@ -127,10 +128,11 @@ class ProcessSlicedLayersJob(Job): line_widths = numpy.fromstring(polygon.line_width, dtype="f4") # Convert bytearray to numpy array line_widths = line_widths.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. - # In the future, line_thicknesses should be given by CuraEngine as well. - # Currently the infill layer thickness also translates to line width - line_thicknesses = numpy.zeros(line_widths.shape, dtype="f4") - line_thicknesses[:] = layer.thickness / 1000 # from micrometer to millimeter + line_thicknesses = numpy.fromstring(polygon.line_thickness, dtype="f4") # Convert bytearray to numpy array + line_thicknesses = line_thicknesses.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. + + line_feedrates = numpy.fromstring(polygon.line_feedrate, dtype="f4") # Convert bytearray to numpy array + line_feedrates = line_feedrates.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly. # Create a new 3D-array, copy the 2D points over and insert the right height. # This uses manual array creation + copy rather than numpy.insert since this is @@ -145,7 +147,7 @@ class ProcessSlicedLayersJob(Job): new_points[:, 1] = points[:, 2] new_points[:, 2] = -points[:, 1] - this_poly = LayerPolygon.LayerPolygon(extruder, line_types, new_points, line_widths, line_thicknesses) + this_poly = LayerPolygon.LayerPolygon(extruder, line_types, new_points, line_widths, line_thicknesses, line_feedrates) this_poly.buildCache() this_layer.polygons.append(this_poly) @@ -219,7 +221,7 @@ class ProcessSlicedLayersJob(Job): self._progress_message.setProgress(100) view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": + if view.getPluginId() == "SimulationView": view.resetLayerData() if self._progress_message: @@ -232,7 +234,7 @@ class ProcessSlicedLayersJob(Job): def _onActiveViewChanged(self): if self.isRunning(): - if Application.getInstance().getController().getActiveView().getPluginId() == "LayerView": + if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": if not self._progress_message: self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0, catalog.i18nc("@info:title", "Information")) if self._progress_message.getProgress() != 100: diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 1b2795800e..2a7e29e370 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Aleph Objects, Inc. +# Copyright (c) 2017 Aleph Objects, Inc. # Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application @@ -40,7 +40,8 @@ class GCodeReader(MeshReader): self._extruder_number = 0 self._clearValues() self._scene_node = None - self._position = namedtuple('Position', ['x', 'y', 'z', 'e']) + # X, Y, Z position, F feedrate and E extruder values are stored + self._position = namedtuple('Position', ['x', 'y', 'z', 'f', 'e']) self._is_layers_in_file = False # Does the Gcode have the layers comment? self._extruder_offsets = {} # Offsets for multi extruders. key is index, value is [x-offset, y-offset] self._current_layer_thickness = 0.2 # default @@ -48,7 +49,9 @@ class GCodeReader(MeshReader): Preferences.getInstance().addPreference("gcodereader/show_caution", True) def _clearValues(self): + self._filament_diameter = 2.85 self._extruder_number = 0 + self._extrusion_length_offset = [0] self._layer_type = LayerPolygon.Inset0Type self._layer_number = 0 self._previous_z = 0 @@ -97,7 +100,7 @@ class GCodeReader(MeshReader): def _createPolygon(self, layer_thickness, path, extruder_offsets): countvalid = 0 for point in path: - if point[3] > 0: + if point[5] > 0: countvalid += 1 if countvalid >= 2: # we know what to do now, no need to count further @@ -115,27 +118,56 @@ class GCodeReader(MeshReader): line_types = numpy.empty((count - 1, 1), numpy.int32) line_widths = numpy.empty((count - 1, 1), numpy.float32) line_thicknesses = numpy.empty((count - 1, 1), numpy.float32) - # TODO: need to calculate actual line width based on E values + line_feedrates = numpy.empty((count - 1, 1), numpy.float32) line_widths[:, 0] = 0.35 # Just a guess line_thicknesses[:, 0] = layer_thickness points = numpy.empty((count, 3), numpy.float32) + extrusion_values = numpy.empty((count, 1), numpy.float32) i = 0 for point in path: points[i, :] = [point[0] + extruder_offsets[0], point[2], -point[1] - extruder_offsets[1]] + extrusion_values[i] = point[4] if i > 0: - line_types[i - 1] = point[3] - if point[3] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + line_feedrates[i - 1] = point[3] + line_types[i - 1] = point[5] + if point[5] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: line_widths[i - 1] = 0.1 + line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines + else: + line_widths[i - 1] = self._calculateLineWidth(points[i], points[i-1], extrusion_values[i], extrusion_values[i-1], layer_thickness) i += 1 - this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses) + this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) this_poly.buildCache() this_layer.polygons.append(this_poly) return True + def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): + # Area of the filament + Af = (self._filament_diameter / 2) ** 2 * numpy.pi + # Length of the extruded filament + de = current_extrusion - previous_extrusion + # Volumne of the extruded filament + dVe = de * Af + # Length of the printed line + dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2) + # When the extruder recovers from a retraction, we get zero distance + if dX == 0: + return 0.1 + # Area of the printed line. This area is a rectangle + Ae = dVe / dX + # This area is a rectangle with area equal to layer_thickness * layer_width + line_width = Ae / layer_thickness + + # A threshold is set to avoid weird paths in the GCode + if line_width > 1.2: + return 0.35 + return line_width + def _gCode0(self, position, params, path): - x, y, z, e = position + x, y, z, f, e = position + if self._is_absolute_positioning: x = params.x if params.x is not None else x y = params.y if params.y is not None else y @@ -145,22 +177,24 @@ class GCodeReader(MeshReader): y += params.y if params.y is not None else 0 z += params.z if params.z is not None else 0 + f = params.f if params.f is not None else f + if params.e is not None: new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e if new_extrusion_value > e[self._extruder_number]: - path.append([x, y, z, self._layer_type]) # extrusion + path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion else: - path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction + path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction e[self._extruder_number] = new_extrusion_value # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. if z > self._previous_z and (z - self._previous_z < 1.5): - self._current_layer_thickness = z - self._previous_z + 0.05 # allow a tiny overlap + self._current_layer_thickness = z - self._previous_z # allow a tiny overlap self._previous_z = z else: - path.append([x, y, z, LayerPolygon.MoveCombingType]) - return self._position(x, y, z, e) + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) + return self._position(x, y, z, f, e) # G0 and G1 should be handled exactly the same. _gCode1 = _gCode0 @@ -171,6 +205,7 @@ class GCodeReader(MeshReader): params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, 0, + position.f, position.e) ## Set the absolute positioning @@ -187,11 +222,14 @@ class GCodeReader(MeshReader): # For example: G92 X10 will set the X to 10 without any physical motion. def _gCode92(self, position, params, path): if params.e is not None: + # Sometimes a G92 E0 is introduced in the middle of the GCode so we need to keep those offsets for calculate the line_width + self._extrusion_length_offset[self._extruder_number] += position.e[self._extruder_number] - params.e position.e[self._extruder_number] = params.e return self._position( params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, params.z if params.z is not None else position.z, + params.f if params.f is not None else position.f, position.e) def _processGCode(self, G, line, position, path): @@ -199,7 +237,7 @@ class GCodeReader(MeshReader): line = line.split(";", 1)[0] # Remove comments (if any) if func is not None: s = line.upper().split(" ") - x, y, z, e = None, None, None, None + x, y, z, f, e = None, None, None, None, None for item in s[1:]: if len(item) <= 1: continue @@ -211,17 +249,20 @@ class GCodeReader(MeshReader): y = float(item[1:]) if item[0] == "Z": z = float(item[1:]) + if item[0] == "F": + f = float(item[1:]) / 60 if item[0] == "E": e = float(item[1:]) if self._is_absolute_positioning and ((x is not None and x < 0) or (y is not None and y < 0)): self._center_is_zero = True - params = self._position(x, y, z, e) + params = self._position(x, y, z, f, e) return func(position, params, path) return position def _processTCode(self, T, line, position, path): self._extruder_number = T if self._extruder_number + 1 > len(position.e): + self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1)) position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) return position @@ -240,6 +281,8 @@ class GCodeReader(MeshReader): def read(self, file_name): Logger.log("d", "Preparing to load %s" % file_name) self._cancelled = False + # We obtain the filament diameter from the selected printer to calculate line widths + self._filament_diameter = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") scene_node = SceneNode() # Override getBoundingBox function of the sceneNode, as this node should return a bounding box, but there is no @@ -277,7 +320,7 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s..." % file_name) - current_position = self._position(0, 0, 0, [0]) + current_position = self._position(0, 0, 0, 0, [0]) current_path = [] for line in file: @@ -310,6 +353,7 @@ class GCodeReader(MeshReader): else: Logger.log("w", "Encountered a unknown type (%s) while parsing g-code.", type) + # When the layer change is reached, the polygon is computed so we have just one layer per layer per extruder if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: try: layer_number = int(line[len(self._layer_keyword):]) @@ -325,17 +369,12 @@ class GCodeReader(MeshReader): G = self._getInt(line, "G") if G is not None: + # When find a movement, the new posistion is calculated and added to the current_path, but + # don't need to create a polygon until the end of the layer current_position = self._processGCode(G, line, current_position, current_path) - - # < 2 is a heuristic for a movement only, that should not be counted as a layer - if current_position.z > last_z and abs(current_position.z - last_z) < 2: - if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): - current_path.clear() - if not self._is_layers_in_file: - self._layer_number += 1 - continue + # When changing the extruder, the polygon with the stored paths is computed if line.startswith("T"): T = self._getInt(line, "T") if T is not None: @@ -344,8 +383,8 @@ class GCodeReader(MeshReader): current_position = self._processTCode(T, line, current_position, current_path) - # "Flush" leftovers - if not self._is_layers_in_file and len(current_path) > 1: + # "Flush" leftovers. Last layer paths are still stored + if len(current_path) > 1: if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): self._layer_number += 1 current_path.clear() diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py deleted file mode 100755 index 963c8c75c8..0000000000 --- a/plugins/LayerView/LayerPass.py +++ /dev/null @@ -1,113 +0,0 @@ -# Copyright (c) 2016 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Resources import Resources -from UM.Scene.SceneNode import SceneNode -from UM.Scene.ToolHandle import ToolHandle -from UM.Application import Application -from UM.PluginRegistry import PluginRegistry - -from UM.View.RenderPass import RenderPass -from UM.View.RenderBatch import RenderBatch -from UM.View.GL.OpenGL import OpenGL - -from cura.Settings.ExtruderManager import ExtruderManager - - -import os.path - -## RenderPass used to display g-code paths. -class LayerPass(RenderPass): - def __init__(self, width, height): - super().__init__("layerview", width, height) - - self._layer_shader = None - self._tool_handle_shader = None - self._gl = OpenGL.getInstance().getBindingsObject() - self._scene = Application.getInstance().getController().getScene() - self._extruder_manager = ExtruderManager.getInstance() - - self._layer_view = None - self._compatibility_mode = None - - def setLayerView(self, layerview): - self._layer_view = layerview - self._compatibility_mode = layerview.getCompatibilityMode() - - def render(self): - if not self._layer_shader: - if self._compatibility_mode: - shader_filename = "layers.shader" - else: - shader_filename = "layers3d.shader" - self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("LayerView"), shader_filename)) - # Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers) - self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex))) - if self._layer_view: - self._layer_shader.setUniformValue("u_layer_view_type", self._layer_view.getLayerViewType()) - self._layer_shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities()) - self._layer_shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves()) - self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) - self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) - self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) - else: - #defaults - self._layer_shader.setUniformValue("u_layer_view_type", 1) - self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1]) - self._layer_shader.setUniformValue("u_show_travel_moves", 0) - self._layer_shader.setUniformValue("u_show_helpers", 1) - self._layer_shader.setUniformValue("u_show_skin", 1) - self._layer_shader.setUniformValue("u_show_infill", 1) - - if not self._tool_handle_shader: - self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) - - self.bind() - - tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) - - for node in DepthFirstIterator(self._scene.getRoot()): - - if isinstance(node, ToolHandle): - tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): - layer_data = node.callDecoration("getLayerData") - if not layer_data: - continue - - # Render all layers below a certain number as line mesh instead of vertices. - if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): - start = 0 - end = 0 - element_counts = layer_data.getElementCounts() - for layer in sorted(element_counts.keys()): - if layer > self._layer_view._current_layer_num: - break - if self._layer_view._minimum_layer_num > layer: - start += element_counts[layer] - end += element_counts[layer] - - # This uses glDrawRangeElements internally to only draw a certain range of lines. - batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) - batch.addItem(node.getWorldTransformation(), layer_data) - batch.render(self._scene.getActiveCamera()) - - # Create a new batch that is not range-limited - batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) - - if self._layer_view.getCurrentLayerMesh(): - batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) - - if self._layer_view.getCurrentLayerJumps(): - batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) - - if len(batch.items) > 0: - batch.render(self._scene.getActiveCamera()) - - # Render toolhandles on top of the layerview - if len(tool_handle_batch.items) > 0: - tool_handle_batch.render(self._scene.getActiveCamera()) - - self.release() diff --git a/plugins/LayerView/LayerSlider.qml b/plugins/LayerView/LayerSlider.qml deleted file mode 100644 index 9abeb01148..0000000000 --- a/plugins/LayerView/LayerSlider.qml +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.0 as UM -import Cura 1.0 as Cura - -Item { - id: sliderRoot - - // handle properties - property real handleSize: 10 - property real handleRadius: handleSize / 2 - property real minimumRangeHandleSize: handleSize / 2 - property color upperHandleColor: "black" - property color lowerHandleColor: "black" - property color rangeHandleColor: "black" - property real handleLabelWidth: width - property var activeHandle: upperHandle - - // track properties - property real trackThickness: 4 // width of the slider track - property real trackRadius: trackThickness / 2 - property color trackColor: "white" - property real trackBorderWidth: 1 // width of the slider track border - property color trackBorderColor: "black" - - // value properties - property real maximumValue: 100 - property real minimumValue: 0 - property real minimumRange: 0 // minimum range allowed between min and max values - property bool roundValues: true - property real upperValue: maximumValue - property real lowerValue: minimumValue - - property bool layersVisible: true - - function getUpperValueFromSliderHandle () { - return upperHandle.getValue() - } - - function setUpperValue (value) { - upperHandle.setValue(value) - updateRangeHandle() - } - - function getLowerValueFromSliderHandle () { - return lowerHandle.getValue() - } - - function setLowerValue (value) { - lowerHandle.setValue(value) - updateRangeHandle() - } - - function updateRangeHandle () { - rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) - } - - // set the active handle to show only one label at a time - function setActiveHandle (handle) { - activeHandle = handle - } - - // slider track - Rectangle { - id: track - - width: sliderRoot.trackThickness - height: sliderRoot.height - sliderRoot.handleSize - radius: sliderRoot.trackRadius - anchors.centerIn: sliderRoot - color: sliderRoot.trackColor - border.width: sliderRoot.trackBorderWidth - border.color: sliderRoot.trackBorderColor - visible: sliderRoot.layersVisible - } - - // Range handle - Item { - id: rangeHandle - - y: upperHandle.y + upperHandle.height - width: sliderRoot.handleSize - height: sliderRoot.minimumRangeHandleSize - anchors.horizontalCenter: sliderRoot.horizontalCenter - visible: sliderRoot.layersVisible - - // set the new value when dragging - function onHandleDragged () { - - upperHandle.y = y - upperHandle.height - lowerHandle.y = y + height - - var upperValue = sliderRoot.getUpperValueFromSliderHandle() - var lowerValue = sliderRoot.getLowerValueFromSliderHandle() - - // set both values after moving the handle position - UM.LayerView.setCurrentLayer(upperValue) - UM.LayerView.setMinimumLayer(lowerValue) - } - - function setValue (value) { - var range = sliderRoot.upperValue - sliderRoot.lowerValue - value = Math.min(value, sliderRoot.maximumValue) - value = Math.max(value, sliderRoot.minimumValue + range) - - UM.LayerView.setCurrentLayer(value) - UM.LayerView.setMinimumLayer(value - range) - } - - Rectangle { - width: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth - height: parent.height + sliderRoot.handleSize - anchors.centerIn: parent - color: sliderRoot.rangeHandleColor - } - - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: upperHandle.height - maximumY: sliderRoot.height - (rangeHandle.height + lowerHandle.height) - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(rangeHandle) - } - - LayerSliderLabel { - id: rangleHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.upperValue - busy: UM.LayerView.busy - setValue: rangeHandle.setValue // connect callback functions - } - } - - // Upper handle - Rectangle { - id: upperHandle - - y: sliderRoot.height - (sliderRoot.minimumRangeHandleSize + 2 * sliderRoot.handleSize) - width: sliderRoot.handleSize - height: sliderRoot.handleSize - anchors.horizontalCenter: sliderRoot.horizontalCenter - radius: sliderRoot.handleRadius - color: sliderRoot.upperHandleColor - visible: sliderRoot.layersVisible - - function onHandleDragged () { - - // don't allow the lower handle to be heigher than the upper handle - if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize) { - lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize - } - - // update the range handle - sliderRoot.updateRangeHandle() - - // set the new value after moving the handle position - UM.LayerView.setCurrentLayer(getValue()) - } - - // get the upper value based on the slider position - function getValue () { - var result = y / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) - result = sliderRoot.maximumValue + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumValue)) - result = sliderRoot.roundValues ? Math.round(result) : result - return result - } - - // set the slider position based on the upper value - function setValue (value) { - - UM.LayerView.setCurrentLayer(value) - - var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) - var newUpperYPosition = Math.round(diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) - y = newUpperYPosition - - // update the range handle - sliderRoot.updateRangeHandle() - } - - // dragging - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: 0 - maximumY: sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(upperHandle) - } - - LayerSliderLabel { - id: upperHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.upperValue - busy: UM.LayerView.busy - setValue: upperHandle.setValue // connect callback functions - } - } - - // Lower handle - Rectangle { - id: lowerHandle - - y: sliderRoot.height - sliderRoot.handleSize - width: parent.handleSize - height: parent.handleSize - anchors.horizontalCenter: parent.horizontalCenter - radius: sliderRoot.handleRadius - color: sliderRoot.lowerHandleColor - - visible: slider.layersVisible - - function onHandleDragged () { - - // don't allow the upper handle to be lower than the lower handle - if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize) { - upperHandle.y = y - (upperHandle.heigth + sliderRoot.minimumRangeHandleSize) - } - - // update the range handle - sliderRoot.updateRangeHandle() - - // set the new value after moving the handle position - UM.LayerView.setMinimumLayer(getValue()) - } - - // get the lower value from the current slider position - function getValue () { - var result = (y - (sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)); - result = sliderRoot.maximumValue - sliderRoot.minimumRange + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumRange)) - result = sliderRoot.roundValues ? Math.round(result) : result - return result - } - - // set the slider position based on the lower value - function setValue (value) { - - UM.LayerView.setMinimumLayer(value) - - var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) - var newLowerYPosition = Math.round((sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) - y = newLowerYPosition - - // update the range handle - sliderRoot.updateRangeHandle() - } - - // dragging - MouseArea { - anchors.fill: parent - - drag { - target: parent - axis: Drag.YAxis - minimumY: upperHandle.height + sliderRoot.minimumRangeHandleSize - maximumY: sliderRoot.height - parent.height - } - - onPositionChanged: parent.onHandleDragged() - onPressed: sliderRoot.setActiveHandle(lowerHandle) - } - - LayerSliderLabel { - id: lowerHandleLabel - - height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height - x: parent.x - width - UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - target: Qt.point(sliderRoot.width, y + height / 2) - visible: sliderRoot.activeHandle == parent - - // custom properties - maximumValue: sliderRoot.maximumValue - value: sliderRoot.lowerValue - busy: UM.LayerView.busy - setValue: lowerHandle.setValue // connect callback functions - } - } -} diff --git a/plugins/LayerView/LayerSliderLabel.qml b/plugins/LayerView/LayerSliderLabel.qml deleted file mode 100644 index c989679285..0000000000 --- a/plugins/LayerView/LayerSliderLabel.qml +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.0 as UM -import Cura 1.0 as Cura - -UM.PointingRectangle { - id: sliderLabelRoot - - // custom properties - property real maximumValue: 100 - property real value: 0 - property var setValue // Function - property bool busy: false - - target: Qt.point(parent.width, y + height / 2) - arrowSize: UM.Theme.getSize("default_arrow").width - height: parent.height - width: valueLabel.width + UM.Theme.getSize("default_margin").width - visible: false - - // make sure the text field is focussed when pressing the parent handle - // needed to connect the key bindings when switching active handle - onVisibleChanged: if (visible) valueLabel.forceActiveFocus() - - color: UM.Theme.getColor("tool_panel_background") - borderColor: UM.Theme.getColor("lining") - borderWidth: UM.Theme.getSize("default_lining").width - - Behavior on height { - NumberAnimation { - duration: 50 - } - } - - // catch all mouse events so they're not handled by underlying 3D scene - MouseArea { - anchors.fill: parent - } - - TextField { - id: valueLabel - - anchors { - left: parent.left - leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - verticalCenter: parent.verticalCenter - } - - width: 40 * screenScaleFactor - text: sliderLabelRoot.value + 1 // the current handle value, add 1 because layers is an array - horizontalAlignment: TextInput.AlignRight - - // key bindings, work when label is currenctly focused (active handle in LayerSlider) - Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) - Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) - - style: TextFieldStyle { - textColor: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - background: Item { } - } - - onEditingFinished: { - - // Ensure that the cursor is at the first position. On some systems the text isn't fully visible - // Seems to have to do something with different dpi densities that QML doesn't quite handle. - // Another option would be to increase the size even further, but that gives pretty ugly results. - cursorPosition = 0 - - if (valueLabel.text != "") { - // -1 because we need to convert back to an array structure - sliderLabelRoot.setValue(parseInt(valueLabel.text) - 1) - } - } - - validator: IntValidator { - bottom: 1 - top: sliderLabelRoot.maximumValue + 1 // +1 because actual layers is an array - } - } - - BusyIndicator { - id: busyIndicator - - anchors { - left: parent.right - leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - verticalCenter: parent.verticalCenter - } - - width: sliderLabelRoot.height - height: width - - visible: sliderLabelRoot.busy - running: sliderLabelRoot.busy - } -} diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py deleted file mode 100755 index 04be97b747..0000000000 --- a/plugins/LayerView/LayerView.py +++ /dev/null @@ -1,495 +0,0 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import sys - -from UM.PluginRegistry import PluginRegistry -from UM.View.View import View -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Resources import Resources -from UM.Event import Event, KeyEvent -from UM.Signal import Signal -from UM.Scene.Selection import Selection -from UM.Math.Color import Color -from UM.Mesh.MeshBuilder import MeshBuilder -from UM.Job import Job -from UM.Preferences import Preferences -from UM.Logger import Logger -from UM.View.GL.OpenGL import OpenGL -from UM.Message import Message -from UM.Application import Application -from UM.View.GL.OpenGLContext import OpenGLContext - -from cura.ConvexHullNode import ConvexHullNode -from cura.Settings.ExtruderManager import ExtruderManager - -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QApplication - -from . import LayerViewProxy - -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - -from . import LayerPass - -import numpy -import os.path - -## View used to display g-code paths. -class LayerView(View): - # Must match LayerView.qml - LAYER_VIEW_TYPE_MATERIAL_TYPE = 0 - LAYER_VIEW_TYPE_LINE_TYPE = 1 - - def __init__(self): - super().__init__() - - self._max_layers = 0 - self._current_layer_num = 0 - self._minimum_layer_num = 0 - self._current_layer_mesh = None - self._current_layer_jumps = None - self._top_layers_job = None - self._activity = False - self._old_max_layers = 0 - - self._busy = False - - self._ghost_shader = None - self._layer_pass = None - self._composite_pass = None - self._old_layer_bindings = None - self._layerview_composite_shader = None - self._old_composite_shader = None - - self._global_container_stack = None - self._proxy = LayerViewProxy.LayerViewProxy() - self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) - - self._resetSettings() - self._legend_items = None - self._show_travel_moves = False - - Preferences.getInstance().addPreference("view/top_layer_count", 5) - Preferences.getInstance().addPreference("view/only_show_top_layers", False) - Preferences.getInstance().addPreference("view/force_layer_view_compatibility_mode", False) - - Preferences.getInstance().addPreference("layerview/layer_view_type", 0) - Preferences.getInstance().addPreference("layerview/extruder_opacities", "") - - Preferences.getInstance().addPreference("layerview/show_travel_moves", False) - Preferences.getInstance().addPreference("layerview/show_helpers", True) - Preferences.getInstance().addPreference("layerview/show_skin", True) - Preferences.getInstance().addPreference("layerview/show_infill", True) - - Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) - self._updateWithPreferences() - - self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) - self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) - self._compatibility_mode = True # for safety - - self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), - title = catalog.i18nc("@info:title", "Layer View")) - - def _resetSettings(self): - self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed - self._extruder_count = 0 - self._extruder_opacity = [1.0, 1.0, 1.0, 1.0] - self._show_travel_moves = 0 - self._show_helpers = 1 - self._show_skin = 1 - self._show_infill = 1 - - def getActivity(self): - return self._activity - - def getLayerPass(self): - if not self._layer_pass: - # Currently the RenderPass constructor requires a size > 0 - # This should be fixed in RenderPass's constructor. - self._layer_pass = LayerPass.LayerPass(1, 1) - self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) - self._layer_pass.setLayerView(self) - return self._layer_pass - - def getCurrentLayer(self): - return self._current_layer_num - - def getMinimumLayer(self): - return self._minimum_layer_num - - def _onSceneChanged(self, node): - self.calculateMaxLayers() - - def getMaxLayers(self): - return self._max_layers - - busyChanged = Signal() - - def isBusy(self): - return self._busy - - def setBusy(self, busy): - if busy != self._busy: - self._busy = busy - self.busyChanged.emit() - - def resetLayerData(self): - self._current_layer_mesh = None - self._current_layer_jumps = None - - def beginRendering(self): - scene = self.getController().getScene() - renderer = self.getRenderer() - - if not self._ghost_shader: - self._ghost_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) - self._ghost_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_ghost").getRgb())) - - for node in DepthFirstIterator(scene.getRoot()): - # We do not want to render ConvexHullNode as it conflicts with the bottom layers. - # However, it is somewhat relevant when the node is selected, so do render it then. - if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()): - continue - - if not node.render(renderer): - if (node.getMeshData()) and node.isVisible(): - renderer.queueNode(node, transparent = True, shader = self._ghost_shader) - - def setLayer(self, value): - if self._current_layer_num != value: - self._current_layer_num = value - if self._current_layer_num < 0: - self._current_layer_num = 0 - if self._current_layer_num > self._max_layers: - self._current_layer_num = self._max_layers - if self._current_layer_num < self._minimum_layer_num: - self._minimum_layer_num = self._current_layer_num - - self._startUpdateTopLayers() - - self.currentLayerNumChanged.emit() - - def setMinimumLayer(self, value): - if self._minimum_layer_num != value: - self._minimum_layer_num = value - if self._minimum_layer_num < 0: - self._minimum_layer_num = 0 - if self._minimum_layer_num > self._max_layers: - self._minimum_layer_num = self._max_layers - if self._minimum_layer_num > self._current_layer_num: - self._current_layer_num = self._minimum_layer_num - - self._startUpdateTopLayers() - - self.currentLayerNumChanged.emit() - - ## Set the layer view type - # - # \param layer_view_type integer as in LayerView.qml and this class - def setLayerViewType(self, layer_view_type): - self._layer_view_type = layer_view_type - self.currentLayerNumChanged.emit() - - ## Return the layer view type, integer as in LayerView.qml and this class - def getLayerViewType(self): - return self._layer_view_type - - ## Set the extruder opacity - # - # \param extruder_nr 0..3 - # \param opacity 0.0 .. 1.0 - def setExtruderOpacity(self, extruder_nr, opacity): - if 0 <= extruder_nr <= 3: - self._extruder_opacity[extruder_nr] = opacity - self.currentLayerNumChanged.emit() - - def getExtruderOpacities(self): - return self._extruder_opacity - - def setShowTravelMoves(self, show): - self._show_travel_moves = show - self.currentLayerNumChanged.emit() - - def getShowTravelMoves(self): - return self._show_travel_moves - - def setShowHelpers(self, show): - self._show_helpers = show - self.currentLayerNumChanged.emit() - - def getShowHelpers(self): - return self._show_helpers - - def setShowSkin(self, show): - self._show_skin = show - self.currentLayerNumChanged.emit() - - def getShowSkin(self): - return self._show_skin - - def setShowInfill(self, show): - self._show_infill = show - self.currentLayerNumChanged.emit() - - def getShowInfill(self): - return self._show_infill - - def getCompatibilityMode(self): - return self._compatibility_mode - - def getExtruderCount(self): - return self._extruder_count - - def calculateMaxLayers(self): - scene = self.getController().getScene() - self._activity = True - - self._old_max_layers = self._max_layers - ## Recalculate num max layers - new_max_layers = 0 - for node in DepthFirstIterator(scene.getRoot()): - layer_data = node.callDecoration("getLayerData") - if not layer_data: - continue - - min_layer_number = sys.maxsize - max_layer_number = -sys.maxsize - for layer_id in layer_data.getLayers(): - if max_layer_number < layer_id: - max_layer_number = layer_id - if min_layer_number > layer_id: - min_layer_number = layer_id - layer_count = max_layer_number - min_layer_number - - if new_max_layers < layer_count: - new_max_layers = layer_count - - if new_max_layers > 0 and new_max_layers != self._old_max_layers: - self._max_layers = new_max_layers - - # The qt slider has a bit of weird behavior that if the maxvalue needs to be changed first - # if it's the largest value. If we don't do this, we can have a slider block outside of the - # slider. - if new_max_layers > self._current_layer_num: - self.maxLayersChanged.emit() - self.setLayer(int(self._max_layers)) - else: - self.setLayer(int(self._max_layers)) - self.maxLayersChanged.emit() - self._startUpdateTopLayers() - - maxLayersChanged = Signal() - currentLayerNumChanged = Signal() - globalStackChanged = Signal() - preferencesChanged = Signal() - - ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created - # as this caused some issues. - def getProxy(self, engine, script_engine): - return self._proxy - - def endRendering(self): - pass - - def event(self, event): - modifiers = QApplication.keyboardModifiers() - ctrl_is_active = modifiers & Qt.ControlModifier - shift_is_active = modifiers & Qt.ShiftModifier - if event.type == Event.KeyPressEvent and ctrl_is_active: - amount = 10 if shift_is_active else 1 - if event.key == KeyEvent.UpKey: - self.setLayer(self._current_layer_num + amount) - return True - if event.key == KeyEvent.DownKey: - self.setLayer(self._current_layer_num - amount) - return True - - if event.type == Event.ViewActivateEvent: - # Make sure the LayerPass is created - layer_pass = self.getLayerPass() - self.getRenderer().addRenderPass(layer_pass) - - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - self._onGlobalStackChanged() - - if not self._layerview_composite_shader: - self._layerview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("LayerView"), "layerview_composite.shader")) - theme = Application.getInstance().getTheme() - self._layerview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) - self._layerview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) - - if not self._composite_pass: - self._composite_pass = self.getRenderer().getRenderPass("composite") - - self._old_layer_bindings = self._composite_pass.getLayerBindings()[:] # make a copy so we can restore to it later - self._composite_pass.getLayerBindings().append("layerview") - self._old_composite_shader = self._composite_pass.getCompositeShader() - self._composite_pass.setCompositeShader(self._layerview_composite_shader) - - elif event.type == Event.ViewDeactivateEvent: - self._wireprint_warning_message.hide() - Application.getInstance().globalContainerStackChanged.disconnect(self._onGlobalStackChanged) - if self._global_container_stack: - self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) - - self.getRenderer().removeRenderPass(self._layer_pass) - self._composite_pass.setLayerBindings(self._old_layer_bindings) - self._composite_pass.setCompositeShader(self._old_composite_shader) - - def getCurrentLayerMesh(self): - return self._current_layer_mesh - - def getCurrentLayerJumps(self): - return self._current_layer_jumps - - def _onGlobalStackChanged(self): - if self._global_container_stack: - self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) - self._global_container_stack = Application.getInstance().getGlobalContainerStack() - if self._global_container_stack: - self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) - self._extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") - self._onPropertyChanged("wireframe_enabled", "value") - self.globalStackChanged.emit() - else: - self._wireprint_warning_message.hide() - - def _onPropertyChanged(self, key, property_name): - if key == "wireframe_enabled" and property_name == "value": - if self._global_container_stack.getProperty("wireframe_enabled", "value"): - self._wireprint_warning_message.show() - else: - self._wireprint_warning_message.hide() - - def _startUpdateTopLayers(self): - if not self._compatibility_mode: - return - - if self._top_layers_job: - self._top_layers_job.finished.disconnect(self._updateCurrentLayerMesh) - self._top_layers_job.cancel() - - self.setBusy(True) - - self._top_layers_job = _CreateTopLayersJob(self._controller.getScene(), self._current_layer_num, self._solid_layers) - self._top_layers_job.finished.connect(self._updateCurrentLayerMesh) - self._top_layers_job.start() - - def _updateCurrentLayerMesh(self, job): - self.setBusy(False) - - if not job.getResult(): - return - self.resetLayerData() # Reset the layer data only when job is done. Doing it now prevents "blinking" data. - self._current_layer_mesh = job.getResult().get("layers") - if self._show_travel_moves: - self._current_layer_jumps = job.getResult().get("jumps") - self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot()) - - self._top_layers_job = None - - def _updateWithPreferences(self): - self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) - self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) - self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool( - Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) - - self.setLayerViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); - - for extruder_nr, extruder_opacity in enumerate(Preferences.getInstance().getValue("layerview/extruder_opacities").split("|")): - try: - opacity = float(extruder_opacity) - except ValueError: - opacity = 1.0 - self.setExtruderOpacity(extruder_nr, opacity) - - self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) - self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) - self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) - self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) - - self._startUpdateTopLayers() - self.preferencesChanged.emit() - - def _onPreferencesChanged(self, preference): - if preference not in { - "view/top_layer_count", - "view/only_show_top_layers", - "view/force_layer_view_compatibility_mode", - "layerview/layer_view_type", - "layerview/extruder_opacities", - "layerview/show_travel_moves", - "layerview/show_helpers", - "layerview/show_skin", - "layerview/show_infill", - }: - return - - self._updateWithPreferences() - - -class _CreateTopLayersJob(Job): - def __init__(self, scene, layer_number, solid_layers): - super().__init__() - - self._scene = scene - self._layer_number = layer_number - self._solid_layers = solid_layers - self._cancel = False - - def run(self): - layer_data = None - for node in DepthFirstIterator(self._scene.getRoot()): - layer_data = node.callDecoration("getLayerData") - if layer_data: - break - - if self._cancel or not layer_data: - return - - layer_mesh = MeshBuilder() - for i in range(self._solid_layers): - layer_number = self._layer_number - i - if layer_number < 0: - continue - - try: - layer = layer_data.getLayer(layer_number).createMesh() - except Exception: - Logger.logException("w", "An exception occurred while creating layer mesh.") - return - - if not layer or layer.getVertices() is None: - continue - - layer_mesh.addIndices(layer_mesh.getVertexCount() + layer.getIndices()) - layer_mesh.addVertices(layer.getVertices()) - - # Scale layer color by a brightness factor based on the current layer number - # This will result in a range of 0.5 - 1.0 to multiply colors by. - brightness = numpy.ones((1, 4), dtype=numpy.float32) * (2.0 - (i / self._solid_layers)) / 2.0 - brightness[0, 3] = 1.0 - layer_mesh.addColors(layer.getColors() * brightness) - - if self._cancel: - return - - Job.yieldThread() - - if self._cancel: - return - - Job.yieldThread() - jump_mesh = layer_data.getLayer(self._layer_number).createJumps() - if not jump_mesh or jump_mesh.getVertices() is None: - jump_mesh = None - - self.setResult({"layers": layer_mesh.build(), "jumps": jump_mesh}) - - def cancel(self): - self._cancel = True - super().cancel() - diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml deleted file mode 100755 index 7261926bc5..0000000000 --- a/plugins/LayerView/LayerView.qml +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.4 -import QtQuick.Controls 1.2 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.0 as UM -import Cura 1.0 as Cura - -Item -{ - id: base - width: { - if (UM.LayerView.compatibilityMode) { - return UM.Theme.getSize("layerview_menu_size_compatibility").width; - } else { - return UM.Theme.getSize("layerview_menu_size").width; - } - } - height: { - if (UM.LayerView.compatibilityMode) { - return UM.Theme.getSize("layerview_menu_size_compatibility").height; - } else if (UM.Preferences.getValue("layerview/layer_view_type") == 0) { - return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) - } else { - return UM.Theme.getSize("layerview_menu_size").height + UM.LayerView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) - } - } - - property var buttonTarget: { - if(parent != null) - { - var force_binding = parent.y; // ensure this gets reevaluated when the panel moves - return base.mapFromItem(parent.parent, parent.buttonTarget.x, parent.buttonTarget.y) - } - return Qt.point(0,0) - } - - visible: parent != null ? !parent.parent.monitoringPrint: true - - UM.PointingRectangle { - id: layerViewMenu - anchors.right: parent.right - anchors.top: parent.top - width: parent.width - height: parent.height - z: slider.z - 1 - color: UM.Theme.getColor("tool_panel_background") - borderWidth: UM.Theme.getSize("default_lining").width - borderColor: UM.Theme.getColor("lining") - arrowSize: 0 // hide arrow until weird issue with first time rendering is fixed - - ColumnLayout { - id: view_settings - - property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") - property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") - property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") - property bool show_skin: UM.Preferences.getValue("layerview/show_skin") - property bool show_infill: UM.Preferences.getValue("layerview/show_infill") - // if we are in compatibility mode, we only show the "line type" - property bool show_legend: UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type") == 1 - property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") - property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") - - anchors.top: parent.top - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getSize("layerview_row_spacing").height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - - Label - { - id: layerViewTypesLabel - anchors.left: parent.left - text: catalog.i18nc("@label","Color scheme") - font: UM.Theme.getFont("default"); - visible: !UM.LayerView.compatibilityMode - Layout.fillWidth: true - color: UM.Theme.getColor("setting_control_text") - } - - ListModel // matches LayerView.py - { - id: layerViewTypes - } - - Component.onCompleted: - { - layerViewTypes.append({ - text: catalog.i18nc("@label:listbox", "Material Color"), - type_id: 0 - }) - layerViewTypes.append({ - text: catalog.i18nc("@label:listbox", "Line Type"), - type_id: 1 // these ids match the switching in the shader - }) - } - - ComboBox - { - id: layerTypeCombobox - anchors.left: parent.left - Layout.fillWidth: true - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - model: layerViewTypes - visible: !UM.LayerView.compatibilityMode - style: UM.Theme.styles.combobox - anchors.right: parent.right - anchors.rightMargin: 10 * screenScaleFactor - - onActivated: - { - UM.Preferences.setValue("layerview/layer_view_type", index); - } - - Component.onCompleted: - { - currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); - updateLegends(currentIndex); - } - - function updateLegends(type_id) - { - // update visibility of legends - view_settings.show_legend = UM.LayerView.compatibilityMode || (type_id == 1); - } - - } - - Label - { - id: compatibilityModeLabel - anchors.left: parent.left - text: catalog.i18nc("@label","Compatibility Mode") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - visible: UM.LayerView.compatibilityMode - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - } - - Label - { - id: space2Label - anchors.left: parent.left - text: " " - font.pointSize: 0.5 - } - - Connections { - target: UM.Preferences - onPreferenceChanged: - { - layerTypeCombobox.currentIndex = UM.LayerView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); - layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); - view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); - view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); - } - } - - Repeater { - model: Cura.ExtrudersModel{} - CheckBox { - id: extrudersModelCheckBox - checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" - onClicked: { - view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 - UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); - } - visible: !UM.LayerView.compatibilityMode - enabled: index + 1 <= 4 - Rectangle { - anchors.verticalCenter: parent.verticalCenter - anchors.right: extrudersModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: model.color - radius: width / 2 - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: !view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox - Label - { - text: model.name - elide: Text.ElideRight - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - anchors.verticalCenter: parent.verticalCenter - anchors.left: extrudersModelCheckBox.left; - anchors.right: extrudersModelCheckBox.right; - anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2 - anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2 - } - } - } - - Repeater { - model: ListModel { - id: typesLegenModel - Component.onCompleted: - { - typesLegenModel.append({ - label: catalog.i18nc("@label", "Show Travels"), - initialValue: view_settings.show_travel_moves, - preference: "layerview/show_travel_moves", - colorId: "layerview_move_combing" - }); - typesLegenModel.append({ - label: catalog.i18nc("@label", "Show Helpers"), - initialValue: view_settings.show_helpers, - preference: "layerview/show_helpers", - colorId: "layerview_support" - }); - typesLegenModel.append({ - label: catalog.i18nc("@label", "Show Shell"), - initialValue: view_settings.show_skin, - preference: "layerview/show_skin", - colorId: "layerview_inset_0" - }); - typesLegenModel.append({ - label: catalog.i18nc("@label", "Show Infill"), - initialValue: view_settings.show_infill, - preference: "layerview/show_infill", - colorId: "layerview_infill" - }); - } - } - - CheckBox { - id: legendModelCheckBox - checked: model.initialValue - onClicked: { - UM.Preferences.setValue(model.preference, checked); - } - Rectangle { - anchors.verticalCenter: parent.verticalCenter - anchors.right: legendModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor(model.colorId) - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox - Label - { - text: label - font: UM.Theme.getFont("default") - elide: Text.ElideRight - color: UM.Theme.getColor("setting_control_text") - anchors.verticalCenter: parent.verticalCenter - anchors.left: legendModelCheckBox.left; - anchors.right: legendModelCheckBox.right; - anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2 - anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2 - } - } - } - - CheckBox { - checked: view_settings.only_show_top_layers - onClicked: { - UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); - } - text: catalog.i18nc("@label", "Only Show Top Layers") - visible: UM.LayerView.compatibilityMode - style: UM.Theme.styles.checkbox - } - CheckBox { - checked: view_settings.top_layer_count == 5 - onClicked: { - UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); - } - text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") - visible: UM.LayerView.compatibilityMode - style: UM.Theme.styles.checkbox - } - - Repeater { - model: ListModel { - id: typesLegenModelNoCheck - Component.onCompleted: - { - typesLegenModelNoCheck.append({ - label: catalog.i18nc("@label", "Top / Bottom"), - colorId: "layerview_skin", - }); - typesLegenModelNoCheck.append({ - label: catalog.i18nc("@label", "Inner Wall"), - colorId: "layerview_inset_x", - }); - } - } - - Label { - text: label - visible: view_settings.show_legend - id: typesLegendModelLabel - Rectangle { - anchors.verticalCenter: parent.verticalCenter - anchors.right: typesLegendModelLabel.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor(model.colorId) - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - } - } - } - - LayerSlider { - id: slider - - width: UM.Theme.getSize("slider_handle").width - height: UM.Theme.getSize("layerview_menu_size").height - - anchors { - top: parent.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").height - right: layerViewMenu.right - rightMargin: UM.Theme.getSize("slider_layerview_margin").width - } - - // custom properties - upperValue: UM.LayerView.currentLayer - lowerValue: UM.LayerView.minimumLayer - maximumValue: UM.LayerView.numLayers - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - upperHandleColor: UM.Theme.getColor("slider_handle") - lowerHandleColor: UM.Theme.getColor("slider_handle") - rangeHandleColor: UM.Theme.getColor("slider_groove_fill") - handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - layersVisible: UM.LayerView.layerActivity && CuraApplication.platformActivity ? true : false - - // update values when layer data changes - Connections { - target: UM.LayerView - onMaxLayersChanged: slider.setUpperValue(UM.LayerView.currentLayer) - onMinimumLayerChanged: slider.setLowerValue(UM.LayerView.minimumLayer) - onCurrentLayerChanged: slider.setUpperValue(UM.LayerView.currentLayer) - } - - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - slider.setLowerValue(UM.LayerView.minimumLayer) - slider.setUpperValue(UM.LayerView.currentLayer) - } - } - } - - FontMetrics { - id: fontMetrics - font: UM.Theme.getFont("default") - } -} diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py deleted file mode 100644 index 4cf84117da..0000000000 --- a/plugins/LayerView/LayerViewProxy.py +++ /dev/null @@ -1,151 +0,0 @@ -from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty -from UM.FlameProfiler import pyqtSlot -from UM.Application import Application - -import LayerView - - -class LayerViewProxy(QObject): - def __init__(self, parent=None): - super().__init__(parent) - self._current_layer = 0 - self._controller = Application.getInstance().getController() - self._controller.activeViewChanged.connect(self._onActiveViewChanged) - self._onActiveViewChanged() - - currentLayerChanged = pyqtSignal() - maxLayersChanged = pyqtSignal() - activityChanged = pyqtSignal() - globalStackChanged = pyqtSignal() - preferencesChanged = pyqtSignal() - busyChanged = pyqtSignal() - - @pyqtProperty(bool, notify=activityChanged) - def layerActivity(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getActivity() - - @pyqtProperty(int, notify=maxLayersChanged) - def numLayers(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getMaxLayers() - - @pyqtProperty(int, notify=currentLayerChanged) - def currentLayer(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getCurrentLayer() - - @pyqtProperty(int, notify=currentLayerChanged) - def minimumLayer(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getMinimumLayer() - - @pyqtProperty(bool, notify=busyChanged) - def busy(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.isBusy() - - return False - - @pyqtProperty(bool, notify=preferencesChanged) - def compatibilityMode(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getCompatibilityMode() - return False - - @pyqtSlot(int) - def setCurrentLayer(self, layer_num): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setLayer(layer_num) - - @pyqtSlot(int) - def setMinimumLayer(self, layer_num): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setMinimumLayer(layer_num) - - @pyqtSlot(int) - def setLayerViewType(self, layer_view_type): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setLayerViewType(layer_view_type) - - @pyqtSlot(result=int) - def getLayerViewType(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getLayerViewType() - return 0 - - # Opacity 0..1 - @pyqtSlot(int, float) - def setExtruderOpacity(self, extruder_nr, opacity): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setExtruderOpacity(extruder_nr, opacity) - - @pyqtSlot(int) - def setShowTravelMoves(self, show): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setShowTravelMoves(show) - - @pyqtSlot(int) - def setShowHelpers(self, show): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setShowHelpers(show) - - @pyqtSlot(int) - def setShowSkin(self, show): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setShowSkin(show) - - @pyqtSlot(int) - def setShowInfill(self, show): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.setShowInfill(show) - - @pyqtProperty(int, notify=globalStackChanged) - def extruderCount(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - return active_view.getExtruderCount() - return 0 - - def _layerActivityChanged(self): - self.activityChanged.emit() - - def _onLayerChanged(self): - self.currentLayerChanged.emit() - self._layerActivityChanged() - - def _onMaxLayersChanged(self): - self.maxLayersChanged.emit() - - def _onBusyChanged(self): - self.busyChanged.emit() - - def _onGlobalStackChanged(self): - self.globalStackChanged.emit() - - def _onPreferencesChanged(self): - self.preferencesChanged.emit() - - def _onActiveViewChanged(self): - active_view = self._controller.getActiveView() - if type(active_view) == LayerView.LayerView.LayerView: - active_view.currentLayerNumChanged.connect(self._onLayerChanged) - active_view.maxLayersChanged.connect(self._onMaxLayersChanged) - active_view.busyChanged.connect(self._onBusyChanged) - active_view.globalStackChanged.connect(self._onGlobalStackChanged) - active_view.preferencesChanged.connect(self._onPreferencesChanged) diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py deleted file mode 100644 index da1a5aed19..0000000000 --- a/plugins/LayerView/__init__.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from . import LayerView, LayerViewProxy -from PyQt5.QtQml import qmlRegisterType, qmlRegisterSingletonType - -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - -def getMetaData(): - return { - "view": { - "name": catalog.i18nc("@item:inlistbox", "Layer view"), - "view_panel": "LayerView.qml", - "weight": 2 - } - } - -def createLayerViewProxy(engine, script_engine): - return LayerViewProxy.LayerViewProxy() - -def register(app): - layer_view = LayerView.LayerView() - qmlRegisterSingletonType(LayerViewProxy.LayerViewProxy, "UM", 1, 0, "LayerView", layer_view.getProxy) - return { "view": LayerView.LayerView() } diff --git a/plugins/LayerView/layers.shader b/plugins/LayerView/layers.shader deleted file mode 100755 index d340773403..0000000000 --- a/plugins/LayerView/layers.shader +++ /dev/null @@ -1,156 +0,0 @@ -[shaders] -vertex = - uniform highp mat4 u_modelViewProjectionMatrix; - uniform lowp float u_active_extruder; - uniform lowp float u_shade_factor; - uniform highp int u_layer_view_type; - - attribute highp float a_extruder; - attribute highp float a_line_type; - attribute highp vec4 a_vertex; - attribute lowp vec4 a_color; - attribute lowp vec4 a_material_color; - - varying lowp vec4 v_color; - varying float v_line_type; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - // shade the color depending on the extruder index - v_color = a_color; - // 8 and 9 are travel moves - if ((a_line_type != 8.0) && (a_line_type != 9.0)) { - v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); - } - - v_line_type = a_line_type; - } - -fragment = - varying lowp vec4 v_color; - varying float v_line_type; - - uniform int u_show_travel_moves; - uniform int u_show_helpers; - uniform int u_show_skin; - uniform int u_show_infill; - - void main() - { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 - // discard movements - discard; - } - // support: 4, 5, 7, 10 - if ((u_show_helpers == 0) && ( - ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || - ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || - ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || - ((v_line_type >= 4.5) && (v_line_type <= 5.5)) - )) { - discard; - } - // skin: 1, 2, 3 - if ((u_show_skin == 0) && ( - (v_line_type >= 0.5) && (v_line_type <= 3.5) - )) { - discard; - } - // infill: - if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { - // discard movements - discard; - } - - gl_FragColor = v_color; - } - -vertex41core = - #version 410 - uniform highp mat4 u_modelViewProjectionMatrix; - uniform lowp float u_active_extruder; - uniform lowp float u_shade_factor; - uniform highp int u_layer_view_type; - - in highp float a_extruder; - in highp float a_line_type; - in highp vec4 a_vertex; - in lowp vec4 a_color; - in lowp vec4 a_material_color; - - out lowp vec4 v_color; - out float v_line_type; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_color = a_color; - if ((a_line_type != 8) && (a_line_type != 9)) { - v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); - } - - v_line_type = a_line_type; - } - -fragment41core = - #version 410 - in lowp vec4 v_color; - in float v_line_type; - out vec4 frag_color; - - uniform int u_show_travel_moves; - uniform int u_show_helpers; - uniform int u_show_skin; - uniform int u_show_infill; - - void main() - { - if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 - // discard movements - discard; - } - // helpers: 4, 5, 7, 10 - if ((u_show_helpers == 0) && ( - ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || - ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || - ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || - ((v_line_type >= 4.5) && (v_line_type <= 5.5)) - )) { - discard; - } - // skin: 1, 2, 3 - if ((u_show_skin == 0) && ( - (v_line_type >= 0.5) && (v_line_type <= 3.5) - )) { - discard; - } - // infill: - if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { - // discard movements - discard; - } - - frag_color = v_color; - } - -[defaults] -u_active_extruder = 0.0 -u_shade_factor = 0.60 -u_layer_view_type = 0 -u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] - -u_show_travel_moves = 0 -u_show_helpers = 1 -u_show_skin = 1 -u_show_infill = 1 - -[bindings] -u_modelViewProjectionMatrix = model_view_projection_matrix - -[attributes] -a_vertex = vertex -a_color = color -a_extruder = extruder -a_line_type = line_type -a_material_color = material_color diff --git a/plugins/LayerView/layers3d.shader b/plugins/LayerView/layers3d.shader deleted file mode 100755 index e8fe425c70..0000000000 --- a/plugins/LayerView/layers3d.shader +++ /dev/null @@ -1,264 +0,0 @@ -[shaders] -vertex41core = - #version 410 - uniform highp mat4 u_modelViewProjectionMatrix; - - uniform highp mat4 u_modelMatrix; - uniform highp mat4 u_viewProjectionMatrix; - uniform lowp float u_active_extruder; - uniform lowp int u_layer_view_type; - uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible - - uniform highp mat4 u_normalMatrix; - - in highp vec4 a_vertex; - in lowp vec4 a_color; - in lowp vec4 a_material_color; - in highp vec4 a_normal; - in highp vec2 a_line_dim; // line width and thickness - in highp float a_extruder; - in highp float a_line_type; - - out lowp vec4 v_color; - - out highp vec3 v_vertex; - out highp vec3 v_normal; - out lowp vec2 v_line_dim; - out highp int v_extruder; - out highp vec4 v_extruder_opacity; - out float v_line_type; - - out lowp vec4 f_color; - out highp vec3 f_vertex; - out highp vec3 f_normal; - - void main() - { - vec4 v1_vertex = a_vertex; - v1_vertex.y -= a_line_dim.y / 2; // half layer down - - vec4 world_space_vert = u_modelMatrix * v1_vertex; - gl_Position = world_space_vert; - // shade the color depending on the extruder index stored in the alpha component of the color - - switch (u_layer_view_type) { - case 0: // "Material color" - v_color = a_material_color; - break; - case 1: // "Line type" - v_color = a_color; - break; - } - - v_vertex = world_space_vert.xyz; - v_normal = (u_normalMatrix * normalize(a_normal)).xyz; - v_line_dim = a_line_dim; - v_extruder = int(a_extruder); - v_line_type = a_line_type; - v_extruder_opacity = u_extruder_opacity; - - // for testing without geometry shader - f_color = v_color; - f_vertex = v_vertex; - f_normal = v_normal; - } - -geometry41core = - #version 410 - - uniform highp mat4 u_viewProjectionMatrix; - uniform int u_show_travel_moves; - uniform int u_show_helpers; - uniform int u_show_skin; - uniform int u_show_infill; - - layout(lines) in; - layout(triangle_strip, max_vertices = 26) out; - - in vec4 v_color[]; - in vec3 v_vertex[]; - in vec3 v_normal[]; - in vec2 v_line_dim[]; - in int v_extruder[]; - in vec4 v_extruder_opacity[]; - in float v_line_type[]; - - out vec4 f_color; - out vec3 f_normal; - out vec3 f_vertex; - - // Set the set of variables and EmitVertex - void myEmitVertex(vec3 vertex, vec4 color, vec3 normal, vec4 pos) { - f_vertex = vertex; - f_color = color; - f_normal = normal; - gl_Position = pos; - EmitVertex(); - } - - void main() - { - vec4 g_vertex_delta; - vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers - vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position - vec3 g_vertex_normal_vert; - vec4 g_vertex_offset_vert; - vec3 g_vertex_normal_horz_head; - vec4 g_vertex_offset_horz_head; - - float size_x; - float size_y; - - if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { - return; - } - // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType - if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { - return; - } - if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10))) { - return; - } - if ((u_show_skin == 0) && ((v_line_type[0] == 1) || (v_line_type[0] == 2) || (v_line_type[0] == 3))) { - return; - } - if ((u_show_infill == 0) && (v_line_type[0] == 6)) { - return; - } - - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { - // fixed size for movements - size_x = 0.05; - } else { - size_x = v_line_dim[1].x / 2 + 0.01; // radius, and make it nicely overlapping - } - size_y = v_line_dim[1].y / 2 + 0.01; - - g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; - g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); - g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); - - g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); - - g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //size * g_vertex_normal_horz; - g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); - g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); - - if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { - // Travels: flat plane with pointy ends - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); - - EndPrimitive(); - } else { - // All normal lines are rendered as 3d tubes. - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - - EndPrimitive(); - - // left side - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); - - EndPrimitive(); - - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - - EndPrimitive(); - - // right side - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); - - EndPrimitive(); - - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - - EndPrimitive(); - } - } - -fragment41core = - #version 410 - in lowp vec4 f_color; - in lowp vec3 f_normal; - in lowp vec3 f_vertex; - - out vec4 frag_color; - - uniform mediump vec4 u_ambientColor; - uniform highp vec3 u_lightPosition; - - void main() - { - mediump vec4 finalColor = vec4(0.0); - float alpha = f_color.a; - - finalColor.rgb += f_color.rgb * 0.3; - - highp vec3 normal = normalize(f_normal); - highp vec3 light_dir = normalize(u_lightPosition - f_vertex); - - // Diffuse Component - highp float NdotL = clamp(dot(normal, light_dir), 0.0, 1.0); - finalColor += (NdotL * f_color); - finalColor.a = alpha; // Do not change alpha in any way - - frag_color = finalColor; - } - - -[defaults] -u_active_extruder = 0.0 -u_layer_view_type = 0 -u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] - -u_specularColor = [0.4, 0.4, 0.4, 1.0] -u_ambientColor = [0.3, 0.3, 0.3, 0.0] -u_diffuseColor = [1.0, 0.79, 0.14, 1.0] -u_shininess = 20.0 - -u_show_travel_moves = 0 -u_show_helpers = 1 -u_show_skin = 1 -u_show_infill = 1 - -[bindings] -u_modelViewProjectionMatrix = model_view_projection_matrix -u_modelMatrix = model_matrix -u_viewProjectionMatrix = view_projection_matrix -u_normalMatrix = normal_matrix -u_lightPosition = light_0_position - -[attributes] -a_vertex = vertex -a_color = color -a_normal = normal -a_line_dim = line_dim -a_extruder = extruder -a_material_color = material_color -a_line_type = line_type diff --git a/plugins/LayerView/layerview_composite.shader b/plugins/LayerView/layerview_composite.shader deleted file mode 100644 index dcc02acc84..0000000000 --- a/plugins/LayerView/layerview_composite.shader +++ /dev/null @@ -1,148 +0,0 @@ -[shaders] -vertex = - uniform highp mat4 u_modelViewProjectionMatrix; - attribute highp vec4 a_vertex; - attribute highp vec2 a_uvs; - - varying highp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -fragment = - uniform sampler2D u_layer0; - uniform sampler2D u_layer1; - uniform sampler2D u_layer2; - - uniform vec2 u_offset[9]; - - uniform vec4 u_background_color; - uniform float u_outline_strength; - uniform vec4 u_outline_color; - - varying vec2 v_uvs; - - float kernel[9]; - - const vec3 x_axis = vec3(1.0, 0.0, 0.0); - const vec3 y_axis = vec3(0.0, 1.0, 0.0); - const vec3 z_axis = vec3(0.0, 0.0, 1.0); - - void main() - { - // blur kernel - kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; - kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; - kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; - - vec4 result = u_background_color; - - vec4 main_layer = texture2D(u_layer0, v_uvs); - vec4 selection_layer = texture2D(u_layer1, v_uvs); - vec4 layerview_layer = texture2D(u_layer2, v_uvs); - - result = main_layer * main_layer.a + result * (1.0 - main_layer.a); - result = layerview_layer * layerview_layer.a + result * (1.0 - layerview_layer.a); - - vec4 sum = vec4(0.0); - for (int i = 0; i < 9; i++) - { - vec4 color = vec4(texture2D(u_layer1, v_uvs.xy + u_offset[i]).a); - sum += color * (kernel[i] / u_outline_strength); - } - - if((selection_layer.rgb == x_axis || selection_layer.rgb == y_axis || selection_layer.rgb == z_axis)) - { - gl_FragColor = result; - } - else - { - gl_FragColor = mix(result, u_outline_color, abs(sum.a)); - } - } - -vertex41core = - #version 410 - uniform highp mat4 u_modelViewProjectionMatrix; - in highp vec4 a_vertex; - in highp vec2 a_uvs; - - out highp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -fragment41core = - #version 410 - uniform sampler2D u_layer0; - uniform sampler2D u_layer1; - uniform sampler2D u_layer2; - - uniform vec2 u_offset[9]; - - uniform vec4 u_background_color; - uniform float u_outline_strength; - uniform vec4 u_outline_color; - - in vec2 v_uvs; - - float kernel[9]; - - const vec3 x_axis = vec3(1.0, 0.0, 0.0); - const vec3 y_axis = vec3(0.0, 1.0, 0.0); - const vec3 z_axis = vec3(0.0, 0.0, 1.0); - - out vec4 frag_color; - - void main() - { - // blur kernel - kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; - kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; - kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; - - vec4 result = u_background_color; - - vec4 main_layer = texture(u_layer0, v_uvs); - vec4 selection_layer = texture(u_layer1, v_uvs); - vec4 layerview_layer = texture(u_layer2, v_uvs); - - result = main_layer * main_layer.a + result * (1.0 - main_layer.a); - result = layerview_layer * layerview_layer.a + result * (1.0 - layerview_layer.a); - - vec4 sum = vec4(0.0); - for (int i = 0; i < 9; i++) - { - vec4 color = vec4(texture(u_layer1, v_uvs.xy + u_offset[i]).a); - sum += color * (kernel[i] / u_outline_strength); - } - - if((selection_layer.rgb == x_axis || selection_layer.rgb == y_axis || selection_layer.rgb == z_axis)) - { - frag_color = result; - } - else - { - frag_color = mix(result, u_outline_color, abs(sum.a)); - } - } - -[defaults] -u_layer0 = 0 -u_layer1 = 1 -u_layer2 = 2 -u_background_color = [0.965, 0.965, 0.965, 1.0] -u_outline_strength = 1.0 -u_outline_color = [0.05, 0.66, 0.89, 1.0] - -[bindings] - -[attributes] -a_vertex = vertex -a_uvs = uv diff --git a/plugins/LayerView/plugin.json b/plugins/LayerView/plugin.json deleted file mode 100644 index 232fe9c361..0000000000 --- a/plugins/LayerView/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "Layer View", - "author": "Ultimaker B.V.", - "version": "1.0.0", - "description": "Provides the Layer view.", - "api": 4, - "i18n-catalog": "cura" -} diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index e61c48bffd..5cfed426e5 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -133,6 +133,7 @@ "slider_groove_fill": [245, 245, 245, 255], "slider_handle": [255, 255, 255, 255], "slider_handle_hover": [77, 182, 226, 255], + "slider_handle_active": [68, 192, 255, 255], "slider_handle_border": [39, 44, 48, 255], "slider_text_background": [255, 255, 255, 255], @@ -194,6 +195,7 @@ "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], "layerview_support_interface": [64, 192, 255, 255], + "layerview_nozzle": [181, 166, 66, 120], "material_compatibility_warning": [255, 255, 255, 255], diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 6d991c5541..ea9d184926 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -269,6 +269,7 @@ QtObject { arrowSize: Theme.getSize("button_tooltip_arrow").width color: Theme.getColor("button_tooltip") opacity: control.hovered ? 1.0 : 0.0; + visible: control.text != "" width: control.hovered ? button_tip.width + Theme.getSize("button_tooltip").width : 0 height: Theme.getSize("button_tooltip").height diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index f084e87da2..4197285dd8 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -183,6 +183,7 @@ "slider_groove_fill": [127, 127, 127, 255], "slider_handle": [0, 0, 0, 255], "slider_handle_hover": [77, 182, 226, 255], + "slider_handle_active": [68, 192, 255, 255], "slider_handle_border": [39, 44, 48, 255], "slider_text_background": [255, 255, 255, 255], @@ -271,7 +272,8 @@ "layerview_support_infill": [0, 255, 255, 255], "layerview_move_combing": [0, 0, 255, 255], "layerview_move_retraction": [128, 128, 255, 255], - "layerview_support_interface": [64, 192, 255, 255] + "layerview_support_interface": [64, 192, 255, 255], + "layerview_nozzle": [181, 166, 66, 50] }, "sizes": { From 2df06bbbb9d517d66b7fb5b722e4eddc3b0afc47 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 10:51:57 +0100 Subject: [PATCH 280/764] CURA-4526 Add Simulation View plugin --- plugins/SimulationView/LayerSlider.qml | 325 +++++++++ plugins/SimulationView/NozzleNode.py | 49 ++ plugins/SimulationView/PathSlider.qml | 161 +++++ plugins/SimulationView/SimulationPass.py | 186 +++++ .../SimulationView/SimulationSliderLabel.qml | 104 +++ plugins/SimulationView/SimulationView.py | 609 +++++++++++++++++ plugins/SimulationView/SimulationView.qml | 645 ++++++++++++++++++ plugins/SimulationView/SimulationViewProxy.py | 259 +++++++ plugins/SimulationView/__init__.py | 26 + plugins/SimulationView/layers.shader | 156 +++++ plugins/SimulationView/layers3d.shader | 293 ++++++++ plugins/SimulationView/layers3d_shadow.shader | 256 +++++++ plugins/SimulationView/layers_shadow.shader | 156 +++++ plugins/SimulationView/plugin.json | 8 + plugins/SimulationView/resources/nozzle.stl | Bin 0 -> 210284 bytes .../resources/simulation_pause.svg | 79 +++ .../resources/simulation_resume.svg | 82 +++ .../simulationview_composite.shader | 148 ++++ 18 files changed, 3542 insertions(+) create mode 100644 plugins/SimulationView/LayerSlider.qml create mode 100644 plugins/SimulationView/NozzleNode.py create mode 100644 plugins/SimulationView/PathSlider.qml create mode 100644 plugins/SimulationView/SimulationPass.py create mode 100644 plugins/SimulationView/SimulationSliderLabel.qml create mode 100644 plugins/SimulationView/SimulationView.py create mode 100644 plugins/SimulationView/SimulationView.qml create mode 100644 plugins/SimulationView/SimulationViewProxy.py create mode 100644 plugins/SimulationView/__init__.py create mode 100644 plugins/SimulationView/layers.shader create mode 100644 plugins/SimulationView/layers3d.shader create mode 100644 plugins/SimulationView/layers3d_shadow.shader create mode 100644 plugins/SimulationView/layers_shadow.shader create mode 100644 plugins/SimulationView/plugin.json create mode 100644 plugins/SimulationView/resources/nozzle.stl create mode 100644 plugins/SimulationView/resources/simulation_pause.svg create mode 100644 plugins/SimulationView/resources/simulation_resume.svg create mode 100644 plugins/SimulationView/simulationview_composite.shader diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml new file mode 100644 index 0000000000..22f9d91340 --- /dev/null +++ b/plugins/SimulationView/LayerSlider.qml @@ -0,0 +1,325 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +Item { + id: sliderRoot + + // handle properties + property real handleSize: 10 + property real handleRadius: handleSize / 2 + property real minimumRangeHandleSize: handleSize / 2 + property color upperHandleColor: "black" + property color lowerHandleColor: "black" + property color rangeHandleColor: "black" + property color handleActiveColor: "white" + property real handleLabelWidth: width + property var activeHandle: upperHandle + + // track properties + property real trackThickness: 4 // width of the slider track + property real trackRadius: trackThickness / 2 + property color trackColor: "white" + property real trackBorderWidth: 1 // width of the slider track border + property color trackBorderColor: "black" + + // value properties + property real maximumValue: 100 + property real minimumValue: 0 + property real minimumRange: 0 // minimum range allowed between min and max values + property bool roundValues: true + property real upperValue: maximumValue + property real lowerValue: minimumValue + + property bool layersVisible: true + + function getUpperValueFromSliderHandle () { + return upperHandle.getValue() + } + + function setUpperValue (value) { + upperHandle.setValue(value) + updateRangeHandle() + } + + function getLowerValueFromSliderHandle () { + return lowerHandle.getValue() + } + + function setLowerValue (value) { + lowerHandle.setValue(value) + updateRangeHandle() + } + + function updateRangeHandle () { + rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) + } + + // set the active handle to show only one label at a time + function setActiveHandle (handle) { + activeHandle = handle + } + + // slider track + Rectangle { + id: track + + width: sliderRoot.trackThickness + height: sliderRoot.height - sliderRoot.handleSize + radius: sliderRoot.trackRadius + anchors.centerIn: sliderRoot + color: sliderRoot.trackColor + border.width: sliderRoot.trackBorderWidth + border.color: sliderRoot.trackBorderColor + visible: sliderRoot.layersVisible + } + + // Range handle + Item { + id: rangeHandle + + y: upperHandle.y + upperHandle.height + width: sliderRoot.handleSize + height: sliderRoot.minimumRangeHandleSize + anchors.horizontalCenter: sliderRoot.horizontalCenter + visible: sliderRoot.layersVisible + + // set the new value when dragging + function onHandleDragged () { + + upperHandle.y = y - upperHandle.height + lowerHandle.y = y + height + + var upperValue = sliderRoot.getUpperValueFromSliderHandle() + var lowerValue = sliderRoot.getLowerValueFromSliderHandle() + + // set both values after moving the handle position + UM.SimulationView.setCurrentLayer(upperValue) + UM.SimulationView.setMinimumLayer(lowerValue) + } + + function setValue (value) { + var range = sliderRoot.upperValue - sliderRoot.lowerValue + value = Math.min(value, sliderRoot.maximumValue) + value = Math.max(value, sliderRoot.minimumValue + range) + + UM.SimulationView.setCurrentLayer(value) + UM.SimulationView.setMinimumLayer(value - range) + } + + Rectangle { + width: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth + height: parent.height + sliderRoot.handleSize + anchors.centerIn: parent + color: sliderRoot.rangeHandleColor + } + + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: upperHandle.height + maximumY: sliderRoot.height - (rangeHandle.height + lowerHandle.height) + } + + onPositionChanged: parent.onHandleDragged() + onPressed: sliderRoot.setActiveHandle(rangeHandle) + } + + SimulationSliderLabel { + id: rangleHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.upperValue + busy: UM.SimulationView.busy + setValue: rangeHandle.setValue // connect callback functions + } + } + + // Upper handle + Rectangle { + id: upperHandle + + y: sliderRoot.height - (sliderRoot.minimumRangeHandleSize + 2 * sliderRoot.handleSize) + width: sliderRoot.handleSize + height: sliderRoot.handleSize + anchors.horizontalCenter: sliderRoot.horizontalCenter + radius: sliderRoot.handleRadius + color: upperHandleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.upperHandleColor + visible: sliderRoot.layersVisible + + function onHandleDragged () { + + // don't allow the lower handle to be heigher than the upper handle + if (lowerHandle.y - (y + height) < sliderRoot.minimumRangeHandleSize) { + lowerHandle.y = y + height + sliderRoot.minimumRangeHandleSize + } + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setCurrentLayer(getValue()) + } + + // get the upper value based on the slider position + function getValue () { + var result = y / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) + result = sliderRoot.maximumValue + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumValue)) + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the upper value + function setValue (value) { + + UM.SimulationView.setCurrentLayer(value) + + var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + var newUpperYPosition = Math.round(diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) + y = newUpperYPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onUpPressed: upperHandleLabel.setValue(upperHandleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: upperHandleLabel.setValue(upperHandleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: 0 + maximumY: sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + } + + onPositionChanged: parent.onHandleDragged() + onPressed: { + sliderRoot.setActiveHandle(upperHandle) + upperHandleLabel.forceActiveFocus() + } + } + + SimulationSliderLabel { + id: upperHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.upperValue + busy: UM.SimulationView.busy + setValue: upperHandle.setValue // connect callback functions + } + } + + // Lower handle + Rectangle { + id: lowerHandle + + y: sliderRoot.height - sliderRoot.handleSize + width: parent.handleSize + height: parent.handleSize + anchors.horizontalCenter: parent.horizontalCenter + radius: sliderRoot.handleRadius + color: lowerHandleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.lowerHandleColor + + visible: sliderRoot.layersVisible + + function onHandleDragged () { + + // don't allow the upper handle to be lower than the lower handle + if (y - (upperHandle.y + upperHandle.height) < sliderRoot.minimumRangeHandleSize) { + upperHandle.y = y - (upperHandle.heigth + sliderRoot.minimumRangeHandleSize) + } + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setMinimumLayer(getValue()) + } + + // get the lower value from the current slider position + function getValue () { + var result = (y - (sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)) / (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize)); + result = sliderRoot.maximumValue - sliderRoot.minimumRange + result * (sliderRoot.minimumValue - (sliderRoot.maximumValue - sliderRoot.minimumRange)) + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the lower value + function setValue (value) { + + UM.SimulationView.setMinimumLayer(value) + + var diff = (value - sliderRoot.maximumValue) / (sliderRoot.minimumValue - sliderRoot.maximumValue) + var newLowerYPosition = Math.round((sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize) + diff * (sliderRoot.height - (2 * sliderRoot.handleSize + sliderRoot.minimumRangeHandleSize))) + y = newLowerYPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onUpPressed: lowerHandleLabel.setValue(lowerHandleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: lowerHandleLabel.setValue(lowerHandleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.YAxis + minimumY: upperHandle.height + sliderRoot.minimumRangeHandleSize + maximumY: sliderRoot.height - parent.height + } + + onPositionChanged: parent.onHandleDragged() + onPressed: { + sliderRoot.setActiveHandle(lowerHandle) + lowerHandleLabel.forceActiveFocus() + } + } + + SimulationSliderLabel { + id: lowerHandleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + x: parent.x - width - UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter + target: Qt.point(sliderRoot.width, y + height / 2) + visible: sliderRoot.activeHandle == parent + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.lowerValue + busy: UM.SimulationView.busy + setValue: lowerHandle.setValue // connect callback functions + } + } +} diff --git a/plugins/SimulationView/NozzleNode.py b/plugins/SimulationView/NozzleNode.py new file mode 100644 index 0000000000..8a29871775 --- /dev/null +++ b/plugins/SimulationView/NozzleNode.py @@ -0,0 +1,49 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Application import Application +from UM.Math.Color import Color +from UM.Math.Vector import Vector +from UM.PluginRegistry import PluginRegistry +from UM.Scene.SceneNode import SceneNode +from UM.View.GL.OpenGL import OpenGL +from UM.Resources import Resources + +import os + +class NozzleNode(SceneNode): + def __init__(self, parent = None): + super().__init__(parent) + + self._shader = None + self.setCalculateBoundingBox(False) + self._createNozzleMesh() + + def _createNozzleMesh(self): + mesh_file = "resources/nozzle.stl" + try: + path = os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), mesh_file) + except FileNotFoundError: + path = "" + + reader = Application.getInstance().getMeshFileHandler().getReaderForFile(path) + node = reader.read(path) + + if node.getMeshData(): + self.setMeshData(node.getMeshData()) + + def render(self, renderer): + # Avoid to render if it is not visible + if not self.isVisible(): + return False + + if not self._shader: + # We now misuse the platform shader, as it actually supports textures + self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + # Set the opacity to 0, so that the template is in full control. + self._shader.setUniformValue("u_opacity", 0) + + if self.getMeshData(): + renderer.queueNode(self, shader = self._shader, transparent = True) + return True diff --git a/plugins/SimulationView/PathSlider.qml b/plugins/SimulationView/PathSlider.qml new file mode 100644 index 0000000000..0a4af904aa --- /dev/null +++ b/plugins/SimulationView/PathSlider.qml @@ -0,0 +1,161 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +Item { + id: sliderRoot + + // handle properties + property real handleSize: 10 + property real handleRadius: handleSize / 2 + property color handleColor: "black" + property color handleActiveColor: "white" + property color rangeColor: "black" + property real handleLabelWidth: width + + // track properties + property real trackThickness: 4 // width of the slider track + property real trackRadius: trackThickness / 2 + property color trackColor: "white" + property real trackBorderWidth: 1 // width of the slider track border + property color trackBorderColor: "black" + + // value properties + property real maximumValue: 100 + property bool roundValues: true + property real handleValue: maximumValue + + property bool pathsVisible: true + + function getHandleValueFromSliderHandle () { + return handle.getValue() + } + + function setHandleValue (value) { + handle.setValue(value) + updateRangeHandle() + } + + function updateRangeHandle () { + rangeHandle.width = handle.x - sliderRoot.handleSize + } + + // slider track + Rectangle { + id: track + + width: sliderRoot.width - sliderRoot.handleSize + height: sliderRoot.trackThickness + radius: sliderRoot.trackRadius + anchors.centerIn: sliderRoot + color: sliderRoot.trackColor + border.width: sliderRoot.trackBorderWidth + border.color: sliderRoot.trackBorderColor + visible: sliderRoot.pathsVisible + } + + // Progress indicator + Item { + id: rangeHandle + + x: handle.width + height: sliderRoot.handleSize + width: handle.x - sliderRoot.handleSize + anchors.verticalCenter: sliderRoot.verticalCenter + visible: sliderRoot.pathsVisible + + Rectangle { + height: sliderRoot.trackThickness - 2 * sliderRoot.trackBorderWidth + width: parent.width + sliderRoot.handleSize + anchors.centerIn: parent + color: sliderRoot.rangeColor + } + } + + // Handle + Rectangle { + id: handle + + x: sliderRoot.handleSize + width: sliderRoot.handleSize + height: sliderRoot.handleSize + anchors.verticalCenter: sliderRoot.verticalCenter + radius: sliderRoot.handleRadius + color: handleLabel.activeFocus ? sliderRoot.handleActiveColor : sliderRoot.handleColor + visible: sliderRoot.pathsVisible + + function onHandleDragged () { + + // update the range handle + sliderRoot.updateRangeHandle() + + // set the new value after moving the handle position + UM.SimulationView.setCurrentPath(getValue()) + } + + // get the value based on the slider position + function getValue () { + var result = x / (sliderRoot.width - sliderRoot.handleSize) + result = result * sliderRoot.maximumValue + result = sliderRoot.roundValues ? Math.round(result) : result + return result + } + + // set the slider position based on the value + function setValue (value) { + + UM.SimulationView.setCurrentPath(value) + + var diff = value / sliderRoot.maximumValue + var newXPosition = Math.round(diff * (sliderRoot.width - sliderRoot.handleSize)) + x = newXPosition + + // update the range handle + sliderRoot.updateRangeHandle() + } + + Keys.onRightPressed: handleLabel.setValue(handleLabel.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onLeftPressed: handleLabel.setValue(handleLabel.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + // dragging + MouseArea { + anchors.fill: parent + + drag { + target: parent + axis: Drag.XAxis + minimumX: 0 + maximumX: sliderRoot.width - sliderRoot.handleSize + } + onPressed: { + handleLabel.forceActiveFocus() + } + + onPositionChanged: parent.onHandleDragged() + } + + SimulationSliderLabel { + id: handleLabel + + height: sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + y: parent.y + sliderRoot.handleSize + UM.Theme.getSize("default_margin").height + anchors.horizontalCenter: parent.horizontalCenter + target: Qt.point(x + width / 2, sliderRoot.height) + visible: false + startFrom: 0 + + // custom properties + maximumValue: sliderRoot.maximumValue + value: sliderRoot.handleValue + busy: UM.SimulationView.busy + setValue: handle.setValue // connect callback functions + } + } +} diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py new file mode 100644 index 0000000000..24a13eaf7a --- /dev/null +++ b/plugins/SimulationView/SimulationPass.py @@ -0,0 +1,186 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Math.Color import Color +from UM.Math.Vector import Vector +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Resources import Resources +from UM.Scene.SceneNode import SceneNode +from UM.Scene.ToolHandle import ToolHandle +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry + +from UM.View.RenderPass import RenderPass +from UM.View.RenderBatch import RenderBatch +from UM.View.GL.OpenGL import OpenGL + +from cura.Settings.ExtruderManager import ExtruderManager + + +import os.path + +## RenderPass used to display g-code paths. +from .NozzleNode import NozzleNode + + +class SimulationPass(RenderPass): + def __init__(self, width, height): + super().__init__("simulationview", width, height) + + self._layer_shader = None + self._layer_shadow_shader = None + self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers + self._tool_handle_shader = None + self._nozzle_shader = None + self._old_current_layer = 0 + self._old_current_path = 0 + self._gl = OpenGL.getInstance().getBindingsObject() + self._scene = Application.getInstance().getController().getScene() + self._extruder_manager = ExtruderManager.getInstance() + + self._layer_view = None + self._compatibility_mode = None + + def setSimulationView(self, layerview): + self._layer_view = layerview + self._compatibility_mode = layerview.getCompatibilityMode() + + def render(self): + if not self._layer_shader: + if self._compatibility_mode: + shader_filename = "layers.shader" + shadow_shader_filename = "layers_shadow.shader" + else: + shader_filename = "layers3d.shader" + shadow_shader_filename = "layers3d_shadow.shader" + self._layer_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shader_filename)) + self._layer_shadow_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), shadow_shader_filename)) + self._current_shader = self._layer_shader + # Use extruder 0 if the extruder manager reports extruder index -1 (for single extrusion printers) + self._layer_shader.setUniformValue("u_active_extruder", float(max(0, self._extruder_manager.activeExtruderIndex))) + if self._layer_view: + self._layer_shader.setUniformValue("u_max_feedrate", self._layer_view.getMaxFeedrate()) + self._layer_shader.setUniformValue("u_min_feedrate", self._layer_view.getMinFeedrate()) + self._layer_shader.setUniformValue("u_max_thickness", self._layer_view.getMaxThickness()) + self._layer_shader.setUniformValue("u_min_thickness", self._layer_view.getMinThickness()) + self._layer_shader.setUniformValue("u_layer_view_type", self._layer_view.getSimulationViewType()) + self._layer_shader.setUniformValue("u_extruder_opacity", self._layer_view.getExtruderOpacities()) + self._layer_shader.setUniformValue("u_show_travel_moves", self._layer_view.getShowTravelMoves()) + self._layer_shader.setUniformValue("u_show_helpers", self._layer_view.getShowHelpers()) + self._layer_shader.setUniformValue("u_show_skin", self._layer_view.getShowSkin()) + self._layer_shader.setUniformValue("u_show_infill", self._layer_view.getShowInfill()) + else: + #defaults + self._layer_shader.setUniformValue("u_max_feedrate", 1) + self._layer_shader.setUniformValue("u_min_feedrate", 0) + self._layer_shader.setUniformValue("u_max_thickness", 1) + self._layer_shader.setUniformValue("u_min_thickness", 0) + self._layer_shader.setUniformValue("u_layer_view_type", 1) + self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1]) + self._layer_shader.setUniformValue("u_show_travel_moves", 0) + self._layer_shader.setUniformValue("u_show_helpers", 1) + self._layer_shader.setUniformValue("u_show_skin", 1) + self._layer_shader.setUniformValue("u_show_infill", 1) + + if not self._tool_handle_shader: + self._tool_handle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "toolhandle.shader")) + + if not self._nozzle_shader: + self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + + self.bind() + + tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Solid) + head_position = None # Indicates the current position of the print head + nozzle_node = None + + for node in DepthFirstIterator(self._scene.getRoot()): + + if isinstance(node, ToolHandle): + tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) + + elif isinstance(node, NozzleNode): + nozzle_node = node + nozzle_node.setVisible(False) + + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + # Render all layers below a certain number as line mesh instead of vertices. + if self._layer_view._current_layer_num > -1 and ((not self._layer_view._only_show_top_layers) or (not self._layer_view.getCompatibilityMode())): + start = 0 + end = 0 + element_counts = layer_data.getElementCounts() + for layer in sorted(element_counts.keys()): + # In the current layer, we show just the indicated paths + if layer == self._layer_view._current_layer_num: + # We look for the position of the head, searching the point of the current path + index = self._layer_view._current_path_num + offset = 0 + for polygon in layer_data.getLayer(layer).polygons: + # The size indicates all values in the two-dimension array, and the second dimension is + # always size 3 because we have 3D points. + if index >= polygon.data.size // 3 - offset: + index -= polygon.data.size // 3 - offset + offset = 1 # This is to avoid the first point when there is more than one polygon, since has the same value as the last point in the previous polygon + continue + # The head position is calculated and translated + head_position = Vector(polygon.data[index+offset][0], polygon.data[index+offset][1], polygon.data[index+offset][2]) + node.getWorldPosition() + break + break + if self._layer_view._minimum_layer_num > layer: + start += element_counts[layer] + end += element_counts[layer] + + # Calculate the range of paths in the last layer + current_layer_start = end + current_layer_end = end + self._layer_view._current_path_num * 2 # Because each point is used twice + + # This uses glDrawRangeElements internally to only draw a certain range of lines. + # All the layers but the current selected layer are rendered first + if self._old_current_path != self._layer_view._current_path_num: + self._current_shader = self._layer_shadow_shader + if not self._layer_view.isSimulationRunning() and self._old_current_layer != self._layer_view._current_layer_num: + self._current_shader = self._layer_shader + + layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) + layers_batch.addItem(node.getWorldTransformation(), layer_data) + layers_batch.render(self._scene.getActiveCamera()) + + # Current selected layer is rendered + current_layer_batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (current_layer_start, current_layer_end)) + current_layer_batch.addItem(node.getWorldTransformation(), layer_data) + current_layer_batch.render(self._scene.getActiveCamera()) + + self._old_current_layer = self._layer_view._current_layer_num + self._old_current_path = self._layer_view._current_path_num + + # Create a new batch that is not range-limited + batch = RenderBatch(self._layer_shader, type = RenderBatch.RenderType.Solid) + + if self._layer_view.getCurrentLayerMesh(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerMesh()) + + if self._layer_view.getCurrentLayerJumps(): + batch.addItem(node.getWorldTransformation(), self._layer_view.getCurrentLayerJumps()) + + if len(batch.items) > 0: + batch.render(self._scene.getActiveCamera()) + + # The nozzle is drawn once we know the correct position + if self._layer_view.getActivity() and nozzle_node is not None: + if head_position is not None: + nozzle_node.setVisible(True) + nozzle_node.setPosition(head_position) + nozzle_batch = RenderBatch(self._nozzle_shader, type = RenderBatch.RenderType.Solid) + nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) + nozzle_batch.render(self._scene.getActiveCamera()) + + # Render toolhandles on top of the layerview + if len(tool_handle_batch.items) > 0: + tool_handle_batch.render(self._scene.getActiveCamera()) + + self.release() diff --git a/plugins/SimulationView/SimulationSliderLabel.qml b/plugins/SimulationView/SimulationSliderLabel.qml new file mode 100644 index 0000000000..1c8daf867f --- /dev/null +++ b/plugins/SimulationView/SimulationSliderLabel.qml @@ -0,0 +1,104 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +UM.PointingRectangle { + id: sliderLabelRoot + + // custom properties + property real maximumValue: 100 + property real value: 0 + property var setValue // Function + property bool busy: false + property int startFrom: 1 + + target: Qt.point(parent.width, y + height / 2) + arrowSize: UM.Theme.getSize("default_arrow").width + height: parent.height + width: valueLabel.width + UM.Theme.getSize("default_margin").width + visible: false + + // make sure the text field is focussed when pressing the parent handle + // needed to connect the key bindings when switching active handle + onVisibleChanged: if (visible) valueLabel.forceActiveFocus() + + color: UM.Theme.getColor("tool_panel_background") + borderColor: UM.Theme.getColor("lining") + borderWidth: UM.Theme.getSize("default_lining").width + + Behavior on height { + NumberAnimation { + duration: 50 + } + } + + // catch all mouse events so they're not handled by underlying 3D scene + MouseArea { + anchors.fill: parent + } + + TextField { + id: valueLabel + + anchors { + left: parent.left + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + verticalCenter: parent.verticalCenter + } + + width: 40 * screenScaleFactor + text: sliderLabelRoot.value + startFrom // the current handle value, add 1 because layers is an array + horizontalAlignment: TextInput.AlignRight + + // key bindings, work when label is currenctly focused (active handle in LayerSlider) + Keys.onUpPressed: sliderLabelRoot.setValue(sliderLabelRoot.value + ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + Keys.onDownPressed: sliderLabelRoot.setValue(sliderLabelRoot.value - ((event.modifiers & Qt.ShiftModifier) ? 10 : 1)) + + style: TextFieldStyle { + textColor: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + background: Item { } + } + + onEditingFinished: { + + // Ensure that the cursor is at the first position. On some systems the text isn't fully visible + // Seems to have to do something with different dpi densities that QML doesn't quite handle. + // Another option would be to increase the size even further, but that gives pretty ugly results. + cursorPosition = 0 + + if (valueLabel.text != "") { + // -startFrom because we need to convert back to an array structure + sliderLabelRoot.setValue(parseInt(valueLabel.text) - startFrom) + } + } + + validator: IntValidator { + bottom:startFrom + top: sliderLabelRoot.maximumValue + startFrom // +startFrom because maybe we want to start in a different value rather than 0 + } + } + + BusyIndicator { + id: busyIndicator + + anchors { + left: parent.right + leftMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + verticalCenter: parent.verticalCenter + } + + width: sliderLabelRoot.height + height: width + + visible: sliderLabelRoot.busy + running: sliderLabelRoot.busy + } +} diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py new file mode 100644 index 0000000000..2751ea4f60 --- /dev/null +++ b/plugins/SimulationView/SimulationView.py @@ -0,0 +1,609 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import sys + +from PyQt5.QtCore import Qt +from PyQt5.QtWidgets import QApplication + +from UM.Application import Application +from UM.Event import Event, KeyEvent +from UM.Job import Job +from UM.Logger import Logger +from UM.Math.Color import Color +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Message import Message +from UM.PluginRegistry import PluginRegistry +from UM.Preferences import Preferences +from UM.Resources import Resources +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.Selection import Selection +from UM.Signal import Signal +from UM.View.GL.OpenGL import OpenGL +from UM.View.GL.OpenGLContext import OpenGLContext +from UM.View.View import View +from UM.i18n import i18nCatalog +from cura.ConvexHullNode import ConvexHullNode + +from .NozzleNode import NozzleNode +from .SimulationPass import SimulationPass +from .SimulationViewProxy import SimulationViewProxy + +catalog = i18nCatalog("cura") + +import numpy +import os.path + +## View used to display g-code paths. +class SimulationView(View): + # Must match SimulationView.qml + LAYER_VIEW_TYPE_MATERIAL_TYPE = 0 + LAYER_VIEW_TYPE_LINE_TYPE = 1 + LAYER_VIEW_TYPE_FEEDRATE = 2 + LAYER_VIEW_TYPE_THICKNESS = 3 + + def __init__(self): + super().__init__() + + self._max_layers = 0 + self._current_layer_num = 0 + self._minimum_layer_num = 0 + self._current_layer_mesh = None + self._current_layer_jumps = None + self._top_layers_job = None + self._activity = False + self._old_max_layers = 0 + + self._max_paths = 0 + self._current_path_num = 0 + self._minimum_path_num = 0 + self.currentLayerNumChanged.connect(self._onCurrentLayerNumChanged) + + self._busy = False + self._simulation_running = False + + self._ghost_shader = None + self._layer_pass = None + self._composite_pass = None + self._old_layer_bindings = None + self._simulationview_composite_shader = None + self._old_composite_shader = None + + self._global_container_stack = None + self._proxy = SimulationViewProxy() + self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) + + self._resetSettings() + self._legend_items = None + self._show_travel_moves = False + self._nozzle_node = None + + Preferences.getInstance().addPreference("view/top_layer_count", 5) + Preferences.getInstance().addPreference("view/only_show_top_layers", False) + Preferences.getInstance().addPreference("view/force_layer_view_compatibility_mode", False) + + Preferences.getInstance().addPreference("layerview/layer_view_type", 0) + Preferences.getInstance().addPreference("layerview/extruder_opacities", "") + + Preferences.getInstance().addPreference("layerview/show_travel_moves", False) + Preferences.getInstance().addPreference("layerview/show_helpers", True) + Preferences.getInstance().addPreference("layerview/show_skin", True) + Preferences.getInstance().addPreference("layerview/show_infill", True) + + Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) + self._updateWithPreferences() + + self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) + self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) + self._compatibility_mode = True # for safety + + self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled"), + title = catalog.i18nc("@info:title", "Simulation View")) + + def _resetSettings(self): + self._layer_view_type = 0 # 0 is material color, 1 is color by linetype, 2 is speed + self._extruder_count = 0 + self._extruder_opacity = [1.0, 1.0, 1.0, 1.0] + self._show_travel_moves = 0 + self._show_helpers = 1 + self._show_skin = 1 + self._show_infill = 1 + self.resetLayerData() + + def getActivity(self): + return self._activity + + def setActivity(self, activity): + if self._activity == activity: + return + self._activity = activity + self.activityChanged.emit() + + def getSimulationPass(self): + if not self._layer_pass: + # Currently the RenderPass constructor requires a size > 0 + # This should be fixed in RenderPass's constructor. + self._layer_pass = SimulationPass(1, 1) + self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool(Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + self._layer_pass.setSimulationView(self) + return self._layer_pass + + def getCurrentLayer(self): + return self._current_layer_num + + def getMinimumLayer(self): + return self._minimum_layer_num + + def getMaxLayers(self): + return self._max_layers + + def getCurrentPath(self): + return self._current_path_num + + def getMinimumPath(self): + return self._minimum_path_num + + def getMaxPaths(self): + return self._max_paths + + def getNozzleNode(self): + if not self._nozzle_node: + self._nozzle_node = NozzleNode() + return self._nozzle_node + + def _onSceneChanged(self, node): + self.setActivity(False) + self.calculateMaxLayers() + + def isBusy(self): + return self._busy + + def setBusy(self, busy): + if busy != self._busy: + self._busy = busy + self.busyChanged.emit() + + def isSimulationRunning(self): + return self._simulation_running + + def setSimulationRunning(self, running): + self._simulation_running = running + + def resetLayerData(self): + self._current_layer_mesh = None + self._current_layer_jumps = None + self._max_feedrate = sys.float_info.min + self._min_feedrate = sys.float_info.max + self._max_thickness = sys.float_info.min + self._min_thickness = sys.float_info.max + + def beginRendering(self): + scene = self.getController().getScene() + renderer = self.getRenderer() + + if not self._ghost_shader: + self._ghost_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._ghost_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_ghost").getRgb())) + + for node in DepthFirstIterator(scene.getRoot()): + # We do not want to render ConvexHullNode as it conflicts with the bottom layers. + # However, it is somewhat relevant when the node is selected, so do render it then. + if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()): + continue + + if not node.render(renderer): + if (node.getMeshData()) and node.isVisible(): + renderer.queueNode(node, transparent = True, shader = self._ghost_shader) + + def setLayer(self, value): + if self._current_layer_num != value: + self._current_layer_num = value + if self._current_layer_num < 0: + self._current_layer_num = 0 + if self._current_layer_num > self._max_layers: + self._current_layer_num = self._max_layers + if self._current_layer_num < self._minimum_layer_num: + self._minimum_layer_num = self._current_layer_num + + self._startUpdateTopLayers() + + self.currentLayerNumChanged.emit() + + def setMinimumLayer(self, value): + if self._minimum_layer_num != value: + self._minimum_layer_num = value + if self._minimum_layer_num < 0: + self._minimum_layer_num = 0 + if self._minimum_layer_num > self._max_layers: + self._minimum_layer_num = self._max_layers + if self._minimum_layer_num > self._current_layer_num: + self._current_layer_num = self._minimum_layer_num + + self._startUpdateTopLayers() + + self.currentLayerNumChanged.emit() + + def setPath(self, value): + if self._current_path_num != value: + self._current_path_num = value + if self._current_path_num < 0: + self._current_path_num = 0 + if self._current_path_num > self._max_paths: + self._current_path_num = self._max_paths + if self._current_path_num < self._minimum_path_num: + self._minimum_path_num = self._current_path_num + + self._startUpdateTopLayers() + + self.currentPathNumChanged.emit() + + def setMinimumPath(self, value): + if self._minimum_path_num != value: + self._minimum_path_num = value + if self._minimum_path_num < 0: + self._minimum_path_num = 0 + if self._minimum_path_num > self._max_layers: + self._minimum_path_num = self._max_layers + if self._minimum_path_num > self._current_path_num: + self._current_path_num = self._minimum_path_num + + self._startUpdateTopLayers() + + self.currentPathNumChanged.emit() + + ## Set the layer view type + # + # \param layer_view_type integer as in SimulationView.qml and this class + def setSimulationViewType(self, layer_view_type): + self._layer_view_type = layer_view_type + self.currentLayerNumChanged.emit() + + ## Return the layer view type, integer as in SimulationView.qml and this class + def getSimulationViewType(self): + return self._layer_view_type + + ## Set the extruder opacity + # + # \param extruder_nr 0..3 + # \param opacity 0.0 .. 1.0 + def setExtruderOpacity(self, extruder_nr, opacity): + if 0 <= extruder_nr <= 3: + self._extruder_opacity[extruder_nr] = opacity + self.currentLayerNumChanged.emit() + + def getExtruderOpacities(self): + return self._extruder_opacity + + def setShowTravelMoves(self, show): + self._show_travel_moves = show + self.currentLayerNumChanged.emit() + + def getShowTravelMoves(self): + return self._show_travel_moves + + def setShowHelpers(self, show): + self._show_helpers = show + self.currentLayerNumChanged.emit() + + def getShowHelpers(self): + return self._show_helpers + + def setShowSkin(self, show): + self._show_skin = show + self.currentLayerNumChanged.emit() + + def getShowSkin(self): + return self._show_skin + + def setShowInfill(self, show): + self._show_infill = show + self.currentLayerNumChanged.emit() + + def getShowInfill(self): + return self._show_infill + + def getCompatibilityMode(self): + return self._compatibility_mode + + def getExtruderCount(self): + return self._extruder_count + + def getMinFeedrate(self): + return self._min_feedrate + + def getMaxFeedrate(self): + return self._max_feedrate + + def getMinThickness(self): + return self._min_thickness + + def getMaxThickness(self): + return self._max_thickness + + def calculateMaxLayers(self): + scene = self.getController().getScene() + + self._old_max_layers = self._max_layers + ## Recalculate num max layers + new_max_layers = 0 + for node in DepthFirstIterator(scene.getRoot()): + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + self.setActivity(True) + min_layer_number = sys.maxsize + max_layer_number = -sys.maxsize + for layer_id in layer_data.getLayers(): + # Store the max and min feedrates and thicknesses for display purposes + for p in layer_data.getLayer(layer_id).polygons: + self._max_feedrate = max(float(p.lineFeedrates.max()), self._max_feedrate) + self._min_feedrate = min(float(p.lineFeedrates.min()), self._min_feedrate) + self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) + self._min_thickness = min(float(p.lineThicknesses.min()), self._min_thickness) + if max_layer_number < layer_id: + max_layer_number = layer_id + if min_layer_number > layer_id: + min_layer_number = layer_id + layer_count = max_layer_number - min_layer_number + + if new_max_layers < layer_count: + new_max_layers = layer_count + + if new_max_layers > 0 and new_max_layers != self._old_max_layers: + self._max_layers = new_max_layers + + # The qt slider has a bit of weird behavior that if the maxvalue needs to be changed first + # if it's the largest value. If we don't do this, we can have a slider block outside of the + # slider. + if new_max_layers > self._current_layer_num: + self.maxLayersChanged.emit() + self.setLayer(int(self._max_layers)) + else: + self.setLayer(int(self._max_layers)) + self.maxLayersChanged.emit() + self._startUpdateTopLayers() + + def calculateMaxPathsOnLayer(self, layer_num): + # Update the currentPath + scene = self.getController().getScene() + for node in DepthFirstIterator(scene.getRoot()): + layer_data = node.callDecoration("getLayerData") + if not layer_data: + continue + + layer = layer_data.getLayer(layer_num) + if layer is None: + return + new_max_paths = layer.lineMeshElementCount() + if new_max_paths > 0 and new_max_paths != self._max_paths: + self._max_paths = new_max_paths + self.maxPathsChanged.emit() + + self.setPath(int(new_max_paths)) + + maxLayersChanged = Signal() + maxPathsChanged = Signal() + currentLayerNumChanged = Signal() + currentPathNumChanged = Signal() + globalStackChanged = Signal() + preferencesChanged = Signal() + busyChanged = Signal() + activityChanged = Signal() + + ## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created + # as this caused some issues. + def getProxy(self, engine, script_engine): + return self._proxy + + def endRendering(self): + pass + + def event(self, event): + modifiers = QApplication.keyboardModifiers() + ctrl_is_active = modifiers & Qt.ControlModifier + shift_is_active = modifiers & Qt.ShiftModifier + if event.type == Event.KeyPressEvent and ctrl_is_active: + amount = 10 if shift_is_active else 1 + if event.key == KeyEvent.UpKey: + self.setLayer(self._current_layer_num + amount) + return True + if event.key == KeyEvent.DownKey: + self.setLayer(self._current_layer_num - amount) + return True + + if event.type == Event.ViewActivateEvent: + # Make sure the SimulationPass is created + layer_pass = self.getSimulationPass() + self.getRenderer().addRenderPass(layer_pass) + + # Make sure the NozzleNode is add to the root + nozzle = self.getNozzleNode() + nozzle.setParent(self.getController().getScene().getRoot()) + nozzle.setVisible(False) + + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() + + if not self._simulationview_composite_shader: + self._simulationview_composite_shader = OpenGL.getInstance().createShaderProgram(os.path.join(PluginRegistry.getInstance().getPluginPath("SimulationView"), "simulationview_composite.shader")) + theme = Application.getInstance().getTheme() + self._simulationview_composite_shader.setUniformValue("u_background_color", Color(*theme.getColor("viewport_background").getRgb())) + self._simulationview_composite_shader.setUniformValue("u_outline_color", Color(*theme.getColor("model_selection_outline").getRgb())) + + if not self._composite_pass: + self._composite_pass = self.getRenderer().getRenderPass("composite") + + self._old_layer_bindings = self._composite_pass.getLayerBindings()[:] # make a copy so we can restore to it later + self._composite_pass.getLayerBindings().append("simulationview") + self._old_composite_shader = self._composite_pass.getCompositeShader() + self._composite_pass.setCompositeShader(self._simulationview_composite_shader) + + elif event.type == Event.ViewDeactivateEvent: + self._wireprint_warning_message.hide() + Application.getInstance().globalContainerStackChanged.disconnect(self._onGlobalStackChanged) + if self._global_container_stack: + self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) + + self._nozzle_node.setParent(None) + self.getRenderer().removeRenderPass(self._layer_pass) + self._composite_pass.setLayerBindings(self._old_layer_bindings) + self._composite_pass.setCompositeShader(self._old_composite_shader) + + def getCurrentLayerMesh(self): + return self._current_layer_mesh + + def getCurrentLayerJumps(self): + return self._current_layer_jumps + + def _onGlobalStackChanged(self): + if self._global_container_stack: + self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) + self._global_container_stack = Application.getInstance().getGlobalContainerStack() + if self._global_container_stack: + self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) + self._extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") + self._onPropertyChanged("wireframe_enabled", "value") + self.globalStackChanged.emit() + else: + self._wireprint_warning_message.hide() + + def _onPropertyChanged(self, key, property_name): + if key == "wireframe_enabled" and property_name == "value": + if self._global_container_stack.getProperty("wireframe_enabled", "value"): + self._wireprint_warning_message.show() + else: + self._wireprint_warning_message.hide() + + def _onCurrentLayerNumChanged(self): + self.calculateMaxPathsOnLayer(self._current_layer_num) + + def _startUpdateTopLayers(self): + if not self._compatibility_mode: + return + + if self._top_layers_job: + self._top_layers_job.finished.disconnect(self._updateCurrentLayerMesh) + self._top_layers_job.cancel() + + self.setBusy(True) + + self._top_layers_job = _CreateTopLayersJob(self._controller.getScene(), self._current_layer_num, self._solid_layers) + self._top_layers_job.finished.connect(self._updateCurrentLayerMesh) + self._top_layers_job.start() + + def _updateCurrentLayerMesh(self, job): + self.setBusy(False) + + if not job.getResult(): + return + self.resetLayerData() # Reset the layer data only when job is done. Doing it now prevents "blinking" data. + self._current_layer_mesh = job.getResult().get("layers") + if self._show_travel_moves: + self._current_layer_jumps = job.getResult().get("jumps") + self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot()) + + self._top_layers_job = None + + def _updateWithPreferences(self): + self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) + self._only_show_top_layers = bool(Preferences.getInstance().getValue("view/only_show_top_layers")) + self._compatibility_mode = OpenGLContext.isLegacyOpenGL() or bool( + Preferences.getInstance().getValue("view/force_layer_view_compatibility_mode")) + + self.setSimulationViewType(int(float(Preferences.getInstance().getValue("layerview/layer_view_type")))); + + for extruder_nr, extruder_opacity in enumerate(Preferences.getInstance().getValue("layerview/extruder_opacities").split("|")): + try: + opacity = float(extruder_opacity) + except ValueError: + opacity = 1.0 + self.setExtruderOpacity(extruder_nr, opacity) + + self.setShowTravelMoves(bool(Preferences.getInstance().getValue("layerview/show_travel_moves"))) + self.setShowHelpers(bool(Preferences.getInstance().getValue("layerview/show_helpers"))) + self.setShowSkin(bool(Preferences.getInstance().getValue("layerview/show_skin"))) + self.setShowInfill(bool(Preferences.getInstance().getValue("layerview/show_infill"))) + + self._startUpdateTopLayers() + self.preferencesChanged.emit() + + def _onPreferencesChanged(self, preference): + if preference not in { + "view/top_layer_count", + "view/only_show_top_layers", + "view/force_layer_view_compatibility_mode", + "layerview/layer_view_type", + "layerview/extruder_opacities", + "layerview/show_travel_moves", + "layerview/show_helpers", + "layerview/show_skin", + "layerview/show_infill", + }: + return + + self._updateWithPreferences() + + +class _CreateTopLayersJob(Job): + def __init__(self, scene, layer_number, solid_layers): + super().__init__() + + self._scene = scene + self._layer_number = layer_number + self._solid_layers = solid_layers + self._cancel = False + + def run(self): + layer_data = None + for node in DepthFirstIterator(self._scene.getRoot()): + layer_data = node.callDecoration("getLayerData") + if layer_data: + break + + if self._cancel or not layer_data: + return + + layer_mesh = MeshBuilder() + for i in range(self._solid_layers): + layer_number = self._layer_number - i + if layer_number < 0: + continue + + try: + layer = layer_data.getLayer(layer_number).createMesh() + except Exception: + Logger.logException("w", "An exception occurred while creating layer mesh.") + return + + if not layer or layer.getVertices() is None: + continue + + layer_mesh.addIndices(layer_mesh.getVertexCount() + layer.getIndices()) + layer_mesh.addVertices(layer.getVertices()) + + # Scale layer color by a brightness factor based on the current layer number + # This will result in a range of 0.5 - 1.0 to multiply colors by. + brightness = numpy.ones((1, 4), dtype=numpy.float32) * (2.0 - (i / self._solid_layers)) / 2.0 + brightness[0, 3] = 1.0 + layer_mesh.addColors(layer.getColors() * brightness) + + if self._cancel: + return + + Job.yieldThread() + + if self._cancel: + return + + Job.yieldThread() + jump_mesh = layer_data.getLayer(self._layer_number).createJumps() + if not jump_mesh or jump_mesh.getVertices() is None: + jump_mesh = None + + self.setResult({"layers": layer_mesh.build(), "jumps": jump_mesh}) + + def cancel(self): + self._cancel = True + super().cancel() + diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml new file mode 100644 index 0000000000..4c7d99deec --- /dev/null +++ b/plugins/SimulationView/SimulationView.qml @@ -0,0 +1,645 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.4 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.0 as UM +import Cura 1.0 as Cura + +Item +{ + id: base + width: { + if (UM.SimulationView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility").width; + } else { + return UM.Theme.getSize("layerview_menu_size").width; + } + } + height: { + if (UM.SimulationView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility").height; + } else if (UM.Preferences.getValue("layerview/layer_view_type") == 0) { + return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) + } else { + return UM.Theme.getSize("layerview_menu_size").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) + } + } + + property var buttonTarget: { + if(parent != null) + { + var force_binding = parent.y; // ensure this gets reevaluated when the panel moves + return base.mapFromItem(parent.parent, parent.buttonTarget.x, parent.buttonTarget.y) + } + return Qt.point(0,0) + } + + visible: parent != null ? !parent.parent.monitoringPrint: true + + UM.PointingRectangle { + id: layerViewMenu + anchors.right: parent.right + anchors.top: parent.top + width: parent.width + height: parent.height + z: layerSlider.z - 1 + color: UM.Theme.getColor("tool_panel_background") + borderWidth: UM.Theme.getSize("default_lining").width + borderColor: UM.Theme.getColor("lining") + arrowSize: 0 // hide arrow until weird issue with first time rendering is fixed + + ColumnLayout { + id: view_settings + + property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") + property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") + property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") + property bool show_skin: UM.Preferences.getValue("layerview/show_skin") + property bool show_infill: UM.Preferences.getValue("layerview/show_infill") + // if we are in compatibility mode, we only show the "line type" + property bool show_legend: UM.SimulationView.compatibilityMode ? true : UM.Preferences.getValue("layerview/layer_view_type") == 1 + property bool show_gradient: UM.SimulationView.compatibilityMode ? false : UM.Preferences.getValue("layerview/layer_view_type") == 2 || UM.Preferences.getValue("layerview/layer_view_type") == 3 + property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") + property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") + + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("layerview_row_spacing").height + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + + Label + { + id: layerViewTypesLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Color scheme") + font: UM.Theme.getFont("default"); + visible: !UM.SimulationView.compatibilityMode + Layout.fillWidth: true + color: UM.Theme.getColor("setting_control_text") + } + + ListModel // matches SimulationView.py + { + id: layerViewTypes + } + + Component.onCompleted: + { + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Material Color"), + type_id: 0 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Line Type"), + type_id: 1 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Feedrate"), + type_id: 2 + }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Layer thickness"), + type_id: 3 // these ids match the switching in the shader + }) + } + + ComboBox + { + id: layerTypeCombobox + anchors.left: parent.left + Layout.fillWidth: true + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + model: layerViewTypes + visible: !UM.SimulationView.compatibilityMode + style: UM.Theme.styles.combobox + anchors.right: parent.right + anchors.rightMargin: 10 * screenScaleFactor + + onActivated: + { + UM.Preferences.setValue("layerview/layer_view_type", index); + } + + Component.onCompleted: + { + currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); + updateLegends(currentIndex); + } + + function updateLegends(type_id) + { + // update visibility of legends + view_settings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); + } + + } + + Label + { + id: compatibilityModeLabel + anchors.left: parent.left + text: catalog.i18nc("@label","Compatibility Mode") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + visible: UM.SimulationView.compatibilityMode + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + } + + Label + { + id: space2Label + anchors.left: parent.left + text: " " + font.pointSize: 0.5 + } + + Connections { + target: UM.Preferences + onPreferenceChanged: + { + layerTypeCombobox.currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); + layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); + view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); + view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); + view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); + view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); + view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); + view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); + } + } + + Repeater { + model: Cura.ExtrudersModel{} + CheckBox { + id: extrudersModelCheckBox + checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" + onClicked: { + view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 + UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); + } + visible: !UM.SimulationView.compatibilityMode + enabled: index + 1 <= 4 + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: extrudersModelCheckBox.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: model.color + radius: width / 2 + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: !view_settings.show_legend & !view_settings.show_gradient + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox + Label + { + text: model.name + elide: Text.ElideRight + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + anchors.verticalCenter: parent.verticalCenter + anchors.left: extrudersModelCheckBox.left; + anchors.right: extrudersModelCheckBox.right; + anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2 + anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2 + } + } + } + + Repeater { + model: ListModel { + id: typesLegendModel + Component.onCompleted: + { + typesLegendModel.append({ + label: catalog.i18nc("@label", "Show Travels"), + initialValue: view_settings.show_travel_moves, + preference: "layerview/show_travel_moves", + colorId: "layerview_move_combing" + }); + typesLegendModel.append({ + label: catalog.i18nc("@label", "Show Helpers"), + initialValue: view_settings.show_helpers, + preference: "layerview/show_helpers", + colorId: "layerview_support" + }); + typesLegendModel.append({ + label: catalog.i18nc("@label", "Show Shell"), + initialValue: view_settings.show_skin, + preference: "layerview/show_skin", + colorId: "layerview_inset_0" + }); + typesLegendModel.append({ + label: catalog.i18nc("@label", "Show Infill"), + initialValue: view_settings.show_infill, + preference: "layerview/show_infill", + colorId: "layerview_infill" + }); + } + } + + CheckBox { + id: legendModelCheckBox + checked: model.initialValue + onClicked: { + UM.Preferences.setValue(model.preference, checked); + } + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: legendModelCheckBox.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor(model.colorId) + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox + Label + { + text: label + font: UM.Theme.getFont("default") + elide: Text.ElideRight + color: UM.Theme.getColor("setting_control_text") + anchors.verticalCenter: parent.verticalCenter + anchors.left: legendModelCheckBox.left; + anchors.right: legendModelCheckBox.right; + anchors.leftMargin: UM.Theme.getSize("checkbox").width + UM.Theme.getSize("default_margin").width /2 + anchors.rightMargin: UM.Theme.getSize("default_margin").width * 2 + } + } + } + + CheckBox { + checked: view_settings.only_show_top_layers + onClicked: { + UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); + } + text: catalog.i18nc("@label", "Only Show Top Layers") + visible: UM.SimulationView.compatibilityMode + style: UM.Theme.styles.checkbox + } + CheckBox { + checked: view_settings.top_layer_count == 5 + onClicked: { + UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); + } + text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") + visible: UM.SimulationView.compatibilityMode + style: UM.Theme.styles.checkbox + } + + Repeater { + model: ListModel { + id: typesLegendModelNoCheck + Component.onCompleted: + { + typesLegendModelNoCheck.append({ + label: catalog.i18nc("@label", "Top / Bottom"), + colorId: "layerview_skin", + }); + typesLegendModelNoCheck.append({ + label: catalog.i18nc("@label", "Inner Wall"), + colorId: "layerview_inset_x", + }); + } + } + + Label { + text: label + visible: view_settings.show_legend + id: typesLegendModelLabel + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: typesLegendModelLabel.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor(model.colorId) + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + } + } + + // Text for the minimum, maximum and units for the feedrates and layer thickness + Rectangle { + id: gradientLegend + visible: view_settings.show_gradient + width: parent.width + height: UM.Theme.getSize("layerview_row").height + anchors { + topMargin: UM.Theme.getSize("slider_layerview_margin").height + horizontalCenter: parent.horizontalCenter + } + + Label { + text: minText() + anchors.left: parent.left + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function minText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return parseFloat(UM.SimulationView.getMinFeedrate()).toFixed(2) + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return parseFloat(UM.SimulationView.getMinThickness()).toFixed(2) + } + } + return catalog.i18nc("@label","min") + } + } + + Label { + text: unitsText() + anchors.horizontalCenter: parent.horizontalCenter + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function unitsText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return "mm/s" + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return "mm" + } + } + return "" + } + } + + Label { + text: maxText() + anchors.right: parent.right + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + function maxText() { + if (UM.SimulationView.layerActivity && CuraApplication.platformActivity) { + // Feedrate selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 2) { + return parseFloat(UM.SimulationView.getMaxFeedrate()).toFixed(2) + } + // Layer thickness selected + if (UM.Preferences.getValue("layerview/layer_view_type") == 3) { + return parseFloat(UM.SimulationView.getMaxThickness()).toFixed(2) + } + } + return catalog.i18nc("@label","max") + } + } + } + + // Gradient colors for feedrate and thickness + Rectangle { // In QML 5.9 can be changed by LinearGradient + // Invert values because then the bar is rotated 90 degrees + id: gradient + visible: view_settings.show_gradient + anchors.left: parent.right + height: parent.width + width: UM.Theme.getSize("layerview_row").height * 1.5 + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + transform: Rotation {origin.x: 0; origin.y: 0; angle: 90} + gradient: Gradient { + GradientStop { + position: 0.000 + color: Qt.rgba(1, 0, 0, 1) + } + GradientStop { + position: 0.25 + color: Qt.rgba(0.75, 0.5, 0.25, 1) + } + GradientStop { + position: 0.5 + color: Qt.rgba(0.5, 1, 0.5, 1) + } + GradientStop { + position: 0.75 + color: Qt.rgba(0.25, 0.5, 0.75, 1) + } + GradientStop { + position: 1.0 + color: Qt.rgba(0, 0, 1, 1) + } + } + } + } + + Item { + id: slidersBox + + width: parent.width + visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity + + anchors { + top: parent.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").height + left: parent.left + } + + PathSlider { + id: pathSlider + + width: parent.width + height: UM.Theme.getSize("slider_handle").width + anchors.left: parent.left + visible: !UM.SimulationView.compatibilityMode + + // custom properties + handleValue: UM.SimulationView.currentPath + maximumValue: UM.SimulationView.numPaths + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + handleColor: UM.Theme.getColor("slider_handle") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + rangeColor: UM.Theme.getColor("slider_groove_fill") + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + } + + LayerSlider { + id: layerSlider + + width: UM.Theme.getSize("slider_handle").width + height: UM.Theme.getSize("layerview_menu_size").height + + anchors { + top: pathSlider.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").height + right: parent.right + rightMargin: UM.Theme.getSize("slider_layerview_margin").width + } + + // custom properties + upperValue: UM.SimulationView.currentLayer + lowerValue: UM.SimulationView.minimumLayer + maximumValue: UM.SimulationView.numLayers + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + upperHandleColor: UM.Theme.getColor("slider_handle") + lowerHandleColor: UM.Theme.getColor("slider_handle") + rangeHandleColor: UM.Theme.getColor("slider_groove_fill") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + } + + // Play simulation button + Button { + id: playButton + implicitWidth: UM.Theme.getSize("button").width * 0.75; + implicitHeight: UM.Theme.getSize("button").height * 0.75; + iconSource: "./resources/simulation_resume.svg" + style: UM.Theme.styles.tool_button + visible: !UM.SimulationView.compatibilityMode + anchors { + horizontalCenter: layerSlider.horizontalCenter + top: layerSlider.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").width + } + + property var status: 0 // indicates if it's stopped (0) or playing (1) + + onClicked: { + switch(status) { + case 0: { + resumeSimulation() + break + } + case 1: { + pauseSimulation() + break + } + } + } + + function pauseSimulation() { + UM.SimulationView.setSimulationRunning(false) + iconSource = "./resources/simulation_resume.svg" + simulationTimer.stop() + status = 0 + } + + function resumeSimulation() { + UM.SimulationView.setSimulationRunning(true) + iconSource = "./resources/simulation_pause.svg" + simulationTimer.start() + } + } + } + + Timer + { + id: simulationTimer + interval: 250 + running: false + repeat: true + onTriggered: { + var currentPath = UM.SimulationView.currentPath + var numPaths = UM.SimulationView.numPaths + var currentLayer = UM.SimulationView.currentLayer + var numLayers = UM.SimulationView.numLayers + // When the user plays the simulation, if the path slider is at the end of this layer, we start + // the simulation at the beginning of the current layer. + if (playButton.status == 0) + { + if (currentPath >= numPaths) + { + UM.SimulationView.setCurrentPath(0) + } + else + { + UM.SimulationView.setCurrentPath(currentPath+1) + } + } + // If the simulation is already playing and we reach the end of a layer, then it automatically + // starts at the beginning of the next layer. + else + { + if (currentPath >= numPaths) + { + // At the end of the model, the simulation stops + if (currentLayer >= numLayers) + { + playButton.pauseSimulation() + } + else + { + UM.SimulationView.setCurrentLayer(currentLayer+1) + UM.SimulationView.setCurrentPath(0) + } + } + else + { + UM.SimulationView.setCurrentPath(currentPath+1) + } + } + playButton.status = 1 + } + } + } + + FontMetrics { + id: fontMetrics + font: UM.Theme.getFont("default") + } +} diff --git a/plugins/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py new file mode 100644 index 0000000000..e144b841e6 --- /dev/null +++ b/plugins/SimulationView/SimulationViewProxy.py @@ -0,0 +1,259 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty +from UM.FlameProfiler import pyqtSlot +from UM.Application import Application + +import SimulationView + + +class SimulationViewProxy(QObject): + def __init__(self, parent=None): + super().__init__(parent) + self._current_layer = 0 + self._controller = Application.getInstance().getController() + self._controller.activeViewChanged.connect(self._onActiveViewChanged) + self._onActiveViewChanged() + self.is_simulationView_selected = False + + currentLayerChanged = pyqtSignal() + currentPathChanged = pyqtSignal() + maxLayersChanged = pyqtSignal() + maxPathsChanged = pyqtSignal() + activityChanged = pyqtSignal() + globalStackChanged = pyqtSignal() + preferencesChanged = pyqtSignal() + busyChanged = pyqtSignal() + + @pyqtProperty(bool, notify=activityChanged) + def layerActivity(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getActivity() + return False + + @pyqtProperty(int, notify=maxLayersChanged) + def numLayers(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxLayers() + return 0 + + @pyqtProperty(int, notify=currentLayerChanged) + def currentLayer(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCurrentLayer() + return 0 + + @pyqtProperty(int, notify=currentLayerChanged) + def minimumLayer(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinimumLayer() + return 0 + + @pyqtProperty(int, notify=maxPathsChanged) + def numPaths(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxPaths() + return 0 + + @pyqtProperty(int, notify=currentPathChanged) + def currentPath(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCurrentPath() + return 0 + + @pyqtProperty(int, notify=currentPathChanged) + def minimumPath(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinimumPath() + return 0 + + @pyqtProperty(bool, notify=busyChanged) + def busy(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.isBusy() + return False + + @pyqtProperty(bool, notify=preferencesChanged) + def compatibilityMode(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getCompatibilityMode() + return False + + @pyqtSlot(int) + def setCurrentLayer(self, layer_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setLayer(layer_num) + + @pyqtSlot(int) + def setMinimumLayer(self, layer_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setMinimumLayer(layer_num) + + @pyqtSlot(int) + def setCurrentPath(self, path_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setPath(path_num) + + @pyqtSlot(int) + def setMinimumPath(self, path_num): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setMinimumPath(path_num) + + @pyqtSlot(int) + def setSimulationViewType(self, layer_view_type): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setSimulationViewisinstance(layer_view_type) + + @pyqtSlot(result=int) + def getSimulationViewType(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getSimulationViewType() + return 0 + + @pyqtSlot(bool) + def setSimulationRunning(self, running): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setSimulationRunning(running) + + @pyqtSlot(result=bool) + def getSimulationRunning(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.isSimulationRunning() + return False + + @pyqtSlot(result=float) + def getMinFeedrate(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinFeedrate() + return 0 + + @pyqtSlot(result=float) + def getMaxFeedrate(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxFeedrate() + return 0 + + @pyqtSlot(result=float) + def getMinThickness(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMinThickness() + return 0 + + @pyqtSlot(result=float) + def getMaxThickness(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getMaxThickness() + return 0 + + # Opacity 0..1 + @pyqtSlot(int, float) + def setExtruderOpacity(self, extruder_nr, opacity): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setExtruderOpacity(extruder_nr, opacity) + + @pyqtSlot(int) + def setShowTravelMoves(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowTravelMoves(show) + + @pyqtSlot(int) + def setShowHelpers(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowHelpers(show) + + @pyqtSlot(int) + def setShowSkin(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowSkin(show) + + @pyqtSlot(int) + def setShowInfill(self, show): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + active_view.setShowInfill(show) + + @pyqtProperty(int, notify=globalStackChanged) + def extruderCount(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + return active_view.getExtruderCount() + return 0 + + def _layerActivityChanged(self): + self.activityChanged.emit() + + def _onLayerChanged(self): + self.currentLayerChanged.emit() + self._layerActivityChanged() + + def _onPathChanged(self): + self.currentPathChanged.emit() + self._layerActivityChanged() + + def _onMaxLayersChanged(self): + self.maxLayersChanged.emit() + + def _onMaxPathsChanged(self): + self.maxPathsChanged.emit() + + def _onBusyChanged(self): + self.busyChanged.emit() + + def _onActivityChanged(self): + self.activityChanged.emit() + + def _onGlobalStackChanged(self): + self.globalStackChanged.emit() + + def _onPreferencesChanged(self): + self.preferencesChanged.emit() + + def _onActiveViewChanged(self): + active_view = self._controller.getActiveView() + if isinstance(active_view, SimulationView.SimulationView.SimulationView): + # remove other connection if once the SimulationView was created. + if self.is_simulationView_selected: + active_view.currentLayerNumChanged.disconnect(self._onLayerChanged) + active_view.currentPathNumChanged.disconnect(self._onPathChanged) + active_view.maxLayersChanged.disconnect(self._onMaxLayersChanged) + active_view.maxPathsChanged.disconnect(self._onMaxPathsChanged) + active_view.busyChanged.disconnect(self._onBusyChanged) + active_view.activityChanged.disconnect(self._onActivityChanged) + active_view.globalStackChanged.disconnect(self._onGlobalStackChanged) + active_view.preferencesChanged.disconnect(self._onPreferencesChanged) + + self.is_simulationView_selected = True + active_view.currentLayerNumChanged.connect(self._onLayerChanged) + active_view.currentPathNumChanged.connect(self._onPathChanged) + active_view.maxLayersChanged.connect(self._onMaxLayersChanged) + active_view.maxPathsChanged.connect(self._onMaxPathsChanged) + active_view.busyChanged.connect(self._onBusyChanged) + active_view.activityChanged.connect(self._onActivityChanged) + active_view.globalStackChanged.connect(self._onGlobalStackChanged) + active_view.preferencesChanged.connect(self._onPreferencesChanged) diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py new file mode 100644 index 0000000000..f7ccf41acc --- /dev/null +++ b/plugins/SimulationView/__init__.py @@ -0,0 +1,26 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtQml import qmlRegisterSingletonType + +from UM.i18n import i18nCatalog +from . import SimulationViewProxy, SimulationView + +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "view": { + "name": catalog.i18nc("@item:inlistbox", "Simulation view"), + "view_panel": "SimulationView.qml", + "weight": 2 + } + } + +def createSimulationViewProxy(engine, script_engine): + return SimulationViewProxy.SimulatorViewProxy() + +def register(app): + simulation_view = SimulationView.SimulationView() + qmlRegisterSingletonType(SimulationViewProxy.SimulationViewProxy, "UM", 1, 0, "SimulationView", simulation_view.getProxy) + return { "view": SimulationView.SimulationView()} diff --git a/plugins/SimulationView/layers.shader b/plugins/SimulationView/layers.shader new file mode 100644 index 0000000000..d340773403 --- /dev/null +++ b/plugins/SimulationView/layers.shader @@ -0,0 +1,156 @@ +[shaders] +vertex = + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + attribute highp float a_extruder; + attribute highp float a_line_type; + attribute highp vec4 a_vertex; + attribute lowp vec4 a_color; + attribute lowp vec4 a_material_color; + + varying lowp vec4 v_color; + varying float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + // shade the color depending on the extruder index + v_color = a_color; + // 8 and 9 are travel moves + if ((a_line_type != 8.0) && (a_line_type != 9.0)) { + v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + } + + v_line_type = a_line_type; + } + +fragment = + varying lowp vec4 v_color; + varying float v_line_type; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // support: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + gl_FragColor = v_color; + } + +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + in highp float a_extruder; + in highp float a_line_type; + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_material_color; + + out lowp vec4 v_color; + out float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + v_color = a_color; + if ((a_line_type != 8) && (a_line_type != 9)) { + v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + } + + v_line_type = a_line_type; + } + +fragment41core = + #version 410 + in lowp vec4 v_color; + in float v_line_type; + out vec4 frag_color; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // helpers: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + frag_color = v_color; + } + +[defaults] +u_active_extruder = 0.0 +u_shade_factor = 0.60 +u_layer_view_type = 0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix + +[attributes] +a_vertex = vertex +a_color = color +a_extruder = extruder +a_line_type = line_type +a_material_color = material_color diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader new file mode 100644 index 0000000000..f377fca055 --- /dev/null +++ b/plugins/SimulationView/layers3d.shader @@ -0,0 +1,293 @@ +[shaders] +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + + uniform highp mat4 u_modelMatrix; + uniform highp mat4 u_viewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_max_feedrate; + uniform lowp float u_min_feedrate; + uniform lowp float u_max_thickness; + uniform lowp float u_min_thickness; + uniform lowp int u_layer_view_type; + uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible + + uniform highp mat4 u_normalMatrix; + + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_material_color; + in highp vec4 a_normal; + in highp vec2 a_line_dim; // line width and thickness + in highp float a_extruder; + in highp float a_line_type; + in highp float a_feedrate; + in highp float a_thickness; + + out lowp vec4 v_color; + + out highp vec3 v_vertex; + out highp vec3 v_normal; + out lowp vec2 v_line_dim; + out highp int v_extruder; + out highp vec4 v_extruder_opacity; + out float v_line_type; + + out lowp vec4 f_color; + out highp vec3 f_vertex; + out highp vec3 f_normal; + + vec4 gradientColor(float abs_value, float min_value, float max_value) + { + float value = (abs_value - min_value)/(max_value - min_value); + float red = value; + float green = 1-abs(1-2*value); + float blue = 1-value; + return vec4(red, green, blue, 1.0); + } + + void main() + { + vec4 v1_vertex = a_vertex; + v1_vertex.y -= a_line_dim.y / 2; // half layer down + + vec4 world_space_vert = u_modelMatrix * v1_vertex; + gl_Position = world_space_vert; + // shade the color depending on the extruder index stored in the alpha component of the color + + switch (u_layer_view_type) { + case 0: // "Material color" + v_color = a_material_color; + break; + case 1: // "Line type" + v_color = a_color; + break; + case 2: // "Feedrate" + v_color = gradientColor(a_feedrate, u_min_feedrate, u_max_feedrate); + break; + case 3: // "Layer thickness" + v_color = gradientColor(a_line_dim.y, u_min_thickness, u_max_thickness); + break; + } + + v_vertex = world_space_vert.xyz; + v_normal = (u_normalMatrix * normalize(a_normal)).xyz; + v_line_dim = a_line_dim; + v_extruder = int(a_extruder); + v_line_type = a_line_type; + v_extruder_opacity = u_extruder_opacity; + + // for testing without geometry shader + f_color = v_color; + f_vertex = v_vertex; + f_normal = v_normal; + } + +geometry41core = + #version 410 + + uniform highp mat4 u_viewProjectionMatrix; + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + layout(lines) in; + layout(triangle_strip, max_vertices = 26) out; + + in vec4 v_color[]; + in vec3 v_vertex[]; + in vec3 v_normal[]; + in vec2 v_line_dim[]; + in int v_extruder[]; + in vec4 v_extruder_opacity[]; + in float v_line_type[]; + + out vec4 f_color; + out vec3 f_normal; + out vec3 f_vertex; + + // Set the set of variables and EmitVertex + void myEmitVertex(vec3 vertex, vec4 color, vec3 normal, vec4 pos) { + f_vertex = vertex; + f_color = color; + f_normal = normal; + gl_Position = pos; + EmitVertex(); + } + + void main() + { + vec4 g_vertex_delta; + vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers + vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position + vec3 g_vertex_normal_vert; + vec4 g_vertex_offset_vert; + vec3 g_vertex_normal_horz_head; + vec4 g_vertex_offset_horz_head; + + float size_x; + float size_y; + + if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { + return; + } + // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType + if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { + return; + } + if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10))) { + return; + } + if ((u_show_skin == 0) && ((v_line_type[0] == 1) || (v_line_type[0] == 2) || (v_line_type[0] == 3))) { + return; + } + if ((u_show_infill == 0) && (v_line_type[0] == 6)) { + return; + } + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // fixed size for movements + size_x = 0.05; + } else { + size_x = v_line_dim[1].x / 2 + 0.01; // radius, and make it nicely overlapping + } + size_y = v_line_dim[1].y / 2 + 0.01; + + g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; + g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); + g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); + + g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); + + g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //size * g_vertex_normal_horz; + g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); + g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // Travels: flat plane with pointy ends + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); + + EndPrimitive(); + } else { + // All normal lines are rendered as 3d tubes. + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // left side + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // right side + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + } + } + +fragment41core = + #version 410 + in lowp vec4 f_color; + in lowp vec3 f_normal; + in lowp vec3 f_vertex; + + out vec4 frag_color; + + uniform mediump vec4 u_ambientColor; + uniform highp vec3 u_lightPosition; + + void main() + { + mediump vec4 finalColor = vec4(0.0); + float alpha = f_color.a; + + finalColor.rgb += f_color.rgb * 0.3; + + highp vec3 normal = normalize(f_normal); + highp vec3 light_dir = normalize(u_lightPosition - f_vertex); + + // Diffuse Component + highp float NdotL = clamp(dot(normal, light_dir), 0.0, 1.0); + finalColor += (NdotL * f_color); + finalColor.a = alpha; // Do not change alpha in any way + + frag_color = finalColor; + } + + +[defaults] +u_active_extruder = 0.0 +u_layer_view_type = 0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_ambientColor = [0.3, 0.3, 0.3, 0.0] +u_diffuseColor = [1.0, 0.79, 0.14, 1.0] +u_shininess = 20.0 + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +u_min_feedrate = 0 +u_max_feedrate = 1 + +u_min_thickness = 0 +u_max_thickness = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix +u_modelMatrix = model_matrix +u_viewProjectionMatrix = view_projection_matrix +u_normalMatrix = normal_matrix +u_lightPosition = light_0_position + +[attributes] +a_vertex = vertex +a_color = color +a_normal = normal +a_line_dim = line_dim +a_extruder = extruder +a_material_color = material_color +a_line_type = line_type +a_feedrate = feedrate +a_thickness = thickness diff --git a/plugins/SimulationView/layers3d_shadow.shader b/plugins/SimulationView/layers3d_shadow.shader new file mode 100644 index 0000000000..ad75fcf9d0 --- /dev/null +++ b/plugins/SimulationView/layers3d_shadow.shader @@ -0,0 +1,256 @@ +[shaders] +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + + uniform highp mat4 u_modelMatrix; + uniform highp mat4 u_viewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible + + uniform highp mat4 u_normalMatrix; + + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_grayColor; + in lowp vec4 a_material_color; + in highp vec4 a_normal; + in highp vec2 a_line_dim; // line width and thickness + in highp float a_extruder; + in highp float a_line_type; + + out lowp vec4 v_color; + + out highp vec3 v_vertex; + out highp vec3 v_normal; + out lowp vec2 v_line_dim; + out highp int v_extruder; + out highp vec4 v_extruder_opacity; + out float v_line_type; + + out lowp vec4 f_color; + out highp vec3 f_vertex; + out highp vec3 f_normal; + + void main() + { + vec4 v1_vertex = a_vertex; + v1_vertex.y -= a_line_dim.y / 2; // half layer down + + vec4 world_space_vert = u_modelMatrix * v1_vertex; + gl_Position = world_space_vert; + // shade the color depending on the extruder index stored in the alpha component of the color + + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer + v_vertex = world_space_vert.xyz; + v_normal = (u_normalMatrix * normalize(a_normal)).xyz; + v_line_dim = a_line_dim; + v_extruder = int(a_extruder); + v_line_type = a_line_type; + v_extruder_opacity = u_extruder_opacity; + + // for testing without geometry shader + f_color = v_color; + f_vertex = v_vertex; + f_normal = v_normal; + } + +geometry41core = + #version 410 + + uniform highp mat4 u_viewProjectionMatrix; + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + layout(lines) in; + layout(triangle_strip, max_vertices = 26) out; + + in vec4 v_color[]; + in vec3 v_vertex[]; + in vec3 v_normal[]; + in vec2 v_line_dim[]; + in int v_extruder[]; + in vec4 v_extruder_opacity[]; + in float v_line_type[]; + + out vec4 f_color; + out vec3 f_normal; + out vec3 f_vertex; + + // Set the set of variables and EmitVertex + void myEmitVertex(vec3 vertex, vec4 color, vec3 normal, vec4 pos) { + f_vertex = vertex; + f_color = color; + f_normal = normal; + gl_Position = pos; + EmitVertex(); + } + + void main() + { + vec4 g_vertex_delta; + vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers + vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position + vec3 g_vertex_normal_vert; + vec4 g_vertex_offset_vert; + vec3 g_vertex_normal_horz_head; + vec4 g_vertex_offset_horz_head; + + float size_x; + float size_y; + + if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) { + return; + } + // See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType + if ((u_show_travel_moves == 0) && ((v_line_type[0] == 8) || (v_line_type[0] == 9))) { + return; + } + if ((u_show_helpers == 0) && ((v_line_type[0] == 4) || (v_line_type[0] == 5) || (v_line_type[0] == 7) || (v_line_type[0] == 10))) { + return; + } + if ((u_show_skin == 0) && ((v_line_type[0] == 1) || (v_line_type[0] == 2) || (v_line_type[0] == 3))) { + return; + } + if ((u_show_infill == 0) && (v_line_type[0] == 6)) { + return; + } + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // fixed size for movements + size_x = 0.05; + } else { + size_x = v_line_dim[1].x / 2 + 0.01; // radius, and make it nicely overlapping + } + size_y = v_line_dim[1].y / 2 + 0.01; + + g_vertex_delta = gl_in[1].gl_Position - gl_in[0].gl_Position; + g_vertex_normal_horz_head = normalize(vec3(-g_vertex_delta.x, -g_vertex_delta.y, -g_vertex_delta.z)); + g_vertex_offset_horz_head = vec4(g_vertex_normal_horz_head * size_x, 0.0); + + g_vertex_normal_horz = normalize(vec3(g_vertex_delta.z, g_vertex_delta.y, -g_vertex_delta.x)); + + g_vertex_offset_horz = vec4(g_vertex_normal_horz * size_x, 0.0); //size * g_vertex_normal_horz; + g_vertex_normal_vert = vec3(0.0, 1.0, 0.0); + g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0); + + if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) { + // Travels: flat plane with pointy ends + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); + + EndPrimitive(); + } else { + // All normal lines are rendered as 3d tubes. + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // left side + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + + // right side + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + + EndPrimitive(); + + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + + EndPrimitive(); + } + } + +fragment41core = + #version 410 + in lowp vec4 f_color; + in lowp vec3 f_normal; + in lowp vec3 f_vertex; + + out vec4 frag_color; + + uniform mediump vec4 u_ambientColor; + uniform highp vec3 u_lightPosition; + + void main() + { + mediump vec4 finalColor = vec4(0.0); + float alpha = f_color.a; + + finalColor.rgb += f_color.rgb * 0.3; + + highp vec3 normal = normalize(f_normal); + highp vec3 light_dir = normalize(u_lightPosition - f_vertex); + + // Diffuse Component + highp float NdotL = clamp(dot(normal, light_dir), 0.0, 1.0); + finalColor += (NdotL * f_color); + finalColor.a = alpha; // Do not change alpha in any way + + frag_color = finalColor; + } + + +[defaults] +u_active_extruder = 0.0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_ambientColor = [0.3, 0.3, 0.3, 0.0] +u_diffuseColor = [1.0, 0.79, 0.14, 1.0] +u_shininess = 20.0 + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix +u_modelMatrix = model_matrix +u_viewProjectionMatrix = view_projection_matrix +u_normalMatrix = normal_matrix +u_lightPosition = light_0_position + +[attributes] +a_vertex = vertex +a_color = color +a_grayColor = vec4(0.87, 0.12, 0.45, 1.0) +a_normal = normal +a_line_dim = line_dim +a_extruder = extruder +a_material_color = material_color +a_line_type = line_type diff --git a/plugins/SimulationView/layers_shadow.shader b/plugins/SimulationView/layers_shadow.shader new file mode 100644 index 0000000000..972f18c921 --- /dev/null +++ b/plugins/SimulationView/layers_shadow.shader @@ -0,0 +1,156 @@ +[shaders] +vertex = + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + attribute highp float a_extruder; + attribute highp float a_line_type; + attribute highp vec4 a_vertex; + attribute lowp vec4 a_color; + attribute lowp vec4 a_material_color; + + varying lowp vec4 v_color; + varying float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + // shade the color depending on the extruder index + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer; + // 8 and 9 are travel moves + // if ((a_line_type != 8.0) && (a_line_type != 9.0)) { + // v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + // } + + v_line_type = a_line_type; + } + +fragment = + varying lowp vec4 v_color; + varying float v_line_type; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // support: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + gl_FragColor = v_color; + } + +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + uniform lowp float u_active_extruder; + uniform lowp float u_shade_factor; + uniform highp int u_layer_view_type; + + in highp float a_extruder; + in highp float a_line_type; + in highp vec4 a_vertex; + in lowp vec4 a_color; + in lowp vec4 a_material_color; + + out lowp vec4 v_color; + out float v_line_type; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer + // if ((a_line_type != 8) && (a_line_type != 9)) { + // v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a); + // } + + v_line_type = a_line_type; + } + +fragment41core = + #version 410 + in lowp vec4 v_color; + in float v_line_type; + out vec4 frag_color; + + uniform int u_show_travel_moves; + uniform int u_show_helpers; + uniform int u_show_skin; + uniform int u_show_infill; + + void main() + { + if ((u_show_travel_moves == 0) && (v_line_type >= 7.5) && (v_line_type <= 9.5)) { // actually, 8 and 9 + // discard movements + discard; + } + // helpers: 4, 5, 7, 10 + if ((u_show_helpers == 0) && ( + ((v_line_type >= 3.5) && (v_line_type <= 4.5)) || + ((v_line_type >= 6.5) && (v_line_type <= 7.5)) || + ((v_line_type >= 9.5) && (v_line_type <= 10.5)) || + ((v_line_type >= 4.5) && (v_line_type <= 5.5)) + )) { + discard; + } + // skin: 1, 2, 3 + if ((u_show_skin == 0) && ( + (v_line_type >= 0.5) && (v_line_type <= 3.5) + )) { + discard; + } + // infill: + if ((u_show_infill == 0) && (v_line_type >= 5.5) && (v_line_type <= 6.5)) { + // discard movements + discard; + } + + frag_color = v_color; + } + +[defaults] +u_active_extruder = 0.0 +u_shade_factor = 0.60 +u_layer_view_type = 0 +u_extruder_opacity = [1.0, 1.0, 1.0, 1.0] + +u_show_travel_moves = 0 +u_show_helpers = 1 +u_show_skin = 1 +u_show_infill = 1 + +[bindings] +u_modelViewProjectionMatrix = model_view_projection_matrix + +[attributes] +a_vertex = vertex +a_color = color +a_extruder = extruder +a_line_type = line_type +a_material_color = material_color diff --git a/plugins/SimulationView/plugin.json b/plugins/SimulationView/plugin.json new file mode 100644 index 0000000000..0e7bec0626 --- /dev/null +++ b/plugins/SimulationView/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Simulation View", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides the Simulation view.", + "api": 4, + "i18n-catalog": "cura" +} diff --git a/plugins/SimulationView/resources/nozzle.stl b/plugins/SimulationView/resources/nozzle.stl new file mode 100644 index 0000000000000000000000000000000000000000..7f4b22804aab6768ed2b9c0ccdc2f89847e38125 GIT binary patch literal 210284 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%0AbuZy#5DmdXLV_bm} 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 MV-kv + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/plugins/SimulationView/resources/simulation_resume.svg b/plugins/SimulationView/resources/simulation_resume.svg new file mode 100644 index 0000000000..a8ed8e79a3 --- /dev/null +++ b/plugins/SimulationView/resources/simulation_resume.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/plugins/SimulationView/simulationview_composite.shader b/plugins/SimulationView/simulationview_composite.shader new file mode 100644 index 0000000000..dcc02acc84 --- /dev/null +++ b/plugins/SimulationView/simulationview_composite.shader @@ -0,0 +1,148 @@ +[shaders] +vertex = + uniform highp mat4 u_modelViewProjectionMatrix; + attribute highp vec4 a_vertex; + attribute highp vec2 a_uvs; + + varying highp vec2 v_uvs; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + v_uvs = a_uvs; + } + +fragment = + uniform sampler2D u_layer0; + uniform sampler2D u_layer1; + uniform sampler2D u_layer2; + + uniform vec2 u_offset[9]; + + uniform vec4 u_background_color; + uniform float u_outline_strength; + uniform vec4 u_outline_color; + + varying vec2 v_uvs; + + float kernel[9]; + + const vec3 x_axis = vec3(1.0, 0.0, 0.0); + const vec3 y_axis = vec3(0.0, 1.0, 0.0); + const vec3 z_axis = vec3(0.0, 0.0, 1.0); + + void main() + { + // blur kernel + kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; + kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; + kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; + + vec4 result = u_background_color; + + vec4 main_layer = texture2D(u_layer0, v_uvs); + vec4 selection_layer = texture2D(u_layer1, v_uvs); + vec4 layerview_layer = texture2D(u_layer2, v_uvs); + + result = main_layer * main_layer.a + result * (1.0 - main_layer.a); + result = layerview_layer * layerview_layer.a + result * (1.0 - layerview_layer.a); + + vec4 sum = vec4(0.0); + for (int i = 0; i < 9; i++) + { + vec4 color = vec4(texture2D(u_layer1, v_uvs.xy + u_offset[i]).a); + sum += color * (kernel[i] / u_outline_strength); + } + + if((selection_layer.rgb == x_axis || selection_layer.rgb == y_axis || selection_layer.rgb == z_axis)) + { + gl_FragColor = result; + } + else + { + gl_FragColor = mix(result, u_outline_color, abs(sum.a)); + } + } + +vertex41core = + #version 410 + uniform highp mat4 u_modelViewProjectionMatrix; + in highp vec4 a_vertex; + in highp vec2 a_uvs; + + out highp vec2 v_uvs; + + void main() + { + gl_Position = u_modelViewProjectionMatrix * a_vertex; + v_uvs = a_uvs; + } + +fragment41core = + #version 410 + uniform sampler2D u_layer0; + uniform sampler2D u_layer1; + uniform sampler2D u_layer2; + + uniform vec2 u_offset[9]; + + uniform vec4 u_background_color; + uniform float u_outline_strength; + uniform vec4 u_outline_color; + + in vec2 v_uvs; + + float kernel[9]; + + const vec3 x_axis = vec3(1.0, 0.0, 0.0); + const vec3 y_axis = vec3(0.0, 1.0, 0.0); + const vec3 z_axis = vec3(0.0, 0.0, 1.0); + + out vec4 frag_color; + + void main() + { + // blur kernel + kernel[0] = 0.0; kernel[1] = 1.0; kernel[2] = 0.0; + kernel[3] = 1.0; kernel[4] = -4.0; kernel[5] = 1.0; + kernel[6] = 0.0; kernel[7] = 1.0; kernel[8] = 0.0; + + vec4 result = u_background_color; + + vec4 main_layer = texture(u_layer0, v_uvs); + vec4 selection_layer = texture(u_layer1, v_uvs); + vec4 layerview_layer = texture(u_layer2, v_uvs); + + result = main_layer * main_layer.a + result * (1.0 - main_layer.a); + result = layerview_layer * layerview_layer.a + result * (1.0 - layerview_layer.a); + + vec4 sum = vec4(0.0); + for (int i = 0; i < 9; i++) + { + vec4 color = vec4(texture(u_layer1, v_uvs.xy + u_offset[i]).a); + sum += color * (kernel[i] / u_outline_strength); + } + + if((selection_layer.rgb == x_axis || selection_layer.rgb == y_axis || selection_layer.rgb == z_axis)) + { + frag_color = result; + } + else + { + frag_color = mix(result, u_outline_color, abs(sum.a)); + } + } + +[defaults] +u_layer0 = 0 +u_layer1 = 1 +u_layer2 = 2 +u_background_color = [0.965, 0.965, 0.965, 1.0] +u_outline_strength = 1.0 +u_outline_color = [0.05, 0.66, 0.89, 1.0] + +[bindings] + +[attributes] +a_vertex = vertex +a_uvs = uv From c4debbea8b5c517df8458ef0233cbd6266726c5c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 10:59:01 +0100 Subject: [PATCH 281/764] Implement deserializeMetadata Let's hope this works... Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 157 +++++++++++++++++- 1 file changed, 156 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index cb93d51b63..7feea6db3b 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -6,7 +6,7 @@ import io import json #To parse the product-to-id mapping file. import os.path #To find the product-to-id mapping. import sys -from typing import Dict, Optional +from typing import Any, Dict, List, Optional import xml.etree.ElementTree as ET from UM.Resources import Resources @@ -642,6 +642,161 @@ class XmlMaterialProfile(InstanceContainer): for container_to_add in containers_to_add: ContainerRegistry.getInstance().addContainer(container_to_add) + @classmethod + def deserializeMetadata(cls, serialized: str, container_id: str) -> List[Dict[str, Any]]: + result_metadata = [] #All the metadata that we found except the base (because the base is returned). + + #Update the serialized data to the latest version. + serialized = cls._updateSerialized(serialized) + + base_metadata = { + "type": "material", + "status": "unknown", #TODO: Add material verification. + "container_type": XmlMaterialProfile + } + + try: + data = ET.fromstring(serialized) + except: + Logger.logException("e", "An exception occurred while parsing the material profile") + return [] + + #TODO: Implement the tag. It's unused at the moment though. + + if "version" in data.attrib: + base_metadata["setting_version"] = cls.xmlVersionToSettingVersion(data.attrib["version"]) + else: + base_metadata["setting_version"] = cls.xmlVersionToSettingVersion("1.2") #1.2 and lower didn't have that version number there yet. + + for entry in data.iterfind("./um:metadata/*", cls.__namespaces): + tag_name = _tag_without_namespace(entry) + + if tag_name == "name": + brand = entry.find("./um:brand", cls.__namespaces) + material = entry.find("./um:material", cls.__namespaces) + color = entry.find("./um:color", cls.__namespaces) + label = entry.find("./um:label", cls.__namespaces) + + if label is not None: + base_metadata["name"] = label.text + else: + base_metadata["name"] = cls._profile_name(material.text, color.text) + base_metadata["brand"] = brand.text + base_metadata["material"] = material.text + base_metadata["color_name"] = color.text + continue + + #Setting_version is derived from the "version" tag in the schema earlier, so don't set it here. + if tag_name == "setting_version": + continue + + base_metadata[tag_name] = entry.text + + if "description" not in base_metadata: + base_metadata["description"] = "" + if "adhesion_info" not in base_metadata: + base_metadata["adhesion_info"] = "" + + property_values = {} + properties = data.iterfind("./um:properties/*", cls.__namespaces) + for entry in properties: + tag_name = _tag_without_namespace(entry) + property_values[tag_name] = entry.text + + base_metadata["approximate_diameter"] = str(round(float(property_values.get("diameter", 2.85)))) # In mm + base_metadata["properties"] = property_values + + compatible_entries = data.iterfind("./um:settings/um:setting[@key='hardware compatible']", cls.__namespaces) + try: + common_compatibility = cls._parseCompatibleValue(next(compatible_entries).text) + except StopIteration: #No 'hardware compatible' setting. + common_compatibility = True + base_metadata["compatible"] = common_compatibility + result_metadata.append(base_metadata) + + # Map machine human-readable names to IDs + product_id_map = cls.getProductIdMap() + + for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces): + machine_compatibility = common_compatibility + for entry in machine.iterfind("./um:setting", cls.__namespaces): + key = entry.get("key") + if key == "hardware compatible": + machine_compatibility = cls._parseCompatibleValue(entry.text) + + for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces): + machine_id = product_id_map.get(identifier.get("product"), None) + if machine_id is None: + # Lets try again with some naive heuristics. + machine_id = identifier.get("product").replace(" ", "").lower() + definition_metadata = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) + if not definition_metadata: + Logger.log("w", "No definition found for machine ID %s", machine_id) + continue + definition_metadata = definition_metadata[0] + + machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. + + if machine_compatibility: + new_material_id = container_id + "_" + machine_id + + # The child or derived material container may already exist. This can happen when a material in a + # project file and the a material in Cura have the same ID. + # In the case if a derived material already exists, override that material container because if + # the data in the parent material has been changed, the derived ones should be updated too. + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_material_id) + if found_materials: + new_material_metadata = found_materials[0] + else: + new_material_metadata = {} + + new_material_metadata.update(base_metadata) + new_material_metadata["compatible"] = machine_compatibility + new_material_metadata["machine_manufacturer"] = machine_manufacturer + + if len(found_materials) == 0: #This is a new material. + result_metadata.append(new_material_metadata) + + for hotend in machine.iterfind("./um:hotend", cls.__namespaces): + hotend_id = hotend.get("id") + if hotend_id is None: + continue + + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = hotend_id) + if not variant_containers: + continue + + hotend_compatibility = machine_compatibility + for entry in hotend.iterfind("./um:setting", cls.__namespaces): + key = entry.get("key") + if key == "hardware compatible": + hotend_compatibility = cls._parseCompatibleValue(entry.text) + + new_hotend_id = container_id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_hotend_id) + if found_materials: + new_hotend_material_metadata = found_materials[0] + else: + new_hotend_material_metadata = {} + + new_hotend_material_metadata["name"] = base_metadata["name"] + new_hotend_material_metadata.update(base_metadata) + new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + new_hotend_material_metadata["compatible"] = hotend_compatibility + new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer + + if len(found_materials) == 0: + result_metadata.append(new_hotend_material_metadata) + + for metadata in result_metadata: + #ContainerRegistry.getInstance().metadata[metadata["id"]] = metadata + ## Override of getIdsFromFile because the XML files contain multiple IDs. @classmethod def getIdsFromFile(cls, file_name): From 0831451371846236cbe8140bc08eb23cc2aedafb Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 11:05:11 +0100 Subject: [PATCH 282/764] Fix returning resulting metadata Forgot to change that back. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7feea6db3b..583febea99 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -795,7 +795,8 @@ class XmlMaterialProfile(InstanceContainer): result_metadata.append(new_hotend_material_metadata) for metadata in result_metadata: - #ContainerRegistry.getInstance().metadata[metadata["id"]] = metadata + result_metadata.append(metadata) + return result_metadata ## Override of getIdsFromFile because the XML files contain multiple IDs. @classmethod From 4fa38c26e8b4e586733529e905bd7cce49365eb8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 11:46:14 +0100 Subject: [PATCH 283/764] Don't add any extra metadata to the end of the list you're iterating over Stupid mistake. This causes infinite loops. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 583febea99..7a2ad3fe51 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -794,8 +794,6 @@ class XmlMaterialProfile(InstanceContainer): if len(found_materials) == 0: result_metadata.append(new_hotend_material_metadata) - for metadata in result_metadata: - result_metadata.append(metadata) return result_metadata ## Override of getIdsFromFile because the XML files contain multiple IDs. From feb0a08fd90b8e52fe8415544048192577b769c1 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 12:34:08 +0100 Subject: [PATCH 284/764] CURA-4581 The project name is cached instead of set --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index a3aadc79b8..a237460bab 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -902,7 +902,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): base_file_name = os.path.basename(file_name) if base_file_name.endswith(".curaproject.3mf"): base_file_name = base_file_name[:base_file_name.rfind(".curaproject.3mf")] - Application.getInstance().projectFileLoaded.emit(base_file_name) + self.setWorkspaceName(base_file_name) return nodes ## HACK: Replaces the material container in the given stack with a newly created material container. From def7b6994daa4e25a4016fbde433cc3c16229b55 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 12:50:10 +0100 Subject: [PATCH 285/764] Store correct ID in metadata after deserialising Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7a2ad3fe51..5dfa130145 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -652,7 +652,8 @@ class XmlMaterialProfile(InstanceContainer): base_metadata = { "type": "material", "status": "unknown", #TODO: Add material verification. - "container_type": XmlMaterialProfile + "container_type": XmlMaterialProfile, + "id": container_id } try: @@ -751,6 +752,7 @@ class XmlMaterialProfile(InstanceContainer): new_material_metadata = {} new_material_metadata.update(base_metadata) + new_material_metadata["id"] = new_material_id new_material_metadata["compatible"] = machine_compatibility new_material_metadata["machine_manufacturer"] = machine_manufacturer @@ -790,6 +792,7 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material_metadata["variant"] = variant_containers[0]["id"] new_hotend_material_metadata["compatible"] = hotend_compatibility new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer + new_hotend_material_metadata["id"] = new_hotend_id if len(found_materials) == 0: result_metadata.append(new_hotend_material_metadata) From abe9ba379575ba5dbe4556b4afa4d62ce6847309 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 13:23:47 +0100 Subject: [PATCH 286/764] CURA-4526 Stop simulation when changing preferences. Hide nozzle node when in compatibility mode. --- plugins/SimulationView/SimulationPass.py | 2 +- plugins/SimulationView/SimulationView.qml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 24a13eaf7a..e3b840fc87 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -171,7 +171,7 @@ class SimulationPass(RenderPass): batch.render(self._scene.getActiveCamera()) # The nozzle is drawn once we know the correct position - if self._layer_view.getActivity() and nozzle_node is not None: + if not self._compatibility_mode and self._layer_view.getActivity() and nozzle_node is not None: if head_position is not None: nozzle_node.setVisible(True) nozzle_node.setPosition(head_position) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 4c7d99deec..67ca39d992 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -168,6 +168,7 @@ Item { layerTypeCombobox.currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); + playButton.pauseSimulation(); view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); From b09ffaf9e2ce0973f2ea36131c44d64a16719d71 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 21 Nov 2017 13:35:59 +0100 Subject: [PATCH 287/764] Remove "Fine" 0.1mm quality for BAM CURA-4595 --- .../um3_aa0.4_BAM_Normal_Quality.inst.cfg | 36 ------------------- 1 file changed, 36 deletions(-) delete mode 100644 resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg deleted file mode 100644 index b9f35fcfa0..0000000000 --- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg +++ /dev/null @@ -1,36 +0,0 @@ -[general] -version = 2 -name = Fine -definition = ultimaker3 - -[metadata] -type = quality -quality_type = normal -material = generic_bam_ultimaker3_AA_0.4 -weight = 0 -setting_version = 4 - -[values] -default_material_print_temperature = 225 -cool_fan_full_at_height = =layer_height_0 + 2 * layer_height -cool_fan_speed_max = =cool_fan_speed -cool_min_speed = 7 -machine_nozzle_cool_down_speed = 0.75 -machine_nozzle_heat_up_speed = 1.6 -material_standby_temperature = 100 -# prime_tower_enable: see CURA-4248 -prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 -skin_overlap = 10 -speed_layer_0 = 20 -top_bottom_thickness = 1 -wall_thickness = 1 -support_interface_enable = True -support_interface_density = =min(extruderValues('material_surface_energy')) -support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' -support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height -support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height -support_angle = 45 -support_join_distance = 5 -support_offset = 2 -support_pattern = triangles -support_infill_rate = 10 From d415c5fcbb1ee90cc7c9d32dd2eef7c128c47e88 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 13:42:46 +0100 Subject: [PATCH 288/764] CURA-4526 Add transparency to the nozzle so the user can see the lines and layers through the nozzle. --- plugins/SimulationView/SimulationPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index e3b840fc87..2b9063e27a 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -175,7 +175,7 @@ class SimulationPass(RenderPass): if head_position is not None: nozzle_node.setVisible(True) nozzle_node.setPosition(head_position) - nozzle_batch = RenderBatch(self._nozzle_shader, type = RenderBatch.RenderType.Solid) + nozzle_batch = RenderBatch(self._nozzle_shader, type = RenderBatch.RenderType.Transparent) nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) From f18cb951fcc68624a564c17fbcae2da14dcce62b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 21 Nov 2017 13:48:03 +0100 Subject: [PATCH 289/764] Use workspaceLoaded signal instead of projectFileLoaded CURA-4581 --- cura/CuraApplication.py | 2 -- cura/PrintInformation.py | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index caa39cc703..b3e6caed4e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -126,8 +126,6 @@ class CuraApplication(QtApplication): # Cura will always show the Add Machine Dialog upon start. stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished - projectFileLoaded = pyqtSignal(str) # Emitted whenever a project file is loaded - def __init__(self): # this list of dir names will be used by UM to detect an old cura directory for dir_name in ["extruders", "machine_instances", "materials", "plugins", "quality", "user", "variants"]: diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 46d9a61254..0e10eda02a 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -71,7 +71,7 @@ class PrintInformation(QObject): Application.getInstance().globalContainerStackChanged.connect(self._updateJobName) Application.getInstance().fileLoaded.connect(self.setBaseName) - Application.getInstance().projectFileLoaded.connect(self.setProjectName) + Application.getInstance().workspaceLoaded.connect(self.setProjectName) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._active_material_container = None From 602e8c0e66be33224b96823298b2c16b0f157a57 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 21 Nov 2017 15:12:17 +0100 Subject: [PATCH 290/764] Changed 'Check material compatibility' to 'Check compatibility' because it's not only materials possibly being incompatible --- resources/qml/SidebarHeader.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 8bba4cf6fd..fab8dc6130 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -346,7 +346,7 @@ Column Label { id: materialInfoLabel wrapMode: Text.WordWrap - text: catalog.i18nc("@label", "Check material compatibility") + text: catalog.i18nc("@label", "Check compatibility") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") linkColor: UM.Theme.getColor("text_link") From 8782e2e529c3abde36e5d473e18d7293cb59090c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 21 Nov 2017 15:12:17 +0100 Subject: [PATCH 291/764] Rename parameters CURA-4581 --- cura/PrintInformation.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 0e10eda02a..0a5db439c3 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -264,13 +264,14 @@ class PrintInformation(QObject): def jobName(self): return self._job_name - def _updateJobName(self, empty_name = False): + def _updateJobName(self, is_project_name_empty = False): # if the project name is set, we use the project name as the job name, so the job name should not get updated # if a model file is loaded after that. if self._project_name != "": - if empty_name: + if is_project_name_empty: self._project_name = "" - return + else: + return if self._base_name == "": self._job_name = "" @@ -312,7 +313,7 @@ class PrintInformation(QObject): if name.endswith(".curaproject"): name = name[:name.rfind(".curaproject")] self._base_name = name - self._updateJobName(empty_name = is_empty) + self._updateJobName(is_project_name_empty = is_empty) ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched From 62d70b46d6fb829c239b81b30a5aade7bac5bd2e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 21 Nov 2017 15:31:59 +0100 Subject: [PATCH 292/764] Fix filtering custom profiles per extruder - CURA-4482 --- cura/QualityManager.py | 15 +++------------ cura/Settings/UserProfilesModel.py | 9 +-------- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index abd14fa841..d2162c2449 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -183,20 +183,11 @@ class QualityManager: materials = [] - # TODO: fix this - if extruder_stacks: - # Multi-extruder machine detected - for stack in extruder_stacks: - if stack.getId() == active_stack_id and machine_manager.newMaterial: - materials.append(machine_manager.newMaterial) - else: - materials.append(stack.material) - else: - # Machine with one extruder - if global_container_stack.getId() == active_stack_id and machine_manager.newMaterial: + for stack in extruder_stacks: + if stack.getId() == active_stack_id and machine_manager.newMaterial: materials.append(machine_manager.newMaterial) else: - materials.append(global_container_stack.material) + materials.append(stack.material) quality_types = self.findAllQualityTypesForMachineAndMaterials(global_machine_definition, materials) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index 5ae9055759..aedbba34d5 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -24,9 +24,6 @@ class UserProfilesModel(ProfilesModel): quality_manager = QualityManager.getInstance() machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - - extruder_manager = ExtruderManager.getInstance() - active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = self._getOrderedExtruderStacksList() # Fetch the list of usable qualities across all extruders. @@ -35,10 +32,6 @@ class UserProfilesModel(ProfilesModel): # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - filtered_quality_changes = [qc for qc in quality_changes_list if - qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is not None and - (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] return filtered_quality_changes From 0625d22e04e00e109ace8855074a3ab687746895 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 21 Nov 2017 16:43:05 +0100 Subject: [PATCH 293/764] Fix update script for single extrusion quality changes - CURA-4482 --- cura/Settings/UserProfilesModel.py | 9 ++- .../VersionUpgrade30to31.py | 67 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index aedbba34d5..5ae9055759 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -24,6 +24,9 @@ class UserProfilesModel(ProfilesModel): quality_manager = QualityManager.getInstance() machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) + + extruder_manager = ExtruderManager.getInstance() + active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = self._getOrderedExtruderStacksList() # Fetch the list of usable qualities across all extruders. @@ -32,6 +35,10 @@ class UserProfilesModel(ProfilesModel): # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] + filtered_quality_changes = [qc for qc in quality_changes_list if + qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is not None and + (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] return filtered_quality_changes diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 7130871d8e..b966ae5192 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -3,9 +3,14 @@ import configparser #To parse preference files. import io #To serialise the preference files afterwards. +import os +from urllib.parse import quote_plus +from UM.Resources import Resources from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this. +from cura.CuraApplication import CuraApplication + # a list of all legacy "Not Supported" quality profiles _OLD_NOT_SUPPORTED_PROFILES = [ @@ -106,6 +111,12 @@ class VersionUpgrade30to31(VersionUpgrade): if not parser.has_section(each_section): parser.add_section(each_section) + # Copy global quality changes to extruder quality changes for single extrusion machines + if parser["metadata"]["type"] == "quality_changes": + all_quality_changes = self._getSingleExtrusionMachineQualityChanges(parser) + if len(all_quality_changes) == 1 and not all_quality_changes[0].has_option("metadata", "extruder"): + self._createExtruderQualityChangesForSingleExtrusionMachine(filename, all_quality_changes[0]) + # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" @@ -153,3 +164,59 @@ class VersionUpgrade30to31(VersionUpgrade): output = io.StringIO() parser.write(output) return [filename], [output.getvalue()] + + def _getSingleExtrusionMachineQualityChanges(self, quality_changes_container): + quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) + quality_changes_containers = [] + + for item in os.listdir(quality_changes_dir): + file_path = os.path.join(quality_changes_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser() + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "quality_changes" != parser["metadata"]["type"]: + continue + + if not parser.has_option("general", "name"): + continue + if quality_changes_container["general"]["name"] != parser["general"]["name"]: + continue + + quality_changes_containers.append(parser) + + return quality_changes_containers + + def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): + suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) + machine_name = filename.strip("." + os.sep).replace(suffix, "") + new_filename = machine_name + "_" + "fdmextruder" + suffix + + extruder_quality_changes_parser = configparser.ConfigParser() + extruder_quality_changes_parser.add_section("general") + extruder_quality_changes_parser["general"]["version"] = str(2) + extruder_quality_changes_parser["general"]["name"] = global_quality_changes["general"]["name"] + extruder_quality_changes_parser["general"]["definition"] = global_quality_changes["general"]["definition"] + + extruder_quality_changes_parser.add_section("metadata") + extruder_quality_changes_parser["metadata"]["quality_type"] = global_quality_changes["metadata"]["quality_type"] + extruder_quality_changes_parser["metadata"]["type"] = global_quality_changes["metadata"]["type"] + extruder_quality_changes_parser["metadata"]["setting_version"] = str(4) + extruder_quality_changes_parser["metadata"]["extruder"] = "fdmextruder" + + extruder_quality_changes_output = io.StringIO() + extruder_quality_changes_parser.write(extruder_quality_changes_output) + extruder_quality_changes_filename = quote_plus(new_filename) + ".inst.cfg" + + quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) + + with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w") as f: + f.write(extruder_quality_changes_output.getvalue()) From 1cb109d192189afcfd236907d40c5a19465c0070 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 16:42:42 +0100 Subject: [PATCH 294/764] Update translation templates for Cura 3.1 Generated by calling 'make extract-messages'. This commit introduces a string freeze for Cura 3.1. Contributes to issue CURA-4601. --- resources/i18n/cura.pot | 1805 +++++++++++++---------- resources/i18n/fdmextruder.def.json.pot | 2 +- resources/i18n/fdmprinter.def.json.pot | 481 +++--- 3 files changed, 1284 insertions(+), 1004 deletions(-) diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index 99ccd7a459..be6613ebf5 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -6,7 +6,7 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -18,81 +18,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml -msgctxt "@title:window" -msgid "User Agreement" -msgstr "" - -#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml -msgctxt "@action:button" -msgid "I understand and agree" -msgstr "" - -#Manually added for plugins/UserAgreementPlugin/UserAgreement.qml -msgctxt "@action:button" -msgid "I don't agree" -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "" - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -130,19 +55,17 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "" @@ -169,7 +92,7 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." +msgid "Open Connect..." msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 @@ -177,7 +100,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "" @@ -212,39 +135,40 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" +msgid "Printer Unavailable" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "" "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "" "Unable to start a new job because the printer does not support usb printing." msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "" @@ -308,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "" @@ -361,137 +285,115 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "" "Access to the printer requested. Please approve the request on the printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "" "Connected over the network. Please approve the access request on the printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "" "The connection with the printer was lost. Check your printer to see if it is " "connected." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "" @@ -499,48 +401,42 @@ msgid "" "%s." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "" @@ -548,14 +444,12 @@ msgid "" "performed on the printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "" "There is a mismatch between the configuration or calibration of the printer " @@ -563,68 +457,65 @@ msgid "" "that are inserted in your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "" "The PrintCores and/or materials on your printer differ from those within " @@ -632,18 +523,12 @@ msgid "" "and materials that are inserted in your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "" "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "" @@ -651,85 +536,109 @@ msgid "" "printers." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "" "{printer_name} has finished printing '{job_name}'. Please collect the print " "and confirm clearing the build plate." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "" "{printer_name} is reserved to print '{job_name}'. Please change the " "printer's configuration to match the job, for it to start printing." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "" -"Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "" "Unable to send new print job: this 3D printer is not (yet) set up to host a " "group of connected Ultimaker 3 printers." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "" "@info Don't translate {machine_name}, since it gets replaced by a printer " "name!" msgid "" -"To ensure that your {machine_name} is equipped with the latest features it " -"is recommended to update the firmware regularly. This can be done on the " -"{machine_name} (when connected to the network) or via USB." +"New features are available for your {machine_name}! It is recommended to " +"update the firmware on your printer." msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" +msgid "How to update" msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "" @@ -762,7 +671,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "" @@ -794,21 +718,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -843,8 +752,9 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "" @@ -857,26 +767,34 @@ msgid "" "errors: {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice due to some per-model settings. The following settings have " +"errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "" "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "" "Nothing to slice because none of the models fit the build volume. Please " "scale or rotate models to fit." msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "" @@ -891,14 +809,41 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " +"is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "" +"Failed to install Siemens NX plugin. Could not set environment variable " +"UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "" @@ -909,29 +854,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "" @@ -946,18 +886,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "" "Make sure the g-code is suitable for your printer and printer configuration " @@ -1001,73 +941,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "" @@ -1094,13 +1039,13 @@ msgid "Can't Find Location" msgstr "" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "" @@ -1118,14 +1063,24 @@ msgctxt "@label" msgid "Custom Material" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "" "The selected material is incompatible with the selected machine or " "configuration." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1148,14 +1103,14 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" "Failed to export profile to {0}: {1}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "" @@ -1163,21 +1118,21 @@ msgid "" "failure." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" +msgid "Export succeeded" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" @@ -1185,30 +1140,30 @@ msgid "" "message>" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1237,42 +1192,115 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

A fatal exception has occurred that we could not recover from!

\n" -"

Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" -"issues

\n" -" " +"

A fatal exception has occurred. Please send us this Crash Report to " +"fix the problem

\n" +"

Please use the \"Send report\" button to post a bug report " +"automatically to our servers

\n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
" msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be " @@ -1280,93 +1308,98 @@ msgctxt "" msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "" "Distance from the left of the printhead to the center of the nozzle. Used to " @@ -1374,12 +1407,12 @@ msgid "" "\"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "" "Distance from the front of the printhead to the center of the nozzle. Used " @@ -1387,12 +1420,12 @@ msgid "" "printing \"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "" "Distance from the right of the printhead to the center of the nozzle. Used " @@ -1400,12 +1433,12 @@ msgid "" "printing \"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "" "Distance from the rear of the printhead to the center of the nozzle. Used to " @@ -1413,12 +1446,12 @@ msgid "" "\"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "" "The height difference between the tip of the nozzle and the gantry system (X " @@ -1426,70 +1459,70 @@ msgid "" "gantry when printing \"One at a Time\"." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "" "The nominal diameter of filament supported by the printer. The exact " "diameter will be overridden by the material and/or the profile." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "" @@ -1502,12 +1535,11 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1559,13 +1591,11 @@ msgid "Unknown error code: %1" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your " @@ -1578,20 +1608,17 @@ msgid "" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1600,224 +1627,223 @@ msgid "Remove" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "" "If your printer is not listed, read the network printing " "troubleshooting guide" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "" -"This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "" -"This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1843,13 +1869,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1876,11 +1895,91 @@ msgid "Fine" msgstr "" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1891,81 +1990,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -2061,129 +2100,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" +msgid "Loading a project will clear all models on the build plate." msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "" @@ -2208,6 +2247,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2216,7 +2260,7 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" @@ -2231,6 +2275,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2429,30 +2478,25 @@ msgid "Printer does not accept commands" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "" @@ -2668,7 +2712,7 @@ msgid "Unit" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "" @@ -2915,7 +2959,7 @@ msgid "Send (anonymous) print information" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "" @@ -2933,39 +2977,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "" @@ -3065,7 +3109,7 @@ msgid "Export Profile" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "" @@ -3127,7 +3171,7 @@ msgid "Successfully exported material to %1" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "" @@ -3147,6 +3191,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3239,12 +3288,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "" @@ -3254,7 +3308,12 @@ msgctxt "@label" msgid "Profile:" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the " @@ -3263,32 +3322,32 @@ msgid "" "Click to open the profile manager." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "" @@ -3341,58 +3400,77 @@ msgid "" "Click to restore the calculated value." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" +msgid "Time specification
    " msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "" +"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " +"print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "" "Recommended Print Setup

    Print with the recommended settings " "for the selected printer, material and quality." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "" "Custom Print Setup

    Print with finegrained control over every " "last bit of the slicing process." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "" @@ -3402,7 +3480,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "" @@ -3431,13 +3509,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "" @@ -3454,54 +3532,54 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "" "The target temperature of the heated bed. The bed will heat up or cool down " "towards this temperature. If this is 0, the bed heating is turned off." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "" "Heat the bed in advance before printing. You can continue adjusting your " @@ -3509,259 +3587,299 @@ msgid "" "when you're ready to print." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" msgstr[1] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "" @@ -3781,114 +3899,119 @@ msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" +msgid "Ultimaker Cura" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "" "Are you sure you want to start a new project? This will clear the build " "plate and any unsaved settings." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "" "We have found one or more G-Code files within the files you have selected. " @@ -3901,90 +4024,104 @@ msgctxt "@title:window" msgid "Save Project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "" +"A custom profile is currently active. To enable the quality slider, choose a " +"default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "" +"You have modified some profile settings. If you want to change these go to " +"custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "" "Gradual infill will gradually increase the amount of infill towards the top." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "" "Generate structures to support parts of the model which have overhangs. " "Without these structures, such parts would collapse during printing." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "" "Select which extruder to use for support. This will build up supporting " @@ -3992,19 +4129,19 @@ msgid "" "mid air." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "" "Enable printing a brim or raft. This will add a flat area around or under " "your object which is easy to cut off afterwards." msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "" "Need help improving your prints?
    Read the Ultimaker " @@ -4023,19 +4160,19 @@ msgctxt "@title:window" msgid "Open project file" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "" "This is a Cura project file. Would you like to open it as a project or " "import the models from it?" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "" @@ -4045,23 +4182,26 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" +msgid "Check compatibility" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "" + #: MachineSettingsAction/plugin.json msgctxt "description" -msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgid "" +"Provides a way to change machine settings (such as build volume, nozzle " +"size, etc)" msgstr "" #: MachineSettingsAction/plugin.json @@ -4141,7 +4281,8 @@ msgstr "" #: USBPrinting/plugin.json msgctxt "description" -msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgid "" +"Accepts G-Code and sends them to a printer. Plugin can also update firmware." msgstr "" #: USBPrinting/plugin.json @@ -4169,11 +4310,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4186,7 +4322,9 @@ msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" -msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +msgid "" +"Gives you the possibility to open certain files via SolidWorks itself. These " +"are then converted and loaded into Cura" msgstr "" #: CuraSolidWorksPlugin/plugin.json @@ -4194,6 +4332,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4254,16 +4402,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "" - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4284,6 +4422,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4344,6 +4492,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4404,9 +4562,21 @@ msgctxt "name" msgid "3MF Writer" msgstr "" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" -msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgid "" +"Provides machine actions for Ultimaker machines (such as bed leveling " +"wizard, selecting upgrades, etc)" msgstr "" #: UltimakerMachineActions/plugin.json @@ -4423,4 +4593,3 @@ msgstr "" msgctxt "name" msgid "Cura Profile Reader" msgstr "" - diff --git a/resources/i18n/fdmextruder.def.json.pot b/resources/i18n/fdmextruder.def.json.pot index 8b67f13315..af77729254 100644 --- a/resources/i18n/fdmextruder.def.json.pot +++ b/resources/i18n/fdmextruder.def.json.pot @@ -5,7 +5,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot index 460e508eb9..9d5ef93fc3 100644 --- a/resources/i18n/fdmprinter.def.json.pot +++ b/resources/i18n/fdmprinter.def.json.pot @@ -5,7 +5,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -651,6 +651,38 @@ msgid "" "adhesion to the build plate easier." msgstr "" +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "" +"How to slice layers with diagonal surfaces. The areas of a layer can be " +"generated based on where the middle of the layer intersects the surface " +"(Middle). Alternatively each layer can have the areas which fall inside of " +"the volume throughout the height of the layer (Exclusive) or a layer has the " +"areas which fall inside anywhere within the layer (Inclusive). Exclusive " +"retains the most details, Inclusive makes for the best fit and Middle takes " +"the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -809,6 +841,18 @@ msgctxt "shell description" msgid "Shell" msgstr "" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "" +"The extruder train used for printing the walls. This is used in multi-" +"extrusion." +msgstr "" + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -823,7 +867,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" +msgid "Inner Wall Extruder" msgstr "" #: fdmprinter.def.json @@ -1339,6 +1383,117 @@ msgid "" "material." msgstr "" +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "" + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1392,9 +1547,10 @@ msgctxt "infill_pattern description" msgid "" "The pattern of the infill material of the print. The line and zig zag infill " "swap direction on alternate layers, reducing material cost. The grid, " -"triangle, cubic, octet, quarter cubic and concentric patterns are fully " -"printed every layer. Cubic, quarter cubic and octet infill change with every " -"layer to provide a more equal distribution of strength over each direction." +"triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " +"patterns are fully printed every layer. Cubic, quarter cubic and octet " +"infill change with every layer to provide a more equal distribution of " +"strength over each direction." msgstr "" #: fdmprinter.def.json @@ -1412,6 +1568,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1465,9 +1626,9 @@ msgstr "" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "" -"Connect the ends where the infill pattern meets the inner wall using a lines " +"Connect the ends where the infill pattern meets the inner wall using a line " "which follows the shape of the inner wall. Enabling this setting can make " -"the infill adhere to the walls better and reduces the effects on infill on " +"the infill adhere to the walls better and reduce the effects of infill on " "the quality of vertical surfaces. Disabling this setting reduces the amount " "of material used." msgstr "" @@ -1488,6 +1649,26 @@ msgid "" "lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "" +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1875,6 +2056,26 @@ msgid "" "diameter of the used filament." msgstr "" +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -3253,42 +3454,6 @@ msgid "" "structure." msgstr "" -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "" -"Skip some support line connections to make the support structure easier to " -"break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "" -"Leave out a connection between support lines once every N millimeter to make " -"the support structure easier to break away." -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "" -"Skip one in every N connection lines to make the support structure easier to " -"break away." -msgstr "" - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3913,7 +4078,7 @@ msgstr "" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from " +"This is the minimum distance. Multiple skirt lines will extend outwards from " "this distance." msgstr "" @@ -3969,32 +4134,6 @@ msgid "" "that much." msgstr "" -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "" -"The extruder is offset from the normal height of the first layer by this " -"amount. It can be positive (raised) or negative (lowered). Some filament " -"types adhere to the build plate better if the extruder is raised slightly." -msgstr "" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "" -"When non-zero, the Z offset is reduced to 0 over that many layers. A value " -"of 0 means that the Z offset remains constant for all the layers in the " -"print." -msgstr "" - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -4016,10 +4155,10 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "" -"This setting control how much inner corners in the raft outline are rounded. " -"Inward corners are rounded to a semi circle with a radius equal to the value " -"given here. This setting also removes holes in the raft outline which are " -"smaller than such a circle." +"This setting controls how much inner corners in the raft outline are " +"rounded. Inward corners are rounded to a semi circle with a radius equal to " +"the value given here. This setting also removes holes in the raft outline " +"which are smaller than such a circle." msgstr "" #: fdmprinter.def.json @@ -4560,6 +4699,20 @@ msgid "" "everything else fails to produce proper GCode." msgstr "" +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "" +"The minimum size of a line segment after slicing. If you increase this, the " +"mesh will have a lower resolution. This may allow the printer to keep up " +"with the speed it has to process g-code and will increase slice speed by " +"removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4598,6 +4751,19 @@ msgid "" "is removed from the other meshes." msgstr "" +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "" +"Remove empty layers beneath the first printed layer if they are present. " +"Disabling this setting can cause empty first layers if the Slicing Tolerance " +"setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4852,6 +5018,42 @@ msgid "" "time estimates with and without optimization." msgstr "" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "" + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -5210,6 +5412,26 @@ msgid "" "higher than half the Fuzzy Skin Thickness." msgstr "" +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -5523,117 +5745,6 @@ msgid "" "applies to Wire Printing." msgstr "" -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "" -"Go over the top surface one additional time, but without extruding material. " -"This is meant to melt the plastic on top further, creating a smoother " -"surface." -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "" -"Only perform ironing on the very last layer of the mesh. This saves time if " -"the lower layers don't need a smooth surface finish." -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "" -"The amount of material, relative to a normal skin line, to extrude during " -"ironing. Keeping the nozzle filled helps filling some of the crevices of the " -"top surface, but too much results in overextrusion and blips on the side of " -"the surface." -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "" -"A distance to keep from the edges of the model. Ironing all the way to the " -"edge of the mesh may result in a jagged edge on your print." -msgstr "" - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "" - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "" - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" From 628e88a7e46cec4c527ed6a9179178e1064a4fc4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 21 Nov 2017 16:59:56 +0100 Subject: [PATCH 295/764] Update translation templates for every language These files are to be sent to the translators. Their old translations have been retained but new strings were added. Contributes to issue CURA-4601. --- resources/i18n/de_DE/cura.po | 1952 ++++---- resources/i18n/de_DE/fdmextruder.def.json.po | 4 +- resources/i18n/de_DE/fdmprinter.def.json.po | 482 +- resources/i18n/es_ES/cura.po | 1950 ++++---- resources/i18n/es_ES/fdmextruder.def.json.po | 4 +- resources/i18n/es_ES/fdmprinter.def.json.po | 482 +- resources/i18n/fi_FI/cura.po | 1950 ++++---- resources/i18n/fi_FI/fdmextruder.def.json.po | 4 +- resources/i18n/fi_FI/fdmprinter.def.json.po | 482 +- resources/i18n/fr_FR/cura.po | 1952 ++++---- resources/i18n/fr_FR/fdmextruder.def.json.po | 4 +- resources/i18n/fr_FR/fdmprinter.def.json.po | 482 +- resources/i18n/it_IT/cura.po | 1952 ++++---- resources/i18n/it_IT/fdmextruder.def.json.po | 4 +- resources/i18n/it_IT/fdmprinter.def.json.po | 482 +- resources/i18n/ja_JP/cura.po | 2188 +++++---- resources/i18n/ja_JP/fdmextruder.def.json.po | 6 +- resources/i18n/ja_JP/fdmprinter.def.json.po | 804 ++-- resources/i18n/ko_KR/cura.po | 4416 ++++++++++++++++++ resources/i18n/ko_KR/fdmextruder.def.json.po | 6 +- resources/i18n/ko_KR/fdmprinter.def.json.po | 452 +- resources/i18n/nl_NL/cura.po | 1950 ++++---- resources/i18n/nl_NL/fdmextruder.def.json.po | 4 +- resources/i18n/nl_NL/fdmprinter.def.json.po | 474 +- resources/i18n/pl_PL/cura.po | 1919 ++++---- resources/i18n/pl_PL/fdmextruder.def.json.po | 4 +- resources/i18n/pl_PL/fdmprinter.def.json.po | 470 +- resources/i18n/pt_BR/cura.po | 1915 ++++---- resources/i18n/pt_BR/fdmextruder.def.json.po | 4 +- resources/i18n/pt_BR/fdmprinter.def.json.po | 462 +- resources/i18n/ru_RU/cura.po | 1915 ++++---- resources/i18n/ru_RU/fdmextruder.def.json.po | 4 +- resources/i18n/ru_RU/fdmprinter.def.json.po | 468 +- resources/i18n/tr_TR/cura.po | 1952 ++++---- resources/i18n/tr_TR/fdmextruder.def.json.po | 4 +- resources/i18n/tr_TR/fdmprinter.def.json.po | 482 +- resources/i18n/zh_CN/cura.po | 1949 ++++---- resources/i18n/zh_CN/fdmextruder.def.json.po | 4 +- resources/i18n/zh_CN/fdmprinter.def.json.po | 482 +- 39 files changed, 22122 insertions(+), 12398 deletions(-) create mode 100644 resources/i18n/ko_KR/cura.po diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 179994a4a6..e5e2509fd0 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: German\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Drucken wurde abgebrochen" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Blockiert" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Handlung erforderlich" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Druck startet nicht" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Dieser Drucker ist nicht eingerichtet um eine Gruppe von Ultimaker 3 Druckern anzusteuern." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Endet um: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Dieser Drucker steuert eine Gruppe von %1 Ultimaker 3 Druckern an." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "Drucker '{printer_name}' hat '{job_name}' vollständig gedrückt." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Druck vollendet" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Plugins" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Plugins durchsuchen..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Installierte plugins..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Zu Doodle3D Connect verbinden" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Abbrechen" @@ -152,15 +90,15 @@ msgstr "Datei wurde zu Doodle3D Connect gesendet" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Connect wird geöffnet ..." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect Web-Schnittstelle öffnen" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Änderungsprotokoll anzeigen" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Über USB verbunden" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Es kann kein neuer Auftrag gestartet werden, da der Drucker beschäftigt oder nicht angeschlossen ist." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Druckdetails" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Der Drucker unterstützt keinen USB-Druck, da er die UltiGCode-Variante verwendet." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-Drucken" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Es kann kein neuer Auftrag gestartet werden, da der Drucker keinen Druck über USB unterstützt." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Warnhinweis" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Konnte nicht auf dem Wechseldatenträger gespeichert werden {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Fehler" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Wechseldatenträger" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drucken über Netzwerk" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Drücken über Netzwerk" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Zugriff auf Drucker erforderlich. Bestätigen Sie den Zugriff auf den Drucker" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Verbindungsstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Verbindungsstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Erneut versuchen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Zugriffanforderung erneut senden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Zugriff auf den Drucker genehmigt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Kein Zugriff auf das Drucken mit diesem Drucker. Druckauftrag kann nicht gesendet werden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Zugriff anfordern" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Zugriffsanforderung für den Drucker senden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Über Netzwerk verbunden. Geben Sie die Zugriffsanforderung für den Drucker frei." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Über Netzwerk verbunden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Über Netzwerk verbunden. Kein Zugriff auf die Druckerverwaltung." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Zugriffsanforderung auf den Drucker wurde abgelehnt." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Zugriffsanforderungen aufgrund von Zeitüberschreitung fehlgeschlagen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Die Verbindung zum Netzwerk ist verlorengegangen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Die Verbindung zum Drucker ist verlorengegangen. Überprüfen Sie Ihren Drucker, um festzustellen, ob er verbunden ist." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Es kann kein neuer Druckauftrag gestartet werden, da der Drucker beschäftigt ist. Der aktuelle Druckerstatus lautet %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Druckerstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein PrintCore in Steckplatz {0} geladen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Es kann kein neuer Druckauftrag gestartet werden. Kein Material in Steckplatz {0} geladen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Material für Spule {0} unzureichend." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Abweichender PrintCore (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Abweichendes Material (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} ist nicht korrekt kalibriert. XY-Kalibrierung muss auf dem Drucker ausgeführt werden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Möchten Sie wirklich mit der gewählten Konfiguration drucken?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Anforderungen zwischen der Druckerkonfiguration oder -kalibrierung und Cura stimmen nicht überein. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Konfiguration nicht übereinstimmend" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Das Senden neuer Aufträge ist (vorübergehend) blockiert; der vorherige Druckauftrag wird noch gesendet." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Daten werden zum Drucker gesendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Daten werden gesendet" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Daten können nicht zum Drucker gesendet werden. Ist noch ein weiterer Auftrag in Bearbeitung?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Drucken wird abgebrochen..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Drucken wurde abgebrochen. Den Drucker überprüfen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Drucken wird pausiert..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Drucken wird fortgesetzt..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchronisieren Ihres Druckers" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Möchten Sie Ihre aktuelle Druckerkonfiguration in Cura verwenden?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Die PrintCores und/oder Materialien auf Ihrem Drucker unterscheiden sich von denen Ihres aktuellen Projekts. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Anschluss über Netzwerk" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Dieser Drucker ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Dieser Drucker ist der Host für eine Gruppe von {count} verbundenen Ultimaker 3-Druckern." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} hat den Druck von '{job_name}‘ beendet. Bitte holen Sie den Druck ab und bestätigen Sie das Räumen des Druckbetts." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} ist für das Drucken von '{job_name}‘ reserviert. Bitte ändern Sie die Druckerkonfiguration passend für den Auftrag, um mit dem Drucken zu beginnen." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Das Senden neuer Aufträge ist (vorübergehend) blockiert; der vorherige Druckauftrag wird noch gesendet." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Es kann kein neuer Druckauftrag gesendet werden: Dieser 3D-Drucker ist (noch) nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "{file_name} wird an Gruppe {cluster_name} gesendet" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} wurde an Gruppe {cluster_name} gesendet." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Druckaufträge anzeigen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Öffnet die Schaltfläche für Druckaufträge in Ihrem Browser." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Es können keine Druckaufträge an die Gruppe {cluster_name} gesendet werden." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} wurde an Gruppe {cluster_name} gesendet." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Druckaufträge anzeigen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Öffnet die Schaltfläche für Druckaufträge in Ihrem Browser." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Unbekannt" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "Drucker '{printer_name}' hat '{job_name}' vollständig gedrückt." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Druck vollendet" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Handlung erforderlich" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "{file_name} wird an Gruppe {cluster_name} gesendet" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Anschluss über Netzwerk" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Um sicherzustellen, dass Ihr {machine_name} mit den neuesten Funktionen ausgestattet ist, wird empfohlen, die Firmware regelmäßig zu aktualisieren Dies kann auf dem {machine_name} (bei Anschluss an ein Netzwerk) oder über USB erfolgen." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Neue Firmware für %s verfügbar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Download" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Zugriff auf Update-Informationen nicht möglich." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Fehler beim Starten %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert ist." + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "G-Code ändern" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-Code-Datei" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Schichtenansicht" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert ist." - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Schichtenansicht" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Slicing mit dem aktuellen Material nicht möglich, da es mit der gewähl #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Slicing nicht möglich" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Die aktuellen Einstellungen lassen kein Schneiden (Slicing) zu. Die folgenden Einstellungen sind fehlerhaft:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Schneiden (Slicing) ist nicht möglich, da der Einzugsturm oder die Einzugsposition(en) ungültig ist (sind)." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Es ist kein Objekt zum Schneiden vorhanden, da keines der Modelle der Druckabmessung entspricht. Bitte die Modelle passend skalieren oder drehen." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Schichten werden verarbeitet" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informationen" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Pro Objekteinstellungen konfigurieren" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Empfohlen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Benutzerdefiniert" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-Datei" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Düse" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Plugins durchsuchen" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Plugin-ID von {0} wurde nicht erhalten" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Warnhinweis" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Plugin-Browser" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G-Datei" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-Code parsen" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-Code-Details" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Stellen Sie sicher, dass der G-Code für Ihren Drucker und Ihre Druckerkonfiguration geeignet ist, bevor Sie die Datei senden. Der Darstellung des G-Codes ist möglicherweise nicht korrekt." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Druckbett nivellieren" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Außenwand" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Innenwände" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Außenhaut" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Füllung" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Stützstruktur-Füllung" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Stützstruktur-Schnittstelle" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Stützstruktur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Bewegungen" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Einzüge" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Sonstige" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Vorgeschnittene Datei {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Kein Material geladen" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Unbekanntes Material" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Kann Position nicht finden" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Datei bereits vorhanden" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Benutzerdefiniertes Material" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Das gewählte Material ist mit der gewählten Maschine oder Konfiguration nicht kompatibel." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Änderung des Materialdurchmessers rückgängig machen" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Export des Profils nach {0} fehlgeschlagen: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Export des Profils nach {0} fehlgeschlagen: Fehlermeldung von Writer-Plugin" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil wurde nach {0} exportiert" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Exportdetails" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Import des Profils aus Datei {0} fehlgeschlagen: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil erfolgreich importiert {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profil {0} hat einen unbekannten Dateityp oder ist beschädigt." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Benutzerdefiniertes Profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Für das Profil fehlt eine Qualitätsangabe." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Objekt-Platzierung" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Crash-Bericht" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Ein schwerer Ausnahmezustand ist aufgetreten, den wir nicht beseitigen konnten!

    \n

    Bitte senden Sie einen Fehlerbericht an folgende URL http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Webseite öffnen" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Geräte werden geladen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Die Szene wird eingerichtet..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Die Benutzeroberfläche wird geladen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Es kann nur jeweils ein G-Code gleichzeitig geladen werden. Wichtige {0} werden übersprungen." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Wenn G-Code geladen wird, kann keine weitere Datei geöffnet werden. Wichtige {0} werden übersprungen." +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Geräteeinstellungen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Drucker" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Druckereinstellungen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Breite)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Tiefe)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Höhe)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Druckbettform" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Ausgang in Mitte" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Heizbares Bett" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "G-Code-Variante" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Druckkopfeinstellungen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Abstand von der linken Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Abstand von der Vorderseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X max." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Abstand von der rechten Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y max." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Abstand von der Rückseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Brückenhöhe" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem Brückensystem (X- und Y-Achsen). Wird verwendet, um Kollisionen zwischen vorherigen Drucken und der Brücke zu verhindern, wenn im Modus „Nacheinander“ gedruckt wird." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Anzahl Extruder" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Der Nenndurchmesser des durch den Drucker unterstützten Filaments. Der exakte Durchmesser wird durch das Material und/oder das Profil überschrieben." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Materialdurchmesser" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Düsengröße" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "G-Code starten" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-Code-Befehle, die zum Start ausgeführt werden sollen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "G-Code beenden" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Düseneinstellungen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "X-Versatz Düse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Y-Versatz Düse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-Code Extruder-Start" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-Code Extruder-Ende" @@ -1406,12 +1448,11 @@ msgstr "Änderungsprotokoll" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Unbekannter Fehlercode: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Anschluss an vernetzten Drucker" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "" +"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" +"\n" +"Wählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Hinzufügen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Bearbeiten" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Entfernen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Aktualisieren" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Wenn Ihr Drucker nicht aufgeführt ist, lesen Sie die Anleitung für Fehlerbehebung für Netzwerkdruck" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Typ" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Unbekannt" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Firmware-Version" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Adresse" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Dieser Drucker ist nicht eingerichtet um eine Gruppe von Ultimaker 3 Druckern anzusteuern." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Dieser Drucker steuert eine Gruppe von %1 Ultimaker 3 Druckern an." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "Der Drucker unter dieser Adresse hat nicht reagiert." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Verbinden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Druckeradresse" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Geben Sie die IP-Adresse oder den Hostnamen Ihres Druckers auf dem Netzwerk ein." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Drucken über Netzwerk" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Drucken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Druckaufträge anzeigen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Vorbereitung für den Druck" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Drucken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Verfügbar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Verbindung zum Drucker wurde unterbrochen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Reserviert" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Beendet" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Drucken wurde abgebrochen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Akzeptiert keine Druckaufträge" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Endet um: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Druckplatte räumen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Warten auf eine Konfigurationsänderung" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Druckaufträge" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Drucken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "In Warteschlange" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Drucker" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Drucker anzeigen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Mit einem Drucker verbinden" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Die Druckerkonfiguration in Cura laden" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Konfiguration aktivieren" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Dieser Drucker ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Dieser Drucker ist der Host für eine Gruppe von %1 verbundenen Ultimaker 3-Druckern" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Drucken über Netzwerk" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Drucken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Drucken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Reserviert" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Beendet" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Vorbereitung" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Verfügbar" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Fertiggestellt am: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Druckplatte räumen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Vorbereitung für den Druck" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Akzeptiert keine Druckaufträge" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Öffnet die Seite für Druckaufträge mit Ihrem Standard-Webbrowser." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Druckaufträge anzeigen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "DRUCKERGRUPPE" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Druckaufträge" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Drucken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "In Warteschlange" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Warten auf eine Konfigurationsänderung" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Drucker" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Drucker anzeigen" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Immer Qualität „Grob“ verwenden" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Fein" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Meine Auswahl merken" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Farbschema" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Materialfarbe" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Linientyp" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Kompatibilitätsmodus" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Bewegungen anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Helfer anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Gehäuse anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Füllung anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Nur obere Schichten anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "5 detaillierte Schichten oben anzeigen" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Oben/Unten" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Innenwand" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Skripts Nachbearbeitung" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Ein Skript hinzufügen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Einstellungen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Aktive Skripts Nachbearbeitung ändern" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Farbschema" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Materialfarbe" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Linientyp" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Kompatibilitätsmodus" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Bewegungen anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Helfer anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Gehäuse anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Füllung anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Nur obere Schichten anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "5 detaillierte Schichten oben anzeigen" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Oben/Unten" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Innenwand" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Alle anzeigen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Projekt öffnen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Vorhandenes aktualisieren" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Neu erstellen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Zusammenfassung – Cura-Projekt" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Druckereinstellungen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Wie soll der Konflikt im Gerät gelöst werden?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Typ" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Name" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Profileinstellungen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Wie soll der Konflikt im Profil gelöst werden?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Nicht im Profil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 überschreiben" msgstr[1] "%1 überschreibt" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Ableitung von" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 überschreiben" msgstr[1] "%1, %2 überschreibt" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Materialeinstellungen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Wie soll der Konflikt im Material gelöst werden?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Sichtbarkeit einstellen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Modus" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Sichtbare Einstellungen:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 von %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Das Laden eines Projekts entfernt alle Modelle von der Druckplatte" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Öffnen" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Installiert" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Download" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Plugin für Lizenzvereinbarung" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " Das Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Ablehnen" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "Drucker nimmt keine Befehle an" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In Wartung. Den Drucker überprüfen" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Verbindung zum Drucker wurde unterbrochen" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Es wird gedruckt..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Pausiert" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Vorbereitung läuft..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "" +"Sie haben einige Profileinstellungen angepasst.\n" +"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Einheit" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Allgemein" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "(Anonyme) Druckinformationen senden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Drucker" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Umbenennen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Druckertyp:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Verbindung:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Der Drucker ist nicht verbunden." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Status:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Warten auf Räumen des Druckbeets" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Warten auf einen Druckauftrag" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profile" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Profil exportieren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materialien" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Material erfolgreich nach %1 exportiert" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Drucker hinzufügen" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Über Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "" +"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" +"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Bibliothek für Polygon-Beschneidung" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Schriftart" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG-Symbole" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." +msgstr "" +"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" +"\n" +"Klicken Sie, um den Profilmanager zu öffnen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Suchen..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Werte für alle Extruder kopieren" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Diese Einstellung ausblenden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Diese Einstellung ausblenden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Diese Einstellung weiterhin anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Sichtbarkeit der Einstellung wird konfiguriert..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "" +"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" +"\n" +"Klicken Sie, um diese Einstellungen sichtbar zu machen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "" +"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" +"\n" +"Klicken Sie, um den Wert des Profils wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "" +"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" +"\n" +"Klicken Sie, um den berechneten Wert wiederherzustellen." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Druckeinrichtung" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" +msgstr "" +"Druckeinrichtung deaktiviert\n" +"G-Code-Dateien können nicht geändert werden" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00 Stunden 00 Minuten" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Zeitangaben" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Druckzeit" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Empfohlene Druckeinrichtung

    Drucken mit den empfohlenen Einstellungen für den gewählten Drucker, das gewählte Material und die gewählte Qualität." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Benutzerdefinierte Druckeinrichtung

    Druck mit Feineinstellung über jedem einzelnen Bereich des Schneidvorgangs." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ansicht" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "&Zuletzt geöffnet" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Es ist kein Drucker verbunden" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Extruder" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Die aktuelle Temperatur dieses Extruders." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Die Farbe des Materials in diesem Extruder." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Das Material in diesem Extruder." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Die in diesem Extruder eingesetzte Düse." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Druckbett" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Die Zieltemperatur des heizbaren Betts. Das Bett wird auf diese Temperatur aufgeheizt oder abgekühlt. Wenn der Wert 0 beträgt, wird die Bettheizung ausgeschaltet." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Die aktuelle Temperatur des beheizten Betts." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Die Temperatur, auf die das Bett vorgeheizt wird." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Abbrechen" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Vorheizen" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Heizen Sie das Bett vor Druckbeginn auf. Sie können Ihren Druck während des Aufheizens weiter anpassen und müssen nicht warten, bis das Bett aufgeheizt ist, wenn Sie druckbereit sind." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Aktiver Druck" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Name des Auftrags" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Druckzeit" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Geschätzte verbleibende Zeit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Umschalten auf Vo&llbild-Modus" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Rückgängig machen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Wiederholen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Beenden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura konfigurieren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Drucker hinzufügen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Dr&ucker verwalten..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialien werden verwaltet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profil mit aktuellen Einstellungen/Überschreibungen aktualisieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Aktuelle Änderungen verwerfen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Profil von aktuellen Einstellungen/Überschreibungen erstellen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profile verwalten..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online-&Dokumentation anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "&Fehler melden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Über..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "&Ausgewähltes Modell löschen" msgstr[1] "&Ausgewählte Modelle löschen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Ausgewähltes Modell zentrieren" msgstr[1] "Ausgewählte Modelle zentrieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Ausgewähltes Modell multiplizieren" msgstr[1] "Ausgewählte Modelle multiplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modell löschen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modell auf Druckplatte ze&ntrieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelle &gruppieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Gruppierung für Modelle aufheben" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modelle &zusammenführen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Modell &multiplizieren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Alle Modelle &wählen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "Druckplatte &reinigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Alle Modelle neu &laden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle Modelle anordnen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Anordnung auswählen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modellpositionen zurücksetzen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Alle Modell&transformationen zurücksetzen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Datei(en) öffnen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Neues Projekt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Engine-&Protokoll anzeigen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Konfigurationsordner anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Sichtbarkeit einstellen wird konfiguriert..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Plugins durchsuchen..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Installierte plugins..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Bitte laden Sie ein 3D-Modell" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Bereit zum Slicen (Schneiden)" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Das Slicing läuft..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Bereit zum %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Slicing nicht möglich" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Slicing ist nicht verfügbar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Vorbereiten" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Abbrechen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Wählen Sie das aktive Ausgabegerät" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Datei(en) öffnen" @@ -3619,112 +3767,117 @@ msgstr "Alle als Modelle importieren" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Datei" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Auswahl als Datei &speichern" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Speichern &Als" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Projekt speichern" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Bearbeiten" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Ansicht" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Einstellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Dr&ucker" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Als aktiven Extruder festlegen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Er&weiterungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Plugins" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "E&instellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Hilfe" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Datei öffnen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Einstellungen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Neues Projekt" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Möchten Sie wirklich ein neues Projekt beginnen? Damit werden das Druckbett und alle nicht gespeicherten Einstellungen gelöscht." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Plugin installieren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Datei(en) öffnen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Es wurden eine oder mehrere G-Code-Datei(en) innerhalb der von Ihnen gewählten Dateien gefunden. Sie können nur eine G-Code-Datei auf einmal öffnen. Wenn Sie eine G-Code-Datei öffnen möchten wählen Sie bitte nur eine Datei." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Projekt speichern" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Extruder %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & Material" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Projektzusammenfassung beim Speichern nicht erneut anzeigen" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Speichern" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Vorbereiten" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Überwachen" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Schichtdicke" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Druckgeschwindigkeit" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Langsamer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Schneller" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Füllung" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Die graduelle Füllung steigert die Menge der Füllung nach oben hin schrittweise." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Graduell aktivieren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Stützstruktur generieren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Damit werden Strukturen zur Unterstützung von Modellteilen mit Überhängen generiert. Ohne diese Strukturen würden solche Teile während des Druckvorgangs zusammenfallen." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Extruder für Stützstruktur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Wählen Sie, welcher Extruder für die Unterstützung verwendet wird. Dient zum Konstruieren von Stützstrukturen unter dem Modell, damit dieses nicht absinkt oder frei schwebend gedruckt wird." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Druckplattenhaftung" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Drucken eines Brim- oder Raft-Elements aktivieren. Es wird ein flacher Bereich rund um oder unter Ihrem Objekt hinzugefügt, das im Anschluss leicht abgeschnitten werden kann. " -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Sie benötigen Hilfe für Ihre Drucke?
    Lesen Sie die Ultimaker Anleitungen für Fehlerbehebung>" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Projektdatei öffnen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Dies ist eine Cura-Projektdatei. Möchten Sie diese als Projekt öffnen oder die Modelle hieraus importieren?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Als Projekt öffnen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Modelle importieren" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Engine-Protokoll" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Klicken Sie, um die Materialkompatibilität auf Ultimaker.com zu prüfen." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-Netzwerkverbindung" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3-Netzwerkverbindung (Cluster)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks Integration" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "G-Code-Profil-Reader" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Bietet eine Schichtenansicht." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Schichtenansicht" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Upgrade von Version 2.7 auf 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Werkzeug „Einstellungen pro Objekt“" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF-Writer" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-Profil-Reader" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Blockiert" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Druck startet nicht" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Connect wird geöffnet ..." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Druckdetails" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Um sicherzustellen, dass Ihr {machine_name} mit den neuesten Funktionen ausgestattet ist, wird empfohlen, die Firmware regelmäßig zu aktualisieren Dies kann auf dem {machine_name} (bei Anschluss an ein Netzwerk) oder über USB erfolgen." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Schichtenansicht" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Schichtenansicht" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Plugins durchsuchen" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Exportdetails" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Ein schwerer Ausnahmezustand ist aufgetreten, den wir nicht beseitigen konnten!

    \n" +#~ "

    Bitte senden Sie einen Fehlerbericht an folgende URL http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Webseite öffnen" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Dieser Drucker ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucker eingerichtet" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Dieser Drucker ist der Host für eine Gruppe von %1 verbundenen Ultimaker 3-Druckern" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Vorbereitung" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Fertiggestellt am: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Öffnet die Seite für Druckaufträge mit Ihrem Standard-Webbrowser." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "DRUCKERGRUPPE" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Das Laden eines Projekts entfernt alle Modelle von der Druckplatte" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " Das Plugin enthält eine Lizenz.\n" +#~ "Sie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\n" +#~ "Stimmen Sie den nachfolgenden Bedingungen zu?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00 Stunden 00 Minuten" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Zeitangaben" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Druckzeit" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr " distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "" +"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" +"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Der Abstand zwischen der Düse und den horizontalen Abwärtslinien. Bei einem größeren Abstand haben die diagonalen Abwärtslinien einen weniger spitzen Winkel, was wiederum weniger Aufwärtsverbindungen zur nächsten Schicht zur Folge hat. Dies gilt nur für das Drucken mit Drahtstruktur." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Glätten aktivieren" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Gehen Sie ein weiteres Mal über die Oberfläche, jedoch ohne Extrusionsmaterial. Damit wird der Kunststoff auf der Oberfläche weiter geschmolzen, was zu einer glatteren Oberfläche führt." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Nur oberste Schicht glätten" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Führen Sie das Glätten nur für die allerletzte Schicht des Meshs aus. Dies spart Zeit, wenn die unteren Schichten keine glatte Oberflächenausführung erfordern." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Glättungsmuster" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Das Muster, das für die Glättung der Oberflächen verwendet wird." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Konzentrisch" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zickzack" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Glättungslinienabstand" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Der Abstand zwischen den Glättungslinien." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Glättungsfluss" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Die Materialmenge relativ zu einer normalen Außenhautlinie, um während des Glättens zu extrudieren. Indem die Düse gefüllt bleibt, können einige Spalten in der oberen Schicht gefüllt werden, allerdings führt zu viel davon zu einer übermäßigen Extrudierung und Markierungen seitlich der Oberfläche." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Glättungseinsatz" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Eine Distanz, die von den Kanten des Modells einzuhalten ist. Die Glättung des gesamten Weges zur Kante des Mesh führt möglicherweise zu einer gezackten Kante Ihres Drucks." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Glättungsgeschwindigkeit" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Die Geschwindigkeit, mit der über die Oberfläche gegangen wird." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Beschleunigung Glättung" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "Die Beschleunigung, mit der das Glätten erfolgt." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Ruckfunktion glätten" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Die maximale unmittelbare Geschwindigkeitsänderung während des Glättens." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angewandt wird." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Extruder für Wand" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Extruder Innenwände" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Die für das Drucken der Wände verwendete Extruder-Einheit. Diese wird für die Mehrfach-Extrusion benutzt." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Das Muster des Füllmaterials des Drucks. Die Linien- und Zickzackfüllmethode wechseln nach jeder Schicht die Richtung, um Materialkosten zu reduzieren. Die Gitter-, Dreieck- Würfel-, Viertelwürfel-, Octahedral- und konzentrischen Muster werden in jeder Schicht vollständig gedruckt. Würfel-, Viertelwürfel- und Octahedral-Füllungen wechseln mit jeder Schicht, um eine gleichmäßigere Verteilung der Stärke in allen Richtungen zu erzielen." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Verbindet die Enden, an denen das Füllmuster auf die Innenwand trifft, mithilfe von Linien, die der Form der Innenwand folgen. Durch Aktivierung dieser Einstellung kann die Füllung besser an den Wänden haften; auch die Auswirkungen der Füllung auf die Qualität der vertikalen Flächen werden reduziert. Die Deaktivierung dieser Einstellung reduziert den Materialverbrauch." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\n" +#~ "Es handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden Skirt-Linien in äußerer Richtung angebracht." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Z-Versatz der ersten Schicht" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "Der Extruder wird um diesen Wert von der normalen Höhe der ersten Schicht versetzt. Das kann positiv (erhöht) oder negativ (abgesenkt) erfolgen. Einige Filamenttypen haften besser am Druckbett, wenn der Extruder leicht erhöht ist." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z-Versatz Kegelschichten" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Bei Nicht-Null wird der Z-Versatz auf 0 über den zahlreichen Schichten reduziert. Ein Wert von 0 bedeutet, dass der Z-Versatz über alle Schichten des Drucks hinweg konstant bleibt." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Diese Einstellung definiert, wie stark die Innenkanten des Raft-Umrisses gerundet werden. Die Innenkanten werden zu einem Halbkreis mit einem Radius entsprechend des hier definierten Werts gerundet. Diese Einstellung entfernt außerdem Löcher im Raft-Umriss, die kleiner als ein solcher Kreis sind." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angew #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Überlappung duale Extrusion" \ No newline at end of file +#~ msgstr "Überlappung duale Extrusion" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index f8f379d3d9..00eb28955a 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Impresión cancelada" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Deshabilitada" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Acción requerida" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "No se puede imprimir" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "La impresora no está configurada para alojar un grupo de impresoras Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Termina a las: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "La impresora aloja un grupo de %1 impresoras Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} ha terminado de imprimir «{job_name}»." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Impresión terminada" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Complementos" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Examinar complementos..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Complementos instalados..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Conectar con Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Cancelar" @@ -152,15 +90,15 @@ msgstr "Archivo enviado a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Abrir Connect" +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Abrir la interfaz web de Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Mostrar registro de cambios" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Conectado mediante USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "No se puede iniciar un trabajo nuevo porque la impresora está ocupada o no está conectada." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Datos de impresión" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Esta impresora no es compatible con la impresión USB porque utiliza el tipo UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "Impresión USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "No se puede iniciar un trabajo nuevo porque la impresora no es compatible con la impresión USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Advertencia" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "No se pudo guardar en unidad extraíble {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Error" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Unidad extraíble" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir a través de la red" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprime a través de la red." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Acceso a la impresora solicitado. Apruebe la solicitud en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Estado de la conexión" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Estado de la conexión" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Volver a intentar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Reenvía la solicitud de acceso." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Acceso a la impresora aceptado" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "No hay acceso para imprimir con esta impresora. No se puede enviar el trabajo de impresión." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Solicitar acceso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Envía la solicitud de acceso a la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Conectado a través de la red. Apruebe la solicitud de acceso en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Conectado a través de la red." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Conectado a través de la red. No hay acceso para controlar la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Solicitud de acceso denegada en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Se ha producido un error al solicitar acceso porque se ha agotado el tiempo de espera." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Se ha perdido la conexión de red." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Se ha perdido la conexión con la impresora. Compruebe que la impresora está conectada." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "No se puede iniciar un trabajo nuevo de impresión, la impresora está ocupada. El estado actual de la impresora es %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Estado de la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado ningún PrintCore en la ranura {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "No se puede iniciar un trabajo nuevo de impresión. No se ha cargado material en la ranura {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "No hay suficiente material para la bobina {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Material distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "El PrintCore {0} no está calibrado correctamente. Debe llevarse a cabo una calibración XY de la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "¿Seguro que desea imprimir con la configuración seleccionada?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "La configuración o calibración de la impresora y de Cura no coinciden. Para obtener el mejor resultado, segmente siempre los PrintCores y los materiales que se insertan en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuración desajustada" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Envío de nuevos trabajos (temporalmente) bloqueado; se sigue enviando el trabajo de impresión previo." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Enviando datos a la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Enviando datos" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "No se puede enviar datos a la impresora. ¿Hay otro trabajo que todavía esté activo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Cancelando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Impresión cancelada. Compruebe la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Pausando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Reanudando impresión..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizar con la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "¿Desea utilizar la configuración actual de su impresora en Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Los PrintCores o los materiales de la impresora difieren de los del proyecto actual. Para obtener el mejor resultado, segmente siempre los PrintCores y materiales que se hayan insertado en la impresora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Conectar a través de la red" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "La impresora no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "La impresora aloja un grupo de {count} impresoras conectadas de Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} ha terminado de imprimir «{job_name}». Recoja el impreso y confirme que ha borrado la placa de impresión." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} está reservada para imprimir «{job_name}». Modifique la configuración de la impresora de modo que se adapte al trabajo para comenzar la impresión." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Envío de nuevos trabajos (temporalmente) bloqueado; se sigue enviando el trabajo de impresión previo." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "No se pudo enviar el nuevo trabajo de impresión: esta impresora 3D (todavía) no está configurada para alojar un grupo de impresoras de Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Enviando {file_name} al grupo {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "Enviar {file_name} al grupo {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Mostrar trabajos de impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Abre la interfaz de trabajos de impresión en el navegador." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "No se puede enviar el trabajo de impresión al grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "Enviar {file_name} al grupo {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Mostrar trabajos de impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Abre la interfaz de trabajos de impresión en el navegador." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Desconocido" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} ha terminado de imprimir «{job_name}»." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Impresión terminada" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Acción requerida" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Enviando {file_name} al grupo {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Conectar a través de la red" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Para garantizar que su {machine_name} disponga de las prestaciones más recientes, se recomienda actualizar el firmware con regularidad. Esto se puede hacer en la {machine_name} (cuando esté conectada a la red) o vía USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nuevo firmware de %s disponible" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Descargar" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "No se pudo acceder a la información actualizada." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Error al iniciar %s" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura no muestra correctamente las capas si la impresión de alambre está habilitada." + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Modificar GCode" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "Archivo GCode" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Vista de capas" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura no muestra correctamente las capas si la impresión de alambre está habilitada." - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Vista de capas" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "No se puede segmentar con el material actual, ya que es incompatible con #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "No se puede segmentar" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Los ajustes actuales no permiten la segmentación. Los siguientes ajustes contienen errores: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "No se puede segmentar porque la torre auxiliar o la posición o posiciones de preparación no son válidas." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "No hay nada que segmentar porque ninguno de los modelos se adapta al volumen de impresión. Escale o rote los modelos para que se adapten." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Procesando capas" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Información" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Configurar ajustes por modelo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Recomendado" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizado" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Archivo 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Tobera" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Examinar complementos" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "No se pudo obtener la ID del complemento de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Advertencia" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Explorador de complementos" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Archivo G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analizar GCode" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Datos de GCode" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Asegúrese de que el GCode es adecuado para la impresora y para su configuración antes de enviar el archivo a la misma. Es posible que la representación del GCode no sea precisa." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivelar placa de impresión" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Pared exterior" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Paredes interiores" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Forro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Relleno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Relleno de soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interfaz de soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Soporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Falda" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Desplazamiento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Retracciones" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Otro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Archivo {0} presegmentado" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "No se ha cargado material." -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Material desconocido" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "No se puede encontrar la ubicación" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "El archivo ya existe" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Material personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "El material seleccionado no es compatible con la máquina o la configuración seleccionada." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Deshacer cambio del diámetro del material." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Error al exportar el perfil a {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Error al exportar el perfil a {0}: Error en el complemento de escritura." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Perfil exportado a {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Datos de exportación" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Error al importar el perfil de {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Perfil {0} importado correctamente" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "El perfil {0} tiene un tipo de archivo desconocido o está corrupto." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Perfil personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Al perfil le falta un tipo de calidad." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando objeto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Informe del accidente" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Se ha producido una excepción fatal de la que no podemos recuperarnos.

    \n

    Use la siguiente información para enviar un informe de error a http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Abrir página web" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Cargando máquinas..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Configurando escena..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Cargando interfaz..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Solo se puede cargar un archivo GCode a la vez. Se omitió la importación de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "No se puede abrir ningún archivo si se está cargando un archivo GCode. Se omitió la importación de {0}" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Ajustes de la máquina" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Impresora" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Ajustes de la impresora" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (anchura)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (profundidad)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (altura)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Forma de la placa de impresión" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Origen en el centro" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Plataforma caliente" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Tipo de Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Ajustes del cabezal de impresión" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X mín." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distancia desde la parte izquierda del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y mín." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distancia desde la parte frontal del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X máx." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distancia desde la parte derecha del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y máx." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distancia desde la parte trasera del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Altura del caballete" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Diferencia de altura entre la punta de la tobera y el sistema del puente (ejes X e Y). Se usa para evitar que colisionen la impresión anterior con el caballete al imprimir «de uno en uno»." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Número de extrusores" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "El diámetro nominal del filamento compatible con la impresora. El diámetro exacto se sobrescribirá según el material o el perfil." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Diámetro del material" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Tamaño de la tobera" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Iniciar GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Los comandos de Gcode que se ejecutarán justo al inicio." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Finalizar GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Los comandos de Gcode que se ejecutarán justo al final." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ajustes de la tobera" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Desplazamiento de la tobera sobre el eje X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Desplazamiento de la tobera sobre el eje Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "GCode inicial del extrusor" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "GCode final del extrusor" @@ -1406,12 +1448,11 @@ msgstr "Registro de cambios" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Código de error desconocido: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Conectar con la impresora en red" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" +msgstr "" +"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" +"\n" +"Seleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Agregar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Editar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Eliminar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Actualizar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Si la impresora no aparece en la lista, lea la guía de solución de problemas de impresión y red" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Desconocido" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Versión de firmware" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Dirección" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "La impresora no está configurada para alojar un grupo de impresoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "La impresora aloja un grupo de %1 impresoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "La impresora todavía no ha respondido en esta dirección." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Conectar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Dirección de la impresora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Introduzca la dirección IP o el nombre de host de la impresora en red." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "Aceptar" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Imprimir a través de la red" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Ver trabajos de impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Preparando para impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Imprimiendo" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Disponible" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Se ha perdido la conexión con la impresora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Reservado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Terminado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Impresión cancelada" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "No se aceptan trabajos de impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Termina a las: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Borrar placa de impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Esperando a que se cambie la configuración" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Trabajos de impresión" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Imprimiendo" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "En cola" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Impresoras" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Ver impresoras" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Conecta a una impresora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Carga la configuración de la impresora en Cura." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Activar configuración" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "La impresora no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "La impresora aloja un grupo de %1 impresoras conectadas de Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Imprimir a través de la red" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Imprimir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Imprimiendo" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Reservado" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Terminado" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Preparando" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Disponible" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Completado el: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Borrar placa de impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Preparando para impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "No se aceptan trabajos de impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Abre la página de trabajos de impresión en su navegador web por defecto." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Ver trabajos de impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "GRUPO DE IMPRESORAS" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Trabajos de impresión" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Imprimiendo" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "En cola" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Esperando a que se cambie la configuración" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Impresoras" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Ver impresoras" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Usar siempre calidad gruesa" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "Aceptar" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Fina" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Recordar mi selección" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Combinación de colores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Color del material" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Tipo de línea" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Modo de compatibilidad" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Mostrar desplazamientos" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Mostrar asistentes" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Mostrar perímetro" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Mostrar relleno" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Mostrar solo capas superiores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Mostrar cinco capas detalladas en la parte superior" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Superior o inferior" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Pared interior" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Secuencias de comandos de posprocesamiento" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Añadir secuencia de comando" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Cambia las secuencias de comandos de posprocesamiento." -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Combinación de colores" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Color del material" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Tipo de línea" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Modo de compatibilidad" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Mostrar desplazamientos" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Mostrar asistentes" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Mostrar perímetro" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Mostrar relleno" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Mostrar solo capas superiores" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Mostrar cinco capas detalladas en la parte superior" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Superior o inferior" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Pared interior" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Mostrar todo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Abrir proyecto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Actualizar existente" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Crear nuevo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Resumen: proyecto de Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Ajustes de la impresora" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "¿Cómo debería solucionarse el conflicto en la máquina?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nombre" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Ajustes del perfil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "¿Cómo debería solucionarse el conflicto en el perfil?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "No está en el perfil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 sobrescrito" msgstr[1] "%1 sobrescritos" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Derivado de" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 sobrescrito" msgstr[1] "%1, %2 sobrescritos" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Ajustes del material" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "¿Cómo debería solucionarse el conflicto en el material?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Visibilidad de los ajustes" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Modo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Ajustes visibles:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 de un total de %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Si carga un proyecto, se borrarán todos los modelos de la placa de impresión." +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Abrir" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Instalado" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Descargar" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Acuerdo de licencia de complemento" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " El complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las siguientes condiciones?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Rechazar" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "La impresora no acepta comandos." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "En mantenimiento. Compruebe la impresora." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Se ha perdido la conexión con la impresora." - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Imprimiendo..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "En pausa" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparando..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" +msgstr "" +"Ha personalizado parte de los ajustes del perfil.\n" +"¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Unidad" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "General" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "Enviar información (anónima) de impresión" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Impresoras" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Cambiar nombre" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Tipo de impresora:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Conexión:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "La impresora no está conectada." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Estado:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Esperando a que alguien limpie la placa de impresión..." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Esperando un trabajo de impresión..." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Perfiles" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Exportar perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materiales" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "El material se ha exportado correctamente a %1." #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Agregar impresora" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Acerca de Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "" +"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" +"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Biblioteca de recorte de polígonos" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Fuente" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Iconos SVG" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Perfil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." +msgstr "" +"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" +"\n" +"Haga clic para abrir el administrador de perfiles." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Buscar..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copiar valor en todos los extrusores" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ocultar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "No mostrar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Mostrar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar la visibilidad de los ajustes..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." +msgstr "" +"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" +"\n" +"Haga clic para mostrar estos ajustes." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." +msgstr "" +"Este ajuste tiene un valor distinto del perfil.\n" +"\n" +"Haga clic para restaurar el valor del perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." +msgstr "" +"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" +"\n" +"Haga clic para restaurar el valor calculado." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuración de impresión" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" +msgstr "" +"Ajustes de impresión deshabilitados\n" +"No se pueden modificar los archivos GCode" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00h 00min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Información sobre el tiempo" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Tiempo de impresión" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g/ ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuración de impresión recomendada

    Imprimir con los ajustes recomendados para la impresora, el material y la calidad seleccionados." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuración de impresión personalizada

    Imprimir con un control muy detallado del proceso de segmentación." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Abrir &reciente" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "No hay ninguna impresora conectada" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Extrusor" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Temperatura actual de este extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Color del material en este extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Material en este extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Tobera insertada en este extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Placa de impresión" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Temperatura objetivo de la plataforma calentada. La plataforma se calentará o enfriará en función de esta temperatura. Si el valor es 0, el calentamiento de la plataforma se desactivará." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Temperatura actual de la plataforma caliente." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Temperatura a la que se va a precalentar la plataforma." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Precalentar" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Caliente la plataforma antes de imprimir. Puede continuar ajustando la impresión durante el calentamiento, así no tendrá que esperar a que la plataforma se caliente para poder imprimir." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Activar impresión" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Nombre del trabajo" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Tiempo de impresión" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Tiempo restante estimado" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "A<ernar pantalla completa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Des&hacer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rehacer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Salir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Agregar impresora..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar impresoras ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar materiales..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Actualizar perfil con ajustes o sobrescrituras actuales" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar cambios actuales" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crear perfil a partir de ajustes o sobrescrituras actuales..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfiles..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostrar &documentación en línea" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Informar de un &error" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Acerca de..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Eliminar modelo &seleccionado" msgstr[1] "Eliminar modelos &seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centrar modelo seleccionado" msgstr[1] "Centrar modelos seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar modelo seleccionado" msgstr[1] "Multiplicar modelos seleccionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Eliminar modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrar modelo en plataforma" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar modelo..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Seleccionar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Borrar placa de impresión" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Recargar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Organizar todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Organizar selección" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Restablecer las posiciones de todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Restablecer las &transformaciones de todos los modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Abrir archivo(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuevo proyecto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "&Mostrar registro del motor..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostrar carpeta de configuración" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar visibilidad de los ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Examinar complementos..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Complementos instalados..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Cargue un modelo en 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Preparado para segmentar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Segmentando..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Listo para %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "No se puede segmentar." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "No se puede segmentar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Seleccione el dispositivo de salida activo" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Abrir archivo(s)" @@ -3619,112 +3767,117 @@ msgstr "Importar todos como modelos" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Guardar &selección en archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Guardar &como..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Guardar proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Edición" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "A&justes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Impresora" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Definir como extrusor activo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensiones" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Complementos" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Pre&ferencias" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "A&yuda" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Abrir archivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Nuevo proyecto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "¿Está seguro de que desea iniciar un nuevo proyecto? Esto borrará la placa de impresión y cualquier ajuste no guardado." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Instalar complemento" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Abrir archivo(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Hemos encontrado uno o más archivos de GCode entre los archivos que ha seleccionado. Solo puede abrir los archivos GCode de uno en uno. Si desea abrir un archivo GCode, seleccione solo uno." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Guardar proyecto" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Extrusor %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 y material" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "No mostrar resumen de proyecto al guardar de nuevo" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Guardar" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Supervisar" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Altura de capa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Velocidad de impresión" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Más lento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Más rápido" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Relleno" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un relleno gradual aumentará gradualmente la cantidad de relleno hacia arriba." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Habilitar gradual" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Generar soporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Generar estructuras para soportar piezas del modelo que tengan voladizos. Sin estas estructuras, estas piezas se romperían durante la impresión." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Extrusor del soporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Seleccione qué extrusor se utilizará como soporte. Esta opción formará estructuras de soporte por debajo del modelo para evitar que éste se combe o la impresión se haga en el aire." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adherencia de la placa de impresión" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Habilita la impresión de un borde o una balsa. Esta opción agregará un área plana alrededor del objeto, que es fácil de cortar después." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "¿Necesita ayuda para mejorar sus impresiones?
    Lea las Guías de solución de problemas de Ultimaker" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Abrir archivo de proyecto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Este es un archivo de proyecto Cura. ¿Le gustaría abrirlo como un proyecto o importar sus modelos?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Abrir como proyecto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Registro del motor" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Comprobar la compatibilidad de los materiales" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Haga clic para comprobar la compatibilidad de los materiales en Utimaker.com." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Conexión de red UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Conexión de red UM3 (grupo)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Integración con SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Lector de perfiles Gcode" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Proporciona la vista de capas." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Vista de capas" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Actualización de la versión 2.7 a la 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Herramienta de ajustes por modelo" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "Escritor de 3MF" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lector de perfiles de Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Deshabilitada" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "No se puede imprimir" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Abrir Connect" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Datos de impresión" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Para garantizar que su {machine_name} disponga de las prestaciones más recientes, se recomienda actualizar el firmware con regularidad. Esto se puede hacer en la {machine_name} (cuando esté conectada a la red) o vía USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Vista de capas" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Vista de capas" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Examinar complementos" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Datos de exportación" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Se ha producido una excepción fatal de la que no podemos recuperarnos.

    \n" +#~ "

    Use la siguiente información para enviar un informe de error a http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Abrir página web" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Aceptar" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "La impresora no está configurada para alojar un grupo de impresoras conectadas de Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "La impresora aloja un grupo de %1 impresoras conectadas de Ultimaker 3" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Preparando" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Completado el: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Abre la página de trabajos de impresión en su navegador web por defecto." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "GRUPO DE IMPRESORAS" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Si carga un proyecto, se borrarán todos los modelos de la placa de impresión." + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " El complemento incluye una licencia.\n" +#~ "Debe aceptar dicha licencia para instalar el complemento.\n" +#~ "¿Acepta las siguientes condiciones?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00h 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Información sobre el tiempo" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Tiempo de impresión" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g/ ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Comprobar la compatibilidad de los materiales" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Conexión de red UM3 (grupo)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Proporciona la vista de capas." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Vista de capas" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Rayos X" diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po index a435f60aae..616b670f93 100644 --- a/resources/i18n/es_ES/fdmextruder.def.json.po +++ b/resources/i18n/es_ES/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:31+0200\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index b472fd44a7..6e21158a77 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n." +msgstr "" +"Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Los comandos de Gcode que se ejecutarán justo al final - separados por \n." +msgstr "" +"Los comandos de Gcode que se ejecutarán justo al final - separados por \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -605,6 +609,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "Altura de capa inicial en mm. Una capa inicial más gruesa se adhiere a la placa de impresión con mayor facilidad." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +784,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Perímetro" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Extrusor de pared" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "El tren extrusor que se utiliza para imprimir paredes. Se emplea en la extrusión múltiple." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +806,8 @@ msgstr "El tren extrusor que se utiliza para imprimir la pared exterior. Se empl #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Extrusor de paredes interiores" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1239,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Reemplaza la parte más externa del patrón superior/inferior con un número de líneas concéntricas. Mediante el uso de una o dos líneas mejora los techos que comienzan en el material de relleno." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Habilitar alisado" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Pasar por la superficie superior una vez más, pero sin extruir material, para derretir la parte externa del plástico y crear una superficie más lisa." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Planchar solo la capa superior" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Planchar únicamente la última capa de la malla. De este modo se ahorra tiempo si las capas inferiores no requieren un acabado superficial suave." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Patrón de alisado" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "El patrón que se usará para el alisado de las superficies superiores." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concéntrico" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zigzag" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Espaciado de líneas del alisado" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Distancia entre las líneas del alisado" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Flujo de alisado" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Cantidad de material (relativa a la línea del forro normal) que se extruye durante el alisado. Dejar la tobera llena permite rellenar algunas grietas de la superficie, pero llenarla demasiado puede provocar la sobrextrusión y afectar a la superficie." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Inserción de alisado" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Distancia que debe guardarse desde el borde del modelo. Si se alisa hasta el borde de la malla, puede quedar un borde irregular." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Velocidad de alisado" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Velocidad a la que pasa por encima de la superficie superior." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Aceleración del alisado" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "La aceleración a la que se produce el alisado." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Impulso de alisado" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Cambio en la velocidad instantánea máxima durante el alisado." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1386,8 @@ msgstr "Patrón de relleno" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Patrón del material de relleno de la impresión. El relleno de línea y zigzag cambia de dirección en capas alternas, con lo que se reduce el coste del material. Los patrones de rejilla, triángulo, cúbico, de octeto, cúbico bitruncado y concéntrico se imprimen en todas las capas por completo. El relleno cúbico, cúbico bitruncado y de octeto cambian en cada capa para proporcionar una distribución de fuerza equitativa en cada dirección." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1404,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Triángulos" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1461,8 @@ msgstr "Conectar líneas de relleno" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Conectar los extremos donde los patrones de relleno se juntan con la pared interior usando una línea que siga la forma de esta. Habilitar este ajuste puede lograr que el relleno se adhiera mejor a las paredes y reduce el efecto del relleno sobre la calidad de las superficies verticales. Deshabilitar este ajuste reduce la cantidad de material utilizado." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1474,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Una lista de los valores enteros de las direcciones de línea. Los elementos de esta lista se utilizan de forma secuencial a medida que las capas se utilizan y, cuando se alcanza el final, la lista vuelve a comenzar desde el principio. Los elementos de la lista están separados por comas y toda la lista aparece entre corchetes. El valor predeterminado es una lista vacía que utiliza los ángulos predeterminados típicos (45 y 135 grados para las líneas y los patrones en zigzag y 45 grados para el resto de patrones)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1804,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Ajusta el diámetro del filamento utilizado. Este valor debe coincidir con el diámetro del filamento utilizado." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3014,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Conectar los zigzags. Esto aumentará la resistencia de la estructura del soporte de zigzag." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Descomponer el soporte en pedazos" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Omitir algunas conexiones de línea de soporte para que la estructura de soporte sea más fácil de descomponer. Este ajuste es aplicable al patrón de relleno del soporte en zigzag." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Tamaño de los pedazos de soporte" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Omitir una conexión entre líneas de soporte una vez cada N milímetros a fin de lograr que la estructura de soporte resulte más fácil de descomponer." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Recuento de líneas de pedazos del soporte" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Omitir una de cada N líneas de conexión para que la estructura de soporte se descomponga fácilmente." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3553,8 @@ msgstr "Distancia de falda" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nEsta es la distancia mínima; múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3596,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Imprimir solo el borde en el exterior del modelo. Esto reduce el número de bordes que deberá retirar después sin que la adherencia a la plataforma se vea muy afectada." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Desplazamiento Z de la capa inicial" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "El extrusor se desplaza de la altura normal de la primera capa con este valor, el cual puede ser positivo (elevado) o negativo (bajo). Algunas clases de filamentos se adhieren mejor a la placa de impresión si se levanta ligeramente el extrusor." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Desplazamiento Z de capas en disminución" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Si no es cero, el desplazamiento Z se reduce a cero en las capas. Un valor de cero implica que el desplazamiento Z se mantiene constante en todas las capas de impresión." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3613,8 @@ msgstr "Suavizado de la balsa" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Este ajuste controla la medida en que se redondean las esquinas interiores en el contorno de la balsa. Las esquinas hacia el interior se redondean en semicírculo con un radio equivalente al valor aquí indicado. Este ajuste también elimina los orificios del contorno de la balsa que sean más pequeños que dicho círculo." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4086,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normalmente, Cura intenta coser los pequeños agujeros de la malla y eliminar las partes de una capa con grandes agujeros. Al habilitar esta opción se mantienen aquellas partes que no puedan coserse. Esta opción se debe utilizar como una opción de último recurso cuando todo lo demás falla para producir un GCode adecuado." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4126,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Cambiar la malla a la que pertenecerán los volúmenes que se cruzan en cada capa, de forma que las mallas superpuestas se entrelacen. Desactivar esta opción dará lugar a que una de las mallas reciba todo el volumen de la superposición y que este se elimine de las demás mallas." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4341,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Optimizar el orden en el que se imprimen las paredes a fin de reducir el número de retracciones y la distancia recorrida. La mayoría de los componentes se beneficiarán si este ajuste está habilitado pero, en algunos casos, se puede tardar más, por lo que deben compararse las previsiones de tiempo de impresión con y sin optimización." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Descomponer el soporte en pedazos" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Omitir algunas conexiones de línea de soporte para que la estructura de soporte sea más fácil de descomponer. Este ajuste es aplicable al patrón de relleno del soporte en zigzag." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Tamaño de los pedazos de soporte" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Omitir una conexión entre líneas de soporte una vez cada N milímetros a fin de lograr que la estructura de soporte resulte más fácil de descomponer." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Recuento de líneas de pedazos del soporte" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Omitir una de cada N líneas de conexión para que la estructura de soporte se descomponga fácilmente." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4661,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Distancia media entre los puntos aleatorios introducidos en cada segmento de línea. Tenga en cuenta que los puntos originales del polígono se descartan, así que un suavizado alto produce una reducción de la resolución. Este valor debe ser mayor que la mitad del grosor del forro difuso." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "" +"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" +"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Distancia entre la tobera y líneas descendentes en horizontal. Cuanto mayor sea la holgura, menos pronunciado será el ángulo de las líneas descendentes en diagonal, lo que a su vez se traduce en menos conexiones ascendentes con la siguiente capa. Solo se aplica a la impresión de alambre." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Habilitar alisado" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Pasar por la superficie superior una vez más, pero sin extruir material, para derretir la parte externa del plástico y crear una superficie más lisa." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Planchar solo la capa superior" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Planchar únicamente la última capa de la malla. De este modo se ahorra tiempo si las capas inferiores no requieren un acabado superficial suave." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Patrón de alisado" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "El patrón que se usará para el alisado de las superficies superiores." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Concéntrico" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zigzag" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Espaciado de líneas del alisado" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Distancia entre las líneas del alisado" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Flujo de alisado" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Cantidad de material (relativa a la línea del forro normal) que se extruye durante el alisado. Dejar la tobera llena permite rellenar algunas grietas de la superficie, pero llenarla demasiado puede provocar la sobrextrusión y afectar a la superficie." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Inserción de alisado" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Distancia que debe guardarse desde el borde del modelo. Si se alisa hasta el borde de la malla, puede quedar un borde irregular." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Velocidad de alisado" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Velocidad a la que pasa por encima de la superficie superior." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Aceleración del alisado" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "La aceleración a la que se produce el alisado." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Impulso de alisado" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Cambio en la velocidad instantánea máxima durante el alisado." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue desde el archivo." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Extrusor de pared" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Extrusor de paredes interiores" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "El tren extrusor que se utiliza para imprimir paredes. Se emplea en la extrusión múltiple." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Patrón del material de relleno de la impresión. El relleno de línea y zigzag cambia de dirección en capas alternas, con lo que se reduce el coste del material. Los patrones de rejilla, triángulo, cúbico, de octeto, cúbico bitruncado y concéntrico se imprimen en todas las capas por completo. El relleno cúbico, cúbico bitruncado y de octeto cambian en cada capa para proporcionar una distribución de fuerza equitativa en cada dirección." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Conectar los extremos donde los patrones de relleno se juntan con la pared interior usando una línea que siga la forma de esta. Habilitar este ajuste puede lograr que el relleno se adhiera mejor a las paredes y reduce el efecto del relleno sobre la calidad de las superficies verticales. Deshabilitar este ajuste reduce la cantidad de material utilizado." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "La distancia horizontal entre la falda y la primera capa de la impresión.\n" +#~ "Esta es la distancia mínima; múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Desplazamiento Z de la capa inicial" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "El extrusor se desplaza de la altura normal de la primera capa con este valor, el cual puede ser positivo (elevado) o negativo (bajo). Algunas clases de filamentos se adhieren mejor a la placa de impresión si se levanta ligeramente el extrusor." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Desplazamiento Z de capas en disminución" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Si no es cero, el desplazamiento Z se reduce a cero en las capas. Un valor de cero implica que el desplazamiento Z se mantiene constante en todas las capas de impresión." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Este ajuste controla la medida en que se redondean las esquinas interiores en el contorno de la balsa. Las esquinas hacia el interior se redondean en semicírculo con un radio equivalente al valor aquí indicado. Este ajuste también elimina los orificios del contorno de la balsa que sean más pequeños que dicho círculo." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue de #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Superposición de extrusión doble" \ No newline at end of file +#~ msgstr "Superposición de extrusión doble" diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po index ae60ff98c6..461bfd63db 100644 --- a/resources/i18n/fi_FI/cura.po +++ b/resources/i18n/fi_FI/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Tulostus keskeytetty" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Tukossa" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Vaatii toimenpiteitä" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Tulostus ei käynnisty" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Tätä tulostinta ei ole määritetty Ultimaker 3 -tulostinryhmän isännäksi." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Päättyy: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Tämä tulostin on {count} tulostimen Ultimaker 3 -ryhmän isäntä." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} on tulostanut työn '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Tulosta valmis" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Lisäosat" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Selaa lisäosia..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Asennetut lisäoset..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Yhteyden muodostaminen Doodle3D Connectiin" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Peruuta" @@ -152,15 +90,15 @@ msgstr "Tiedosto lähetetty Doodle3D Connectiin" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Avaa Connect..." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Avaa Doodle3D Connect -verkkoliittymä" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Näytä muutosloki" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Yhdistetty USB:n kautta" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Uuden työn aloittaminen ei onnistu, koska tulostin on varattu tai sitä ei ole yhdistetty." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Tulostustiedot" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Tämä tulostin ei tue USB-tulostusta, koska se käyttää UltiGCode-tyyppiä." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-tulostus" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Uuden työn aloittaminen ei onnistu, koska tulostin ei tue USB-tulostusta." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Varoitus" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Ei voitu tallentaa siirrettävälle asemalle {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Virhe" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Siirrettävä asema" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Tulosta verkon kautta" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Tulosta verkon kautta" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Tulostimen käyttöoikeutta pyydetty. Hyväksy tulostimen pyyntö" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Yhteyden tila" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Yhteyden tila" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Yritä uudelleen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Lähetä käyttöoikeuspyyntö uudelleen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Tulostimen käyttöoikeus hyväksytty" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Tällä tulostimella tulostukseen ei ole käyttöoikeutta. Tulostustyön lähetys ei onnistu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Pyydä käyttöoikeutta" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Lähetä tulostimen käyttöoikeuspyyntö" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Yhdistetty verkon kautta. Hyväksy tulostimen käyttöoikeuspyyntö." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Yhdistetty verkon kautta tulostimeen." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Yhdistetty verkon kautta tulostimeen. Ei käyttöoikeutta tulostimen hallintaan." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Tulostimen käyttöoikeuspyyntö hylättiin." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Käyttöoikeuspyyntö epäonnistui aikakatkaisun vuoksi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Yhteys verkkoon menetettiin." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Yhteys tulostimeen menetettiin. Tarkista, onko tulostin yhdistetty." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Uuden tulostustyön aloittaminen ei onnistu, koska tulostin on varattu. Nykyinen tulostimen tila on %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Tulostimen tila" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Uuden tulostustyön aloittaminen ei onnistu. PrintCorea ei ole ladattu aukkoon {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Uuden tulostustyön aloittaminen ei onnistu. Materiaalia ei ole ladattu aukkoon {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Kelalle {0} ei ole tarpeeksi materiaalia." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Eri PrintCore (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Eri materiaali (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "Print Core -tulostusydintä {0} ei ole kalibroitu oikein. Tulostimen XY-kalibrointi tulee suorittaa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Haluatko varmasti tulostaa valitulla määrityksellä?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Tulostimen ja Curan määrityksen tai kalibroinnin välillä on ristiriita. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Ristiriitainen määritys" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Uusien töiden lähettäminen (tilapäisesti) estetty, edellistä tulostustyötä lähetetään vielä." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Lähetetään tietoja tulostimeen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Lähetetään tietoja" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Tietojen lähetys tulostimeen ei onnistu. Onko toinen työ yhä aktiivinen?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Keskeytetään tulostus..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Tulostus keskeytetty. Tarkista tulostin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Tulostus pysäytetään..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Tulostusta jatketaan..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synkronoi tulostimen kanssa" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Haluatko käyttää nykyistä tulostimen määritystä Curassa?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Tulostimen PrintCoret tai materiaalit eivät vastaa tulostettavan projektin asetuksia. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Yhdistä verkon kautta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Tätä tulostinta ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Tämä tulostin on {count} tulostimen yhdistetyn Ultimaker 3 -ryhmän isäntä." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} on tulostanut työn '{job_name}'. Nouda työ ja vahvista alustan tyhjennys." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} on varattu työn {job_name} tulostamiseen. Muuta tulostimen määritys vastaamaan työtä, jotta tulostus alkaa." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Uusien töiden lähettäminen (tilapäisesti) estetty, edellistä tulostustyötä lähetetään vielä." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Uuden tulostustyön lähetys ei onnistu: tätä 3D-tulostinta ei ole (vielä) määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Lähetetään tiedostoa {file_name} ryhmään {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "Lähetettiin {file_name} ryhmään {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Näytä tulostustyöt" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Avaa tulostustöiden käyttöliittymän selaimessa." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Tulostustyön lähetys ryhmään {cluster_name} ei onnistu." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "Lähetettiin {file_name} ryhmään {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Näytä tulostustyöt" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Avaa tulostustöiden käyttöliittymän selaimessa." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Tuntematon" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} on tulostanut työn '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Tulosta valmis" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Vaatii toimenpiteitä" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Lähetetään tiedostoa {file_name} ryhmään {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Yhdistä verkon kautta" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "On suositeltavaa päivittää laiteohjelmisto säännöllisesti, jotta voidaan varmistaa, että laitteessa {machine_name} on viimeisimmät ominaisuudet. Tämä voidaan tehdä laitteessa {machine_name} (verkkoon yhdistettynä) tai USB:n kautta." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Uusi tulostimen %s laiteohjelmisto saatavilla" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Lataa" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Päivitystietoja ei löytynyt." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "%s:n käynnistyksen aikana ilmeni virhe!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura ei näytä kerroksia täsmällisesti, kun rautalankatulostus on käytössä" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Muokkaa GCode-arvoa" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "GCode-tiedosto" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Kerrosnäkymä" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura ei näytä kerroksia täsmällisesti, kun rautalankatulostus on käytössä" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Kerrosnäkymä" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Viipalointi ei onnistu nykyisellä materiaalilla, sillä se ei sovellu k #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Viipalointi ei onnistu" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Viipalointi ei onnistu nykyisten asetuksien ollessa voimassa. Seuraavissa asetuksissa on virheitä: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Viipalointi ei onnistu, koska esitäyttötorni tai esitäytön sijainti tai sijainnit eivät kelpaa." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Ei viipaloitavaa, koska mikään malleista ei sovellu tulostustilavuuteen. Skaalaa tai pyöritä mallia, kunnes se on sopiva." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Käsitellään kerroksia" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Tiedot" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Määritä mallikohtaiset asetukset" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Suositeltu" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Mukautettu" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-tiedosto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Suutin" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Selaa lisäosia" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Lisäosan tunnuksen hankkiminen epäonnistui tiedostosta {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Varoitus" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Lisäosien selain" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G File -tiedosto" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-coden jäsennys" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-coden tiedot" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Varmista, että G-code on tulostimelle ja sen tulostusasetuksille soveltuva, ennen kuin lähetät tiedoston siihen. G-coden esitys ei välttämättä ole tarkka." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Tasaa alusta" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Ulkoseinämä" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Sisäseinämät" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Pintakalvo" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Täyttö" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Tuen täyttö" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Tukiliittymä" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Tuki" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Helma" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Siirtoliike" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Takaisinvedot" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Muu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Esiviipaloitu tiedosto {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Ei ladattua materiaalia" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Tuntematon materiaali" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Paikkaa ei löydy" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Tiedosto on jo olemassa" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Mukautettu materiaali" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Valittu materiaali ei sovellu käytettäväksi valitun laitteen tai kokoonpanon kanssa." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Kumoa materiaalin halkaisijan muutokset." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Profiilin vienti epäonnistui tiedostoon {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Profiilin vienti epäonnistui tiedostoon {0}: Kirjoitin-lisäosa ilmoitti virheestä." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profiili viety tiedostoon {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Viennin tiedot" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Profiilin tuonti epäonnistui tiedostosta {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Onnistuneesti tuotu profiili {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profiililla {0} on tuntematon tiedostotyyppi tai se on vioittunut." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Mukautettu profiili" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profiilista puuttuu laatutyyppi." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Sijoitetaan kappaletta" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Kaatumisraportti" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Tapahtui vakava poikkeus, josta palautuminen ei onnistunut!

    \n

    Tee virheraportti alla olevien tietojen perusteella osoitteessa http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Avaa verkkosivu" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Ladataan laitteita..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Asetetaan näkymää..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Ladataan käyttöliittymää..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Vain yksi G-code-tiedosto voidaan ladata kerralla. Tiedoston {0} tuonti ohitettiin." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Muita tiedostoja ei voida ladata, kun G-code latautuu. Tiedoston {0} tuonti ohitettiin." +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Laitteen asetukset" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Tulostin" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Tulostimen asetukset" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (leveys)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (syvyys)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (korkeus)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Alustan muoto" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Alkukohta keskellä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Lämmitettävä pöytä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "GCode-tyyppi" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Tulostuspään asetukset" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X väh." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Etäisyys tulostuspään vasemmalta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y väh." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Etäisyys tulostuspään etupuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X enint." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Etäisyys tulostuspään oikealta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y enint." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Etäisyys tulostuspään takapuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Korokkeen korkeus" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Suuttimen kärjen ja korokejärjestelmän (X- ja Y-akselit) välinen korkeusero. Käytetään estämään aiempien tulosteiden ja korokkeen yhteentörmäyksiä, kun tulostetaan yksi kerrallaan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Suulakkeiden määrä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Tulostimen tukema tulostuslangan nimellinen halkaisija. Materiaali ja/tai profiili korvaa tarkan halkaisijan." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Materiaalin halkaisija" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Suuttimen koko" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Aloita GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "GCode-komennot, jotka suoritetaan aivan alussa." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Lopeta GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "GCode-komennot, jotka suoritetaan aivan lopussa." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Suutinasetukset" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Suuttimen X-siirtymä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Suuttimen Y-siirtymä" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Suulake – aloita Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Suulake – lopeta Gcode" @@ -1406,12 +1448,11 @@ msgstr "Muutosloki" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Tuntemattoman virheen koodi: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Yhdistä verkkotulostimeen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Tulosta suoraan tulostimeen verkon kautta yhdistämällä tulostin verkkoon verkkokaapelilla tai yhdistämällä tulostin Wi-Fi-verkkoon. Jos Curaa ei yhdistetä tulostimeen, GCode-tiedostot voidaan silti siirtää tulostimeen USB-aseman avulla.\n\nValitse tulostin alla olevasta luettelosta:" +msgstr "" +"Tulosta suoraan tulostimeen verkon kautta yhdistämällä tulostin verkkoon verkkokaapelilla tai yhdistämällä tulostin Wi-Fi-verkkoon. Jos Curaa ei yhdistetä tulostimeen, GCode-tiedostot voidaan silti siirtää tulostimeen USB-aseman avulla.\n" +"\n" +"Valitse tulostin alla olevasta luettelosta:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Lisää" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Muokkaa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Poista" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Päivitä" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Jos tulostinta ei ole luettelossa, lue verkkotulostuksen vianetsintäopas" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Tyyppi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Tuntematon" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Laiteohjelmistoversio" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Osoite" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Tätä tulostinta ei ole määritetty Ultimaker 3 -tulostinryhmän isännäksi." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Tämä tulostin on {count} tulostimen Ultimaker 3 -ryhmän isäntä." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "Tämän osoitteen tulostin ei ole vielä vastannut." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Yhdistä" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Tulostimen osoite" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Anna verkon tulostimen IP-osoite tai isäntänimi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "OK" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Tulosta verkon kautta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Tulosta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Näytä tulostustyöt" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Valmistellaan tulostusta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Tulostetaan" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Saatavilla" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Yhteys tulostimeen menetetty" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Varattu" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Valmis" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Tulostus keskeytetty" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Ei hyväksy tulostustöitä" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Päättyy: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Tyhjennä alusta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Odotetaan määrityksen muutosta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Tulostustyöt" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Tulostetaan" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Jonossa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Tulostimet" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Näytä tulostimet" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Yhdistä tulostimeen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Lataa tulostimen määritys Curaan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Aktivoi määritys" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Tätä tulostinta ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Tämä tulostin on %1 tulostimen yhdistetyn Ultimaker 3 -ryhmän isäntä" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Tulosta verkon kautta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Tulosta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Tulostetaan" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Varattu" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Valmis" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Valmistellaan" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Saatavilla" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Valmistunut: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Tyhjennä alusta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Valmistellaan tulostusta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Ei hyväksy tulostustöitä" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Avaa tulostöiden sivun oletusselaimessa." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Näytä tulostustyöt" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "TULOSTINRYHMÄ" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Tulostustyöt" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Tulostetaan" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Jonossa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Odotetaan määrityksen muutosta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Tulostimet" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Näytä tulostimet" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Käytä aina karkeaa laatua" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Hieno" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Muista valintani" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Värimalli" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Materiaalin väri" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Linjojen tyyppi" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Yhteensopivuustila" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Näytä siirtoliikkeet" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Näytä avustimet" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Näytä kuori" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Näytä täyttö" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Näytä vain yläkerrokset" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Näytä 5 yksityiskohtaista kerrosta ylhäällä" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Yläosa/alaosa" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Sisäseinämä" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Jälkikäsittelykomentosarjat" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Lisää komentosarja" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Asetukset" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Muuta aktiivisia jälkikäsittelykomentosarjoja" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Värimalli" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Materiaalin väri" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Linjojen tyyppi" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Yhteensopivuustila" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Näytä siirtoliikkeet" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Näytä avustimet" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Näytä kuori" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Näytä täyttö" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Näytä vain yläkerrokset" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Näytä 5 yksityiskohtaista kerrosta ylhäällä" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Yläosa/alaosa" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Sisäseinämä" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Näytä kaikki" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Avaa projekti" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Päivitä nykyinen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Luo uusi" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Yhteenveto – Cura-projekti" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Tulostimen asetukset" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Miten laitteen ristiriita pitäisi ratkaista?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Tyyppi" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nimi" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Profiilin asetukset" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Miten profiilin ristiriita pitäisi ratkaista?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Ei profiilissa" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 ohitus" msgstr[1] "%1 ohitusta" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Johdettu seuraavista" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 ohitus" msgstr[1] "%1, %2 ohitusta" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Materiaaliasetukset" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Miten materiaalin ristiriita pitäisi ratkaista?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Asetusten näkyvyys" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Tila" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Näkyvät asetukset:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1/%2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Projektin lataaminen poistaa kaikki alustalla olevat mallit" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Avaa" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Asennettu" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Lataa" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Lisäosan lisenssisopimus" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " lisäosa sisältää lisenssin.\nLisenssi on hyväksyttävä lisäosan asentamista varten.\nHyväksytkö alla olevat ehdot?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Hylkää" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "Tulostin ei hyväksy komentoja" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Huolletaan. Tarkista tulostin" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Yhteys tulostimeen menetetty" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Tulostetaan..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Keskeytetty" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Valmistellaan..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Olet mukauttanut profiilin asetuksia.\nHaluatko säilyttää vai hylätä nämä asetukset?" +msgstr "" +"Olet mukauttanut profiilin asetuksia.\n" +"Haluatko säilyttää vai hylätä nämä asetukset?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Yksikkö" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Yleiset" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "Lähetä (anonyymit) tulostustiedot" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Tulostimet" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Nimeä uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Tulostimen tyyppi:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Yhteys:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Tulostinta ei ole yhdistetty." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Tila:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Odotetaan tulostusalustan tyhjennystä" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Odotetaan tulostustyötä" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profiilit" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Profiilin vienti" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materiaalit" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Materiaalin vieminen onnistui kohteeseen %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Lisää tulostin" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Tietoja Curasta" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura-ohjelman on kehittänyt Ultimaker B.V. yhteistyössä käyttäjäyhteisön kanssa.\nCura hyödyntää seuraavia avoimeen lähdekoodiin perustuvia projekteja:" +msgstr "" +"Cura-ohjelman on kehittänyt Ultimaker B.V. yhteistyössä käyttäjäyhteisön kanssa.\n" +"Cura hyödyntää seuraavia avoimeen lähdekoodiin perustuvia projekteja:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Monikulmion leikkauskirjasto" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Fontti" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG-kuvakkeet" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profiili:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Jotkut asetusten ja ohitusten arvot eroavat profiiliin tallennetuista arvoista.\n\nAvaa profiilin hallinta napsauttamalla." +msgstr "" +"Jotkut asetusten ja ohitusten arvot eroavat profiiliin tallennetuista arvoista.\n" +"\n" +"Avaa profiilin hallinta napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Haku…" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Kopioi arvo kaikkiin suulakepuristimiin" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Piilota tämä asetus" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Älä näytä tätä asetusta" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Pidä tämä asetus näkyvissä" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Määritä asetusten näkyvyys..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Jotkin piilotetut asetukset käyttävät arvoja, jotka eroavat normaaleista lasketuista arvoista.\n\nTee asetuksista näkyviä napsauttamalla." +msgstr "" +"Jotkin piilotetut asetukset käyttävät arvoja, jotka eroavat normaaleista lasketuista arvoista.\n" +"\n" +"Tee asetuksista näkyviä napsauttamalla." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Tämän asetuksen arvo eroaa profiilin arvosta.\n\nPalauta profiilin arvo napsauttamalla." +msgstr "" +"Tämän asetuksen arvo eroaa profiilin arvosta.\n" +"\n" +"Palauta profiilin arvo napsauttamalla." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Tämä asetus on normaalisti laskettu, mutta sillä on tällä hetkellä absoluuttinen arvo.\n\nPalauta laskettu arvo napsauttamalla." +msgstr "" +"Tämä asetus on normaalisti laskettu, mutta sillä on tällä hetkellä absoluuttinen arvo.\n" +"\n" +"Palauta laskettu arvo napsauttamalla." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Tulostuksen asennus" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Tulostuksen asennus ei käytössä\nG-code-tiedostoja ei voida muokata" +msgstr "" +"Tulostuksen asennus ei käytössä\n" +"G-code-tiedostoja ei voida muokata" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00 h 00 min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Aikatiedot" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Tulostusaika" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1 m / ~ %2 g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1 m / ~ %2 g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Suositeltu tulostuksen asennus

    Tulosta valitun tulostimen, materiaalin ja laadun suositelluilla asetuksilla." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Mukautettu tulostuksen asennus

    Tulosta hallitsemalla täysin kaikkia viipalointiprosessin vaiheita." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automaattinen: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Näytä" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automaattinen: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Avaa &viimeisin" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Ei tulostinta yhdistettynä" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Suulake" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Tämän suulakkeen nykyinen lämpötila." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Tämän suulakkeen materiaalin väri." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Tämän suulakkeen materiaali." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Tähän suulakkeeseen liitetty suutin." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Alusta" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Lämmitettävän pöydän kohdelämpötila. Pöytä lämpenee tai viilenee kohti tätä lämpötilaa. Jos asetus on 0, pöydän lämmitys sammutetaan." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Lämmitettävän pöydän nykyinen lämpötila." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Lämmitettävän pöydän esilämmityslämpötila." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Peruuta" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Esilämmitä" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Lämmitä pöytä ennen tulostusta. Voit edelleen säätää tulostinta sen lämmitessä, eikä sinun tarvitse odottaa pöydän lämpiämistä, kun olet valmis tulostamaan." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Aktiivinen tulostustyö" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Työn nimi" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Tulostusaika" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Aikaa jäljellä arviolta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Vaihda &koko näyttöön" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Kumoa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Tee &uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Lopeta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Määritä Curan asetukset..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "L&isää tulostin..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Tulostinten &hallinta..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Hallitse materiaaleja..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Päivitä nykyiset asetukset tai ohitukset profiiliin" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Hylkää tehdyt muutokset" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Luo profiili nykyisten asetusten tai ohitusten perusteella..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profiilien hallinta..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Näytä sähköinen &dokumentaatio" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Ilmoita &virheestä" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "Ti&etoja..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Poista &valittu malli" msgstr[1] "Poista &valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Keskitä valittu malli" msgstr[1] "Keskitä valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Kerro valittu malli" msgstr[1] "Kerro valitut mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Poista malli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ke&skitä malli alustalle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Ryhmittele mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Poista mallien ryhmitys" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Yhdistä mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Kerro malli..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Valitse kaikki mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Tyhjennä tulostusalusta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Lataa kaikki mallit uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Järjestä kaikki mallit" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Järjestä valinta" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Määritä kaikkien mallien positiot uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Määritä kaikkien mallien &muutokset uudelleen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Avaa tiedosto(t)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Uusi projekti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Näytä moottorin l&oki" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Näytä määrityskansio" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Määritä asetusten näkyvyys..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Selaa lisäosia..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Asennetut lisäoset..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Lataa 3D-malli" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Valmiina viipaloimaan" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Viipaloidaan..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Valmis: %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Viipalointi ei onnistu" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Viipalointi ei käytettävissä" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Valmistele" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Peruuta" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Valitse aktiivinen tulostusväline" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Avaa tiedosto(t)" @@ -3619,112 +3767,117 @@ msgstr "Tuo kaikki malleina" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Tiedosto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Tallenna valinta tiedostoon" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Tallenna &nimellä…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Tallenna projekti" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Muokkaa" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Näytä" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Asetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Tulostin" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiaali" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profiili" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Aseta aktiiviseksi suulakepuristimeksi" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Laa&jennukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Lisäosat" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "L&isäasetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Ohje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Avaa tiedosto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Asetukset" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Uusi projekti" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Haluatko varmasti aloittaa uuden projektin? Se tyhjentää alustan ja kaikki tallentamattomat asetukset." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Asenna laajennus" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Avaa tiedosto(t)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Löysimme vähintään yhden Gcode-tiedoston valitsemiesi tiedostojen joukosta. Voit avata vain yhden Gcode-tiedoston kerrallaan. Jos haluat avata Gcode-tiedoston, valitse vain yksi." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Tallenna projekti" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Suulake %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & materiaali" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Älä näytä projektin yhteenvetoa tallennettaessa" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Tallenna" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Valmistele" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Valvo" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Kerroksen korkeus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Tulostusnopeus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Hitaammin" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Nopeammin" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Täyttö" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Asteittainen täyttö lisää täytön tiheyttä vähitellen yläosaa kohti." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Ota asteittainen käyttöön" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Muodosta tuki" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Muodosta rakenteita, jotka tukevat mallin ulokkeita sisältäviä osia. Ilman tukirakenteita kyseiset osat luhistuvat tulostuksen aikana." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Tuen suulake" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Valitse tukena käytettävä suulakepuristin. Näin mallin alle rakennetaan tukirakenteita estämään mallin painuminen tai tulostuminen ilmaan." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Alustan tarttuvuus" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Ota reunuksen tai pohjaristikon tulostus käyttöön. Tämä lisää kappaleen ympärille tai alle tasaisen alueen, joka on helppo leikata pois myöhemmin." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Tarvitsetko apua tulosteiden parantamiseen?
    Lue Ultimakerin vianmääritysoppaat" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Avaa projektitiedosto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Tämä on Cura-projektitiedosto. Haluatko avata sen projektina vai tuoda siinä olevat mallit?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Avaa projektina" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Tuo mallit" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Moottorin loki" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Materiaali" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Tarkista materiaalin yhteensopivuus" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Napsauta ja tarkista materiaalin yhteensopivuus sivustolla Ultimaker.com." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-verkkoyhteys" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3-verkkoyhteys (klusteri)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks-integrointi" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "GCode-profiilin lukija" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Näyttää kerrosnäkymän." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Kerrosnäkymä" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Päivitys versiosta 2.7 versioon 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Mallikohtaisten asetusten työkalu" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF-kirjoitin" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-profiilin lukija" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Tukossa" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Tulostus ei käynnisty" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Avaa Connect..." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Tulostustiedot" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "On suositeltavaa päivittää laiteohjelmisto säännöllisesti, jotta voidaan varmistaa, että laitteessa {machine_name} on viimeisimmät ominaisuudet. Tämä voidaan tehdä laitteessa {machine_name} (verkkoon yhdistettynä) tai USB:n kautta." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Kerrosnäkymä" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Kerrosnäkymä" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Selaa lisäosia" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Viennin tiedot" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Tapahtui vakava poikkeus, josta palautuminen ei onnistunut!

    \n" +#~ "

    Tee virheraportti alla olevien tietojen perusteella osoitteessa http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Avaa verkkosivu" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "OK" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Tätä tulostinta ei ole määritetty yhdistetyn Ultimaker 3 -tulostinryhmän isännäksi" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Tämä tulostin on %1 tulostimen yhdistetyn Ultimaker 3 -ryhmän isäntä" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Valmistellaan" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Valmistunut: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Avaa tulostöiden sivun oletusselaimessa." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "TULOSTINRYHMÄ" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Projektin lataaminen poistaa kaikki alustalla olevat mallit" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " lisäosa sisältää lisenssin.\n" +#~ "Lisenssi on hyväksyttävä lisäosan asentamista varten.\n" +#~ "Hyväksytkö alla olevat ehdot?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00 h 00 min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Aikatiedot" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Tulostusaika" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1 m / ~ %2 g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1 m / ~ %2 g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Tarkista materiaalin yhteensopivuus" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3-verkkoyhteys (klusteri)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Näyttää kerrosnäkymän." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Kerrosnäkymä" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Kerros" diff --git a/resources/i18n/fi_FI/fdmextruder.def.json.po b/resources/i18n/fi_FI/fdmextruder.def.json.po index ea50325417..a76ee285e0 100644 --- a/resources/i18n/fi_FI/fdmextruder.def.json.po +++ b/resources/i18n/fi_FI/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:31+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" diff --git a/resources/i18n/fi_FI/fdmprinter.def.json.po b/resources/i18n/fi_FI/fdmprinter.def.json.po index fb73e2e39d..23ed6b0da4 100644 --- a/resources/i18n/fi_FI/fdmprinter.def.json.po +++ b/resources/i18n/fi_FI/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "GCode-komennot, jotka suoritetaan aivan alussa – eroteltuina merkillä \n." +msgstr "" +"GCode-komennot, jotka suoritetaan aivan alussa – eroteltuina merkillä \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "GCode-komennot, jotka suoritetaan aivan lopussa – eroteltuina merkillä \n." +msgstr "" +"GCode-komennot, jotka suoritetaan aivan lopussa – eroteltuina merkillä \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -605,6 +609,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "Alkukerroksen korkeus milleinä. Paksumpi alkukerros helpottaa alustaan kiinnittymistä." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +784,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Kuori" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Seinämien suulake" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Seinämien tulostukseen käytettävä suulakeryhmä. Tätä käytetään monipursotuksessa." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +806,8 @@ msgstr "Ulkoseinämän tulostukseen käytettävä suulakeryhmä. Tätä käytet #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Sisäseinämien suulake" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1239,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Korvaa ylä-/alakuvion uloimman osan samankeskisillä linjoilla. Yhden tai kahden linjan käyttäminen parantaa kattoja, jotka alkavat täyttömateriaalin keskeltä." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Ota silitys käyttöön" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Yläpinnan läpikäynti yhden ylimääräisen kerran ilman materiaalin pursotusta. Tämän tarkoitus on sulattaa yläosan muovia enemmän, jolloin saadaan sileämpi pinta." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Silitä vain korkein kerros" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Suorita silitys vain verkon viimeisessä kerroksessa. Tämä säästää aikaa, jos alemmat kerrokset eivät edellytä sileää pintaviimeistelyä." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Silityskuvio" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Yläpintojen silitykseen käytettävä kuvio." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Samankeskinen" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Siksak" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Silityksen linjajako" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Silityslinjojen välinen etäisyys." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Silitysvirtaus" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Silityksen aikana pursotettavan materiaalin määrä suhteessa normaaliin pintakalvon linjaan. Suuttimen pitäminen täytettynä auttaa joidenkin yläpinnan halkeamien täyttämisessä, mutta liiallinen määrä johtaa ylipursotukseen ja täpliin pinnan sivulla." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Silitysliitos" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Etäisyys mallin reunoihin. Silitys verkon reunoihin saakka voi johtaa rosoiseen reunaan tulosteessa." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Silitysnopeus" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Yläpinnan ylikulkuun käytettävä nopeus." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Silityksen kiihtyvyys" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "Kiihtyvyys, jolla silitys suoritetaan." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Silityksen nykäisy" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Silityksen aikainen nopeuden hetkellinen maksimimuutos." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1386,8 @@ msgstr "Täyttökuvio" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Tulostettava täyttömateriaalin kuvio. Linja- ja siksak-täytöt vaihtavat suuntaa kerrosten välillä, mikä vähentää materiaalikustannuksia. Ristikko-, kolmio-, kuutio-, oktetti-, neljänneskuutio- ja samankeskinen-kuviot tulostetaan kokonaisuudessaan kuhunkin kerrokseen. Kuutio-, neljänneskuutio- ja oktettitäytöt muuttuvat kerroksittain, jotta vahvuus jakautuu tasaisemmin kussakin suunnassa." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1404,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Kolmiot" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1461,8 @@ msgstr "Yhdistä täyttölinjat" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Yhdistä päät, joissa täyttökuvio kohtaa sisäseinämän käyttämällä linjoja, jotka seuraavat sisäseinämän muotoa. Tämän asetuksen ottaminen käyttöön voi saada täytön tarttumaan seinämiin paremmin ja vähentää täytön vaikutusta pystypintojen laatuun. Tämän asetuksen poistaminen käytöstä vähentää käytettävän materiaalin määrää." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1474,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Luettelo käytettävistä linjojen kokonaislukusuunnista. Tämän luettelon elementtejä käytetään järjestyksessä kerrosten edetessä, ja kun luettelon loppu saavutetaan, aloitetaan taas alusta. Luettelon kohteet on erotettu pilkuilla, ja koko luettelo on hakasulkeiden sisällä. Oletusarvo on tyhjä luettelo, jolloin käytetään perinteisiä oletuskulmia (45 ja 135 astetta linja- ja siksak-kuvioille ja 45 astetta muille kuvioille)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1804,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Säätää käytetyn tulostuslangan halkaisijaa. Määritä tämä arvo vastaamaan käytetyn tulostuslangan halkaisijaa." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3014,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Yhdistä siksakit. Tämä lisää siksak-tukirakenteen lujuutta." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Riko tuki lohkoihin" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Ohita jotkin tukilinjojen yhdistämiset, jotta tukirakenne on helpompi rikkoa. Tämä asetus soveltuu siksak-tukitäyttökuvioon." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Tukilohkon koko" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Jätä tukilinjojen välinen yhdistäminen pois joka N. millimetri, jotta tukirakenne on helpompi rikkoa." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Tukilohkolinjaluku" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Ohita joka N. yhdistämislinja, jotta tukirakenne on helpompi rikkoa." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3553,8 @@ msgstr "Helman etäisyys" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "Vaakasuora etäisyys helman ja tulosteen ensimmäisen kerroksen välillä.\nTämä on minimietäisyys; useampia helmalinjoja käytettäessä ne ulottuvat tämän etäisyyden ulkopuolelle." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3596,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Tulostaa reunuksen vain mallin ulkopuolelle. Tämä vähentää myöhemmin poistettavan reunuksen määrää, mutta se ei juurikaan vähennä pöydän tarttuvuutta." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Alkukerroksen Z-siirtymä" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "Suulaketta siirretään ensimmäisen kerroksen normaalista korkeudesta tällä määrällä. Se voi olla positiivinen (nostettu) tai negatiivinen (laskettu). Jotkin tulostuslankatyypit tarttuvat alustaan paremmin, jos suulaketta nostetaan hieman." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z-siirtymän kapenevat kerrokset" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Kun tämä ei ole nolla, Z-siirtymä pienenee nollaan niin monen kerroksen matkalla. Kun arvo on 0, Z-siirtymä pysyy vakiona kaikille tulostuksen kerroksille." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3613,8 @@ msgstr "Pohjaristikon tasoitus" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Tällä asetuksella säädetään, kuinka paljon pohjaristikon ulkolinjan sisäkulmia pyöristetään. Sisäpuoliset kulmat pyöristetään puoliympyräksi, jonka säde on yhtä suuri kuin tässä annettu arvo. Asetuksella myös poistetaan pohjaristikon ulkolinjan reiät, jotka ovat pienempiä kuin tällainen ympyrä." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4086,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normaalisti Cura yrittää silmukoida umpeen pieniä reikiä verkosta ja poistaa kerroksesta osat, joissa on isoja reikiä. Tämän vaihtoehdon käyttöönotto pitää ne osat, joita ei voida silmukoida. Tätä tulisi pitää viimeisenä vaihtoehtona, kun millään muulla ei saada aikaan kunnollista GCodea." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4126,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Määrittää, mitkä verkon leikkaustilavuudet kuuluvat jokaiseen kerrokseen, jotta limittäiset verkot yhdistetään. Jos tämä asetus poistetaan käytöstä, yksi verkoista saa kaiken tilavuuden limityksessä, ja verkko poistetaan muista verkoista." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4341,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Optimoi seinämien tulostusjärjestys takaisinvetojen ja kuljetun etäisyyden vähentämiseksi. Useimmat osat hyötyvät tämän asetuksen käytöstä, mutta joissakin saattaa kestää kauemmin, joten vertaa tulostusajan arvioita optimointia käytettäessä ja ilman sitä." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Riko tuki lohkoihin" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Ohita jotkin tukilinjojen yhdistämiset, jotta tukirakenne on helpompi rikkoa. Tämä asetus soveltuu siksak-tukitäyttökuvioon." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Tukilohkon koko" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Jätä tukilinjojen välinen yhdistäminen pois joka N. millimetri, jotta tukirakenne on helpompi rikkoa." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Tukilohkolinjaluku" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Ohita joka N. yhdistämislinja, jotta tukirakenne on helpompi rikkoa." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4661,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Keskimääräinen etäisyys kunkin linjasegmentin satunnaisten pisteiden välillä. Huomaa, että alkuperäiset monikulmion pisteet poistetaan käytöstä, joten korkea sileysarvo alentaa resoluutiota. Tämän arvon täytyy olla suurempi kuin puolet karhean pintakalvon paksuudesta." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Puolella nopeudella pursotetun nousuliikkeen etäisyys.\nSe voi parantaa tarttuvuutta edellisiin kerroksiin kuumentamatta materiaalia liikaa kyseisissä kerroksissa. Koskee vain rautalankamallin tulostusta." +msgstr "" +"Puolella nopeudella pursotetun nousuliikkeen etäisyys.\n" +"Se voi parantaa tarttuvuutta edellisiin kerroksiin kuumentamatta materiaalia liikaa kyseisissä kerroksissa. Koskee vain rautalankamallin tulostusta." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Suuttimen ja vaakasuoraan laskevien linjojen välinen etäisyys. Suurempi väli aiheuttaa vähemmän jyrkän kulman diagonaalisesti laskeviin linjoihin, mikä puolestaan johtaa harvempiin yläliitoksiin seuraavan kerroksen kanssa. Koskee vain rautalankamallin tulostusta." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Ota silitys käyttöön" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Yläpinnan läpikäynti yhden ylimääräisen kerran ilman materiaalin pursotusta. Tämän tarkoitus on sulattaa yläosan muovia enemmän, jolloin saadaan sileämpi pinta." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Silitä vain korkein kerros" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Suorita silitys vain verkon viimeisessä kerroksessa. Tämä säästää aikaa, jos alemmat kerrokset eivät edellytä sileää pintaviimeistelyä." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Silityskuvio" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Yläpintojen silitykseen käytettävä kuvio." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Samankeskinen" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Siksak" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Silityksen linjajako" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Silityslinjojen välinen etäisyys." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Silitysvirtaus" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Silityksen aikana pursotettavan materiaalin määrä suhteessa normaaliin pintakalvon linjaan. Suuttimen pitäminen täytettynä auttaa joidenkin yläpinnan halkeamien täyttämisessä, mutta liiallinen määrä johtaa ylipursotukseen ja täpliin pinnan sivulla." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Silitysliitos" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Etäisyys mallin reunoihin. Silitys verkon reunoihin saakka voi johtaa rosoiseen reunaan tulosteessa." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Silitysnopeus" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Yläpinnan ylikulkuun käytettävä nopeus." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Silityksen kiihtyvyys" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "Kiihtyvyys, jolla silitys suoritetaan." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Silityksen nykäisy" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Silityksen aikainen nopeuden hetkellinen maksimimuutos." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Mallissa käytettävä muunnosmatriisi, kun malli ladataan tiedostosta." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Seinämien suulake" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Sisäseinämien suulake" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Seinämien tulostukseen käytettävä suulakeryhmä. Tätä käytetään monipursotuksessa." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Tulostettava täyttömateriaalin kuvio. Linja- ja siksak-täytöt vaihtavat suuntaa kerrosten välillä, mikä vähentää materiaalikustannuksia. Ristikko-, kolmio-, kuutio-, oktetti-, neljänneskuutio- ja samankeskinen-kuviot tulostetaan kokonaisuudessaan kuhunkin kerrokseen. Kuutio-, neljänneskuutio- ja oktettitäytöt muuttuvat kerroksittain, jotta vahvuus jakautuu tasaisemmin kussakin suunnassa." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Yhdistä päät, joissa täyttökuvio kohtaa sisäseinämän käyttämällä linjoja, jotka seuraavat sisäseinämän muotoa. Tämän asetuksen ottaminen käyttöön voi saada täytön tarttumaan seinämiin paremmin ja vähentää täytön vaikutusta pystypintojen laatuun. Tämän asetuksen poistaminen käytöstä vähentää käytettävän materiaalin määrää." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Vaakasuora etäisyys helman ja tulosteen ensimmäisen kerroksen välillä.\n" +#~ "Tämä on minimietäisyys; useampia helmalinjoja käytettäessä ne ulottuvat tämän etäisyyden ulkopuolelle." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Alkukerroksen Z-siirtymä" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "Suulaketta siirretään ensimmäisen kerroksen normaalista korkeudesta tällä määrällä. Se voi olla positiivinen (nostettu) tai negatiivinen (laskettu). Jotkin tulostuslankatyypit tarttuvat alustaan paremmin, jos suulaketta nostetaan hieman." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z-siirtymän kapenevat kerrokset" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Kun tämä ei ole nolla, Z-siirtymä pienenee nollaan niin monen kerroksen matkalla. Kun arvo on 0, Z-siirtymä pysyy vakiona kaikille tulostuksen kerroksille." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Tällä asetuksella säädetään, kuinka paljon pohjaristikon ulkolinjan sisäkulmia pyöristetään. Sisäpuoliset kulmat pyöristetään puoliympyräksi, jonka säde on yhtä suuri kuin tässä annettu arvo. Asetuksella myös poistetaan pohjaristikon ulkolinjan reiät, jotka ovat pienempiä kuin tällainen ympyrä." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Mallissa käytettävä muunnosmatriisi, kun malli ladataan tiedostosta." #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Kaksoispursotuksen limitys" \ No newline at end of file +#~ msgstr "Kaksoispursotuksen limitys" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 76ad2ae4a6..54d5eadd62 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: French\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Abandon de l'impression" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Bloqué" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Action requise" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Ne peux pas imprimer" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "L'imprimante n'est pas configurée pour héberger un groupe d'imprimantes Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Complète a: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "L'imprimante est le patron pour un groupe de %1 imprimantes Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} a terminé d'imprimer '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Impression terminée" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Plug-ins" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Parcourir les plug-ins..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Plug-ins installés..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Connexion avec Doodle3D Connecter..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Annuler" @@ -152,15 +90,15 @@ msgstr "Fichier envoyé vers Doodle3D Connecter" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Ouvrir Connect" +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Ouvrir l'interface web Doodle3D Connecter" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Afficher le récapitulatif des changements" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Connecté via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Impossible de démarrer une nouvelle tâche car l'imprimante est occupée ou n'est pas connectée." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Les détails d'impression" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "L'imprimante ne prend pas en charge l'impression par USB car elle utilise UltiGCode parfum." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "Impression par USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Impossible de démarrer une nouvelle tâche car l'imprimante ne prend pas en charge l'impression par USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Avertissement" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Impossible d'enregistrer sur le lecteur {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Erreur" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Lecteur amovible" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimer sur le réseau" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprimer sur le réseau" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Accès à l'imprimante demandé. Veuillez approuver la demande sur l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Statut de la connexion" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Statut de la connexion" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Réessayer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Renvoyer la demande d'accès" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Accès à l'imprimante accepté" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Aucun accès pour imprimer avec cette imprimante. Impossible d'envoyer la tâche d'impression." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Demande d'accès" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Envoyer la demande d'accès à l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Connecté sur le réseau. Veuillez approuver la demande d'accès sur l'imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Connecté sur le réseau." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Connecté sur le réseau. Pas d'accès pour commander l'imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "La demande d'accès a été refusée sur l'imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Échec de la demande d'accès à cause de la durée limite." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "La connexion avec le réseau a été perdue." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "La connexion avec l'imprimante a été perdue. Vérifiez que votre imprimante est connectée." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. L'état actuel de l'imprimante est %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Statut de l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Impossible de démarrer une nouvelle tâche d'impression. Pas de PrintCore inséré dans la fente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Impossible de démarrer une nouvelle tâche d'impression car l'imprimante est occupée. Pas de matériau chargé dans la fente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Pas suffisamment de matériau pour bobine {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Matériau différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "Le PrintCore {0} n'est pas correctement calibré. Le calibrage XY doit être effectué sur l'imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Êtes-vous sûr(e) de vouloir imprimer avec la configuration sélectionnée ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Problème de compatibilité entre la configuration ou l'étalonnage de l'imprimante et Cura. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuration différente" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Envoi de nouvelles tâches (temporairement) bloqué, envoi de la tâche d'impression précédente en cours." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Envoi des données à l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Envoi des données..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Impossible d'envoyer les données à l'imprimante. Une autre tâche est-elle toujours active ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Abandon de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Abandon de l'impression. Vérifiez l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Mise en pause de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Reprise de l'impression..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchroniser avec votre imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Voulez-vous utiliser votre configuration d'imprimante actuelle dans Cura ?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Les PrintCores et / ou matériaux sur votre imprimante diffèrent de ceux de votre projet actuel. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Connecter via le réseau" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "L'imprimante n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "L'imprimante n'est pas configurée pour héberger un groupe de {count} imprimantes connectées Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} a terminé d'imprimer '{job_name}'. Veuillez enlever l'impression et confirmer avoir débarrassé le plateau." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} est réservé pour imprimer '{job_name}'. Veuillez modifier la configuration de l'imprimante pour qu'elle corresponde à la tâche et commence l'impression." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Envoi de nouvelles tâches (temporairement) bloqué, envoi de la tâche d'impression précédente en cours." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Impossible d'envoyer une nouvelle tâche d'impression : cette imprimante 3D n'est pas (encore) configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Envoi de {file_name} vers le groupe {cluster_name}..." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} envoyé vers le groupe {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Afficher les tâches d'impression" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Ouvre l'interface d'impression des tâches dans votre navigateur." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Impossible d'envoyer la tâche d'impression vers le groupe {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} envoyé vers le groupe {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Afficher les tâches d'impression" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Ouvre l'interface d'impression des tâches dans votre navigateur." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Inconnu" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} a terminé d'imprimer '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Impression terminée" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Action requise" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Envoi de {file_name} vers le groupe {cluster_name}..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Connecter via le réseau" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Pour s'assurer que votre {machine_name} est pourvue des dernières fonctionnalités, il est recommandé de mettre régulièrement à jour le firmware. Cela peut se faire sur la {machine_name} (lorsque connectée au réseau) ou via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nouveau firmware %s disponible" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Télécharger" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Impossible d'accéder aux informations de mise à jour." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Erreur lors du lancement de %s !" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura n'affiche pas les couches avec précision lorsque l'impression filaire est activée" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Modifier le G-Code" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "Fichier GCode" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Vue en couches" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura n'affiche pas les couches avec précision lorsque l'impression filaire est activée" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Vue en couches" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Impossible de découper le matériau actuel, car celui-ci est incompatib #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Impossible de découper" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suivants contiennent des erreurs : {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Impossible de couper car la tour primaire ou la (les) position(s) d'amorçage ne sont pas valides." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Rien à couper car aucun des modèles ne convient au volume d'impression. Mettez à l'échelle ou faites pivoter les modèles pour les faire correspondre." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Traitement des couches" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informations" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Configurer les paramètres par modèle" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Recommandé" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Personnalisé" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Fichier 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Buse" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Parcourir les plug-ins" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Échec de l'obtention de l'identifiant du plug-in au départ de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Avertissement" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Navigateur de plug-ins" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Fichier G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analyse du G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Détails G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Assurez-vous que le g-code est adapté à votre imprimante et à la configuration de l'imprimante avant d'y envoyer le fichier. La représentation du g-code peut ne pas être exacte." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivellement du plateau" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Paroi externe" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Parois internes" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Couche extérieure" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Remplissage" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Remplissage du support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interface du support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Support" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Jupe" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Déplacement" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Rétractions" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Autre" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Fichier {0} prédécoupé" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Pas de matériau chargé" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Matériau inconnu" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Impossible de trouver un emplacement" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Le fichier existe déjà" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Matériau personnalisé" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Le matériau sélectionné est incompatible avec la machine ou la configuration sélectionnée." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Annuler la modification du diamètre du matériau." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Échec de l'exportation du profil vers {0} : {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Échec de l'exportation du profil vers {0} : le plug-in du générateur a rapporté une erreur." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil exporté vers {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Exporter les détails" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Échec de l'importation du profil depuis le fichier {0} : {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Importation du profil {0} réussie" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Le profil {0} est un type de fichier inconnu ou est corrompu." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Personnaliser le profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Il manque un type de qualité au profil." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Placement de l'objet..." -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Rapport d'incident" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Une erreur fatale que nous ne pouvons résoudre s'est produite !

    \n

    Veuillez utiliser les informations ci-dessous pour envoyer un rapport d'erreur à http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Ouvrir la page Web" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Chargement des machines..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Préparation de la scène..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Chargement de l'interface..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Un seul fichier G-Code peut être chargé à la fois. Importation de {0} sautée" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossible d'ouvrir un autre fichier si le G-Code est en cours de chargement. Importation de {0} sautée" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Paramètres de la machine" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Imprimante" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Paramètres de l'imprimante" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Largeur)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Profondeur)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Hauteur)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Forme du plateau" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Origine au centre" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Plateau chauffant" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "GCode Parfum" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Paramètres de la tête d'impression" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distance entre la gauche de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distance entre le devant de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distance entre la droite de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distance entre le dos de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Hauteur du portique" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "La différence de hauteur entre la pointe de la buse et le système de portique (axes X et Y). Permet d'empêcher les collisions entre les impressions précédentes et le portique lors d'une impression « Un à la fois »." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Nombre d'extrudeuses" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Le diamètre nominal de filament pris en charge par l'imprimante. Le diamètre exact sera remplacé par le matériau et / ou le profil." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Diamètre du matériau" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Taille de la buse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Début Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Commandes Gcode à exécuter au tout début." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Fin Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Commandes Gcode à exécuter tout à la fin." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Paramètres de la buse" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Décalage buse X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Décalage buse Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Extrudeuse Gcode de démarrage" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Extrudeuse Gcode de fin" @@ -1406,12 +1448,11 @@ msgstr "Récapitulatif des changements" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Code erreur inconnue : %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Connecter à l'imprimante en réseau" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "" +"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" +"\n" +"Sélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Ajouter" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Modifier" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Supprimer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Rafraîchir" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Si votre imprimante n'apparaît pas dans la liste, lisez le guide de dépannage de l'impression en réseau" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Type" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Inconnu" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Version du firmware" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Adresse" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "L'imprimante n'est pas configurée pour héberger un groupe d'imprimantes Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "L'imprimante est le patron pour un groupe de %1 imprimantes Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "L'imprimante à cette adresse n'a pas encore répondu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Connecter" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Adresse de l'imprimante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Saisissez l'adresse IP ou le nom d'hôte de votre imprimante sur le réseau." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Imprimer sur le réseau" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Imprimer" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Afficher les tâches d'impression" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Préparation de l'impression..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Impression..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Disponible" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Connexion avec l'imprimante perdue" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Réservée" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Terminé" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Abandon de l'impression" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Non acceptation des tâches d'impression" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Complète a: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Enlever les objets du plateau" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "En attente de modification de configuration" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Imprimer les tâches" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Impression..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Mis en file d'attente" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Imprimantes" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Afficher les imprimantes" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Connecter à une imprimante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Charger la configuration de l'imprimante dans Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Activer la configuration" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Cette imprimante n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "L'imprimante est configurée pour héberger un groupe de %1 imprimantes connectées Ultimaker 3." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Imprimer sur le réseau" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Imprimer" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Impression..." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Réservée" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Terminé" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Préparation..." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Disponible" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Finalisé sur : " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Enlever les objets du plateau" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Préparation de l'impression..." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Non acceptation des tâches d'impression" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Ouvre la page des tâches d'impression avec votre navigateur web." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Afficher les tâches d'impression" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "GROUPE D'IMPRIMANTES" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Imprimer les tâches" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Impression..." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Mis en file d'attente" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "En attente de modification de configuration" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Imprimantes" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Afficher les imprimantes" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Toujours utiliser la qualité grossière" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Fine" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Se souvenir de mon choix" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Modèle de couleurs" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Couleur du matériau" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Type de ligne" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Mode de compatibilité" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Afficher les déplacements" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Afficher les aides" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Afficher la coque" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Afficher le remplissage" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Afficher uniquement les couches supérieures" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Afficher 5 niveaux détaillés en haut" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Haut / bas" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Paroi interne" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Scripts de post-traitement" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Ajouter un script" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Paramètres" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Modifier les scripts de post-traitement actifs" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Modèle de couleurs" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Couleur du matériau" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Type de ligne" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Mode de compatibilité" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Afficher les déplacements" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Afficher les aides" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Afficher la coque" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Afficher le remplissage" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Afficher uniquement les couches supérieures" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Afficher 5 niveaux détaillés en haut" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Haut / bas" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Paroi interne" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Afficher tout" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Ouvrir un projet" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Mettre à jour l'existant" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Créer" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Résumé - Projet Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Paramètres de l'imprimante" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Comment le conflit de la machine doit-il être résolu ?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Type" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nom" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Paramètres de profil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Comment le conflit du profil doit-il être résolu ?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Absent du profil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 écrasent" msgstr[1] "%1 écrase" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Dérivé de" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 écrasent" msgstr[1] "%1, %2 écrase" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Paramètres du matériau" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Comment le conflit du matériau doit-il être résolu ?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Visibilité des paramètres" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Mode" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Paramètres visibles :" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 sur %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Le chargement d'un projet effacera tous les modèles sur le plateau" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Ouvrir" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Installé" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Télécharger" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Plug-in d'accord de licence" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " le plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Refuser" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "L'imprimante n'accepte pas les commandes" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "En maintenance. Vérifiez l'imprimante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Connexion avec l'imprimante perdue" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Impression..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "En pause" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Préparation..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "" +"Vous avez personnalisé certains paramètres du profil.\n" +"Souhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Unité" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Général" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "Envoyer des informations (anonymes) sur l'impression" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Imprimantes" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Renommer" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Type d'imprimante :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Connexion :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "L'imprimante n'est pas connectée." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "État :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "En attente du dégagement du plateau" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "En attente d'une tâche d'impression" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profils" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Exporter un profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Matériaux" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Matériau exporté avec succès vers %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Ajouter une imprimante" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "À propos de Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" +msgstr "" +"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" +"Cura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Bibliothèque de découpe polygone" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Police" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Icônes SVG" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil :" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." +msgstr "" +"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" +"\n" +"Cliquez pour ouvrir le gestionnaire de profils." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Rechercher..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copier la valeur vers tous les extrudeurs" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Masquer ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Masquer ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Afficher ce paramètre" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurer la visibilité des paramètres..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." +msgstr "" +"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" +"\n" +"Cliquez pour rendre ces paramètres visibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." +msgstr "" +"Ce paramètre possède une valeur qui est différente du profil.\n" +"\n" +"Cliquez pour restaurer la valeur du profil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." +msgstr "" +"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" +"\n" +"Cliquez pour restaurer la valeur calculée." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuration de l'impression" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" +msgstr "" +"Configuration de l'impression désactivée\n" +"Les fichiers G-Code ne peuvent pas être modifiés" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00 h 00 min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Information horaire" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Imprimer l'heure" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuration de l'impression recommandée

    Imprimer avec les paramètres recommandés pour l'imprimante, le matériau et la qualité sélectionnés." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuration de l'impression personnalisée

    Imprimer avec un contrôle fin de chaque élément du processus de découpe." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatique : %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Visualisation" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automatique : %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Ouvrir un fichier &récent" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Aucune imprimante n'est connectée" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Extrudeuse" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Température actuelle de cet extrudeur." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Couleur du matériau dans cet extrudeur." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Matériau dans cet extrudeur." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Buse insérée dans cet extrudeur." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Plateau" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Température cible du plateau chauffant. Le plateau sera chauffé ou refroidi pour tendre vers cette température. Si la valeur est 0, le chauffage du plateau sera éteint." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Température actuelle du plateau chauffant." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Température jusqu'à laquelle préchauffer le plateau." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Annuler" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Préchauffer" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Préchauffez le plateau avant l'impression. Vous pouvez continuer à ajuster votre impression pendant qu'il chauffe, et vous n'aurez pas à attendre que le plateau chauffe lorsque vous serez prêt à lancer l'impression." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Activer l'impression" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Nom de la tâche" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Durée d'impression" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Durée restante estimée" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Passer en P&lein écran" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annuler" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rétablir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Quitter" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurer Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Ajouter une imprimante..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gérer les &imprimantes..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gérer les matériaux..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Mettre à jour le profil à l'aide des paramètres / forçages actuels" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Ignorer les modifications actuelles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Créer un profil à partir des paramètres / forçages actuels..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gérer les profils..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Afficher la &documentation en ligne" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Notifier un &bug" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&À propos de..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Supprimer le modèle &sélectionné" msgstr[1] "Supprimer les modèles &sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centrer le modèle sélectionné" msgstr[1] "Centrer les modèles sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplier le modèle sélectionné" msgstr[1] "Multiplier les modèles sélectionnés" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Supprimer le modèle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrer le modèle sur le plateau" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grouper les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Dégrouper les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Fusionner les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplier le modèle..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Sélectionner tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Supprimer les objets du plateau" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Rechar&ger tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Réorganiser tous les modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Réorganiser la sélection" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Réinitialiser toutes les positions des modèles" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Réinitialiser tous les modèles et transformations" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Ouvrir le(s) fichier(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nouveau projet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Afficher le &journal du moteur..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Afficher le dossier de configuration" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurer la visibilité des paramètres..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Parcourir les plug-ins..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Plug-ins installés..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Veuillez charger un modèle 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Prêt à découper" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Découpe en cours..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Prêt à %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Impossible de découper" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Découpe indisponible" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Préparer" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annuler" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Sélectionner le périphérique de sortie actif" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Ouvrir le(s) fichier(s)" @@ -3619,112 +3767,117 @@ msgstr "Importer tout comme modèles" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Enregi&strer la sélection dans un fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Enregistrer &sous..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Enregistrer le projet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Modifier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Visualisation" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Paramètres" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Im&primante" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Matériau" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Définir comme extrudeur actif" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensions" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Plug-ins" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&références" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Aide" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Ouvrir un fichier" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Paramètres" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Nouveau projet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Êtes-vous sûr(e) de souhaiter lancer un nouveau projet ? Cela supprimera les objets du plateau ainsi que tous paramètres non enregistrés." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Installer plug-in" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Ouvrir le(s) fichier(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Nous avons trouvé au moins un fichier G-Code parmi les fichiers que vous avez sélectionné. Vous ne pouvez ouvrir qu'un seul fichier G-Code à la fois. Si vous souhaitez ouvrir un fichier G-Code, veuillez ne sélectionner qu'un seul fichier de ce type." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Enregistrer le projet" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Extrudeuse %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & matériau" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Ne pas afficher à nouveau le résumé du projet lors de l'enregistrement" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Enregistrer" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Préparer" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Surveiller" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Hauteur de la couche" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Vitesse d’impression" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Ralentir" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Accélérer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Remplissage" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un remplissage graduel augmentera la quantité de remplissage vers le haut." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Permettre le remplissage graduel" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Générer les supports" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Générer des structures pour soutenir les parties du modèle qui possèdent des porte-à-faux. Sans ces structures, ces parties s'effondreront durant l'impression." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Extrudeuse de soutien" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Sélectionnez l'extrudeur à utiliser comme support. Cela créera des structures de support sous le modèle afin de l'empêcher de s'affaisser ou de s'imprimer dans les airs." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adhérence au plateau" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Activez l'impression d'une bordure ou plaquette (Brim/Raft). Cela ajoutera une zone plate autour de ou sous votre objet qui est facile à découper par la suite." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Besoin d'aide pour améliorer vos impressions ?
    Lisez les Guides de dépannage Ultimaker" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Ouvrir un fichier de projet" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Ceci est un fichier de projet Cura. Souhaitez-vous l'ouvrir comme projet ou en importer les modèles ?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Ouvrir comme projet" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Importer les modèles" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Journal du moteur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Matériau" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Vérifier la compatibilité du matériau" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Cliquez ici pour vérifier la compatibilité des matériaux sur Ultimaker.com." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Connexion au réseau UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Connexion au réseau UM3 (Cluster)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Intégration SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Lecteur de profil GCode" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Permet la vue en couches." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Vue en couches" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Mise à niveau de version, de 2.7 vers 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Outil de paramètres par modèle" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "Générateur 3MF" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lecteur de profil Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Bloqué" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Ne peux pas imprimer" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Ouvrir Connect" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Les détails d'impression" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Pour s'assurer que votre {machine_name} est pourvue des dernières fonctionnalités, il est recommandé de mettre régulièrement à jour le firmware. Cela peut se faire sur la {machine_name} (lorsque connectée au réseau) ou via USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Vue en couches" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Vue en couches" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Parcourir les plug-ins" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Exporter les détails" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Une erreur fatale que nous ne pouvons résoudre s'est produite !

    \n" +#~ "

    Veuillez utiliser les informations ci-dessous pour envoyer un rapport d'erreur à http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Ouvrir la page Web" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Cette imprimante n'est pas configurée pour héberger un groupe d'imprimantes connectées Ultimaker 3." + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "L'imprimante est configurée pour héberger un groupe de %1 imprimantes connectées Ultimaker 3." + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Préparation..." + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Finalisé sur : " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Ouvre la page des tâches d'impression avec votre navigateur web." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "GROUPE D'IMPRIMANTES" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Le chargement d'un projet effacera tous les modèles sur le plateau" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " le plug-in contient une licence.\n" +#~ "Vous devez approuver cette licence pour installer ce plug-in.\n" +#~ "Acceptez-vous les clauses ci-dessous ?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00 h 00 min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Information horaire" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Imprimer l'heure" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Vérifier la compatibilité du matériau" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Connexion au réseau UM3 (Cluster)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Permet la vue en couches." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Vue en couches" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Rayon-X" diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po index 70279e97d9..d190a4ef2c 100644 --- a/resources/i18n/fr_FR/fdmextruder.def.json.po +++ b/resources/i18n/fr_FR/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:31+0200\n" "Last-Translator: Bothof \n" "Language-Team: French\n" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index 0a4a135b99..3327f1af8c 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: French\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "Commandes Gcode à exécuter au tout début, séparées par \n." +msgstr "" +"Commandes Gcode à exécuter au tout début, séparées par \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "Commandes Gcode à exécuter à la toute fin, séparées par \n." +msgstr "" +"Commandes Gcode à exécuter à la toute fin, séparées par \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -605,6 +609,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "La hauteur de la couche initiale en mm. Une couche initiale plus épaisse adhère plus facilement au plateau." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +784,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Coque" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Extrudeuse de paroi" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Le train d'extrudeuse utilisé pour l'impression des parois. Cela est utilisé en multi-extrusion." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +806,8 @@ msgstr "Le train d'extrudeuse utilisé pour l'impression des parois externes. Ce #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Extrudeuse de parois internes" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1239,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Remplace la partie la plus externe du motif du dessus/dessous par un certain nombre de lignes concentriques. Le fait d'utiliser une ou deux lignes améliore les plafonds qui commencent sur du matériau de remplissage." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Activer l'étirage" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Aller au-dessus de la surface supérieure une fois supplémentaire, mais sans extruder de matériau. Cela signifie de faire fondre le plastique en haut un peu plus, pour créer une surface lisse." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "N'étirer que la couche supérieure" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "N'exécute un étirage que sur l'ultime couche du maillage. Ceci économise du temps si les couches inférieures ne nécessitent pas de fini lisse de surface." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Motif d'étirage" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Le motif à utiliser pour étirer les surfaces supérieures." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrique" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zig Zag" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Interligne de l'étirage" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "La distance entre les lignes d'étirage." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Flux d'étirage" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "La quantité de matériau, relative à une ligne de couche extérieure normale, à extruder pendant l'étirage. Le fait de garder la buse pleine aide à remplir certaines des crevasses de la surface supérieure ; mais si la quantité est trop importante, cela entraînera une surextrusion et l'apparition de coupures sur le côté de la surface." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Insert d'étirage" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Distance à garder à partir des bords du modèle. Étirer jusqu'au bord de la maille peut entraîner l'apparition d'un bord denté sur votre impression." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Vitesse d'étirage" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "La vitesse à laquelle passer sur la surface supérieure." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Accélération d'étirage" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "L'accélération selon laquelle l'étirage est effectué." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Saccade d'étirage" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Le changement instantané maximal de vitesse lors de l'étirage." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1386,8 @@ msgstr "Motif de remplissage" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Le motif du matériau de remplissage de l'impression. La ligne et le remplissage en zigzag changent de sens à chaque alternance de couche, réduisant ainsi les coûts matériels. Les motifs en grille, en triangle, octaédriques, quart cubiques et concentriques sont entièrement imprimés sur chaque couche. Le remplissage cubique, quart cubique et octaédrique change à chaque couche afin d'offrir une répartition plus égale de la solidité dans chaque direction." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1404,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Triangles" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1461,8 @@ msgstr "Relier les lignes de remplissage" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Relie les extrémités où le motif de remplissage touche la paroi interne, à l'aide de lignes épousant la forme de la paroi interne. Activer ce paramètre peut faire mieux coller le remplissage aux parois, et réduit les effets du remplissage sur la qualité des surfaces verticales. Désactiver ce paramètre diminue la quantité de matière utilisée." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1474,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Une liste de sens de ligne (exprimés en nombres entiers) à utiliser. Les éléments de la liste sont utilisés de manière séquentielle à mesure de l'avancement des couches. La liste reprend depuis le début lorsque la fin est atteinte. Les éléments de la liste sont séparés par des virgules et la liste entière est encadrée entre crochets. La valeur par défaut est une liste vide, ce qui signifie que les angles traditionnels par défaut seront utilisés (45 et 135 degrés pour les motifs en lignes et en zig zag et 45 degrés pour tout autre motif)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1804,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Ajuste le diamètre du filament utilisé. Faites correspondre cette valeur au diamètre du filament utilisé." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3014,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Relie les zigzags. Cela augmente la solidité des supports en zigzag." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Démantèlement du support en morceaux" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Ignorer certaines connexions de ligne du support pour rendre la structure de support plus facile à casser. Ce paramètre s'applique au motif de remplissage du support en zigzag." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Taille de morceaux du support" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Ignorer une connexion entre lignes du support tous les N millimètres, pour rendre la structure de support plus facile à casser." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Comptage des lignes de morceaux du support" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Ignorer une ligne de connexion sur N pour rendre la structure de support plus facile à casser." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3553,8 @@ msgstr "Distance de la jupe" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3596,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Imprimer uniquement la bordure sur l'extérieur du modèle. Cela réduit la quantité de bordure que vous devez retirer par la suite, sans toutefois véritablement réduire l'adhérence au plateau." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Décalage en Z de la couche initiale" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "L'extrudeuse est décalée de cette valeur à partir de la hauteur normale de la première couche. Elle peut être positive (relevée) ou négative (abaissée). Certains types de filament adhèrent mieux au plateau si l'extrudeuse est légèrement relevée." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Couches biseautées de décalage en Z" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Si non nul, le décalage en Z est ramené à 0 sur un grand nombre de couches. Une valeur égale à 0 signifie que le décalage en Z reste constant pour toutes les couches de l'impression." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3613,8 @@ msgstr "Lissage de radeau" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Ce paramètre définit combien d'angles intérieurs sont arrondis dans le contour de radeau. Les angles internes sont arrondis en un demi-cercle avec un rayon égal à la valeur indiquée ici. Ce paramètre élimine également les cavités dans le contour de radeau qui sont d'une taille inférieure à ce cercle." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4086,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normalement, Cura essaye de raccommoder les petits trous dans le maillage et supprime les parties des couches contenant de gros trous. Activer cette option pousse Cura à garder les parties qui ne peuvent être raccommodées. Cette option doit être utilisée en dernier recours quand tout le reste échoue à produire un GCode correct." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4126,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Passe aux volumes d'intersection de maille qui appartiennent à chaque couche, de manière à ce que les mailles qui se chevauchent soient entrelacées. Si vous désactivez ce paramètre, l'une des mailles obtiendra tout le volume dans le chevauchement tandis qu'il est retiré des autres mailles." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4341,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Optimiser l'ordre dans lequel des parois sont imprimées de manière à réduire le nombre de retraits et les distances parcourues. La plupart des pièces bénéficieront de cette possibilité, mais certaines peuvent en fait prendre plus de temps à l'impression ; veuillez dès lors comparer les estimations de durée d'impression avec et sans optimisation." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Démantèlement du support en morceaux" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Ignorer certaines connexions de ligne du support pour rendre la structure de support plus facile à casser. Ce paramètre s'applique au motif de remplissage du support en zigzag." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Taille de morceaux du support" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Ignorer une connexion entre lignes du support tous les N millimètres, pour rendre la structure de support plus facile à casser." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Comptage des lignes de morceaux du support" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Ignorer une ligne de connexion sur N pour rendre la structure de support plus facile à casser." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4661,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Distance moyenne entre les points ajoutés aléatoirement sur chaque segment de ligne. Il faut noter que les points originaux du polygone ne sont plus pris en compte donc un fort lissage conduira à une diminution de la résolution. Cette valeur doit être supérieure à la moitié de l'épaisseur de la couche floue." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "" +"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" +"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Distance entre la buse et les lignes descendantes horizontalement. Un espacement plus important génère des lignes diagonalement descendantes avec un angle moins abrupt, qui génère alors des connexions moins ascendantes avec la couche suivante. Uniquement applicable à l'impression filaire." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Activer l'étirage" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Aller au-dessus de la surface supérieure une fois supplémentaire, mais sans extruder de matériau. Cela signifie de faire fondre le plastique en haut un peu plus, pour créer une surface lisse." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "N'étirer que la couche supérieure" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "N'exécute un étirage que sur l'ultime couche du maillage. Ceci économise du temps si les couches inférieures ne nécessitent pas de fini lisse de surface." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Motif d'étirage" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Le motif à utiliser pour étirer les surfaces supérieures." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrique" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zig Zag" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Interligne de l'étirage" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "La distance entre les lignes d'étirage." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Flux d'étirage" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "La quantité de matériau, relative à une ligne de couche extérieure normale, à extruder pendant l'étirage. Le fait de garder la buse pleine aide à remplir certaines des crevasses de la surface supérieure ; mais si la quantité est trop importante, cela entraînera une surextrusion et l'apparition de coupures sur le côté de la surface." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Insert d'étirage" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Distance à garder à partir des bords du modèle. Étirer jusqu'au bord de la maille peut entraîner l'apparition d'un bord denté sur votre impression." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Vitesse d'étirage" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "La vitesse à laquelle passer sur la surface supérieure." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Accélération d'étirage" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "L'accélération selon laquelle l'étirage est effectué." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Saccade d'étirage" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Le changement instantané maximal de vitesse lors de l'étirage." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matrice de transformation à appliquer au modèle lors de son chargement depuis le fichier." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Extrudeuse de paroi" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Extrudeuse de parois internes" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Le train d'extrudeuse utilisé pour l'impression des parois. Cela est utilisé en multi-extrusion." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Le motif du matériau de remplissage de l'impression. La ligne et le remplissage en zigzag changent de sens à chaque alternance de couche, réduisant ainsi les coûts matériels. Les motifs en grille, en triangle, octaédriques, quart cubiques et concentriques sont entièrement imprimés sur chaque couche. Le remplissage cubique, quart cubique et octaédrique change à chaque couche afin d'offrir une répartition plus égale de la solidité dans chaque direction." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Relie les extrémités où le motif de remplissage touche la paroi interne, à l'aide de lignes épousant la forme de la paroi interne. Activer ce paramètre peut faire mieux coller le remplissage aux parois, et réduit les effets du remplissage sur la qualité des surfaces verticales. Désactiver ce paramètre diminue la quantité de matière utilisée." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "La distance horizontale entre la jupe et la première couche de l’impression.\n" +#~ "Il s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Décalage en Z de la couche initiale" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "L'extrudeuse est décalée de cette valeur à partir de la hauteur normale de la première couche. Elle peut être positive (relevée) ou négative (abaissée). Certains types de filament adhèrent mieux au plateau si l'extrudeuse est légèrement relevée." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Couches biseautées de décalage en Z" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Si non nul, le décalage en Z est ramené à 0 sur un grand nombre de couches. Une valeur égale à 0 signifie que le décalage en Z reste constant pour toutes les couches de l'impression." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Ce paramètre définit combien d'angles intérieurs sont arrondis dans le contour de radeau. Les angles internes sont arrondis en un demi-cercle avec un rayon égal à la valeur indiquée ici. Ce paramètre élimine également les cavités dans le contour de radeau qui sont d'une taille inférieure à ce cercle." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Matrice de transformation à appliquer au modèle lors de son chargement #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Chevauchement de double extrusion" \ No newline at end of file +#~ msgstr "Chevauchement de double extrusion" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 7354379afa..ae81a507bd 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Stampa interrotta" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Ostacolato" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Richiede un'azione" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Impossibile avviare la stampa" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Questa stampante non è predisposta per comandare un gruppo di stampanti Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Finisce alle: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Questa stampante comanda un gruppo di %1 stampanti Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "La stampante '{printer_name}' ha finito di stampare '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Stampa finita" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Plugin" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Sfoglia plugin..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Plugin installati..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Collegamento a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Annulla" @@ -152,15 +90,15 @@ msgstr "File inviato a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Apri Connect.." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Apri interfaccia web Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Visualizza registro modifiche" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Connesso tramite USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è occupata o non collegata." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Dettagli stampa" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Questa stampante non supporta la stampa tramite USB in quanto utilizza la versione UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "Stampa USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante non supporta la stampa tramite USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Avvertenza" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Impossibile salvare su unità rimovibile {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Errore" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Unità rimovibile" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Stampa sulla rete" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Stampa sulla rete" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Richiesto accesso alla stampante. Approvare la richiesta sulla stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Stato di connessione" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Stato di connessione" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Riprova" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Invia nuovamente la richiesta di accesso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Accesso alla stampante accettato" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Nessun accesso per stampare con questa stampante. Impossibile inviare il processo di stampa." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Richiesta di accesso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Invia la richiesta di accesso alla stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Collegato alla rete. Si prega di approvare la richiesta di accesso sulla stampante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Collegato alla rete." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Collegato alla rete. Nessun accesso per controllare la stampante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Richiesta di accesso negata sulla stampante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Richiesta di accesso non riuscita per superamento tempo." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Il collegamento con la rete si è interrotto." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Il collegamento con la stampante si è interrotto. Controllare la stampante per verificare se è collegata." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è occupata. Stato stampante corrente %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Stato stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Impossibile avviare un nuovo processo di stampa. Nessun Printcore caricato nello slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Impossibile avviare un nuovo processo di stampa. Nessun materiale caricato nello slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Materiale per la bobina insufficiente {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore diverso (Cura: {0}, Stampante: {1}) selezionata per estrusore {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Materiale diverso (Cura: {0}, Stampante: {1}) selezionato per l’estrusore {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} non correttamente calibrato. Necessario eseguire calibrazione XY sulla stampante." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Sei sicuro di voler stampare con la configurazione selezionata?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Le configurazioni o la calibrazione della stampante e di Cura non corrispondono. Per ottenere i migliori risultati, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Mancata corrispondenza della configurazione" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Invio nuovi processi (temporaneamente) bloccato, invio in corso precedente processo di stampa." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Invio dati alla stampante in corso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Invio dati" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Impossibile inviare i dati alla stampante. Altro processo ancora attivo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Interruzione stampa in corso..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Stampa interrotta. Controllare la stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Messa in pausa stampa..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Ripresa stampa..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizzazione con la stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Desideri utilizzare la configurazione corrente della tua stampante in Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "I PrintCore e/o i materiali sulla stampante differiscono da quelli contenuti nel tuo attuale progetto. Per ottenere i risultati migliori, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Collega tramite rete" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Questa stampante non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Questa stampante fa da host per un gruppo di {count} stampanti Ultimaker 3 connesse." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} ha terminato la stampa '{job_name}'. Raccogliere la stampa e confermare la liberazione del piano di stampa." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} è riservata per la stampa di '{job_name}'. Modificare la configurazione della stampante in modo che corrisponda al lavoro da eseguire per avviare il processo di stampa." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Invio nuovi processi (temporaneamente) bloccato, invio in corso precedente processo di stampa." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Impossibile inviare nuovo processo di stampa: questa stampante 3D non è (ancora) configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Invio {file_name} a gruppo {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "Inviato {file_name} a gruppo {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Mostra processi di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Apre l'interfaccia processi di stampa sul browser." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Impossibile inviare processo di stampa a gruppo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "Inviato {file_name} a gruppo {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Mostra processi di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Apre l'interfaccia processi di stampa sul browser." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Sconosciuto" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "La stampante '{printer_name}' ha finito di stampare '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Stampa finita" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Richiede un'azione" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Invio {file_name} a gruppo {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Collega tramite rete" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Per verificare che la vostra {machine_name} sia dotata delle funzionalità più recenti, si consiglia di aggiornare periodicamente il firmware. Questo può essere fatto sulla {machine_name} (quando connessa alla rete) o via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nuovo firmware %s disponibile" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Download" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Non è possibile accedere alle informazioni di aggiornamento." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Errore durante l'avvio di %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura non visualizza in modo accurato gli strati se la funzione Wire Printing è abilitata" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Modifica G-code" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "File G-Code" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Visualizzazione strato" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura non visualizza in modo accurato gli strati se la funzione Wire Printing è abilitata" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Visualizzazione strato" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Impossibile eseguire il sezionamento con il materiale corrente in quanto #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Sezionamento impossibile" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Impossibile eseguire il sezionamento con le impostazioni attuali. Le seguenti impostazioni presentano errori: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Impossibile eseguire il sezionamento perché la torre di innesco o la posizione di innesco non sono valide." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Nulla da sezionare in quanto nessuno dei modelli corrisponde al volume di stampa. Ridimensionare o ruotare i modelli secondo necessità." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Elaborazione dei livelli" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informazioni" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Configura impostazioni per modello" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Consigliata" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizzata" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "File 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Ugello" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Sfoglia plugin" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Impossibile ottenere ID plugin da {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Avvertenza" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Browser plugin" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "File G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Parsing codice G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Dettagli codice G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Verifica che il codice G sia idoneo alla tua stampante e alla sua configurazione prima di trasmettere il file. La rappresentazione del codice G potrebbe non essere accurata." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Livella piano di stampa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Parete esterna" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Pareti interne" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Rivestimento esterno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Riempimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Riempimento del supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interfaccia supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Supporto" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Spostamenti" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrazioni" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Altro" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "File pre-sezionato {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Nessun materiale caricato" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Materiale sconosciuto" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Impossibile individuare posizione" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Il file esiste già" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Materiale personalizzato" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Il materiale selezionato è incompatibile con la macchina o la configurazione selezionata." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Annulla modifica del diametro del materiale." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Impossibile esportare il profilo su {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Impossibile esportare il profilo su {0}: Rilevata anomalia durante scrittura plugin." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profilo esportato su {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Dettagli esportazione" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Impossibile importare il profilo da {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profilo importato correttamente {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Il profilo {0} ha un tipo di file sconosciuto o corrotto." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Profilo personalizzato" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Il profilo è privo del tipo di qualità." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Sistemazione oggetto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Rapporto su crash" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Si è verificata un'eccezione fatale che non stato possibile superare!

    \n

    Utilizzare le informazioni sotto riportate per inviare un rapporto sull'errore a http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Apri pagina Web" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Caricamento macchine in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Impostazione scena in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Caricamento interfaccia in corso..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "È possibile caricare un solo file codice G per volta. Importazione saltata {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossibile aprire altri file durante il caricamento del codice G. Importazione saltata {0}" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Impostazioni macchina" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Stampante" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Impostazioni della stampante" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Larghezza)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Profondità)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Altezza)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Forma del piano di stampa" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Origine al centro" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Piano riscaldato" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Versione GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Impostazioni della testina di stampa" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distanza tra il lato sinistro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distanza tra il lato anteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distanza tra il lato destro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distanza tra il lato posteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Altezza gantry" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "La differenza di altezza tra la punta dell’ugello e il sistema gantry (assi X e Y). Utilizzata per evitare collisioni tra le stampe precedenti e il gantry durante la stampa \"Uno alla volta\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Numero di estrusori" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Diametro nominale del filamento supportato dalla stampante. Il diametro esatto verrà sovrapposto dal materiale e/o dal profilo." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Diametro materiale" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Dimensione ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Avvio GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Comandi Gcode da eseguire all’avvio." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Fine GCode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Comandi Gcode da eseguire alla fine." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Impostazioni ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Scostamento X ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Scostamento Y ugello" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Codice G avvio estrusore" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Codice G fine estrusore" @@ -1406,12 +1448,11 @@ msgstr "Registro modifiche" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Codice errore sconosciuto: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Collega alla stampante in rete" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" +msgstr "" +"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" +"\n" +"Selezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Aggiungi" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Modifica" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Rimuovi" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Aggiorna" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Se la stampante non è nell’elenco, leggere la guida alla risoluzione dei problemi per la stampa in rete" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Sconosciuto" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Versione firmware" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Indirizzo" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Questa stampante non è predisposta per comandare un gruppo di stampanti Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Questa stampante comanda un gruppo di %1 stampanti Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "La stampante a questo indirizzo non ha ancora risposto." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Collega" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Indirizzo stampante" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Inserire l’indirizzo IP o l’hostname della stampante sulla rete." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Stampa sulla rete" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Visualizza processi di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Preparazione della stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Stampa in corso" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Disponibile" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Persa connessione con la stampante" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Riservato" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Terminato" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Stampa interrotta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Mancata accettazione processi di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Finisce alle: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Cancellare piano di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "In attesa di modifica configurazione" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Processi di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Stampa in corso" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Coda di stampa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Stampanti" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Visualizza stampanti" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Collega a una stampante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Carica la configurazione della stampante in Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Attiva la configurazione" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Questa stampante non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Questa stampante fa da host per un gruppo di %1 stampanti Ultimaker 3 connesse" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Stampa sulla rete" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Stampa in corso" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Riservato" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Terminato" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Preparazione in corso" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Disponibile" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Completato su: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Cancellare piano di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Preparazione della stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Mancata accettazione processi di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Apre la pagina processi di stampa con il browser web predefinito." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Visualizza processi di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "GRUPPO STAMPANTI" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Processi di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Stampa in corso" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Coda di stampa" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "In attesa di modifica configurazione" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Stampanti" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Visualizza stampanti" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Utilizza sempre la qualità Grossolana" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Fine" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Ricorda la scelta" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Schema colori" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Colore materiale" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Tipo di linea" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Modalità di compatibilità" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Mostra spostamenti" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Mostra helper" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Mostra guscio" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Mostra riempimento" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Mostra solo strati superiori" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Mostra 5 strati superiori in dettaglio" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Superiore / Inferiore" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Parete interna" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Script di post-elaborazione" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Aggiungi uno script" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Impostazioni" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Modifica script di post-elaborazione attivi" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Schema colori" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Colore materiale" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Tipo di linea" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Modalità di compatibilità" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Mostra spostamenti" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Mostra helper" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Mostra guscio" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Mostra riempimento" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Mostra solo strati superiori" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Mostra 5 strati superiori in dettaglio" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Superiore / Inferiore" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Parete interna" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Mostra tutto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Apri progetto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Aggiorna esistente" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Crea nuovo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Riepilogo - Progetto Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Impostazioni della stampante" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Come può essere risolto il conflitto nella macchina?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nome" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Impostazioni profilo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Come può essere risolto il conflitto nel profilo?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Non nel profilo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 override" msgstr[1] "%1 override" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Derivato da" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 override" msgstr[1] "%1, %2 override" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Impostazioni materiale" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Come può essere risolto il conflitto nel materiale?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Impostazione visibilità" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Modalità" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Impostazioni visibili:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 su %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Il caricamento di un modello annulla tutti i modelli sul piano di stampa" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Apri" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Installa" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Download" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Accordo di licenza plugin" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " I plugin contengono una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Non accetto" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "La stampante non accetta comandi" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In manutenzione. Controllare la stampante" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Persa connessione con la stampante" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Stampa in corso..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "In pausa" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparazione in corso..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" +msgstr "" +"Sono state personalizzate alcune impostazioni del profilo.\n" +"Mantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Unità" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Generale" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "Invia informazioni di stampa (anonime)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Stampanti" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Rinomina" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Tipo di stampante:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Collegamento:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "La stampante non è collegata." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Stato:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "In attesa di qualcuno che cancelli il piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "In attesa di un processo di stampa" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profili" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Esporta profilo" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materiali" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Materiale esportato correttamente su %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Aggiungi stampante" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Informazioni su Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "" +"Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" +"Cura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Libreria ritaglio poligono" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Font" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Icone SVG" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profilo:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." +msgstr "" +"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" +"\n" +"Fare clic per aprire la gestione profili." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Ricerca..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copia valore su tutti gli estrusori" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Nascondi questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Nascondi questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Mantieni visibile questa impostazione" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurazione visibilità delle impostazioni in corso..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." +msgstr "" +"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" +"\n" +"Fare clic per rendere visibili queste impostazioni." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." +msgstr "" +"Questa impostazione ha un valore diverso dal profilo.\n" +"\n" +"Fare clic per ripristinare il valore del profilo." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." +msgstr "" +"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" +"\n" +"Fare clic per ripristinare il valore calcolato." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Impostazione di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" +msgstr "" +"Impostazione di stampa disabilitata\n" +"I file codice G non possono essere modificati" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00h 00min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Informazioni su tempo" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Tempo di stampa" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Impostazione di stampa consigliata

    Stampa con le impostazioni consigliate per la stampante, il materiale e la qualità selezionati." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Impostazione di stampa personalizzata

    Stampa con il controllo grana fine su ogni sezione finale del processo di sezionamento." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatico: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Visualizza" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automatico: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Ap&ri recenti" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Nessuna stampante collegata" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Estrusore" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "La temperatura corrente di questo estrusore." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Il colore del materiale di questo estrusore." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Il materiale di questo estrusore." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "L’ugello inserito in questo estrusore." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "La temperatura target del piano riscaldato. Il piano verrà riscaldato o raffreddato a questa temperatura. Se è 0, il riscaldamento del piano viene disattivato." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "La temperatura corrente del piano riscaldato." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "La temperatura di preriscaldo del piano." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Annulla" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Pre-riscaldo" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Riscalda il piano prima della stampa. È possibile continuare a regolare la stampa durante il riscaldamento e non è necessario attendere il riscaldamento del piano quando si è pronti per la stampa." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Stampa attiva" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Nome del processo" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Tempo di stampa" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Tempo residuo stimato" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Att&iva/disattiva schermo intero" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annulla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Ri&peti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "E&sci" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configura Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "A&ggiungi stampante..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "&Gestione stampanti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gestione materiali..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aggiorna il profilo con le impostazioni/esclusioni correnti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Elimina le modifiche correnti" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crea profilo dalle impostazioni/esclusioni correnti..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gestione profili..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostra documentazione &online" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Se&gnala un errore" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "I&nformazioni..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Cancella &modello selezionato" msgstr[1] "Cancella modelli &selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centra modello selezionato" msgstr[1] "Centra modelli selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Moltiplica modello selezionato" msgstr[1] "Moltiplica modelli selezionati" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Elimina modello" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "C&entra modello su piattaforma" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Raggruppa modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Separa modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Unisci modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Mo<iplica modello" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Sel&eziona tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Cancellare piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "R&icarica tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Sistema tutti i modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Sistema selezione" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reimposta tutte le posizioni dei modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Reimposta tutte le &trasformazioni dei modelli" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Apri file..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuovo Progetto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "M&ostra log motore..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostra cartella di configurazione" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configura visibilità delle impostazioni..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Sfoglia plugin..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Plugin installati..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Caricare un modello 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Pronto per il sezionamento" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Sezionamento in corso..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Pronto a %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Sezionamento impossibile" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Sezionamento non disponibile" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Prepara" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annulla" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Seleziona l'unità di uscita attiva" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Apri file" @@ -3619,112 +3767,117 @@ msgstr "Importa tutto come modelli" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&File" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Salva selezione su file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Salva &come..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Salva progetto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Modifica" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Visualizza" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Impostazioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "S&tampante" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "Ma&teriale" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profilo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Imposta come estrusore attivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Es&tensioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Plugin" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&referenze" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Help" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Apri file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Impostazioni" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Nuovo progetto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Sei sicuro di voler aprire un nuovo progetto? Questo cancellerà il piano di stampa e tutte le impostazioni non salvate." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Installa plugin" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Apri file" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Rilevata la presenza di uno o più file codice G tra i file selezionati. È possibile aprire solo un file codice G alla volta. Se desideri aprire un file codice G, selezionane uno solo. " @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Salva progetto" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Estrusore %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & materiale" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Non mostrare il riepilogo di progetto alla ripetizione di salva" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Salva" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Prepara" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Controlla" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Altezza dello strato" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Velocità di stampa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Più lenta" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Più veloce" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Riempimento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Un riempimento graduale aumenterà gradualmente la quantità di riempimento verso l'alto." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Consenti variazione graduale" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Generazione supporto" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Genera strutture per supportare le parti del modello a sbalzo. Senza queste strutture, queste parti collasserebbero durante la stampa." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Estrusore del supporto" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Seleziona l’estrusore da utilizzare per la stampa di strutture di supporto. Ciò consentirà di costruire strutture di supporto sotto il modello per evitare cedimenti del modello o di stampare a mezz'aria." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Adesione piano di stampa" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Abilita stampa di brim o raft. Questa funzione aggiunge un’area piana attorno o sotto l’oggetto, facile da tagliare successivamente." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Serve aiuto per migliorare le tue stampe?
    Leggi la Guida alla ricerca e riparazione guasti Ultimaker" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Apri file progetto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Questo è un file progetto Cura. Vuoi aprirlo come progetto o importarne i modelli?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Apri come progetto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Importa i modelli" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Log motore" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Materiale" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Controllo compatibilità materiale" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Fai clic per verificare la compatibilità del materiale su Ultimaker.com." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Connessione di rete UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Connessione di rete UM3 (Cluster)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Integrazione SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Lettore profilo GCode" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Fornisce la visualizzazione degli strati." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Visualizzazione strato" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Aggiornamento della versione da 2.7 a 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Utilità impostazioni per modello" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "Writer 3MF" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Lettore profilo Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Ostacolato" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Impossibile avviare la stampa" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Apri Connect.." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Dettagli stampa" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Per verificare che la vostra {machine_name} sia dotata delle funzionalità più recenti, si consiglia di aggiornare periodicamente il firmware. Questo può essere fatto sulla {machine_name} (quando connessa alla rete) o via USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Visualizzazione strato" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Visualizzazione strato" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Sfoglia plugin" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Dettagli esportazione" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Si è verificata un'eccezione fatale che non stato possibile superare!

    \n" +#~ "

    Utilizzare le informazioni sotto riportate per inviare un rapporto sull'errore a http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Apri pagina Web" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Questa stampante non è configurata per supportare la connessione di un gruppo di stampanti Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Questa stampante fa da host per un gruppo di %1 stampanti Ultimaker 3 connesse" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Preparazione in corso" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Completato su: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Apre la pagina processi di stampa con il browser web predefinito." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "GRUPPO STAMPANTI" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Il caricamento di un modello annulla tutti i modelli sul piano di stampa" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " I plugin contengono una licenza.\n" +#~ "È necessario accettare questa licenza per poter installare il plugin.\n" +#~ "Accetti i termini sotto riportati?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00h 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Informazioni su tempo" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Tempo di stampa" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Controllo compatibilità materiale" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Connessione di rete UM3 (Cluster)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Fornisce la visualizzazione degli strati." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Visualizzazione strato" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Raggi X" diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po index 75d0d77472..bfb6ef876b 100644 --- a/resources/i18n/it_IT/fdmextruder.def.json.po +++ b/resources/i18n/it_IT/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:31+0200\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index d618ecfeac..112065dc28 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "I comandi codice G da eseguire all’avvio, separati da \n." +msgstr "" +"I comandi codice G da eseguire all’avvio, separati da \n" +"." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "I comandi codice G da eseguire alla fine, separati da \n." +msgstr "" +"I comandi codice G da eseguire alla fine, separati da \n" +"." #: fdmprinter.def.json msgctxt "material_guid label" @@ -605,6 +609,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "Indica l’altezza dello strato iniziale in mm. Uno strato iniziale più spesso facilita l’adesione al piano di stampa." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +784,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Guscio" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Estrusore pareti" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Treno estrusore utilizzato per stampare le pareti. Si utilizza nell'estrusione multipla." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +806,8 @@ msgstr "Treno estrusore utilizzato per stampare la parete esterna. Si utilizza n #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Estrusore parete interna" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1239,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Sostituisce la parte più esterna della configurazione degli strati superiori/inferiori con una serie di linee concentriche. L’utilizzo di una o due linee migliora le parti superiori (tetti) che iniziano sul materiale di riempimento." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Abilita stiratura" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Ulteriore passaggio sopra la superficie superiore, senza estrusione di materiale. Ha lo scopo di fondere ulteriormente la plastica alla sommità, creando una superficie più uniforme." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Stiramento del solo strato più elevato" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Effettua lo stiramento solo dell'ultimissimo strato della maglia. È possibile quindi risparmiare tempo se gli strati inferiori non richiedono una finitura con superficie liscia." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Configurazione di stiratura" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Configurazione utilizzata per la stiratura della superficie superiore." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrica" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zig Zag" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Spaziatura delle linee di stiratura" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Distanza tra le linee di stiratura." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Flusso di stiratura" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Quantità di materiale, relativo ad una normale linea del rivestimento, da estrudere durante la stiratura. Mantenere l'ugello pieno aiuta a riempire alcune delle fessure presenti sulla superficie superiore, ma una quantità eccessiva comporta un'estrusione eccessiva con conseguente puntinatura sui lati della superficie." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Inserto di stiratura" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Distanza da mantenere dai bordi del modello. La stiratura fino in fondo sino al bordo del reticolo può causare la formazione di un bordo frastagliato nella stampa." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Velocità di stiratura" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Velocità alla quale passare sopra la superficie superiore" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Accelerazione di stiratura" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "L’accelerazione con cui viene effettuata la stiratura." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Jerk stiratura" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Indica la variazione della velocità istantanea massima durante la stiratura." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1386,8 @@ msgstr "Configurazione di riempimento" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Configurazione del materiale di riempimento della stampa. Il riempimento a linea e zig zag su strati alternati riduce il costo del materiale. Le configurazioni a griglia, triangolo, a cubo, ottagonale, a quarto di cubo e concentrica comportano la stampa completa in ogni strato. Il riempimento a cubi, a quarto di cubo e a ottagonale cambia a ogni strato per consentire una distribuzione più uniforme della resistenza in ogni direzione." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1404,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Triangoli" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1461,8 @@ msgstr "Collegamento delle linee di riempimento" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Collega le estremità in cui la configurazione del riempimento incontra la parete interna utilizzando linee che seguono il profilo della parete interna stessa. Consentendo tale configurazione è possibile fare in modo che il riempimento aderisca meglio alle pareti riducendo gli effetti dello stesso sulla qualità delle superfici verticali. Disabilitando questa configurazione si riduce la quantità di materiale utilizzato." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1474,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Un elenco di direzioni linee intere. Gli elementi dall’elenco sono utilizzati in sequenza con il progredire degli strati e, al raggiungimento della fine dell’elenco, la sequenza ricomincia dall’inizio. Le voci elencate sono separate da virgole e l’intero elenco è racchiuso tra parentesi quadre. L’elenco predefinito è vuoto, vale a dire che utilizza i valori angolari predefiniti (45 e 135 gradi per le linee e la configurazione zig zag e 45 gradi per tutte le altre configurazioni)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1804,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Regolare il diametro del filamento utilizzato. Abbinare questo valore al diametro del filamento utilizzato." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3014,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Collega i ZigZag. Questo aumenta la forza della struttura di supporto a zig zag." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Rottura del supporto in pezzi di grandi dimensioni" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Salto di alcuni collegamenti per rendere la struttura del supporto più facile da rompere. Questa impostazione è applicabile alla configurazione a zig-zag del riempimento del supporto." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Dimensioni frammento supporto" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Lasciare un collegamento tra le linee del supporto ogni N millimetri per facilitare la rottura del supporto stesso." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Conteggio linee di rottura supporto" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Salto di una ogni N linee di collegamento per rendere la struttura del supporto più facile da rompere." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3553,8 @@ msgstr "Distanza dello skirt" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima, più linee di skirt aumenteranno tale distanza." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3596,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Stampa il brim solo sull’esterno del modello. Questo riduce la quantità del brim che si deve rimuovere in seguito, mentre non riduce particolarmente l’adesione al piano." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Scostamento Z strato iniziale" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "L'estrusore viene posizionato ad una distanza dall'altezza normale del primo strato pari al valore indicato. Questo scostamento può essere positivo (più in alto) o negativo (più in basso). Alcuni tipi di filamento aderiscono meglio al piano di stampa se l'estrusore viene leggermente sollevato." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Scostamento Z strati di rastremazione" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Se diverso da zero, lo scostamento Z viene ridotto a 0 entro il numero di strati indicato. Un valore di 0 indica che lo scostamento Z rimane costante per tutti gli strati di stampa." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3613,8 @@ msgstr "Smoothing raft" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Questa impostazione controlla l'entità dell'arrotondamento degli angoli interni sul profilo raft. Gli angoli interni vengono arrotondati a semicerchio con un raggio pari al valore indicato. Questa impostazione elimina inoltre i fori sul profilo raft più piccoli di tale cerchio." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4086,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Di norma Cura cerca di \"ricucire\" piccoli fori nella maglia e di rimuovere le parti di uno strato che presentano grossi fori. Abilitando questa opzione, Cura mantiene quelle parti che non possono essere 'ricucite'. Questa opzione deve essere utilizzata come ultima risorsa quando non sia stato possibile produrre un corretto GCode in nessun altro modo." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4126,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Selezionare quali volumi di intersezione maglie appartengono a ciascuno strato, in modo che le maglie sovrapposte diventino interconnesse. Disattivando questa funzione una delle maglie ottiene tutto il volume della sovrapposizione, che viene rimosso dalle altre maglie." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4341,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Ottimizza l'ordine in cui vengono stampate le pareti in modo da ridurre le retrazioni e la distanza percorsa. L'abilitazione di questa funzione porta vantaggi per la maggior parte dei pezzi, ma alcuni potrebbero richiedere un maggior tempo di esecuzione, per cui si consiglia di confrontare i tempi di stampa stimati con e senza ottimizzazione." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Rottura del supporto in pezzi di grandi dimensioni" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Salto di alcuni collegamenti per rendere la struttura del supporto più facile da rompere. Questa impostazione è applicabile alla configurazione a zig-zag del riempimento del supporto." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Dimensioni frammento supporto" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Lasciare un collegamento tra le linee del supporto ogni N millimetri per facilitare la rottura del supporto stesso." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Conteggio linee di rottura supporto" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Salto di una ogni N linee di collegamento per rendere la struttura del supporto più facile da rompere." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4661,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Indica la distanza media tra i punti casuali introdotti su ciascun segmento di linea. Si noti che i punti originali del poligono vengono scartati, perciò un elevato livello di regolarità si traduce in una riduzione della risoluzione. Questo valore deve essere superiore alla metà dello spessore del rivestimento incoerente (fuzzy)." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "" +"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" +"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Indica la distanza tra l'ugello e le linee diagonali verso il basso. Un maggior gioco risulta in linee diagonali verso il basso con un minor angolo di inclinazione, cosa che a sua volta si traduce in meno collegamenti verso l'alto con lo strato successivo. Applicabile solo alla funzione Wire Printing." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Abilita stiratura" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Ulteriore passaggio sopra la superficie superiore, senza estrusione di materiale. Ha lo scopo di fondere ulteriormente la plastica alla sommità, creando una superficie più uniforme." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Stiramento del solo strato più elevato" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Effettua lo stiramento solo dell'ultimissimo strato della maglia. È possibile quindi risparmiare tempo se gli strati inferiori non richiedono una finitura con superficie liscia." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Configurazione di stiratura" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Configurazione utilizzata per la stiratura della superficie superiore." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrica" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zig Zag" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Spaziatura delle linee di stiratura" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Distanza tra le linee di stiratura." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Flusso di stiratura" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Quantità di materiale, relativo ad una normale linea del rivestimento, da estrudere durante la stiratura. Mantenere l'ugello pieno aiuta a riempire alcune delle fessure presenti sulla superficie superiore, ma una quantità eccessiva comporta un'estrusione eccessiva con conseguente puntinatura sui lati della superficie." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Inserto di stiratura" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Distanza da mantenere dai bordi del modello. La stiratura fino in fondo sino al bordo del reticolo può causare la formazione di un bordo frastagliato nella stampa." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Velocità di stiratura" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Velocità alla quale passare sopra la superficie superiore" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Accelerazione di stiratura" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "L’accelerazione con cui viene effettuata la stiratura." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Jerk stiratura" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Indica la variazione della velocità istantanea massima durante la stiratura." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matrice di rotazione da applicare al modello quando caricato dal file." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Estrusore pareti" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Estrusore parete interna" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Treno estrusore utilizzato per stampare le pareti. Si utilizza nell'estrusione multipla." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Configurazione del materiale di riempimento della stampa. Il riempimento a linea e zig zag su strati alternati riduce il costo del materiale. Le configurazioni a griglia, triangolo, a cubo, ottagonale, a quarto di cubo e concentrica comportano la stampa completa in ogni strato. Il riempimento a cubi, a quarto di cubo e a ottagonale cambia a ogni strato per consentire una distribuzione più uniforme della resistenza in ogni direzione." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Collega le estremità in cui la configurazione del riempimento incontra la parete interna utilizzando linee che seguono il profilo della parete interna stessa. Consentendo tale configurazione è possibile fare in modo che il riempimento aderisca meglio alle pareti riducendo gli effetti dello stesso sulla qualità delle superfici verticali. Disabilitando questa configurazione si riduce la quantità di materiale utilizzato." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\n" +#~ "Questa è la distanza minima, più linee di skirt aumenteranno tale distanza." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Scostamento Z strato iniziale" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "L'estrusore viene posizionato ad una distanza dall'altezza normale del primo strato pari al valore indicato. Questo scostamento può essere positivo (più in alto) o negativo (più in basso). Alcuni tipi di filamento aderiscono meglio al piano di stampa se l'estrusore viene leggermente sollevato." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Scostamento Z strati di rastremazione" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Se diverso da zero, lo scostamento Z viene ridotto a 0 entro il numero di strati indicato. Un valore di 0 indica che lo scostamento Z rimane costante per tutti gli strati di stampa." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Questa impostazione controlla l'entità dell'arrotondamento degli angoli interni sul profilo raft. Gli angoli interni vengono arrotondati a semicerchio con un raggio pari al valore indicato. Questa impostazione elimina inoltre i fori sul profilo raft più piccoli di tale cerchio." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Matrice di rotazione da applicare al modello quando caricato dal file." #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Sovrapposizione doppia estrusione" \ No newline at end of file +#~ msgstr "Sovrapposizione doppia estrusione" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 1b77006b0c..329a844eb0 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -6,78 +6,18 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-11-17 15:52+0100\n" +"Last-Translator: \n" "Language-Team: TEAM\n" "Language: xx_XX\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"Last-Translator: \n" "X-Generator: Poedit 1.8.7.1\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "プリント中止" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "ブロックされました" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "アクションが必要です。" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "プリントを開始できません。" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Ultimaker3のグループをホストするために設定されていません。" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "この層で終了します:" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "このプリンターはUltimaker3 %1グループのホストプリンターです。" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "プリント終了" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "プラグイン" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "プラグインをみる" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "インストールされたプラグイン" - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -115,19 +55,17 @@ msgstr "Doodle3D Connectに接続する" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "キャンセル" @@ -154,15 +92,15 @@ msgstr "Doodle3D Connectにファイル送信完了" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Connect..を開く" +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect web interfaceを開く" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Changelogの表示" @@ -199,37 +137,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "USBにて接続する" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "新しいプリントジョブをはじめることができません。プリンターが使用中または接続できていません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "プリント詳細" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "UltiGCodeを使用中のため、USBからのプリントができません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USBプリント" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "USBでの印刷ができないため、新しいプリントジョブができません。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "警告" @@ -293,11 +232,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "エラー" @@ -346,374 +285,340 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "リムーバブルドライブ" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "ネットワーク上のプリント" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "ネットワークのプリント" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "コネクションのステータス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "コネクションステータス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "再試行" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "アクセスリクエストを再送信" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "プリンターへのアクセスが承認されました。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "このプリンターへのアクセスが許可されていないため、プリントジョブの送信ができませんでした。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "アクセスのリクエスト" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "アクセスのリクエスト送信" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "ネットワーク上で接続。プリンタへのリクエストを承認してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "ネットワーク上で接続" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "ネットワーク上で接続。プリントを操作するアクセス権がありません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "プリンターへのアクセス権" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "時間制限によりアクセスが却下されました。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "ネットワークへの接続が切断されました。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "ネットワークへの接続が切断されました。プリンターの接続状態を確認ください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." -msgstr "" -"プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在のプリンターのステータスは%sです。" +msgstr "プリンターが利用中です。新しいプリントジョブを開始することができませんでした。現在のプリンターのステータスは%sです。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "プリンターのステータス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "プリントコアがスロット{0}に入っていません。プリントジョブを開始できません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "フィラメントがスロット{0}に入っていません。プリントジョブを開始できません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "フィラメント{0}の残量が足りません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "異なるプリントコアが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "異なるフィラメントが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "プリントコア{0}が適切にキャリブレーションできていません。XYキャリブレーションをプリンターで行ってください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "選択された構成にてプリントを開始してもいいですか。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" -msgid "" -"There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice " -"for the PrintCores and materials that are inserted in your printer." -msgstr "" -"プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメント" -"を元にCuraをスライスすることで最良の印刷結果を出すことができます。" +msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメントを元にCuraをスライスすることで最良の印刷結果を出すことができます。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "ミスマッチの構成" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "プリンターにプリントデータを送信中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "プリントデータを送信中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "データをプリンターに送ることができません。他のプリントジョブは進行中ですか?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "プリントを停止します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "プリントを中止しました。プリンターを確認してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "プリントを一時停止します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "プリント再開します…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "プリンターと同期する" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Curaで設定しているプリンタ構成を使用されますか?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" -msgid "" -"The PrintCores and/or materials on your printer differ from those within your current project. For the best result, " -"always slice for the PrintCores and materials that are inserted in your printer." -msgstr "" -"プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプ" -"リントコア、フィラメントに合わせてスライスして頂くことをお勧めします。" +msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプリントコア、フィラメントに合わせてスライスして頂くことをお勧めします。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "ネットワーク上にて接続" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "このプリンターは{count}繋がっているUltimaker3プリンターのグループのホストプリンターです。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name}は ‘{job_name}’印刷を終了しました。造形物を確認し、ビルドプレートから取り出してください。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format -msgid "" -"{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to " -"start printing." +msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} は '{job_name}'.を印刷予定です。印刷を開始するためにジョブに合わせた構成に変更してください。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." -msgstr "" -"新しいプリントジョブをお送りできません。この3Dプリンターは繋がっているUltimaker3のグループをホストするために設定されていま" -"せん。" +msgstr "新しいプリントジョブをお送りできません。この3Dプリンターは繋がっているUltimaker3のグループをホストするために設定されていません。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "グループに送信中{file_name} {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "グループに送信完了{file_name} {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "プリントジョブを見る" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "プリントジョブのインターフェイスをブラウザーで開く" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "プリントジョブをグループに送ることができません。{cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "グループに送信完了{file_name} {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "プリントジョブのインターフェイスをブラウザーで開く" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "不明" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "プリント終了" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "アクションが必要です。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "グループに送信中{file_name} {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "ネットワーク上にて接続" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "" -"To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware " -"regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "" -"{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネット" -"ワーク上で接続)またはUSBにて行ってください。 " -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "新しい利用可能な%sファームウェアのアップデートがあります。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "ダウンロード" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "必要なアップデートの情報にアクセスできません。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" -msgid "" -"Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in " -"SolidWorks itself without any problems as well!" -msgstr "" -"ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" +msgid "Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" +msgstr "ソリッドワークスのファイルを開く際にエラーが発生しました!ソリッドワークスで、問題なく開くことができるか確認してください。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 msgctxt "@item:inlistbox" @@ -735,7 +640,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "%sを開始中にエラーが発生" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "G-codeを修正" @@ -765,21 +685,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-codeファイル" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "レイヤービュー" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Curaはワイヤープリンティング設定中には正確にレイヤーを表示しません。" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "レイヤービュー" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -812,8 +717,9 @@ msgstr "選ばれたプリンターまたは選ばれたプリント構成が異 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "スライスできません。" @@ -824,25 +730,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "プライムタワーまたはプライム位置が無効なためスライスできません。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." -msgstr "" -"モデルのデータがビルトボリュームに入っていないためスライスできるものがありません。スケールやローテーションにて合うように設" -"定してください。" +msgstr "モデルのデータがビルトボリュームに入っていないためスライスできるものがありません。スケールやローテーションにて合うように設定してください。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "レイヤーを処理しています。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "インフォメーション" @@ -857,46 +767,64 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "各モデル構成設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "推奨" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "カスタム" -#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF ファイル" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "ノズル" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "プラグインを見る" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "{0}からプラグインIDを取得することに失敗しました。" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "プラグインブラウザー" @@ -911,25 +839,21 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Gファイル" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-codeを解析" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-codeの詳細" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" -msgid "" -"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code " -"representation may not be accurate." -msgstr "" -"データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が" -"適切でない場合があります。" +msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." +msgstr "データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が適切でない場合があります。" #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 @@ -968,73 +892,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "ビルドプレートを調整する" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "アウターウォール" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "インナーウォール" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "スキン" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "インフィル" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "サポートイルフィル" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "サポートインターフェイス" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "サポート" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "スカート" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "移動" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "退却" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "他" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "スライス前ファイル {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "フィラメントがロードされていません。" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "未確認のフィラメント" @@ -1049,7 +978,8 @@ msgctxt "@info:title" msgid "Finding Location" msgstr "位置確認" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません" @@ -1060,13 +990,13 @@ msgid "Can't Find Location" msgstr "位置を確保できません。" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "すでに存在するファイルです。" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1082,12 +1012,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "カスタムフィラメント" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "選択されたフィラメントはプリンターとそのプリント構成に適応しておりません。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1108,62 +1048,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "フィラメント直径を変更を取り消す" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "{0}にプロファイルを書き出すのに失敗しました: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr " {0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "{0}にプロファイルを書き出しました。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "詳細を書き出す" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "{0}: {1}からプロファイルを取り込むことに失敗しました。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "プロファイル {0}の取り込み完了" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "プロファイル{0}は不特定なファイルまたは破損があります。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "カスタムプロファイル" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "プロファイルはクオリティータイプが不足しています。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1171,9 +1111,7 @@ msgstr "進行中のプリント構成にあったクオリティータイプ{0} #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" -msgid "" -"The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from " -"colliding with printed models." +msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." msgstr "プリントシークエンス設定値により、ガントリーと造形物の衝突を避けるため印刷データの高さを低くしました。" #: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 @@ -1186,272 +1124,322 @@ msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "造形データを増やす、配置する。" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:title" msgid "Placing Object" msgstr "造形データを配置" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "クラッシュ報告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    不可解なエラーが発生しリカバリーできませんでした。

    \n" -"

    この情報をバグとして報告してください。 http://github.com/Ultimaker/" -"Cura/issues

    \n" -" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "ウェブページを開く" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "プリンターを読み込み中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "シーンをセットアップ中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "インターフェイスを読み込み中…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format -msgctxt "" -"@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " -"mm." +msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "プリンターの設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "プリンター" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "プリンターの設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X(幅)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (奥行き)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (高さ)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "ビルドプレート形" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "センターを出します。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "ヒーテッドドベッド" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Gcodeフレーバー" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "プリントヘッド設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" -msgid "" -"Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" -"を使用。" +msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" -msgid "" -"Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" -"を使用。" +msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "最大X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" -msgid "" -"Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" -"を使用。" +msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "最大Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" -msgid "" -"Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷" -"を使用。" +msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "ガントリーの高さ" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" -msgid "" -"The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions " -"between previous prints and the gantry when printing \"One at a Time\"." -msgstr "" -"(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるた" -"めに “1プリントづつ”印刷を使用。" +msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." +msgstr "(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "エクストルーダーの数" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" -msgid "" -"The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or " -"the profile." +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "フィラメント直径" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "ノズルサイズ" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "G-codeをスタートします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-codeが最初に起動するようにします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "G-codeを終了" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-codeが最後にに起動するようにします。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "ノズル設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "ノズルオフセットX" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "ノズルオフセットY" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "エクストルーダーがGcodeを開始します。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "エクストルーダーがGcodeを終了します。" @@ -1464,12 +1452,12 @@ msgstr "Changelogの表示" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" msgstr "やめる" @@ -1520,39 +1508,30 @@ msgid "Unknown error code: %1" msgstr "不特定エラーコード: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "ネットワーク上で繋がったプリンターに接続" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" -"To print directly to your printer over the network, please make sure your printer is connected to the network using a " -"network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can " -"still use a USB drive to transfer g-code files to your printer.\n" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。" -"Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。" +msgstr "ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "追加" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "編集" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1561,222 +1540,221 @@ msgid "Remove" msgstr "取り除く" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "更新" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" -msgstr "" -"お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読ん" -"でください。" +msgstr "お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読んでください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "タイプ" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "不明" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "ファームウェアバージョン" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "アドレス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Ultimaker3のグループをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "このプリンターはUltimaker3 %1グループのホストプリンターです。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "このアドレスのプリンターは応答していません。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "接続" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "プリンターアドレス" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "OK" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "ネットワーク上のプリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "プリント" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1は、繋がっているUltimaker3プリンターのグループをホストするために設定されていません。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "プリントジョブを見る" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "プリントの準備をする" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "利用可能" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "プリンターへの接続が切断されました。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "予約済み" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "終了" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "プリント中止" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "プリントデータを確認できない" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "この層で終了します:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "ビルドプレートをクリアにする" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "プリント構成の変更を待っている" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "プリントジョブ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "プリント中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "順番を待つ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "複数のプリンター" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "複数のプリンターをみる" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "プリンターにつなぐ" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "プリンターの構成をCuraに取り入れる。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "プリント構成をアクティベートする" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "このプリンターは繋がっているUltimaker3プリンターの%1グループのホストです。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "ネットワーク上のプリント" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "プリント" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1は、繋がっているUltimaker3プリンターのグループをホストするために設定されていません。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "プリント中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "予約済み" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "終了" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "準備中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "利用可能" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "完了:" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "ビルドプレートをクリアにする" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "プリントの準備をする" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "プリントデータを確認できない" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "デフォルトのウェブブラウザーにてプリントジョブを開く" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "プリントジョブを見る" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "プリンターグループ" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "プリントジョブ" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "プリント中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "順番を待つ" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "プリント構成の変更を待っている" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "複数のプリンター" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "複数のプリンターをみる" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1802,13 +1780,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "常に粗めのクオリティーを使用する" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1835,11 +1806,91 @@ msgid "Fine" msgstr "ファイン" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "選択を記憶させる" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "カラースキーム" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "フィラメントの色" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "ラインタイプ" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "コンパティビリティモード" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "移動を表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "ヘルプを表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "シェルを表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "インフィルを表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "トップのレイヤーを表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "トップの5レイヤーの詳細を表示する" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "トップ/ボトム" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "インナーウォール" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1850,81 +1901,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "スクリプトの処理後" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "スクリプトを加える" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "処理したスクリプトを変更する" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "カラースキーム" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "フィラメントの色" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "ラインタイプ" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "コンパティビリティモード" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "移動を表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "ヘルプを表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "シェルを表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "インフィルを表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "トップのレイヤーを表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "トップの5レイヤーの詳細を表示する" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "トップ/ボトム" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "インナーウォール" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1972,13 +1963,8 @@ msgstr "深さ(mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 msgctxt "@info:tooltip" -msgid "" -"By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this " -"option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low " -"points on the mesh." -msgstr "" -"デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリ" -"バースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。" +msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." +msgstr "デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリバースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" @@ -2021,79 +2007,79 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "すべて表示する" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "プロジェクトを開く" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "existingをアップデートする" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "新しいものを作成する" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "サマリーCuraプロジェクト" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "プリンターの設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "このプリンターの問題をどのように解決すればいいか?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "タイプ" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "ネーム" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "プロファイル設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "このプロファイルの問題をどのように解決すればいいか?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "プロファイル内にない" # Can’t edit the Japanese text -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1個の設定を上書き" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "次から引き出す" @@ -2101,51 +2087,51 @@ msgstr "次から引き出す" # can’t inset the japanese text # %1: print quality profile name # %2: number of overridden ssettings -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%2の%1個の設定を上書き" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "フィラメント設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "このフィラメントの問題をどのように解決すればいいか?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "視野設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "モード" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "ビジブル設定:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%2のうち%1" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "プロジェクトを入れることでビルド上のモデルがすべて消滅します。" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "開く" @@ -2170,6 +2156,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "インストールした" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "ダウンロード" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2178,13 +2169,10 @@ msgstr "プラグインライセンス同意書" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -"プラグインがライセンスを保持しています。\n" -"このライセンスを承認しプラグインをインストールしてください。\n" -"下記項目に賛成しますか?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2196,6 +2184,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "拒否する" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2219,16 +2212,12 @@ msgstr "ビルドプレートのレベリング" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 msgctxt "@label" -msgid "" -"To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' " -"the nozzle will move to the different positions that can be adjusted." +msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 msgctxt "@label" -msgid "" -"For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build " -"plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." msgstr "すべてのポジションに;" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 @@ -2248,18 +2237,13 @@ msgstr "ファームウェアをアップグレード" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 msgctxt "@label" -msgid "" -"Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates " -"the temperature and ultimately makes your printer work." -msgstr "" -"ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管" -"理し、プリンターとして成すべき点を補います。" +msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." +msgstr "ファームウェアとは直接お持ちの3Dプリンターを動かすソフトウェアです。このファームウェアはステップモーターを操作し、温度を管理し、プリンターとして成すべき点を補います。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 msgctxt "@label" msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." -msgstr "" -"配達時のファームウェアで動かすことはできますが、新しいバージョンの方がより改善され、便利なフィーチャーがついてきます。" +msgstr "配達時のファームウェアで動かすことはできますが、新しいバージョンの方がより改善され、便利なフィーチャーがついてきます。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 msgctxt "@action:button" @@ -2293,12 +2277,8 @@ msgstr "プリンターチェック" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 msgctxt "@label" -msgid "" -"It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is " -"functional" -msgstr "" -"お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップし" -"てください。" +msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" +msgstr "お持ちのUltimkaerにてサニティーチェックを数回行うことは推奨します。もしプリンター機能に問題ない場合はこの項目をスキップしてください。" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" @@ -2397,30 +2377,25 @@ msgid "Printer does not accept commands" msgstr "今プリンタはコマンドを処理できません。" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "メンテナンス。プリンターをチェックしてください。" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "プリンターへの接続が切断されました。" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "プリント中" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "一時停止しました" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "準備中" @@ -2636,7 +2611,7 @@ msgid "Unit" msgstr "ユニット" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "一般" @@ -2778,12 +2753,8 @@ msgstr "大きなモデルをスケールする" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 msgctxt "@info:tooltip" -msgid "" -"An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be " -"scaled up?" -msgstr "" -"ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべき" -"ですか?" +msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" +msgstr "ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべきですか?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 msgctxt "@option:check" @@ -2837,12 +2808,8 @@ msgstr "常にモデルを取り込む" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 msgctxt "@info:tooltip" -msgid "" -"When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want " -"to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." -msgstr "" -"プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダ" -"イアログが表示されないようにデフォルト機能を選ぶことができます。" +msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダイアログが表示されないようにデフォルト機能を選ぶことができます。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 msgctxt "@label" @@ -2866,12 +2833,8 @@ msgstr "スタート時にアップデートあるかどうかのチェック" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 msgctxt "@info:tooltip" -msgid "" -"Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally " -"identifiable information is sent or stored." -msgstr "" -"プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしま" -"せん。" +msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." +msgstr "プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしません。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 msgctxt "@option:check" @@ -2879,7 +2842,7 @@ msgid "Send (anonymous) print information" msgstr " (不特定な) プリントインフォメーションを送信" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "プリンター" @@ -2897,39 +2860,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "名を変える" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "プリンタータイプ:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "コネクション:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "このプリンターはつながっていません。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "ステート:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "ビルドプレートの掃除を待つ" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "プリントジョブの待機中" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "プロファイル" @@ -2984,9 +2947,7 @@ msgstr "今の変更を破棄する" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 msgctxt "@action:label" msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." -msgstr "" -"このプロファイルはプリンターによりデフォルトを使用、従いこのプロファイルはセッティング/書き換えが以下のリストにありませ" -"ん。" +msgstr "このプロファイルはプリンターによりデフォルトを使用、従いこのプロファイルはセッティング/書き換えが以下のリストにありません。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 msgctxt "@action:label" @@ -3029,7 +2990,7 @@ msgid "Export Profile" msgstr "プロファイルを書き出す" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "マテリアル" @@ -3086,7 +3047,8 @@ msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "フィラメントの%1への書き出しが完了ました。" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "プリンターを追加する" @@ -3106,6 +3068,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Curaについて" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3198,12 +3165,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "ポリゴンクリッピングライブラリー" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "フォント" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVGアイコン" @@ -3213,7 +3185,12 @@ msgctxt "@label" msgid "Profile:" msgstr "プロファイル:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3223,32 +3200,32 @@ msgstr "" "いくらかの設定プロファイルにある値とことなる場合無効にします。\n" "プロファイルマネージャーをクリックして開いてください。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "検索…" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "すべてのエクストルーダーの値をコピーする" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "この設定を非表示にする" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "この設定を表示しない" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "常に見えるように設定する" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "視野のセッティングを構成する" @@ -3303,12 +3280,12 @@ msgstr "" "このセッティングは通常計算されます、今は絶対値に固定されています。\n" "計算された値に変更するためにクリックを押してください。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "プリントセットアップ" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3317,46 +3294,59 @@ msgstr "" "プリントセットアップが無効\n" "G-codeファイルを修正することができません。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00h 00min" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 -msgctxt "@tooltip" -msgid "Time information" -msgstr "Time information" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "プリント時間" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 -msgctxt "@label" -msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1分 / ~ %2g / ~ %4 %3" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" -msgid "%1m / ~ %2g" -msgstr "%1分/ ~ %2g" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 -msgctxt "@tooltip" -msgid "" -"Recommended Print Setup

    Print with the recommended settings for the selected printer, material and " -"quality." msgstr "" -"おすすめプリントセットアップ

    選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてくだ" -"さい。 " -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +msgctxt "@tooltip" +msgid "Time specification
    " +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" +msgid "%1m / ~ %2g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +msgctxt "@tooltip" +msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." +msgstr "おすすめプリントセットアップ

    選択されたプリンターにておすすめの設定、フィラメント、質にてプリントしてください。 " + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "カスタムプリントセットアップ

    スライス処理のきめ細かなコントロールにてプリントする" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自動選択: %1" @@ -3366,7 +3356,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&ビュー" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "自動選択: %1" @@ -3395,353 +3385,378 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "最近開いたファイルを開く" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "接続中のプリンターはありません。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "エクストルーダー" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 msgctxt "@tooltip" -msgid "" -"The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the " -"hotend heating is turned off." -msgstr "" -"ホットエンドの目標温度。ホットエンドはこの温度に向けて上がったり下がったりします。これが0の場合、ホットエンドの加熱はオフ" -"になっています。" +msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "ホットエンドの目標温度。ホットエンドはこの温度に向けて上がったり下がったりします。これが0の場合、ホットエンドの加熱はオフになっています。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "現在のエクストルーダーの温度" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "エクストルーダーのマテリアルの色" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "エクストルーダー入ったフィラメント" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "ノズルが入ったエクストルーダー" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "ビルドプレート" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" -msgid "" -"The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the " -"bed heating is turned off." -msgstr "" -"ヒーティッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっ" -"ています。" +msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." +msgstr "ヒーティッドベッドの目標温度。ベッドはこの温度に向けて上がったり下がったりします。これが0の場合、ベッドの加熱はオフになっています。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "現在のヒーティッドベッドの温度" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "ベッドのプリヒート温度" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "キャンセル" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "プレヒート" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" -msgid "" -"Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to " -"wait for the bed to heat up when you're ready to print." -msgstr "" -"プリント開始前にベッドを加熱します。加熱中もプリントの調整を行えます、またべットが加熱するまでプリント開始を待つ必要もあり" -"ません。" +msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." +msgstr "プリント開始前にベッドを加熱します。加熱中もプリントの調整を行えます、またべットが加熱するまでプリント開始を待つ必要もありません。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "プリントをアクティベートする" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "ジョブネーム" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "プリント時間" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "残り時間" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "留め金 フルスクリーン" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&取り消す" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&やりなおす" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&やめる" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Curaを構成する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&プリンターを追加する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "プリンターを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "フィラメントを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&現在の設定/無効にプロファイルをアップデートする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&変更を破棄する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&今の設定/無効からプロファイルを作成する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "プロファイルを管理する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "オンラインドキュメントを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "報告&バグ" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "アバウト..." # can’t enter japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "" # can’t enter japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "" # can’t edit japanese text -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "モデルを消去する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "プラットホームの中心にモデルを配置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&モデルグループ" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "モデルを非グループ化" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&モデルの合体" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&モデルを増倍する…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&すべてのモデル選択" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&ビルドプレート上のクリア" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "すべてのモデルを読み込む" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "すべてのモデルをアレンジする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "選択をアレンジする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "すべてのモデルのポジションをリセットする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "すべてのモデル&変更点をリセットする" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&ファイルを開く(s)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&新しいプロジェクト…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "エンジン&ログを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "コンフィグレーションのフォルダーを表示する" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "視野のセッティングを構成する" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "プラグインをみる" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "インストールされたプラグイン" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "3Dモデルをロードしてください。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "スライスの準備ができました。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "スライス中…" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1の準備完了" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "スライスできません。" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "スライスが利用不可能" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "準備する" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "キャンセル" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "アクティブなアウトプットデバイスを選択する" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "ファイルを開く(s)" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 msgctxt "@text:window" -msgid "" -"We have found one or more project file(s) within the files you have selected. You can open only one project file at a " -"time. We suggest to only import models from those files. Would you like to proceed?" -msgstr "" -"選択したファイルの中に複数のプロジェクトが存在します。1ファイルのみ一度に開けます。ファイルからモデルを先に取り込むことを" -"お勧めします。続けますか?" +msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "選択したファイルの中に複数のプロジェクトが存在します。1ファイルのみ一度に開けます。ファイルからモデルを先に取り込むことをお勧めします。続けますか?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" @@ -3750,228 +3765,232 @@ msgstr "すべてをモデルとして取り入れる" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&ファイル" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&ファイルに選択したものを保存" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "名前をつけて保存" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "プロジェクトを保存" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&編集" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&ビュー" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&プリンター" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&フィラメント" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&プロファイル" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "アクティブエクストルーダーとしてセットする" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "拡張子" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "プラグイン" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "プレファレンス" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "ヘルプ" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "ファイルを開く" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "新しいプロジェクト…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "新しいプロジェクトを開始しますか?この作業では保存していない設定やビルドプレートをクリアします。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "プラグインをインストール" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "ファイルを開く(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" -msgid "" -"We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. " -"If you want to open a G-Code file, please just select only one." -msgstr "" -"選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでく" -"ださい。" +msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." +msgstr "選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでください。" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" msgid "Save Project" msgstr "プロジェクトを保存" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "エクストルーダー%1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1とフィラメント" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "保存中のプロジェクトサマリーを非表示にする" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "保存" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "準備する" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "モニター" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "レイヤーの高さ" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "プリントスピード" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "ゆっくり" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "早く" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "インフィル" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "グラデュアルインフィルはトップに向かうに従ってインフィルの量を増やします。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "グラデュアルを有効にする" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "サポートを生成します。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" -msgid "" -"Generate structures to support parts of the model which have overhangs. Without these structures, such parts would " -"collapse during printing." -msgstr "" -"オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してし" -"まいます。" +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してしまいます。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "サポートエクストルーダー" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" -msgid "" -"Select which extruder to use for support. This will build up supporting structures below the model to prevent the model " -"from sagging or printing in mid air." -msgstr "" -"サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成し" -"ます。" +msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." +msgstr "サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成します。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "ビルドプレートの接着" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" -msgid "" -"Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、プリントの周り、また造形物の下に底面を加え切り取りやすくします。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "プリントにヘルプが必要ですか?
    Ultimakerトラブルシューティングガイドを読んでください。" @@ -3988,17 +4007,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "プロジェクトを開く" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "これはCuraのプロジェクトファイルです。プロジェクトとしてあけますか、それともモデルのみ取り込みますか?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "プロジェクトを開く" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "モデルを取り込む" @@ -4008,17 +4027,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "エンジンログ" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "フィラメント" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "マテリアルのコンパティビリティを確認" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック" @@ -4133,11 +4152,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3ネットワークコネクション" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 ネットワークコネクション(クラスター)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4158,6 +4172,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "ソリッドワークスインタグレーション" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4218,16 +4242,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "GCodeプロファイルリーダー" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "レイヤービューを供給する" - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "レイヤービュー" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4248,6 +4262,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "2.7から3.0にバージョンアップグレート" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4308,6 +4332,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "各モデル設定ツール" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4368,6 +4402,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MFリーダー" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4387,3 +4431,135 @@ msgstr "Curaプロファイルを取り込むためのサポートを供給す msgctxt "name" msgid "Cura Profile Reader" msgstr "Curaプロファイルリーダー" + +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "ブロックされました" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "プリントを開始できません。" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Connect..を開く" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "プリント詳細" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネットワーク上で接続)またはUSBにて行ってください。 " + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "レイヤービュー" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "レイヤービュー" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "プラグインを見る" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "詳細を書き出す" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    不可解なエラーが発生しリカバリーできませんでした。

    \n" +#~ "

    この情報をバグとして報告してください。 http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "ウェブページを開く" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "OK" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "このプリンターは、繋がっているUltimaker3プリンターをホストするために設定されていません。" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "このプリンターは繋がっているUltimaker3プリンターの%1グループのホストです。" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "準備中" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "完了:" + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "デフォルトのウェブブラウザーにてプリントジョブを開く" + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "プリンターグループ" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "プロジェクトを入れることでビルド上のモデルがすべて消滅します。" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ "プラグインがライセンスを保持しています。\n" +#~ "このライセンスを承認しプラグインをインストールしてください。\n" +#~ "下記項目に賛成しますか?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00h 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Time information" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "プリント時間" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1分 / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1分/ ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "マテリアルのコンパティビリティを確認" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 ネットワークコネクション(クラスター)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "レイヤービューを供給する" + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "レイヤービュー" diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po index e1afc955f2..392cde1aad 100644 --- a/resources/i18n/ja_JP/fdmextruder.def.json.po +++ b/resources/i18n/ja_JP/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-10-02 17:55+0900\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -195,4 +195,4 @@ msgstr "エクストルーダープライムY位置" #: fdmextruder.def.json msgctxt "extruder_prime_pos_y description" msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "印刷開始時にノズルがポジションを確認するY座標。" \ No newline at end of file +msgstr "印刷開始時にノズルがポジションを確認するY座標。" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index aab090bb15..235b9ef64e 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-10-04 14:30+0900\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -22,8 +22,8 @@ msgstr "" msgctxt "machine_settings label" msgid "Machine" msgstr "" -#msgstr "プリンター" +# msgstr "プリンター" #: fdmprinter.def.json msgctxt "machine_settings description" msgid "Machine specific settings" @@ -33,8 +33,8 @@ msgstr "プリンター詳細設定" msgctxt "machine_name label" msgid "Machine Type" msgstr "" -#msgstr "プリンタータイプ" +# msgstr "プリンタータイプ" #: fdmprinter.def.json msgctxt "machine_name description" msgid "The name of your 3D printer model." @@ -44,8 +44,8 @@ msgstr "3Dプリンターの機種名" msgctxt "machine_show_variants label" msgid "Show Machine Variants" msgstr "" -#msgstr "プリンターのバリエーションを表示する" +# msgstr "プリンターのバリエーションを表示する" #: fdmprinter.def.json msgctxt "machine_show_variants description" msgid "Whether to show the different variants of this machine, which are described in separate json files." @@ -55,8 +55,8 @@ msgstr "このプリンターのバリエーションを表示するかどうか msgctxt "machine_start_gcode label" msgid "Start GCode" msgstr "" -#msgstr "GCodeを開始する" +# msgstr "GCodeを開始する" #: fdmprinter.def.json msgctxt "machine_start_gcode description" msgid "" @@ -70,8 +70,8 @@ msgstr "" msgctxt "machine_end_gcode label" msgid "End GCode" msgstr "" -#msgstr "GCodeを終了する" +# msgstr "GCodeを終了する" #: fdmprinter.def.json msgctxt "machine_end_gcode description" msgid "" @@ -85,8 +85,8 @@ msgstr "" msgctxt "material_guid label" msgid "Material GUID" msgstr "" -#msgstr "マテリアルGUID" +# msgstr "マテリアルGUID" #: fdmprinter.def.json msgctxt "material_guid description" msgid "GUID of the material. This is set automatically. " @@ -96,8 +96,8 @@ msgstr "マテリアルのGUID。これは自動的に設定されます。" msgctxt "material_bed_temp_wait label" msgid "Wait for Build Plate Heatup" msgstr "" -#msgstr "ビルドプレート加熱の待機" +# msgstr "ビルドプレート加熱の待機" #: fdmprinter.def.json msgctxt "material_bed_temp_wait description" msgid "Whether to insert a command to wait until the build plate temperature is reached at the start." @@ -107,8 +107,8 @@ msgstr "開始時にビルドプレートが温度に達するまで待つコマ msgctxt "material_print_temp_wait label" msgid "Wait for Nozzle Heatup" msgstr "" -#msgstr "ノズル加熱の待機" +# msgstr "ノズル加熱の待機" #: fdmprinter.def.json msgctxt "material_print_temp_wait description" msgid "Whether to wait until the nozzle temperature is reached at the start." @@ -118,8 +118,8 @@ msgstr "開始時にノズルの温度が達するまで待つかどうか。" msgctxt "material_print_temp_prepend label" msgid "Include Material Temperatures" msgstr "" -#msgstr "マテリアル温度を含む" +# msgstr "マテリアル温度を含む" #: fdmprinter.def.json msgctxt "material_print_temp_prepend description" msgid "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting." @@ -129,8 +129,8 @@ msgstr "GCodeの開始時にノズル温度設定を含めるかどうか。 既 msgctxt "material_bed_temp_prepend label" msgid "Include Build Plate Temperature" msgstr "" -#msgstr "ビルドプレートの温度を含める" +# msgstr "ビルドプレートの温度を含める" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend description" msgid "Whether to include build plate temperature commands at the start of the gcode. When the start_gcode already contains build plate temperature commands Cura frontend will automatically disable this setting." @@ -140,8 +140,8 @@ msgstr "GCodeの開始時にビルドプレート温度設定を含めるかど msgctxt "machine_width label" msgid "Machine Width" msgstr "" -#msgstr "プリンターの幅" +# msgstr "プリンターの幅" #: fdmprinter.def.json msgctxt "machine_width description" msgid "The width (X-direction) of the printable area." @@ -151,8 +151,8 @@ msgstr "造形可能領域の幅(X方向)。" msgctxt "machine_depth label" msgid "Machine Depth" msgstr "" -#msgstr "プリンターの奥行き" +# msgstr "プリンターの奥行き" #: fdmprinter.def.json msgctxt "machine_depth description" msgid "The depth (Y-direction) of the printable area." @@ -162,8 +162,8 @@ msgstr "造形可能領域の幅(Y方向)。" msgctxt "machine_shape label" msgid "Build Plate Shape" msgstr "" -#msgstr "ビルドプレートの形" +# msgstr "ビルドプレートの形" #: fdmprinter.def.json msgctxt "machine_shape description" msgid "The shape of the build plate without taking unprintable areas into account." @@ -173,20 +173,20 @@ msgstr "造形不可領域を考慮しないビルドプレートの形状。" msgctxt "machine_shape option rectangular" msgid "Rectangular" msgstr "" -#msgstr "長方形" +# msgstr "長方形" #: fdmprinter.def.json msgctxt "machine_shape option elliptic" msgid "Elliptic" msgstr "" -#msgstr "楕円形" +# msgstr "楕円形" #: fdmprinter.def.json msgctxt "machine_height label" msgid "Machine Height" msgstr "" -#msgstr "プリンターの高さ" +# msgstr "プリンターの高さ" #: fdmprinter.def.json msgctxt "machine_height description" msgid "The height (Z-direction) of the printable area." @@ -196,8 +196,8 @@ msgstr "造形可能領域の幅(Z方向)。" msgctxt "machine_heated_bed label" msgid "Has Heated Build Plate" msgstr "" -#msgstr "加熱したビルドプレート" +# msgstr "加熱したビルドプレート" #: fdmprinter.def.json msgctxt "machine_heated_bed description" msgid "Whether the machine has a heated build plate present." @@ -207,8 +207,8 @@ msgstr "プリンターに加熱式ビルドプレートが付属しているか msgctxt "machine_center_is_zero label" msgid "Is Center Origin" msgstr "" -#msgstr "センター原点" +# msgstr "センター原点" #: fdmprinter.def.json msgctxt "machine_center_is_zero description" msgid "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area." @@ -218,8 +218,8 @@ msgstr "プリンタのゼロポジションのX / Y座標が印刷可能領域 msgctxt "machine_extruder_count label" msgid "Number of Extruders" msgstr "" -#msgstr "エクストルーダーの数" +# msgstr "エクストルーダーの数" #: fdmprinter.def.json msgctxt "machine_extruder_count description" msgid "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle." @@ -229,8 +229,8 @@ msgstr "エクストルーダーの数。エクストルーダーの単位は、 msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" msgstr "" -#msgstr "ノズル外径" +# msgstr "ノズル外径" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter description" msgid "The outer diameter of the tip of the nozzle." @@ -240,8 +240,8 @@ msgstr "ノズルの外径。" msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" msgstr "" -#msgstr "ノズルの長さ" +# msgstr "ノズルの長さ" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance description" msgid "The height difference between the tip of the nozzle and the lowest part of the print head." @@ -251,8 +251,8 @@ msgstr "ノズル先端とプリントヘッドの最下部との高さの差。 msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" msgstr "" -#msgstr "ノズル角度" +# msgstr "ノズル角度" #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle description" msgid "The angle between the horizontal plane and the conical part right above the tip of the nozzle." @@ -262,8 +262,8 @@ msgstr "水平面とノズル直上の円錐部分との間の角度。" msgctxt "machine_heat_zone_length label" msgid "Heat zone length" msgstr "" -#msgstr "加熱範囲" +# msgstr "加熱範囲" #: fdmprinter.def.json msgctxt "machine_heat_zone_length description" msgid "The distance from the tip of the nozzle in which heat from the nozzle is transferred to the filament." @@ -333,8 +333,8 @@ msgstr "生成するGコードの種類" msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" msgid "Marlin" msgstr "" -#msgstr "Marlin" +# msgstr "Marlin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Volumetric)" msgid "Marlin (Volumetric)" @@ -344,44 +344,44 @@ msgstr "" msgctxt "machine_gcode_flavor option RepRap (RepRap)" msgid "RepRap" msgstr "" -#msgstr "RepRap" +# msgstr "RepRap" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option UltiGCode" msgid "Ultimaker 2" msgstr "" -#msgstr "Ultimaker 2" +# msgstr "Ultimaker 2" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Griffin" msgid "Griffin" msgstr "" -#msgstr "Griffin" +# msgstr "Griffin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Makerbot" msgid "Makerbot" msgstr "" -#msgstr "Makerbot" +# msgstr "Makerbot" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option BFB" msgid "Bits from Bytes" msgstr "" -#msgstr "Bits from Bytes" +# msgstr "Bits from Bytes" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option MACH3" msgid "Mach3" msgstr "" -#msgstr "Mach3" +# msgstr "Mach3" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" msgstr "" -#msgstr "Repetier" +# msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" @@ -436,8 +436,8 @@ msgstr "ノズルの先端とガントリーシステムの高さの差(X軸 msgctxt "machine_nozzle_id label" msgid "Nozzle ID" msgstr "" -#msgstr "ノズル ID" +# msgstr "ノズル ID" #: fdmprinter.def.json msgctxt "machine_nozzle_id description" msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." @@ -617,8 +617,8 @@ msgstr "プリントヘッドの最小移動速度。" msgctxt "resolution label" msgid "Quality" msgstr "" -#msgstr "品質" +# msgstr "品質" #: fdmprinter.def.json msgctxt "resolution description" msgid "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)" @@ -628,8 +628,8 @@ msgstr "プリントの解像度に影響を与えるすべての設定。これ msgctxt "layer_height label" msgid "Layer Height" msgstr "" -#msgstr "積層ピッチ" +# msgstr "積層ピッチ" #: fdmprinter.def.json msgctxt "layer_height description" msgid "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution." @@ -645,6 +645,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "初期レイヤーの高さ(mm)。厚い初期層はビルドプレートへの接着を容易にする。" +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -689,8 +714,8 @@ msgstr "一番外側のウォールラインを除くすべてのウォールラ msgctxt "roofing_line_width label" msgid "Top Surface Skin Line Width" msgstr "" -#msgstr "上表面スキンの線幅" +# msgstr "上表面スキンの線幅" #: fdmprinter.def.json msgctxt "roofing_line_width description" msgid "Width of a single line of the areas at the top of the print." @@ -750,8 +775,8 @@ msgstr "サポートのルーフ、フロアのライン幅" msgctxt "support_roof_line_width label" msgid "Support Roof Line Width" msgstr "" -#msgstr "サポートルーフライン幅" +# msgstr "サポートルーフライン幅" #: fdmprinter.def.json msgctxt "support_roof_line_width description" msgid "Width of a single support roof line." @@ -761,8 +786,8 @@ msgstr "サポートルーフのライン一幅。" msgctxt "support_bottom_line_width label" msgid "Support Floor Line Width" msgstr "" -#msgstr "サポートフロアライン幅" +# msgstr "サポートフロアライン幅" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" msgid "Width of a single support floor line." @@ -782,8 +807,8 @@ msgstr "単一のプライムタワーラインの幅。" msgctxt "initial_layer_line_width_factor label" msgid "Initial Layer Line Width" msgstr "" -#msgstr "初期レイヤー線幅" +# msgstr "初期レイヤー線幅" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor description" msgid "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion." @@ -793,19 +818,29 @@ msgstr "最初のレイヤーに線幅の乗数です。この値を増やすと msgctxt "shell label" msgid "Shell" msgstr "" -#msgstr "外郭" +# msgstr "外郭" #: fdmprinter.def.json msgctxt "shell description" msgid "Shell" msgstr "外郭" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "壁造形用のエクストルーダー。デュアルノズル印刷時に使用。" + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" msgstr "" -#msgstr "外側印刷用エクストルーダー" +# msgstr "外側印刷用エクストルーダー" #: fdmprinter.def.json msgctxt "wall_0_extruder_nr description" msgid "The extruder train used for printing the outer wall. This is used in multi-extrusion." @@ -813,10 +848,10 @@ msgstr "外壁印刷用のエクストルーダー。デュアルノズル印刷 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" +msgid "Inner Wall Extruder" msgstr "" -#msgstr "内側用エクストルーダー" +# msgstr "内側用エクストルーダー" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" msgid "The extruder train used for printing the inner walls. This is used in multi-extrusion." @@ -836,8 +871,8 @@ msgstr "壁の厚さ。この値をラインの幅で割ることで壁の数が msgctxt "wall_line_count label" msgid "Wall Line Count" msgstr "" -#msgstr "壁の線本数" +# msgstr "壁の線本数" #: fdmprinter.def.json msgctxt "wall_line_count description" msgid "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number." @@ -847,8 +882,8 @@ msgstr "ウォールの数。厚さから計算された場合、この値は整 msgctxt "wall_0_wipe_dist label" msgid "Outer Wall Wipe Distance" msgstr "" -#msgstr "外壁のワイピング距離" +# msgstr "外壁のワイピング距離" #: fdmprinter.def.json msgctxt "wall_0_wipe_dist description" msgid "Distance of a travel move inserted after the outer wall, to hide the Z seam better." @@ -858,8 +893,8 @@ msgstr "外壁の後に挿入された移動の距離はZシームをよりよ msgctxt "roofing_extruder_nr label" msgid "Top Surface Skin Extruder" msgstr "" -#msgstr "上層表面スキンエクストルーダー" +# msgstr "上層表面スキンエクストルーダー" #: fdmprinter.def.json msgctxt "roofing_extruder_nr description" msgid "The extruder train used for printing the top most skin. This is used in multi-extrusion." @@ -869,8 +904,8 @@ msgstr "上部の表面印刷用のエクストルーダー。デュアルノズ msgctxt "roofing_layer_count label" msgid "Top Surface Skin Layers" msgstr "" -#msgstr "上の表皮層" +# msgstr "上の表皮層" #: fdmprinter.def.json msgctxt "roofing_layer_count description" msgid "The number of top most skin layers. Usually only one top most layer is sufficient to generate higher quality top surfaces." @@ -880,8 +915,8 @@ msgstr "上部表面のレイヤー数。通常一層で綺麗に出来上がり msgctxt "roofing_pattern label" msgid "Top Surface Skin Pattern" msgstr "" -#msgstr "上層表面スキンパターン" +# msgstr "上層表面スキンパターン" #: fdmprinter.def.json msgctxt "roofing_pattern description" msgid "The pattern of the top most layers." @@ -891,26 +926,26 @@ msgstr "上層のパターン" msgctxt "roofing_pattern option lines" msgid "Lines" msgstr "" -#msgstr "線" +# msgstr "線" #: fdmprinter.def.json msgctxt "roofing_pattern option concentric" msgid "Concentric" msgstr "" -#msgstr "同心" +# msgstr "同心" #: fdmprinter.def.json msgctxt "roofing_pattern option zigzag" msgid "Zig Zag" msgstr "" -#msgstr "ジグザグ" +# msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "roofing_angles label" msgid "Top Surface Skin Line Directions" msgstr "" -#msgstr "上層表面スキンラインの方向" +# msgstr "上層表面スキンラインの方向" #: fdmprinter.def.json msgctxt "roofing_angles description" msgid "A list of integer line directions to use when the top surface skin layers use the lines or zig zag pattern. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees)." @@ -920,8 +955,8 @@ msgstr "トップ表面層に縦かジグザグパターンを利用する時に msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" msgstr "" -#msgstr "トップ/ボトムエクストルーダー" +# msgstr "トップ/ボトムエクストルーダー" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr description" msgid "The extruder train used for printing the top and bottom skin. This is used in multi-extrusion." @@ -996,8 +1031,8 @@ msgstr "" msgctxt "top_bottom_pattern option concentric" msgid "Concentric" msgstr "" -#msgstr "同心" +# msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" @@ -1122,8 +1157,8 @@ msgstr "" msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" msgstr "" -#msgstr "薄い壁をプリントする" +# msgstr "薄い壁をプリントする" #: fdmprinter.def.json msgctxt "fill_outline_gaps description" msgid "Print pieces of the model which are horizontally thinner than the nozzle size." @@ -1143,8 +1178,8 @@ msgstr "各レイヤーのすべてのポリゴンに適用されるオフセッ msgctxt "xy_offset_layer_0 label" msgid "Initial Layer Horizontal Expansion" msgstr "" -#msgstr "初期レイヤー水平方向への展開" +# msgstr "初期レイヤー水平方向への展開" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" msgid "Amount of offset applied to all polygons in the first layer. A negative value can compensate for squishing of the first layer known as \"elephant's foot\"." @@ -1179,8 +1214,8 @@ msgstr "" msgctxt "z_seam_type option sharpest_corner" msgid "Sharpest Corner" msgstr "" -#msgstr "最も鋭利な角" +# msgstr "最も鋭利な角" #: fdmprinter.def.json msgctxt "z_seam_x label" msgid "Z Seam X" @@ -1207,8 +1242,8 @@ msgstr "レイヤー内の各パーツの印刷を開始する場所の近くの msgctxt "z_seam_corner label" msgid "Seam Corner Preference" msgstr "" -#msgstr "薄層のプレファレンス" +# msgstr "薄層のプレファレンス" #: fdmprinter.def.json msgctxt "z_seam_corner description" msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner." @@ -1218,32 +1253,32 @@ msgstr "モデル輪郭のコーナーがシーム(縫い目)の位置に影 msgctxt "z_seam_corner option z_seam_corner_none" msgid "None" msgstr "" -#msgstr "なし" +# msgstr "なし" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_inner" msgid "Hide Seam" msgstr "" -#msgstr "シームを非表示にする" +# msgstr "シームを非表示にする" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_outer" msgid "Expose Seam" msgstr "" -#msgstr "シームを表示する" +# msgstr "シームを表示する" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_any" msgid "Hide or Expose Seam" msgstr "" -#msgstr "シームを非表示または表示する" +# msgstr "シームを非表示または表示する" #: fdmprinter.def.json msgctxt "z_seam_relative label" msgid "Z Seam Relative" msgstr "" -#msgstr "Zシーム関連" +# msgstr "Zシーム関連" #: fdmprinter.def.json msgctxt "z_seam_relative description" msgid "When enabled, the z seam coordinates are relative to each part's centre. When disabled, the coordinates define an absolute position on the build plate." @@ -1253,8 +1288,8 @@ msgstr "有効時は、Zシームは各パーツの真ん中に設定されま msgctxt "skin_no_small_gaps_heuristic label" msgid "Ignore Small Z Gaps" msgstr "" -#msgstr "小さなZギャップを無視する" +# msgstr "小さなZギャップを無視する" #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic description" msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting." @@ -1264,19 +1299,130 @@ msgstr "モデルに垂直方向のギャップが小さくある場合、これ msgctxt "skin_outline_count label" msgid "Extra Skin Wall Count" msgstr "" -#msgstr "余分な肌壁の本数" +# msgstr "余分な肌壁の本数" #: fdmprinter.def.json msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "上部/下部パターンの最も外側の部分を同心円の線で置き換えます。 1つまたは2つの線を使用すると、トップ部分の造形が改善されます。" +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "" + +# msgstr "アイロンを有効にする" +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "ノズルから吐出せずに上部表面を再度動く機能。表面を溶かしてよりスムースにします。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "" + +# msgstr "上層のみアイロンをかけます" +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "メッシュの最後のレイヤーでのみアイロンをかけます。下層にて滑らかな表面仕上げを必要としない場合、時間を節約します。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "" + +# msgstr "アイロン時のパターン" +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "アイロンのパターン" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "" + +# msgstr "同心" +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "" + +# msgstr "ジグザグ" +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "" + +# msgstr "アイロンラインの線隔" +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "アイロンライン同士の距離" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "" + +# msgstr "アイロン時のフロー" +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "アイロン時にノズルから出しておくフィラメントの量。多少出しておくと裂け目を綺麗にします。ただ出し過ぎると吐出過多になり、端が荒れます。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "" + +# msgstr "アイロンを挿入する" +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "モデルの端からの距離。端までアイロンをすると、端が荒れる場合があります。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "" + +# msgstr "アイロン時のスピード" +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "上部表面通過時の速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "" + +# msgstr "アイロン時の加速" +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "アイロン時の加速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "" + +# msgstr "ジャークをアイロンする" +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "アイロン時の最大加速度" + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" msgstr "" -#msgstr "インフィル" +# msgstr "インフィル" #: fdmprinter.def.json msgctxt "infill description" msgid "Infill" @@ -1286,8 +1432,8 @@ msgstr "インフィル" msgctxt "infill_extruder_nr label" msgid "Infill Extruder" msgstr "" -#msgstr "インフィルエクストルーダー" +# msgstr "インフィルエクストルーダー" #: fdmprinter.def.json msgctxt "infill_extruder_nr description" msgid "The extruder train used for printing infill. This is used in multi-extrusion." @@ -1320,8 +1466,8 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "印刷物のインフィルのパターン。線とジグザグのインフィルはレイヤーごとに交互に方向を変え、材料費を削減します。グリッド、三角形、キュービック、オクテット、クォーターキュービック、同心円のパターンは、すべてのレイヤーにて完全に印刷されます。キュービック、クォーターキュービック、オクテットのインフィルは各レイヤーごとに変化し、各方向の強度が均等になるように分布します。" +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1338,6 +1484,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1352,20 +1503,20 @@ msgstr "" msgctxt "infill_pattern option tetrahedral" msgid "Octet" msgstr "" -#msgstr "オクテット" +# msgstr "オクテット" #: fdmprinter.def.json msgctxt "infill_pattern option quarter_cubic" msgid "Quarter Cubic" msgstr "" -#msgstr "クォーターキュービック" +# msgstr "クォーターキュービック" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" msgid "Concentric" msgstr "" -#msgstr "同心円" +# msgstr "同心円" #: fdmprinter.def.json msgctxt "infill_pattern option concentric_3d" msgid "Concentric 3D" @@ -1380,36 +1531,55 @@ msgstr "" msgctxt "infill_pattern option cross" msgid "Cross" msgstr "" -#msgstr "クロス" +# msgstr "クロス" #: fdmprinter.def.json msgctxt "infill_pattern option cross_3d" msgid "Cross 3D" msgstr "" -#msgstr "クロス3D" +# msgstr "クロス3D" #: fdmprinter.def.json msgctxt "zig_zaggify_infill label" msgid "Connect Infill Lines" msgstr "" -#msgstr "インフィルの線をつなげる" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "内壁の形状に沿った線を使用して、インフィルのパターンが内壁と接する端を接続します。この設定を有効にすると、インフィルを壁面に密着させることができ、充填材が垂直面の品質に与える影響を低減できます。この設定を無効にすると、使用される材料の量が減ります。" +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" msgid "Infill Line Directions" msgstr "" -#msgstr "インフィルラインの方向" +# msgstr "インフィルラインの方向" #: fdmprinter.def.json msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "使用する整数線の方向のリスト。リストの要素は、レイヤの層に合わせて順番に使用され、リストの末尾に達すると、最初から再び開始されます。リスト項目はコンマで区切られ、リスト全体は大括弧で囲まれています。デフォルトは空のリストです。これは、従来のデフォルト角度(線とジグザグのパターンでは45と135度、他のすべてのパターンでは45度)を使用することを意味します。" +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1424,8 +1594,8 @@ msgstr "この立方体を細分するかどうかを決定するために、各 msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" msgstr "" -#msgstr "インフィルのオーバーラップ率" +# msgstr "インフィルのオーバーラップ率" #: fdmprinter.def.json msgctxt "infill_overlap description" msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." @@ -1435,8 +1605,8 @@ msgstr "インフィルと壁が交差する量、わずかな交差によって msgctxt "infill_overlap_mm label" msgid "Infill Overlap" msgstr "" -#msgstr "インフィルのオーバーラップ" +# msgstr "インフィルのオーバーラップ" #: fdmprinter.def.json msgctxt "infill_overlap_mm description" msgid "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill." @@ -1456,8 +1626,8 @@ msgstr "表面と壁の交わる量。ラインの幅の%で設定。少しの msgctxt "skin_overlap_mm label" msgid "Skin Overlap" msgstr "" -#msgstr "スキンオーバーラップ" +# msgstr "スキンオーバーラップ" #: fdmprinter.def.json msgctxt "skin_overlap_mm description" msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." @@ -1467,8 +1637,8 @@ msgstr "スキンと壁の間の交差した量 わずかなオーバーラッ msgctxt "infill_wipe_dist label" msgid "Infill Wipe Distance" msgstr "" -#msgstr "インフィルWipe距離" +# msgstr "インフィルWipe距離" #: fdmprinter.def.json msgctxt "infill_wipe_dist description" msgid "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line." @@ -1530,8 +1700,8 @@ msgstr "これより小さいインフィルの領域を生成しないでくだ msgctxt "skin_preshrink label" msgid "Skin Removal Width" msgstr "" -#msgstr "スキン除去幅" +# msgstr "スキン除去幅" #: fdmprinter.def.json msgctxt "skin_preshrink description" msgid "The largest width of skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top/bottom skin at slanted surfaces in the model." @@ -1541,8 +1711,8 @@ msgstr "取り除くスキンエリアの最大幅。この値より小さいす msgctxt "top_skin_preshrink label" msgid "Top Skin Removal Width" msgstr "" -#msgstr "トップスキン除去幅" +# msgstr "トップスキン除去幅" #: fdmprinter.def.json msgctxt "top_skin_preshrink description" msgid "The largest width of top skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top skin at slanted surfaces in the model." @@ -1552,8 +1722,8 @@ msgstr "取り除くスキンエリアの最大幅。この値より小さいす msgctxt "bottom_skin_preshrink label" msgid "Bottom Skin Removal Width" msgstr "" -#msgstr "ボトムのスキン除去幅" +# msgstr "ボトムのスキン除去幅" #: fdmprinter.def.json msgctxt "bottom_skin_preshrink description" msgid "The largest width of bottom skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing bottom skin at slanted surfaces in the model." @@ -1573,8 +1743,8 @@ msgstr "スキンがインフィルまで到達する距離です。高い数値 msgctxt "top_skin_expand_distance label" msgid "Top Skin Expand Distance" msgstr "" -#msgstr "トップのスキンの展開距離" +# msgstr "トップのスキンの展開距離" #: fdmprinter.def.json msgctxt "top_skin_expand_distance description" msgid "The distance the top skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on the layer above adhere better to the skin. Lower values save amount of material used." @@ -1584,8 +1754,8 @@ msgstr "スキンがインフィルまで到達する距離です。高い数値 msgctxt "bottom_skin_expand_distance label" msgid "Bottom Skin Expand Distance" msgstr "" -#msgstr "ボトムのスキンの展開距離" +# msgstr "ボトムのスキンの展開距離" #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance description" msgid "The distance the bottom skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the skin adhere better to the walls on the layer below. Lower values save amount of material used." @@ -1731,6 +1901,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "使用するフィラメントの太さの調整 この値を使用するフィラメントの太さと一致させてください。" +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -1958,8 +2148,8 @@ msgstr "内側のウォールをプリントする速度 外壁より内壁を msgctxt "speed_roofing label" msgid "Top Surface Skin Speed" msgstr "" -#msgstr "トップサーフェススキンの速度" +# msgstr "トップサーフェススキンの速度" #: fdmprinter.def.json msgctxt "speed_roofing description" msgid "The speed at which top surface skin layers are printed." @@ -2009,8 +2199,8 @@ msgstr "ルーフとフロアのサポート材をプリントする速度。低 msgctxt "speed_support_roof label" msgid "Support Roof Speed" msgstr "" -#msgstr "サポートルーフの速度" +# msgstr "サポートルーフの速度" #: fdmprinter.def.json msgctxt "speed_support_roof description" msgid "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality." @@ -2020,8 +2210,8 @@ msgstr "ルーフとフロアのサポート材をプリントする速度 こ msgctxt "speed_support_bottom label" msgid "Support Floor Speed" msgstr "" -#msgstr "サポートフロアの速度" +# msgstr "サポートフロアの速度" #: fdmprinter.def.json msgctxt "speed_support_bottom description" msgid "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model." @@ -2191,8 +2381,8 @@ msgstr "内側のウォールがが出力される際のスピード。" msgctxt "acceleration_roofing label" msgid "Top Surface Skin Acceleration" msgstr "" -#msgstr "トップ表面スキンの加速度" +# msgstr "トップ表面スキンの加速度" #: fdmprinter.def.json msgctxt "acceleration_roofing description" msgid "The acceleration with which top surface skin layers are printed." @@ -2242,8 +2432,8 @@ msgstr "サポートの上面と下面が印刷される加速度。低加速度 msgctxt "acceleration_support_roof label" msgid "Support Roof Acceleration" msgstr "" -#msgstr "サポートルーフの加速度" +# msgstr "サポートルーフの加速度" #: fdmprinter.def.json msgctxt "acceleration_support_roof description" msgid "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality." @@ -2253,8 +2443,8 @@ msgstr "サポートの上面がプリントされる加速度、低加速度で msgctxt "acceleration_support_bottom label" msgid "Support Floor Acceleration" msgstr "" -#msgstr "サポートフロアの加速度" +# msgstr "サポートフロアの加速度" #: fdmprinter.def.json msgctxt "acceleration_support_bottom description" msgid "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model." @@ -2384,8 +2574,8 @@ msgstr "内側のウォールがプリントされれう際の最大瞬間速度 msgctxt "jerk_roofing label" msgid "Top Surface Skin Jerk" msgstr "" -#msgstr "トップサーフェススキンジャーク" +# msgstr "トップサーフェススキンジャーク" #: fdmprinter.def.json msgctxt "jerk_roofing description" msgid "The maximum instantaneous velocity change with which top surface skin layers are printed." @@ -2435,8 +2625,8 @@ msgstr "どのルーフとフロアのサポート部分を印刷するかによ msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" msgstr "" -#msgstr "サポートルーフのジャーク" +# msgstr "サポートルーフのジャーク" #: fdmprinter.def.json msgctxt "jerk_support_roof description" msgid "The maximum instantaneous velocity change with which the roofs of support are printed." @@ -2446,8 +2636,8 @@ msgstr "どのサポートのルーフ部分を印刷するかによって最大 msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" msgstr "" -#msgstr "サポートフロアのジャーク" +# msgstr "サポートフロアのジャーク" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" msgid "The maximum instantaneous velocity change with which the floors of support are printed." @@ -2785,8 +2975,8 @@ msgstr "サポート" msgctxt "support_enable label" msgid "Generate Support" msgstr "" -#msgstr "サポートを生成します。" +# msgstr "サポートを生成します。" #: fdmprinter.def.json msgctxt "support_enable description" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." @@ -2836,8 +3026,8 @@ msgstr "サポートのルーフおよび底面を印刷するために使用す msgctxt "support_roof_extruder_nr label" msgid "Support Roof Extruder" msgstr "" -#msgstr "サポートルーフエクストルーダー" +# msgstr "サポートルーフエクストルーダー" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr description" msgid "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion." @@ -2847,8 +3037,8 @@ msgstr "サポートのルーフ面をプリントする際のエクストルー msgctxt "support_bottom_extruder_nr label" msgid "Support Floor Extruder" msgstr "" -#msgstr "サポートフロアエクストルーダー" +# msgstr "サポートフロアエクストルーダー" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr description" msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion." @@ -2928,8 +3118,8 @@ msgstr "" msgctxt "support_pattern option cross" msgid "Cross" msgstr "" -#msgstr "クロス" +# msgstr "クロス" #: fdmprinter.def.json msgctxt "support_connect_zigzags label" msgid "Connect Support ZigZags" @@ -2940,39 +3130,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "ジグザグを接続します。ジグザグ形のサポート材の強度が上がります。" -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "" -#msgstr "かたまりででサポートを割る" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "サポートラインの接続部分をスキップし、サポート材部分を壊れやすくします。この設定はジグザクのサポートインフィル材のパターンにて適用できます。" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "" -#msgstr "サポートのかたまりサイズ" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "サポート毎行Nミリ時に、サポートの接続をわざと外し、後のサポート材の構造をもろくし、壊れやすくする。" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "" -#msgstr "サポートのかたまり線数" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "毎行Nミリ時に、サポートの接続をわざとスキップし、後のサポート材の構造をもろくし、壊れやすくする。" - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3077,8 +3234,8 @@ msgstr "モデルにのっている階段状のサポートの底のステップ msgctxt "support_bottom_stair_step_width label" msgid "Support Stair Step Maximum Width" msgstr "" -#msgstr "階段状ステップサポートの最大幅" +# msgstr "階段状ステップサポートの最大幅" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width description" msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." @@ -3108,8 +3265,8 @@ msgstr "各レイヤーのサポート用ポリゴンに適用されるオフセ msgctxt "support_infill_sparse_thickness label" msgid "Support Infill Layer Thickness" msgstr "" -#msgstr "サポートインフィルのレイヤーの厚さ" +# msgstr "サポートインフィルのレイヤーの厚さ" #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness description" msgid "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded." @@ -3119,8 +3276,8 @@ msgstr "サポートのインフィルの厚さ。この値はレイヤーの倍 msgctxt "gradual_support_infill_steps label" msgid "Gradual Support Infill Steps" msgstr "" -#msgstr "段階的なサポート インフィルステップ" +# msgstr "段階的なサポート インフィルステップ" #: fdmprinter.def.json msgctxt "gradual_support_infill_steps description" msgid "Number of times to reduce the support infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Support Infill Density." @@ -3130,8 +3287,8 @@ msgstr "天井面より下に遠ざかる際にサポートのインフィル密 msgctxt "gradual_support_infill_step_height label" msgid "Gradual Support Infill Step Height" msgstr "" -#msgstr "段階的なサポート インフィル ステップの高さ" +# msgstr "段階的なサポート インフィル ステップの高さ" #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height description" msgid "The height of support infill of a given density before switching to half the density." @@ -3151,8 +3308,8 @@ msgstr "モデルとサポートの間に密なインターフェースを生成 msgctxt "support_roof_enable label" msgid "Enable Support Roof" msgstr "" -#msgstr "サポートルーフの有効化" +# msgstr "サポートルーフの有効化" #: fdmprinter.def.json msgctxt "support_roof_enable description" msgid "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support." @@ -3162,8 +3319,8 @@ msgstr "サポートの上部とモデルの間に高密度の厚板を形成し msgctxt "support_bottom_enable label" msgid "Enable Support Floor" msgstr "" -#msgstr "サポートフロアを有効にします。" +# msgstr "サポートフロアを有効にします。" #: fdmprinter.def.json msgctxt "support_bottom_enable description" msgid "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support." @@ -3193,8 +3350,8 @@ msgstr "サポートのルーフの厚さ。これは、モデルの下につく msgctxt "support_bottom_height label" msgid "Support Floor Thickness" msgstr "" -#msgstr "サポートのフロアの厚み" +# msgstr "サポートのフロアの厚み" #: fdmprinter.def.json msgctxt "support_bottom_height description" msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." @@ -3224,8 +3381,8 @@ msgstr "サポート材のルーフとフロアの密度を調整します 大 msgctxt "support_roof_density label" msgid "Support Roof Density" msgstr "" -#msgstr "サポートルーフの密度" +# msgstr "サポートルーフの密度" #: fdmprinter.def.json msgctxt "support_roof_density description" msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." @@ -3235,8 +3392,8 @@ msgstr "サポート材のルーフの部分の密度を調整します 大き msgctxt "support_roof_line_distance label" msgid "Support Roof Line Distance" msgstr "" -#msgstr "サポートルーフライン距離" +# msgstr "サポートルーフライン距離" #: fdmprinter.def.json msgctxt "support_roof_line_distance description" msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." @@ -3246,8 +3403,8 @@ msgstr "印刷されたサポートルーフ線間の距離。この設定は、 msgctxt "support_bottom_density label" msgid "Support Floor Density" msgstr "" -#msgstr "サポートフロア密度" +# msgstr "サポートフロア密度" #: fdmprinter.def.json msgctxt "support_bottom_density description" msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." @@ -3307,8 +3464,8 @@ msgstr "" msgctxt "support_roof_pattern label" msgid "Support Roof Pattern" msgstr "" -#msgstr "ルーフのサポートのパターン" +# msgstr "ルーフのサポートのパターン" #: fdmprinter.def.json msgctxt "support_roof_pattern description" msgid "The pattern with which the roofs of the support are printed." @@ -3318,44 +3475,44 @@ msgstr "サポートのルーフが印刷されるパターン" msgctxt "support_roof_pattern option lines" msgid "Lines" msgstr "" -#msgstr "線" +# msgstr "線" #: fdmprinter.def.json msgctxt "support_roof_pattern option grid" msgid "Grid" msgstr "" -#msgstr "グリッド" +# msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_roof_pattern option triangles" msgid "Triangles" msgstr "" -#msgstr "三角形" +# msgstr "三角形" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric" msgid "Concentric" msgstr "" -#msgstr "同心" +# msgstr "同心" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric_3d" msgid "Concentric 3D" msgstr "" -#msgstr "同心3D" +# msgstr "同心3D" #: fdmprinter.def.json msgctxt "support_roof_pattern option zigzag" msgid "Zig Zag" msgstr "" -#msgstr "ジグザグ" +# msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_bottom_pattern label" msgid "Support Floor Pattern" msgstr "" -#msgstr "サポートフロアパターン" +# msgstr "サポートフロアパターン" #: fdmprinter.def.json msgctxt "support_bottom_pattern description" msgid "The pattern with which the floors of the support are printed." @@ -3365,38 +3522,38 @@ msgstr "サポートのフロアが印刷されるパターン。" msgctxt "support_bottom_pattern option lines" msgid "Lines" msgstr "" -#msgstr "線" +# msgstr "線" #: fdmprinter.def.json msgctxt "support_bottom_pattern option grid" msgid "Grid" msgstr "" -#msgstr "グリッド" +# msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_bottom_pattern option triangles" msgid "Triangles" msgstr "" -#msgstr "三角形" +# msgstr "三角形" #: fdmprinter.def.json msgctxt "support_bottom_pattern option concentric" msgid "Concentric" msgstr "" -#msgstr "同心円" +# msgstr "同心円" #: fdmprinter.def.json msgctxt "support_bottom_pattern option concentric_3d" msgid "Concentric 3D" msgstr "" -#msgstr "コンセントリック3D" +# msgstr "コンセントリック3D" #: fdmprinter.def.json msgctxt "support_bottom_pattern option zigzag" msgid "Zig Zag" msgstr "" -#msgstr "ジグザグ" +# msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_use_towers label" msgid "Use Towers" @@ -3451,8 +3608,8 @@ msgstr "密着性" msgctxt "prime_blob_enable label" msgid "Enable Prime Blob" msgstr "" -#msgstr "プライムブロブを有効にする" +# msgstr "プライムブロブを有効にする" #: fdmprinter.def.json msgctxt "prime_blob_enable description" msgid "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time." @@ -3492,26 +3649,26 @@ msgstr "エクストルーダーとビルドプレートへの接着両方を改 msgctxt "adhesion_type option skirt" msgid "Skirt" msgstr "" -#msgstr "スカート" +# msgstr "スカート" #: fdmprinter.def.json msgctxt "adhesion_type option brim" msgid "Brim" msgstr "" -#msgstr "ブリム" +# msgstr "ブリム" #: fdmprinter.def.json msgctxt "adhesion_type option raft" msgid "Raft" msgstr "" -#msgstr "ラフト" +# msgstr "ラフト" #: fdmprinter.def.json msgctxt "adhesion_type option none" msgid "None" msgstr "" -#msgstr "なし" +# msgstr "なし" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr label" msgid "Build Plate Adhesion Extruder" @@ -3541,8 +3698,8 @@ msgstr "" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "スカートとプリントの最初のレイヤーの間の水平距離。これが最小距離であり、複数のスカートラインがこの距離から外側に延びている。" +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3584,28 +3741,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "モデルの外側のみにブリムを印刷します。これにより、後で取り除くブリムの量が減少します。またプレートへの接着力はそれほど低下しません。" -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "" -#msgstr "初期レイヤーのZオフセット" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "エクストルーダーは、最初のレイヤーの通常の高さからこの値でオフセットされます。それは、正 (上昇) または負 (低下)。エクストルーダーを少しだけ上昇させた方が、フィラメントによってはビルドプレートに付着しやすくなります。" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "" -#msgstr "Z オフセット テーパーレイヤー" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "0 以外の場合、Z オフセットは多くのレイヤーを介して 0 に減らされます。0 の値は そのZ オフセットがプリント中すべてのレイヤーにてコンスタントを維持することを意味します。" - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3620,12 +3755,11 @@ msgstr "ラフトが有効になっている場合、モデルの周りに余分 msgctxt "raft_smoothing label" msgid "Raft Smoothing" msgstr "" -#msgstr "ラフトスムージング" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "この設定は、ラフトのアウトラインの内側の角が丸みを帯びているかを制御します。内側のコーナーは、与えられた値と等しい半径の半円に丸められています。この設定では、円よりも小さいラフトアウトラインの穴は削除されます。" +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4011,8 +4145,8 @@ msgstr "エクストルーダーを切り替えた後、最初に印刷したも msgctxt "prime_tower_purge_volume label" msgid "Prime Tower Purge Volume" msgstr "" -#msgstr "プライムタワーのパージ時のボリューム" +# msgstr "プライムタワーのパージ時のボリューム" #: fdmprinter.def.json msgctxt "prime_tower_purge_volume description" msgid "Amount of filament to be purged when wiping on the prime tower. Purging is useful for compensating the filament lost by oozing during inactivity of the nozzle." @@ -4098,6 +4232,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "通常、Curaはメッシュ内の小さな穴をスティッチし、大きな穴のあるレイヤーの部分を削除しようとします。このオプションを有効にすると、スティッチできない部分が保持されます。このオプションは、他のすべてが適切なGCodeを生成できない場合の最後の手段として使用する必要があります。" +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4128,6 +4272,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "交差するメッシュがどのレイヤーに属しているかを切り替えることで、オーバーラップしているメッシュを絡み合うようにします。この設定をオフにすると、一方のメッシュはオーバーラップ内のすべてのボリュームを取得し、他方のメッシュは他から削除されます。" +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4182,8 +4336,8 @@ msgstr "他のインフィルメッシュのインフィル内にあるインフ msgctxt "cutting_mesh label" msgid "Cutting Mesh" msgstr "" -#msgstr "メッシュの切断" +# msgstr "メッシュの切断" #: fdmprinter.def.json msgctxt "cutting_mesh description" msgid "Limit the volume of this mesh to within other meshes. You can use this to make certain areas of one mesh print with different settings and with a whole different extruder." @@ -4193,8 +4347,8 @@ msgstr "このメッシュの大きさをを他のメッシュ内に制限しま msgctxt "mold_enabled label" msgid "Mold" msgstr "" -#msgstr "モールド" +# msgstr "モールド" #: fdmprinter.def.json msgctxt "mold_enabled description" msgid "Print models as a mold, which can be cast in order to get a model which resembles the models on the build plate." @@ -4204,8 +4358,8 @@ msgstr "型を取るため印刷し、ビルドプレート上の同じような msgctxt "mold_width label" msgid "Minimal Mold Width" msgstr "" -#msgstr "最小のモールド幅" +# msgstr "最小のモールド幅" #: fdmprinter.def.json msgctxt "mold_width description" msgid "The minimal distance between the ouside of the mold and the outside of the model." @@ -4215,8 +4369,8 @@ msgstr "型用とモデルの外側の最短距離。" msgctxt "mold_roof_height label" msgid "Mold Roof Height" msgstr "" -#msgstr "モールドの屋根の高さ" +# msgstr "モールドの屋根の高さ" #: fdmprinter.def.json msgctxt "mold_roof_height description" msgid "The height above horizontal parts in your model which to print mold." @@ -4226,8 +4380,8 @@ msgstr "型を印刷するためのモデルの水平部分上の高さ。" msgctxt "mold_angle label" msgid "Mold Angle" msgstr "" -#msgstr "モールドの角度" +# msgstr "モールドの角度" #: fdmprinter.def.json msgctxt "mold_angle description" msgid "The angle of overhang of the outer walls created for the mold. 0° will make the outer shell of the mold vertical, while 90° will make the outside of the model follow the contour of the model." @@ -4247,8 +4401,8 @@ msgstr "このメッシュを使用してサポート領域を指定します。 msgctxt "support_mesh_drop_down label" msgid "Drop Down Support Mesh" msgstr "" -#msgstr "ドロップダウンサポートメッシュ" +# msgstr "ドロップダウンサポートメッシュ" #: fdmprinter.def.json msgctxt "support_mesh_drop_down description" msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." @@ -4303,8 +4457,8 @@ msgstr "Z軸の外側のエッジの動きを滑らかにします。全体の msgctxt "smooth_spiralized_contours label" msgid "Smooth Spiralized Contours" msgstr "" -#msgstr "滑らかならせん状の輪郭" +# msgstr "滑らかならせん状の輪郭" #: fdmprinter.def.json msgctxt "smooth_spiralized_contours description" msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details." @@ -4314,8 +4468,8 @@ msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低 msgctxt "relative_extrusion label" msgid "Relative Extrusion" msgstr "" -#msgstr "相対エクストルージョン" +# msgstr "相対エクストルージョン" #: fdmprinter.def.json msgctxt "relative_extrusion description" msgid "Use relative extrusion rather than absolute extrusion. Using relative E-steps makes for easier post-processing of the Gcode. However, it's not supported by all printers and it may produce very slight deviations in the amount of deposited material compared to absolute E-steps. Irrespective of this setting, the extrusion mode will always be set to absolute before any Gcode script is output." @@ -4335,13 +4489,46 @@ msgstr "実験的" msgctxt "optimize_wall_printing_order label" msgid "Optimize Wall Printing Order" msgstr "" -#msgstr "壁のプリントの順番を最適化する" +# msgstr "壁のプリントの順番を最適化する" #: fdmprinter.def.json msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "撤回と移動距離を減らすために、壁のプリント順序を最適化します。ほとんどの部品がこの設定を有効にしている方が良い印刷結果につながりますが、実際には時間がかかることがありますので、最適化の有無に関わらず印刷時間を比較してください。" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "" + +# msgstr "かたまりででサポートを割る" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "サポートラインの接続部分をスキップし、サポート材部分を壊れやすくします。この設定はジグザクのサポートインフィル材のパターンにて適用できます。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "" + +# msgstr "サポートのかたまりサイズ" +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "サポート毎行Nミリ時に、サポートの接続をわざと外し、後のサポート材の構造をもろくし、壊れやすくする。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "" + +# msgstr "サポートのかたまり線数" +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "毎行Nミリ時に、サポートの接続をわざとスキップし、後のサポート材の構造をもろくし、壊れやすくする。" + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4466,8 +4653,8 @@ msgstr "トップ/ボトムのレイヤーが印刷される方向を変更し msgctxt "cross_infill_pocket_size label" msgid "Cross 3D Pocket Size" msgstr "" -#msgstr "クロス3Dポケットサイズ" +# msgstr "クロス3Dポケットサイズ" #: fdmprinter.def.json msgctxt "cross_infill_pocket_size description" msgid "The size of pockets at four-way crossings in the cross 3D pattern at heights where the pattern is touching itself." @@ -4477,8 +4664,8 @@ msgstr "四方でクロス3Dパターンが交差するポケットの大きさ msgctxt "cross_infill_apply_pockets_alternatingly label" msgid "Alternate Cross 3D Pockets" msgstr "" -#msgstr "クロス3Dポケットと交差させる" +# msgstr "クロス3Dポケットと交差させる" #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly description" msgid "Only apply pockets at half of the four-way crossings in the cross 3D pattern and alternate the location of the pockets between heights where the pattern is touching itself." @@ -4488,8 +4675,8 @@ msgstr "四方がクロスする、クロス3Dパターン交差時には半分 msgctxt "spaghetti_infill_enabled label" msgid "Spaghetti Infill" msgstr "" -#msgstr "スパゲッティ・インフィル" +# msgstr "スパゲッティ・インフィル" #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled description" msgid "Print the infill every so often, so that the filament will curl up chaotically inside the object. This reduces print time, but the behaviour is rather unpredictable." @@ -4499,8 +4686,8 @@ msgstr "時々インフィルを印刷してください、オブジェクト内 msgctxt "spaghetti_infill_stepped label" msgid "Spaghetti Infill Stepping" msgstr "" -#msgstr "スパゲッティのインフィルステッピング" +# msgstr "スパゲッティのインフィルステッピング" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped description" msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print." @@ -4510,8 +4697,8 @@ msgstr "スパゲッティインフィルをプリントするか印刷の最後 msgctxt "spaghetti_max_infill_angle label" msgid "Spaghetti Maximum Infill Angle" msgstr "" -#msgstr "スパゲッティの最大のインフィルの角度" +# msgstr "スパゲッティの最大のインフィルの角度" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle description" msgid "The maximum angle w.r.t. the Z axis of the inside of the print for areas which are to be filled with spaghetti infill afterwards. Lowering this value causes more angled parts in your model to be filled on each layer." @@ -4521,8 +4708,8 @@ msgstr "最大角度 w.r.t.-印刷範囲内がスパゲッティ・インフィ msgctxt "spaghetti_max_height label" msgid "Spaghetti Infill Maximum Height" msgstr "" -#msgstr "スパゲッティインフィルの最大高さ" +# msgstr "スパゲッティインフィルの最大高さ" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" msgid "The maximum height of inside space which can be combined and filled from the top." @@ -4532,8 +4719,8 @@ msgstr "内部空間の上から結合して埋め込むことができる最大 msgctxt "spaghetti_inset label" msgid "Spaghetti Inset" msgstr "" -#msgstr "スパゲティをセットする" +# msgstr "スパゲティをセットする" #: fdmprinter.def.json msgctxt "spaghetti_inset description" msgid "The offset from the walls from where the spaghetti infill will be printed." @@ -4543,8 +4730,8 @@ msgstr "スパゲッティ・インフィルがプリントされる壁からの msgctxt "spaghetti_flow label" msgid "Spaghetti Flow" msgstr "" -#msgstr "スパゲッティのフロー" +# msgstr "スパゲッティのフロー" #: fdmprinter.def.json msgctxt "spaghetti_flow description" msgid "Adjusts the density of the spaghetti infill. Note that the Infill Density only controls the line spacing of the filling pattern, not the amount of extrusion for spaghetti infill." @@ -4554,8 +4741,8 @@ msgstr "スパゲッティ・インフィルの密度を調整します。イン msgctxt "spaghetti_infill_extra_volume label" msgid "Spaghetti Infill Extra Volume" msgstr "" -#msgstr "スパゲッティ・インフィルの余分量" +# msgstr "スパゲッティ・インフィルの余分量" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume description" msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti." @@ -4641,6 +4828,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "各線分に導入されたランダム点間の平均距離。ポリゴンの元の点は破棄されるので、積層の値を低くすることで、なめらかな仕上がりになります。この値は、ファジースキンの厚さの半分よりも大きくなければなりません。" +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4898,117 +5105,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "ノズルと水平方向に下向きの線間の距離。大きな隙間がある場合、急な角度で斜め下方線となり、次の層が上方接続しずらくなる。ワイヤ印刷にのみ適用されます。" -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "" -#msgstr "アイロンを有効にする" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "ノズルから吐出せずに上部表面を再度動く機能。表面を溶かしてよりスムースにします。" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "" -#msgstr "上層のみアイロンをかけます" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "メッシュの最後のレイヤーでのみアイロンをかけます。下層にて滑らかな表面仕上げを必要としない場合、時間を節約します。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "" -#msgstr "アイロン時のパターン" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "アイロンのパターン" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "" -#msgstr "同心" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "" -#msgstr "ジグザグ" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "" -#msgstr "アイロンラインの線隔" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "アイロンライン同士の距離" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "" -#msgstr "アイロン時のフロー" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "アイロン時にノズルから出しておくフィラメントの量。多少出しておくと裂け目を綺麗にします。ただ出し過ぎると吐出過多になり、端が荒れます。" - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "" -#msgstr "アイロンを挿入する" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "モデルの端からの距離。端までアイロンをすると、端が荒れる場合があります。" - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "" -#msgstr "アイロン時のスピード" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "上部表面通過時の速度" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "" -#msgstr "アイロン時の加速" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "アイロン時の加速度" - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "" -#msgstr "ジャークをアイロンする" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "アイロン時の最大加速度" - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -5069,22 +5165,40 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "ファイルから読み込むときに、モデルに適用するトランスフォーメーションマトリックス。" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "壁造形用のエクストルーダー。デュアルノズル印刷時に使用。" +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "印刷物のインフィルのパターン。線とジグザグのインフィルはレイヤーごとに交互に方向を変え、材料費を削減します。グリッド、三角形、キュービック、オクテット、クォーターキュービック、同心円のパターンは、すべてのレイヤーにて完全に印刷されます。キュービック、クォーターキュービック、オクテットのインフィルは各レイヤーごとに変化し、各方向の強度が均等になるように分布します。" + +# msgstr "インフィルの線をつなげる" +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "内壁の形状に沿った線を使用して、インフィルのパターンが内壁と接する端を接続します。この設定を有効にすると、インフィルを壁面に密着させることができ、充填材が垂直面の品質に与える影響を低減できます。この設定を無効にすると、使用される材料の量が減ります。" + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "スカートとプリントの最初のレイヤーの間の水平距離。これが最小距離であり、複数のスカートラインがこの距離から外側に延びている。" + +# msgstr "初期レイヤーのZオフセット" +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "エクストルーダーは、最初のレイヤーの通常の高さからこの値でオフセットされます。それは、正 (上昇) または負 (低下)。エクストルーダーを少しだけ上昇させた方が、フィラメントによってはビルドプレートに付着しやすくなります。" + +# msgstr "Z オフセット テーパーレイヤー" +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "0 以外の場合、Z オフセットは多くのレイヤーを介して 0 に減らされます。0 の値は そのZ オフセットがプリント中すべてのレイヤーにてコンスタントを維持することを意味します。" + +# msgstr "ラフトスムージング" +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "この設定は、ラフトのアウトラインの内側の角が丸みを帯びているかを制御します。内側のコーナーは、与えられた値と等しい半径の半円に丸められています。この設定では、円よりも小さいラフトアウトラインの穴は削除されます。" #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." #~ msgstr "印刷物のインフィルのパターン。ラインとジグザグのインフィルは交互のレイヤー方向をずらし、材料費を削減します。グリッド、三角形、キュービック、四面体、同心円のパターンは、各レイヤーに完全に印刷されます。立方体および四面体のインフィルは各層ごとに変化し、各方向に沿ってより均等な強度分布を提供する。" -#~ msgctxt "infill_pattern option tetrahedral" -#~ msgid "Tetrahedral" -#~ msgstr "" - -#~ msgctxt "expand_skins_into_infill label" -#~ msgid "Expand Skins Into Infill" -#~ msgstr "" - #~ msgctxt "expand_skins_into_infill description" #~ msgid "Expand skin areas of top and/or bottom skin of flat surfaces. By default, skins stop under the wall lines that surround infill but this can lead to holes appearing when the infill density is low. This setting extends the skins beyond the wall lines so that the infill on the next layer rests on skin." #~ msgstr "平らな面の上部または底部のスキン部の及びその領域を展開します。既定では、スキンインフィルの周りの壁の線で停止しますが、これはインフィル密度が低いときに現れる穴につながることがあります。この設定は、次の層の面材が皮膚にかかっているので、壁の線を超えてスキンを拡張します。" @@ -5157,10 +5271,6 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ #~ msgid "RepRap (Marlin/Sprinter)" #~ msgstr "RepRap (Marlin/Sprinter)" -#~ msgctxt "machine_gcode_flavor option RepRap (Volumatric)" -#~ msgid "RepRap (Volumetric)" -#~ msgstr "" - #~ msgctxt "wall_thickness description" #~ msgid "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls." #~ msgstr "水平方向の外壁厚さ この値をウォールライン幅で割ることで、ウォール数を定義します。" @@ -5173,26 +5283,14 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ #~ msgid "Width of a single support interface line." #~ msgstr "単一のサポートインタフェースラインの幅。" -#~ msgctxt "sub_div_rad_mult label" -#~ msgid "Cubic Subdivision Radius" -#~ msgstr "" - #~ msgctxt "sub_div_rad_mult description" #~ msgid "A multiplier on the radius from the center of each cube to check for the boundary of the model, as to decide whether this cube should be subdivided. Larger values lead to more subdivisions, i.e. more small cubes." #~ msgstr "各立方体の中心からの半径上の乗数で、モデルの境界をチェックし、この立方体を細分するかどうかを決定します。値を大きくすると細分化が増えます。つまり、より小さなキューブになります。" -#~ msgctxt "expand_upper_skins label" -#~ msgid "Expand Upper Skins" -#~ msgstr "" - #~ msgctxt "expand_upper_skins description" #~ msgid "Expand upper skin areas (areas with air above) so that they support infill above." #~ msgstr "上部のインフィルをサポートするので、スキン面 (上記の空気を含んだ領域) を展開します。" -#~ msgctxt "expand_lower_skins label" -#~ msgid "Expand Lower Skins" -#~ msgstr "" - #~ msgctxt "expand_lower_skins description" #~ msgid "Expand lower skin areas (areas with air below) so that they are anchored by the infill layers above and below." #~ msgstr "彼らは上と下の面材のレイヤーによって固定されますので、低い肌の部分 (空気を含んだ領域) を展開します。" @@ -5209,10 +5307,6 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ #~ msgid "The maximum instantaneous velocity change with which the roofs and bottoms of support are printed." #~ msgstr "サポート材の屋根とボトムのプリント時、最大瞬間速度の変更。" -#~ msgctxt "support_enable label" -#~ msgid "Enable Support" -#~ msgstr "" - #~ msgctxt "support_enable description" #~ msgid "Enable support structures. These structures support parts of the model with severe overhangs." #~ msgstr "サポート材を印刷可能にします。これは、モデル上のオーバーハング部分にサポート材を構築します。" @@ -5225,10 +5319,6 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ #~ msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." #~ msgstr "モデルにかかる階段形サポートの下部の高さです。低い値のサポートの除去は難しく、高すぎる値は不安定なサポート構造につながります。" -#~ msgctxt "support_bottom_height label" -#~ msgid "Support Bottom Thickness" -#~ msgstr "" - #~ msgctxt "support_bottom_height description" #~ msgid "The thickness of the support bottoms. This controls the number of dense layers are printed on top of places of a model on which support rests." #~ msgstr "サポート材の底部の厚さ。これは、サモデルの上に印刷されるサポートの積層密度を制御します。" @@ -5241,10 +5331,6 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ #~ msgid "Adjusts the density of the roofs and bottoms of the support structure. A higher value results in better overhangs, but the supports are harder to remove." #~ msgstr "サポート材の屋根と底部の密度を調整します 大きな値ではオーバーハングでの成功率があがりますが、サポート材が除去しにくくなります" -#~ msgctxt "support_interface_line_distance label" -#~ msgid "Support Interface Line Distance" -#~ msgstr "" - #~ msgctxt "support_interface_line_distance description" #~ msgid "Distance between the printed support interface lines. This setting is calculated by the Support Interface Density, but can be adjusted separately." #~ msgstr "印刷されたサポートインタフェースラインの間隔。この設定はSupport Interface Densityで計算されますが、個別に調整することができます。" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po new file mode 100644 index 0000000000..65346b16d8 --- /dev/null +++ b/resources/i18n/ko_KR/cura.po @@ -0,0 +1,4416 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.1\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: TEAM\n" +"Language: xx_XX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 +msgctxt "@action:button" +msgid "Cancel" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +msgctxt "@info:title" +msgid "Printer Unavailable" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +msgctxt "@info:status" +msgid "This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer does not support usb printing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +msgctxt "@info:title" +msgid "Warning" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +msgctxt "@info:title" +msgid "Error" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:status" +msgid "Access to the printer requested. Please approve the request on the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:title" +msgid "Connection status" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +msgctxt "@action:button" +msgid "Retry" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 +msgctxt "@info:status" +msgid "Connected over the network. Please approve the access request on the printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 +msgctxt "@info:status" +msgid "The connection with the printer was lost. Check your printer to see if it is connected." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 +#, python-format +msgctxt "@info:status" +msgid "Unable to start a new print job, printer is busy. Current printer status is %s." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#, python-brace-format +msgctxt "@label" +msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +msgctxt "@label" +msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +msgctxt "@label" +msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 +#, python-brace-format +msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +msgctxt "@info:status" +msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#, python-brace-format +msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +msgctxt "@action:button" +msgid "How to update" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +msgctxt "@info" +msgid "Could not access update information." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +msgid "Modify G-Code" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice with the current settings. The following settings have errors: {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +msgctxt "@info:status" +msgid "Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +msgctxt "@info:status" +msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +msgctxt "@info:title" +msgid "Information" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +msgctxt "@title:tab" +msgid "Custom" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +msgctxt "@label" +msgid "Nozzle" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +msgctxt "@info:tile" +msgid "Warning" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +msgctxt "@info:generic" +msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Skin" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Infill" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Support" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Travel" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +msgctxt "@tooltip" +msgid "Other" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "The file {0} already exists. Are you sure you want to overwrite it?" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +msgctxt "@info:status" +msgid "The selected material is incompatible with the selected machine or configuration." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "The selected material diameter causes the material to become incompatible with the current printer." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to export profile to {0}: {1}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Failed to export profile to {0}: Writer plugin reported failure." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +msgctxt "@info:title" +msgid "Export succeeded" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Failed to import profile from {0}: {1}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +msgctxt "@label" +msgid "Custom profile" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" +msgid "" +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#, python-format +msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 +msgctxt "@title:tab" +msgid "Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 +msgctxt "@label" +msgid "Printer Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +msgctxt "@label" +msgid "X (Width)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +msgctxt "@label" +msgid "mm" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +msgctxt "@label" +msgid "Z (Height)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 +msgctxt "@label" +msgid "Build plate shape" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@label" +msgid "X min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 +msgctxt "@tooltip" +msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@label" +msgid "Y min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 +msgctxt "@tooltip" +msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@label" +msgid "X max" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 +msgctxt "@tooltip" +msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@label" +msgid "Y max" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 +msgctxt "@tooltip" +msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +msgctxt "@label" +msgid "Gantry height" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 +msgctxt "@tooltip" +msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 +msgctxt "@tooltip" +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 +msgctxt "@label" +msgid "Material diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +msgctxt "@label" +msgid "Nozzle size" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +msgctxt "@label" +msgid "Start Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +msgctxt "@label" +msgid "End Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 +msgctxt "@label" +msgid "If your printer is not listed, read the network printing troubleshooting guide" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 +msgctxt "@label" +msgid "Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 +msgctxt "@label" +msgid "Firmware version" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 +msgctxt "@label" +msgid "Address" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 +msgctxt "@action" +msgid "Add a script" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 +msgctxt "@label" +msgid "Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 +msgctxt "@title:window" +msgid "Open Project" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 +msgctxt "@action:label" +msgid "Type" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 +msgctxt "@action:label" +msgid "Name" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 +msgctxt "@action:label" +msgid "Material settings" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 +msgctxt "@action:label" +msgid "Mode" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the build plate." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 +msgctxt "@action:button" +msgid "Open" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +"This plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "General" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "You will need to restart the application for these changes to have effect." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "Moves the camera so the model is in the center of the view when a model is selected" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved so that they no longer intersect?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "Should a prefix based on the printer name be added to the print job name automatically?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +msgctxt "@title:tab" +msgid "Printers" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 +msgctxt "@label" +msgid "Printer type:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 +msgctxt "@label" +msgid "Connection:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 +msgctxt "@label" +msgid "State:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +msgctxt "@title:tab" +msgid "Materials" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" +msgid "Printer: %1, %2: %3" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not import material %1: %2" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "Failed to export material to %1: %2" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "Font" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 +msgctxt "@label" +msgid "SVG icons" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated value.\n" +"\n" +"Click to make these settings visible." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" +msgid "00h 00min" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +msgctxt "@tooltip" +msgid "Time specification
    " +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" +msgid "%1m / ~ %2g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +msgctxt "@tooltip" +msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +msgctxt "@tooltip" +msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +msgctxt "@label" +msgid "Extruder" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 +msgctxt "@label" +msgid "Build plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 +msgctxt "@tooltip" +msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +msgctxt "@button" +msgid "Pre-heat" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 +msgctxt "@tooltip of pre-heat" +msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 +msgctxt "@label" +msgid "Active print" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 +msgctxt "@label" +msgid "Job Name" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 +msgctxt "@label" +msgid "Printing Time" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 +msgctxt "@label" +msgid "Estimated time left" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Ultimaker Cura" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +msgctxt "@title:menu" +msgid "&View" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +msgctxt "@title:menu" +msgid "&Material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +msgctxt "@action:button" +msgid "Open File" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +msgctxt "@title:tab" +msgid "Settings" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +msgctxt "@title:window" +msgid "New project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +msgctxt "@info:question" +msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +msgctxt "@text:window" +msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +msgctxt "@label" +msgid "Layer Height" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +msgctxt "@label" +msgid "Print Speed" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +msgctxt "@label" +msgid "Slower" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +msgctxt "@label" +msgid "Faster" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +msgctxt "@label" +msgid "Infill" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +msgctxt "@label" +msgid "Gradual infill will gradually increase the amount of infill towards the top." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +msgctxt "@label" +msgid "Enable gradual" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +msgctxt "@label" +msgid "Generate Support" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +msgctxt "@label" +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +msgctxt "@label" +msgid "Support Extruder" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +msgctxt "@label" +msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +msgctxt "@label" +msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +msgctxt "@label" +msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "" +msgstr[1] "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +msgctxt "@text:window" +msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@action:button" +msgid "Open as project" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +msgctxt "@action:button" +msgid "Import models" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +msgctxt "@label" +msgid "Material" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +msgctxt "@label" +msgid "Check compatibility" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "" + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" +msgstr "" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "" + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "" + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "" + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "" + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "" + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "" + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" +msgstr "" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "" + +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "" + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "" + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "" + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "" + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "" + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "" + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "" + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "" + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "" + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "" + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "" + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "" + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "" + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "" + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" +msgstr "" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "" + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "" diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po index a6635e1d78..401dac7ff0 100644 --- a/resources/i18n/ko_KR/fdmextruder.def.json.po +++ b/resources/i18n/ko_KR/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-20 14:31+0900\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -196,4 +196,4 @@ msgstr "압출기 프라임 Y 위치 " #: fdmextruder.def.json msgctxt "extruder_prime_pos_y description" msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " \ No newline at end of file +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index b943c854d0..d39f06d408 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-21 14:58+0900\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" @@ -607,6 +607,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 빌드 플레이트에 쉽게 접착합니다. " +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -757,6 +782,16 @@ msgctxt "shell description" msgid "Shell" msgstr "겉면 " +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -769,7 +804,7 @@ msgstr "외벽 인쇄에 사용되는 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" +msgid "Inner Wall Extruder" msgstr "" #: fdmprinter.def.json @@ -1202,6 +1237,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "위쪽 / 아래쪽 패턴의 가장 바깥 쪽 부분을 여러 동심 선으로 바꿉니다. 하나 또는 두 개의 선을 사용하면 충진재로 시작하는 지붕이 향상됩니다. " +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "윗면을 다림질 할 때 사용하는 패턴. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "다림질 라인 사이의 거리. " + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "상단 표면을 통과하는 속도. " + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "다림질이 수행되는 가속도. " + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "다림질을하는 동안 최대 순간 속도 변화. " + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1249,8 +1384,8 @@ msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1267,6 +1402,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1319,8 +1459,8 @@ msgstr "" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1332,6 +1472,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호 안에 들어 있습니다. 기본값은 전통적인 기본 각도 (선 및 지그재그 패턴의 경우 45 및 135도, 다른 모든 패턴의 경우 45도)를 사용한다는 의미의 빈 목록입니다. " +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1642,6 +1802,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "사용 된 필라멘트의 직경을 조정합니다. 이 값을 사용 필라멘트의 직경과 일치시킵니다. " +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2832,36 +3012,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "지그재그를 연결하십시오. 이것은 지그재그지지 구조의 강도를 증가시킵니다. " -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "지원 구조가 쉽게 끊어 지도록 지원 라인 연결을 건너 뛰십시오. 이 설정은 지그재그 지원 충전 패턴에 적용됩니다. " - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "지지 구조를 쉽게 분리 할 수 있도록 N 밀리미터마다 지지선 사이를 연결하십시오. " - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "지원 구조를 쉽게 깨뜨릴 수 있도록 모든 N 개의 연결 라인을 건너 뜁니다. " - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3401,8 +3551,8 @@ msgstr "" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3444,26 +3594,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "모델 바깥 쪽 가장자리에만 인쇄하십시오. 이렇게하면 나중에 제거해야하는 가장자리의 양이 줄어들지 만 침대 접착력은 그렇게 많이 줄어들지 않습니다. " -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3481,8 +3611,8 @@ msgstr "" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3954,6 +4084,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3984,6 +4124,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 메쉬가 서로 얽 히게됩니다. 이 설정을 해제하면 메시 중 하나가 다른 메시에서 제거되는 동안 오버랩의 모든 볼륨을 가져옵니다. " +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4189,6 +4339,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "지원 구조가 쉽게 끊어 지도록 지원 라인 연결을 건너 뛰십시오. 이 설정은 지그재그 지원 충전 패턴에 적용됩니다. " + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "지지 구조를 쉽게 분리 할 수 있도록 N 밀리미터마다 지지선 사이를 연결하십시오. " + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "지원 구조를 쉽게 깨뜨릴 수 있도록 모든 N 개의 연결 라인을 건너 뜁니다. " + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4479,6 +4659,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "각 선분에 도입 된 임의의 점 사이의 평균 거리입니다. 다각형의 원래 점은 버려 지므로 높은 부드러움으로 인해 해상도가 감소합니다. 이 값은 퍼지 스킨 두께의 절반보다 커야합니다. " +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4736,106 +4936,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 클수록 비스듬한 각도에서 비스듬히 아래쪽으로 선이 그어져 다음 층과의 연결이보다 적어집니다. 와이어 인쇄에만 적용됩니다. " -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "윗면을 다림질 할 때 사용하는 패턴. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "다림질 라인 사이의 거리. " - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "상단 표면을 통과하는 속도. " - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "다림질이 수행되는 가속도. " - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "다림질을하는 동안 최대 순간 속도 변화. " - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4896,9 +4996,31 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다. " -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -4934,4 +5056,4 @@ msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬 #~ msgctxt "skin_overlap description" #~ msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin." -#~ msgstr "피부와 벽 사이의 겹침 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. " \ No newline at end of file +#~ msgstr "피부와 벽 사이의 겹침 정도입니다. 약간 겹치면 벽이 피부에 단단히 연결됩니다. " diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 680106d321..460eddc9b3 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Print afgebroken" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Geblokkeerd" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Handeling nodig" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Print start niet" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Deze printer is niet opgezet om een groep Ultimaker 3 printers te hosten." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Klaar om: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Deze printer is de host voor een groep van %1 Ultimaker 3 printers." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "Printer '{printer_name}' is klaar met het printen van '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Print klaar" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Plugins" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Door invoegtoepassingen bladeren..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Geïnstalleerde plugins..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Verbinding maken met Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Annuleren" @@ -152,15 +90,15 @@ msgstr "Het bestand is naar Doodle3D Connect verzonden" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Connect openen" +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "De Doodle3D Connect-webinterface openen" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Wijzigingenlogboek Weergeven" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Aangesloten via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Er kan geen nieuwe taak worden gestart omdat de printer bezig is of niet aangesloten is." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Printgegevens" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "De printer biedt geen ondersteuning voor USB-printen omdat deze de codeversie UltiGCode gebruikt." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB-printen" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Er kan geen nieuwe taak worden gestart omdat de printer geen ondersteuning biedt voor USB-printen." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Waarschuwing" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Kan niet opslaan op verwisselbaar station {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Fout" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Verwisselbaar Station" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Printen via netwerk" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Printen via netwerk" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Er is een toegangsaanvraag voor de printer verstuurd. Keur de aanvraag goed op de printer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Verbindingsstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Verbindingsstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Opnieuw proberen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "De toegangsaanvraag opnieuw verzenden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Toegang tot de printer is geaccepteerd" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Kan geen toegang verkrijgen om met deze printer te printen. Kan de printtaak niet verzenden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Toegang aanvragen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Toegangsaanvraag naar de printer verzenden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Via het netwerk verbonden. Keur de aanvraag goed op de printer." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Via het netwerk verbonden." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Via het netwerk verbonden. Kan de printer niet beheren." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Toegang is op de printer geweigerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "De toegangsaanvraag is mislukt vanwege een time-out." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "De verbinding met het netwerk is verbroken." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "De verbinding met de printer is verbroken. Controleer of de printer nog is aangesloten." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Er kan geen nieuwe taak worden gestart omdat de printer bezig is. De huidige printerstatus is %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Printerstatus" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Er kan geen nieuwe taak worden gestart. Er is geen PrintCore geladen in de sleuf {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Er kan geen nieuwe taak worden gestart. Er is geen materiaal geladen in de sleuf {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Er is onvoldoende materiaal voor de spool {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Afwijkende PrintCore (Cura: {0}, Printer: {1}) geselecteerd voor de extruder {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Afwijkend materiaal (Cura: {0}, Printer: {1}) geselecteerd voor de extruder {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "De PrintCore {0} is niet correct gekalibreerd. Op de printer moet XY-kalibratie worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Weet u zeker dat u met de geselecteerde configuratie wilt printen?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "De configuratie of kalibratie van de printer komt niet overeen met de configuratie van Cura. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "De configuratie komt niet overeen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Het verzenden van nieuwe taken is (tijdelijk) geblokkeerd. Nog bezig met het verzenden van de vorige printtaak." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "De gegevens worden naar de printer verzonden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Gegevens Verzenden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Kan geen gegevens naar de printer verzenden. Is er nog een andere taak actief?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Printen afbreken..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Print afgebroken. Controleer de printer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Print onderbreken..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Print hervatten..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchroniseren met de printer" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Wilt u uw huidige printerconfiguratie gebruiken in Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "De PrintCores en/of materialen in de printer wijken af van de PrintCores en/of materialen in uw huidige project. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Verbinding Maken via Netwerk" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Deze printer is niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Deze printer is de host voor een groep van {count} aangesloten Ultimaker 3-printers." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} heeft '{job_name}' voltooid. Haal de print op en bevestig dat het platform is leeggemaakt." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} is gereserveerd voor het printen van '{job_name}'. Wijzig de instellingen van de printer zodanig dat ze aansluiten bij de taak, zodat u kunt beginnen met printen." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Het verzenden van nieuwe taken is (tijdelijk) geblokkeerd. Nog bezig met het verzenden van de vorige printtaak." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Kan geen nieuwe printtaak verzenden: deze 3D-printer is (nog) niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Bezig met verzenden van {file_name} naar groep {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} is verzonden naar groep {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Printtaken weergeven" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Opent de printtaken-interface in uw browser." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Kan de printtaak niet naar groep {cluster_name} verzenden." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} is verzonden naar groep {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Printtaken weergeven" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Opent de printtaken-interface in uw browser." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Onbekend" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "Printer '{printer_name}' is klaar met het printen van '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Print klaar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Handeling nodig" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Bezig met verzenden van {file_name} naar groep {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Verbinding Maken via Netwerk" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Om ervoor te zorgen dat uw {machine_name} van de nieuwste functies is voorzien, wordt aanbevolen om de firmware regelmatig bij te werken. U kunt dit doen op de {machine_name} (wanneer deze is verbonden met het netwerk) of via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nieuwe firmware voor %s beschikbaar" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Downloaden" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Geen toegang tot update-informatie." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Er is een fout opgetreden tijdens het starten van %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Als draadprinten is ingeschakeld, geeft Cura lagen niet nauwkeurig weer" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "G-code wijzigen" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-code-bestand" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Laagweergave" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Als draadprinten is ingeschakeld, geeft Cura lagen niet nauwkeurig weer" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Laagweergave" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Met het huidige materiaal is slicen niet mogelijk, omdat het materiaal n #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Kan niet slicen" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Met de huidige instellingen is slicing niet mogelijk. De volgende instellingen bevatten fouten: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Slicen is niet mogelijk omdat de terugduwpijler of terugduwpositie(s) ongeldig zijn." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Er valt niets te slicen omdat geen van de modellen in het bouwvolume past. Schaal of roteer de modellen totdat deze passen." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Lagen verwerken" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informatie" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Instellingen per Model configureren" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Aanbevolen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Aangepast" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF-bestand" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Nozzle" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Door invoegtoepassingen bladeren" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Kan de invoegtoepassing-ID van {0} niet vinden" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Waarschuwing" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Invoegtoepassingbrowser" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G-bestand" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-code parseren" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Details van de G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Zorg ervoor dat de G-code geschikt is voor uw printer en de printerconfiguratie voordat u het bestand verzendt. Mogelijk is de weergave van de G-code niet nauwkeurig." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Platform kalibreren" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Buitenwand" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Binnenwanden" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Skin" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Vulling" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Supportvulling" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Verbindingsstructuur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Supportstructuur" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Beweging" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Intrekkingen" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Overig(e)" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Vooraf geslicet bestand {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Geen materiaal ingevoerd" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Onbekend materiaal" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Kan locatie niet vinden" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Het Bestand Bestaat Al" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Aangepast materiaal" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Het geselecteerde materiaal is niet compatibel met de geselecteerde machine of configuratie." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Maak wijzigen van de materiaaldiameter ongedaan." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Kan het profiel niet exporteren als {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Kan het profiel niet exporteren als {0}: Invoegtoepassing voor de schrijver heeft een fout gerapporteerd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Het profiel is geëxporteerd als {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Exportgegevens" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Kan het profiel niet importeren uit {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Het profiel {0} is geïmporteerd" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Het profiel {0} heeft een onbekend bestandstype of is beschadigd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Aangepast profiel" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Er ontbreekt een kwaliteitstype in het profiel." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Object plaatsen" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Crashrapport" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Er is een fatale fout opgetreden die niet kan worden hersteld!

    \n

    Gebruik de onderstaande informatie om een bugrapport te plaatsen op http://github.com/Ultimaker/Cura/issues

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Webpagina openen" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Machines laden..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Scene instellen..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Interface laden..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Er kan slechts één G-code-bestand tegelijkertijd worden geladen. Het importeren van {0} is overgeslagen" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Kan geen ander bestand openen als G-code wordt geladen. Het importeren van {0} is overgeslagen" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Machine-instellingen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Printer" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Printerinstellingen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Breedte)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Diepte)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Hoogte)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Vorm van het platform" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Centraal oorsprongpunt" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Verwarmd bed" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Versie G-code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Instellingen Printkop" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Afstand van de linkerkant van de printkop tot het midden van de nozzle. Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en de printkop te voorkomen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Afstand van de voorkant van de printkop tot het midden van de nozzle. Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en de printkop te voorkomen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Afstand van de rechterkant van de printkop tot het midden van de nozzle. Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en de printkop te voorkomen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Afstand van de achterkant van de printkop tot het midden van de nozzle. Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en de printkop te voorkomen." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Hoogte rijbrug" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Het hoogteverschil tussen de punt van de nozzle en het rijbrugsysteem (X- en Y-as). Wordt tijdens \"een voor een\"-printen gebruikt om botsingen tussen eerder geprinte voorwerpen en het rijbrugsysteem te voorkomen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Aantal extruders" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "De nominale diameter van het filament dat wordt ondersteund door de printer. De exacte diameter wordt overschreven door het materiaal en/of het profiel." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Materiaaldiameter" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Maat nozzle" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Start G-code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "G-code-opdrachten die aan het begin worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Eind G-code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "G-code-opdrachten die aan het eind worden uitgevoerd." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Nozzle-instellingen" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Nozzle-offset X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Nozzle-offset Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Start-G-code van extruder" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Eind-G-code van extruder" @@ -1406,12 +1448,11 @@ msgstr "Wijzigingenlogboek" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Onbekende foutcode: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Verbinding Maken met Printer in het Netwerk" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" +msgstr "" +"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" +"\n" +"Selecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Toevoegen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Bewerken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Verwijderen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Vernieuwen" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Raadpleeg de handleiding voor probleemoplossing bij printen via het netwerk als uw printer niet in de lijst wordt vermeld" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Type" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Onbekend" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Firmwareversie" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Adres" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Deze printer is niet opgezet om een groep Ultimaker 3 printers te hosten." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Deze printer is de host voor een groep van %1 Ultimaker 3 printers." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "De printer op dit adres heeft nog niet gereageerd." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Verbinden" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Printeradres" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Voer het IP-adres of de hostnaam van de printer in het netwerk in." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "OK" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Printen via netwerk" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Printen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 is niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Printtaken weergeven" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Voorbereiden om te printen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Printen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Beschikbaar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Verbinding met de printer is verbroken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Gereserveerd" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Gereed" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Print afgebroken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Accepteert geen printtaken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Klaar om: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Platform leegmaken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Wacht op wijziging van configuratie" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Printtaken" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Printen" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "In wachtrij" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Printers" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Printers weergeven" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Verbinding maken met een printer" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "De configuratie van de printer in Cura laden" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Configuratie Activeren" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Deze printer is niet ingesteld voor het hosten van een groep aaneengesloten Ultimaker 3-printers" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Deze printer is de host voor een groep van %1 aaneengesloten Ultimaker 3-printers" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Printen via netwerk" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Printen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 is niet ingesteld voor het hosten van een groep aangesloten Ultimaker 3-printers" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Printen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Gereserveerd" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Gereed" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Voorbereiden" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Beschikbaar" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Voltooid op: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Platform leegmaken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Voorbereiden om te printen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Accepteert geen printtaken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Opent de pagina met printtaken in uw standaard webbrowser." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Printtaken weergeven" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "PRINTERGROEP" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Printtaken" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Printen" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "In wachtrij" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Wacht op wijziging van configuratie" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Printers" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Printers weergeven" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Altijd Grove kwaliteit gebruiken" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "Fijn" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Mijn keuze onthouden" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Kleurenschema" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Materiaalkleur" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Lijntype" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Compatibiliteitsmodus" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Bewegingen weergeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Helpers weergeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Shell weergeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Vulling weergeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Alleen bovenlagen weergegeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "5 gedetailleerde lagen bovenaan weergeven" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Boven-/onderkant" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Binnenwand" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Scripts voor Nabewerking" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Een script toevoegen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Instellingen" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Actieve scripts voor nabewerking wijzigen" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Kleurenschema" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Materiaalkleur" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Lijntype" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Compatibiliteitsmodus" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Bewegingen weergeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Helpers weergeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Shell weergeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Vulling weergeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Alleen bovenlagen weergegeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "5 gedetailleerde lagen bovenaan weergeven" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Boven-/onderkant" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Binnenwand" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Alles weergeven" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Project openen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Bestaand(e) bijwerken" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Nieuw maken" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Samenvatting - Cura-project" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Printerinstellingen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Hoe dient het conflict in de machine te worden opgelost?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Type" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Naam" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Profielinstellingen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Hoe dient het conflict in het profiel te worden opgelost?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Niet in profiel" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 overschrijving" msgstr[1] "%1 overschrijvingen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Afgeleide van" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 overschrijving" msgstr[1] "%1, %2 overschrijvingen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Materiaalinstellingen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Hoe dient het materiaalconflict te worden opgelost?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Zichtbaarheid instellen" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Modus" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Zichtbare instellingen:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 van %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Als u een project laadt, worden alle modellen van het platform gewist" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Openen" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Geïnstalleerd" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Downloaden" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Licentieovereenkomst invoegtoepassing" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met onderstaande voorwaarden?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Nee, ik ga niet akkoord" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "Printer accepteert geen opdrachten" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "In onderhoud. Controleer de printer" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Verbinding met de printer is verbroken" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Printen..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Gepauzeerd" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Voorbereiden..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" +msgstr "" +"U hebt enkele profielinstellingen aangepast.\n" +"Wilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Eenheid" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Algemeen" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "(Anonieme) printgegevens verzenden" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Printers" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Hernoemen" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Type printer:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Verbinding:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Er is geen verbinding met de printer." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Status:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Wachten totdat iemand het platform leegmaakt" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Wachten op een printtaak" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profielen" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Profiel exporteren" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materialen" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Materiaal is geëxporteerd naar %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Printer Toevoegen" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Over Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "" +"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" +"Cura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Bibliotheek met veelhoeken" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Lettertype" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG-pictogrammen" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profiel:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." +msgstr "" +"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" +"\n" +"Klik om het profielbeheer te openen." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Zoeken..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Waarde naar alle extruders kopiëren" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Deze instelling verbergen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Deze instelling verbergen" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Deze instelling zichtbaar houden" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Zichtbaarheid van instelling configureren..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." +msgstr "" +"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" +"\n" +"Klik om deze instellingen zichtbaar te maken." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." +msgstr "" +"Deze instelling heeft een andere waarde dan in het profiel.\n" +"\n" +"Klik om de waarde van het profiel te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." +msgstr "" +"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" +"\n" +"Klik om de berekende waarde te herstellen." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Instelling voor Printen" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" +msgstr "" +"Instelling voor printen uitgeschakeld\n" +"G-code-bestanden kunnen niet worden aangepast" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00u 00min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Tijdsinformatie" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Printtijd" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Aanbevolen instellingen voor printen

    Print met de aanbevolen instellingen voor de geselecteerde printer en kwaliteit, en het geselecteerde materiaal." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Aangepaste instellingen voor printen

    Print met uiterst precieze controle over elk detail van het slice-proces." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "Beel&d" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automatisch: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "&Recente bestanden openen" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Er is geen printer aangesloten" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Extruder" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "De huidige temperatuur van deze extruder." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "De kleur van het materiaal in deze extruder." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Het materiaal in deze extruder." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "De nozzle die in deze extruder geplaatst is." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Platform" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "De doeltemperatuur van het verwarmde bed. Het bed wordt verwarmd of afgekoeld totdat deze temperatuur bereikt is. Als deze waarde ingesteld is op 0, wordt de verwarming van het bed uitgeschakeld." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "De huidige temperatuur van het verwarmde bed." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "De temperatuur waarnaar het bed moet worden voorverwarmd." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Annuleren" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Voorverwarmen" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Verwarm het bed voordat u gaat printen. U kunt doorgaan met het aanpassen van uw print terwijl het bed wordt verwarmd. Zo hoeft u niet te wachten totdat het bed opgewarmd is wanneer u gereed bent om te printen." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Actieve print" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Taaknaam" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Printtijd" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Geschatte resterende tijd" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Vo&lledig Scherm In-/Uitschakelen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Ongedaan &Maken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Opnieuw" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Afsluiten" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura Configureren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Printer Toevoegen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Pr&inters Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialen Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Profiel bijwerken met h&uidige instellingen/overschrijvingen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Hui&dige wijzigingen verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Profiel maken op basis van huidige instellingen/overs&chrijvingen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profielen Beheren..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online &Documentatie Weergeven" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Een &Bug Rapporteren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Over..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Ge&selecteerd model verwijderen" msgstr[1] "Ge&selecteerde modellen verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Geselecteerd model centreren" msgstr[1] "Geselecteerde modellen centreren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Geselecteerd model verveelvoudigen" msgstr[1] "Geselecteerde modellen verveelvoudigen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Model Verwijderen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Model op Platform Ce&ntreren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modellen &Groeperen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Groeperen van Modellen Opheffen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modellen Samen&voegen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Model verveelvoudigen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Alle Modellen &Selecteren" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Platform Leegmaken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Alle Modellen Opnieuw &Laden" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle modellen schikken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Selectie schikken" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modelposities Herstellen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Alle Model&transformaties Herstellen" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Bestand(en) &openen..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nieuw project..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Engine-&logboek Weergeven..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Open Configuratiemap" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Zichtbaarheid Instelling Configureren..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Door invoegtoepassingen bladeren..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Geïnstalleerde plugins..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Laad een 3D-model" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Gereed om te slicen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Slicen..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Gereed voor %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Kan Niet Slicen" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Slicen is niet beschikbaar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Voorbereiden" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Annuleren" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Actief Uitvoerapparaat Selecteren" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Bestand(en) openen" @@ -3619,112 +3767,117 @@ msgstr "Allemaal als model importeren" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Bestand" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Selectie Opslaan naar Bestand" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Opslaan &als..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Project opslaan" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "B&ewerken" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "Beel&d" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "In&stellingen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Printer" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiaal" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profiel" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Instellen als Actieve Extruder" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensies" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Plugins" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Voo&rkeuren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Help" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Bestand Openen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Instellingen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Nieuw project" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Weet u zeker dat u een nieuw project wilt starten? Hiermee wordt het platform leeggemaakt en worden eventuele niet-opgeslagen instellingen verwijderd." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Invoegtoepassing installeren" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Bestand(en) openen" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Binnen de door u geselecteerde bestanden zijn een of meer G-code-bestanden aangetroffen. U kunt maximaal één G-code-bestand tegelijk openen. Selecteer maximaal één bestand als u dit wilt openen als G-code-bestand." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Project opslaan" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Extruder %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 &materiaal" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Bij opnieuw opslaan projectsamenvatting niet weergeven" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Opslaan" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Voorbereiden" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Controleren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Laaghoogte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Printsnelheid" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Langzamer" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Sneller" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Vulling" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Met geleidelijke vulling neemt de hoeveelheid vulling naar boven toe." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Geleidelijke vulling" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Support genereren" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Genereer structuren om delen van het model met overhang te ondersteunen. Zonder deze structuren zakken dergelijke delen in tijdens het printen." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Extruder voor supportstructuur" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Selecteren welke extruder voor support wordt gebruikt. Deze optie zorgt ervoor dat onder het model ondersteuning wordt geprint, om te voorkomen dat dit doorzakt of dat er midden in de lucht moet worden geprint." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Hechting aan platform" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Het printen van een brim of raft inschakelen. Deze optie zorgt ervoor dat er extra materiaal rondom of onder het object wordt neergelegd, dat er naderhand eenvoudig kan worden afgesneden." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Hebt u hulp nodig om betere prints te krijgen?
    Lees de Ultimaker Troubleshooting Guides (Handleiding voor probleemoplossing)" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Projectbestand openen" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Dit is een Cura-projectbestand. Wilt u dit openen als project of de modellen eruit importeren?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Openen als project" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Modellen importeren" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Engine-logboek" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Materiaal" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Materiaalcompatibiliteit controleren" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Klik om de materiaalcompatibiliteit te controleren op Ultimaker.com." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3-netwerkverbinding" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3-netwerkverbinding (Cluster)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks-integratie" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "G-code-profiellezer" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Biedt een laagweergave." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Laagweergave" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Versie-upgrade van 2.7 naar 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Gereedschap voor Instellingen per Model" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF-schrijver" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura-profiellezer" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Geblokkeerd" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Print start niet" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Connect openen" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Printgegevens" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Om ervoor te zorgen dat uw {machine_name} van de nieuwste functies is voorzien, wordt aanbevolen om de firmware regelmatig bij te werken. U kunt dit doen op de {machine_name} (wanneer deze is verbonden met het netwerk) of via USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Laagweergave" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Laagweergave" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Door invoegtoepassingen bladeren" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Exportgegevens" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Er is een fatale fout opgetreden die niet kan worden hersteld!

    \n" +#~ "

    Gebruik de onderstaande informatie om een bugrapport te plaatsen op http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Webpagina openen" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "OK" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Deze printer is niet ingesteld voor het hosten van een groep aaneengesloten Ultimaker 3-printers" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Deze printer is de host voor een groep van %1 aaneengesloten Ultimaker 3-printers" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Voorbereiden" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Voltooid op: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Opent de pagina met printtaken in uw standaard webbrowser." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "PRINTERGROEP" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Als u een project laadt, worden alle modellen van het platform gewist" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " invoegtoepassing bevat een licentie.\n" +#~ "U moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\n" +#~ "Gaat u akkoord met onderstaande voorwaarden?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00u 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Tijdsinformatie" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Printtijd" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Materiaalcompatibiliteit controleren" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3-netwerkverbinding (Cluster)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Biedt een laagweergave." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Laagweergave" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Röntgen" diff --git a/resources/i18n/nl_NL/fdmextruder.def.json.po b/resources/i18n/nl_NL/fdmextruder.def.json.po index 989f366539..ba3027de2c 100644 --- a/resources/i18n/nl_NL/fdmextruder.def.json.po +++ b/resources/i18n/nl_NL/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:30+0200\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 18b692c116..0aeb2b9d5a 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" @@ -605,6 +605,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "De hoogte van de eerste laag in mm. Met een dikkere eerste laag hecht het object beter aan het platform." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +780,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Shell" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Wandextruder" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "De extruder train die voor het printen van de wanden wordt gebruikt. Deze wordt gebruikt in meervoudige doorvoer." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +802,8 @@ msgstr "De extruder train die voor het printen van de buitenwand wordt gebruikt. #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Extruder binnenwand" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1235,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Vervang het buitenste gedeelte van het patroon boven-/onderkant door een aantal concentrische lijnen. Het gebruik van 1 of 2 lijnen verbetert daken die op vulmateriaal beginnen." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Strijken inschakelen" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Ga nog een extra keer over de bovenlaag, echter zonder materiaal door te voeren. Hierdoor wordt de kunststof aan de bovenkant verder gesmolten, waardoor een gladder oppervlak wordt verkregen." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Alleen hoogste laag strijken" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Strijk alleen de allerlaatste laag van het voorwerp. Dit bespaart tijd als de daaronder gelegen lagen geen glad oppervlak vereisen." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Strijkpatroon" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Het patroon dat wordt gebruikt voor het strijken van oppervlakken." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concentrisch" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zigzag" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Tussenruimte strijklijnen" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "De afstand tussen de strijklijnen." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Strijkdoorvoer" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "De hoeveelheid materiaal, in verhouding tot een normale skinlijn, die tijdens het strijken moet worden doorgevoerd. Als de nozzle gevuld blijft, kunnen scheuren in de bovenlaag worden gevuld. Te hoge doorvoer leidt echter tot uitstulpingen aan de zijkant van het oppervlak." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Uitsparing strijken" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "De afstand die moet worden aangehouden tot de randen van het model. Strijken tot de rand van het raster kan leiden tot een gerafelde rand van de print." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Strijksnelheid" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "De snelheid waarmee over de bovenste laag wordt bewogen." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Strijkacceleratie" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "De acceleratie tijdens het strijken." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Schok strijken" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "De maximale onmiddellijke snelheidsverandering tijdens het strijken." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1382,8 @@ msgstr "Vulpatroon" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Het patroon van het vulmateriaal van de print. De lijn- en zigzagvulling veranderen per vullaag van richting, waardoor wordt bespaard op materiaalkosten. De raster-, driehoeks-, kubische, achtvlaks-, afgeknotte kubus- en concentrische patronen worden elke laag volledig geprint. Kubische, afgeknotte kubus- en achtvlaksvullingen veranderen elke laag voor een meer gelijke krachtsverdeling in elke richting." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1400,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Driehoeken" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1457,8 @@ msgstr "Vullijnen verbinden" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Verbindt de uiteinden waar het vulpatroon bij de binnenwand komt met een lijn die de vorm van de binnenwand volgt. Als u deze instelling inschakelt, kan de vulling beter hechten aan de wanden en wordt de invloed van de vulling op de kwaliteit van de verticale oppervlakken kleiner. Als u deze instelling uitschakelt, wordt er minder materiaal gebruikt." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1470,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Een lijst met gehele getallen voor lijnrichtingen die moet worden gebruikt. Elementen uit de lijst worden tijdens het printen van de lagen opeenvolgend gebruikt. Wanneer het einde van de lijst bereikt is, wordt deze weer van voren af aan gestart. De lijstitems zijn gescheiden door komma's en de hele lijst is binnen vierkante haken geplaatst. Standaard wordt een lege lijst gebruikt, wat inhoudt dat de traditionele standaardhoeken (45 en 135 graden voor het lijn- en zigzagpatroon en 45 voor alle andere patronen) worden gebruikt." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1800,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Bepaalt de diameter van het gebruikte filament. Pas deze waarde aan de diameter van het gebruikte filament aan." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3010,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Verbind de zigzaglijnen. Hiermee versterkt u de zigzag-supportstructuur." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Supportstructuur in Stukken Breken" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Sla enkele verbindingen tussen lijnen van de supportstructuur over zodat deze gemakkelijker kan worden weggebroken. Deze instelling is van toepassing op het zigzag-vulpatroon van de supportstructuur." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Grootte Supportstuk" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Sla elke N millimeter een verbinding tussen de lijnen van de supportstructuur over, zodat deze gemakkelijker kan worden weggebroken." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Aantal Lijnen Supportstuk" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Sla elke N verbindingslijnen één lijn over zodat de supportstructuur gemakkelijker kan worden weggebroken." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3549,8 @@ msgstr "Skirtafstand" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand; als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3592,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Print de brim alleen aan de buitenkant van het model. Hiermee verkleint u de hoeveelheid brim die u achteraf moet verwijderen, zonder dat dit de hechting aan het printbed te zeer vermindert." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Z-offset Eerste Laag" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "De extruder wordt in deze mate gecorrigeerd ten opzichte van de normale hoogte van de eerste laag. Dit kan plus (verhoogd) of min (verlaagd) zijn. Sommige soorten filament hechten beter op het platform als de extruder iets hoger staat." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z-offset Aflopende Lagen" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Wanneer de waarde niet is ingesteld op 0, dan wordt de Z-offset over zoveel lagen verkleind tot 0. Wanneer de waarde op 0 is ingesteld, blijft de Z-offset voor alle lagen in de print gelijk." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3609,8 @@ msgstr "Raft effenen" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Deze instelling bepaalt hoeveel binnenhoeken in de raftcontour worden afgerond. Naar binnen gebogen hoeken worden tot een halve cirkel afgerond met een straal die gelijk is aan de hier opgegeven waarde. Met deze instellingen worden ook gaten in de raftcontour verwijderd die kleiner zijn dan een dergelijke cirkel." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4082,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normaal probeert Cura kleine gaten in het raster te hechten en delen van een laag met grote gaten te verwijderen. Als u deze optie inschakelt, behoudt u deze delen die niet kunnen worden gehecht. Deze optie kan als laatste redmiddel worden gebruikt als er geen andere manier meer is om correcte G-code te genereren." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4122,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Schakel naar de rastersnijpuntvolumes die bij elke laag horen, zodat de overlappende rasters worden verweven. Als u deze instelling uitschakelt, krijgt een van de rasters al het volume in de overlap, terwijl dit uit de andere rasters wordt verwijderd." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4337,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Optimaliseer de volgorde waarin wanden worden geprint om het aantal intrekbewegingen en de afgelegde afstand te verkleinen. Deze instelling is gunstig voor de meeste onderdelen. Bij sommige onderdelen duurt het printen echter langer. Controleer daarom de verwachte printtijd met en zonder optimalisatie." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Supportstructuur in Stukken Breken" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Sla enkele verbindingen tussen lijnen van de supportstructuur over zodat deze gemakkelijker kan worden weggebroken. Deze instelling is van toepassing op het zigzag-vulpatroon van de supportstructuur." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Grootte Supportstuk" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Sla elke N millimeter een verbinding tussen de lijnen van de supportstructuur over, zodat deze gemakkelijker kan worden weggebroken." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Aantal Lijnen Supportstuk" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Sla elke N verbindingslijnen één lijn over zodat de supportstructuur gemakkelijker kan worden weggebroken." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4657,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "De gemiddelde afstand tussen de willekeurig geplaatste punten op elk lijnsegment. Houd er rekening mee dat de originele punten van de polygoon worden verwijderd. Een hoge effenheid leidt dus tot een verlaging van de resolutie. Deze waarde moet hoger zijn dan de helft van de Dikte rafelig oppervlak." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4827,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "" +"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" +"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4936,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "De afstand tussen de nozzle en horizontaal neergaande lijnen. Een grotere tussenruimte zorgt voor diagonaal neerwaarts gaande lijnen met een minder steile hoek. Hierdoor ontstaan minder opwaartse verbindingen met de volgende laag. Alleen van toepassing op Draadprinten." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Strijken inschakelen" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Ga nog een extra keer over de bovenlaag, echter zonder materiaal door te voeren. Hierdoor wordt de kunststof aan de bovenkant verder gesmolten, waardoor een gladder oppervlak wordt verkregen." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Alleen hoogste laag strijken" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Strijk alleen de allerlaatste laag van het voorwerp. Dit bespaart tijd als de daaronder gelegen lagen geen glad oppervlak vereisen." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Strijkpatroon" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Het patroon dat wordt gebruikt voor het strijken van oppervlakken." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Concentrisch" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zigzag" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Tussenruimte strijklijnen" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "De afstand tussen de strijklijnen." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Strijkdoorvoer" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "De hoeveelheid materiaal, in verhouding tot een normale skinlijn, die tijdens het strijken moet worden doorgevoerd. Als de nozzle gevuld blijft, kunnen scheuren in de bovenlaag worden gevuld. Te hoge doorvoer leidt echter tot uitstulpingen aan de zijkant van het oppervlak." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Uitsparing strijken" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "De afstand die moet worden aangehouden tot de randen van het model. Strijken tot de rand van het raster kan leiden tot een gerafelde rand van de print." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Strijksnelheid" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "De snelheid waarmee over de bovenste laag wordt bewogen." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Strijkacceleratie" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "De acceleratie tijdens het strijken." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Schok strijken" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "De maximale onmiddellijke snelheidsverandering tijdens het strijken." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +4996,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Omzettingsmatrix die moet worden toegepast op het model wanneer dit wordt geladen vanuit een bestand." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Wandextruder" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Extruder binnenwand" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "De extruder train die voor het printen van de wanden wordt gebruikt. Deze wordt gebruikt in meervoudige doorvoer." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Het patroon van het vulmateriaal van de print. De lijn- en zigzagvulling veranderen per vullaag van richting, waardoor wordt bespaard op materiaalkosten. De raster-, driehoeks-, kubische, achtvlaks-, afgeknotte kubus- en concentrische patronen worden elke laag volledig geprint. Kubische, afgeknotte kubus- en achtvlaksvullingen veranderen elke laag voor een meer gelijke krachtsverdeling in elke richting." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Verbindt de uiteinden waar het vulpatroon bij de binnenwand komt met een lijn die de vorm van de binnenwand volgt. Als u deze instelling inschakelt, kan de vulling beter hechten aan de wanden en wordt de invloed van de vulling op de kwaliteit van de verticale oppervlakken kleiner. Als u deze instelling uitschakelt, wordt er minder materiaal gebruikt." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "De horizontale afstand tussen de skirt en de eerste laag van de print.\n" +#~ "Dit is de minimumafstand; als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Z-offset Eerste Laag" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "De extruder wordt in deze mate gecorrigeerd ten opzichte van de normale hoogte van de eerste laag. Dit kan plus (verhoogd) of min (verlaagd) zijn. Sommige soorten filament hechten beter op het platform als de extruder iets hoger staat." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z-offset Aflopende Lagen" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Wanneer de waarde niet is ingesteld op 0, dan wordt de Z-offset over zoveel lagen verkleind tot 0. Wanneer de waarde op 0 is ingesteld, blijft de Z-offset voor alle lagen in de print gelijk." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Deze instelling bepaalt hoeveel binnenhoeken in de raftcontour worden afgerond. Naar binnen gebogen hoeken worden tot een halve cirkel afgerond met een straal die gelijk is aan de hier opgegeven waarde. Met deze instellingen worden ook gaten in de raftcontour verwijderd die kleiner zijn dan een dergelijke cirkel." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5250,4 @@ msgstr "Omzettingsmatrix die moet worden toegepast op het model wanneer dit word #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "Overlap Dubbele Doorvoer" \ No newline at end of file +#~ msgstr "Overlap Dubbele Doorvoer" diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index fd840d9fc2..9416935018 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-10-05 17:27+0200\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" @@ -18,66 +18,6 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.4\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Drukowanie zostaje przerwane" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Zablokowany" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Konieczne są działania" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Nie mogę rozpocząć drukowania" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Ta drukarka nie jest skonfigurowana do zarządzania grupą drukarek Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Wykończenia na: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Ta drukarka jest gospodarzem grupy %1 drukarek Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} skończyła drukowanie '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Drukowanie zakończone" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "W&tyczki" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Przeglądaj wtyczki..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Zainstalowane wtyczki..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -115,19 +55,17 @@ msgstr "Łączenie z Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Anuluj" @@ -154,15 +92,15 @@ msgstr "Plik wysłany do Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Otwórz Connect.." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Otwórz interfejs Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Pokaż Dziennik" @@ -197,37 +135,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Połączono przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka jest zajęta lub nie jest podłączona." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Szczegółu druku" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Ta drukarka nie obsługuje drukowania USB, ponieważ korzysta z UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "Drukowanie przez USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka nie obsługuje drukowania poprzez USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Ostrzeżenie" @@ -291,11 +230,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Nie można zapisać na wymiennym dysku {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Błąd" @@ -344,346 +283,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Dysk wymienny" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drukuj przez sieć" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Drukuj przez sieć" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Wymagany dostęp do drukarki. Proszę zatwierdzić prośbę na drukarce" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Status połączenia" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Status połączenia" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Spróbuj ponownie" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Prześlij ponownie żądanie dostępu" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Dostęp do drukarki został zaakceptowany" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Brak dostępu do tej drukarki. Nie można wysłać zadania drukowania." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Poproś o dostęp" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Wyślij żądanie dostępu do drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Połączono przez sieć. Proszę zatwierdzić żądanie dostępu na drukarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Połączono przez sieć." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Połączono przez sieć. Brak dostępu do sterowania drukarką." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Żądanie dostępu zostało odrzucone na drukarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Żądanie dostępu nie powiodło się z powodu limitu czasu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Połączenie z siecią zostało utracone." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Połączenie z drukarką zostało utracone. Sprawdź, czy drukarka jest podłączona." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Nie można uruchomić nowego zadania, drukarka jest zajęta. Aktualny stan drukarki to %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Status Drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Nie można uruchomić nowego zadania. Brak Printcore w slocie {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Nie można uruchomić nowego zadania. Brak materiału w slocie {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Nie ma wystarczającej ilości materiału na szpuli {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Różne PrintCore (Cura: {0}, Drukarka: {1}) wybrane dla ekstrudera {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Różne materiały (Cura: {0}, Drukarka: {1}) wybrane do dzyszy {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} nie jest poprawnie skalibrowany. Kalibracja XY musi zostać wykonana na tej drukarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Czy na pewno chcesz drukować z wybraną konfiguracją?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Występuje niezgodność między konfiguracją lub kalibracją drukarki a Curą. Aby uzyskać najlepszy rezultat, zawsze tnij dla Print core'ów i materiałów włożonych do drukarki." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Niedopasowana konfiguracja" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Wysyłanie nowych zadań (tymczasowo) zostało zablokowane, dalej wysyłane jest poprzednie zadanie." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Wysyłanie danych do drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Wysyłanie danych" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Nie można wysłać danych do drukarki. Czy inna praca jest nadal aktywna?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Przerywanie drukowania..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Wydruk został przerwany. Sprawdź drukarkę" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Wstrzymywanie drukowania..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Wznawianie drukowania ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Synchronizuj się z drukarką" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Czy chcesz używać bieżącej konfiguracji drukarki w programie Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "PrintCore'y i/lub materiały w drukarce różnią się od tych w obecnym projekcie. Dla najlepszego rezultatu, zawsze tnij dla wybranych PrinCore'ów i materiałów, które są umieszczone w drukarce." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Połącz przez sieć" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Ta drukarka nie jest skonfigurowana do zarządzania grupą podłączonych drukarek Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Ta drukarka jest gospodarzem grupy {count} podłączonych drukarek Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} skończyła drukowanie '{job_name}'. Proszę zabrać wydruk i potwierdzić oczyszczenie platformy roboczej." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} jest zarezerwowana do druku '{job_name}'. Proszę zmień konfigurację drukarki, żeby pasowała do zadania dla niej, aby rozpocząć drukowanie." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Wysyłanie nowych zadań (tymczasowo) zostało zablokowane, dalej wysyłane jest poprzednie zadanie." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Nie można wysłać nowego zadania: ta drukarka 3D nie jest (jeszcze) ustawiona jako gospodarz grupy podłączonych drukarek Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Wysyłanie {file_name} do grupy {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "Wysłano {file_name} do grupy {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Pokaż zadania druku" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Otwiera interfejs zadań druku w przeglądarce." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Nie można wysłać zadania do grupy {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "Wysłano {file_name} do grupy {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Pokaż zadania druku" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Otwiera interfejs zadań druku w przeglądarce." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Nieznany" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} skończyła drukowanie '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Drukowanie zakończone" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Konieczne są działania" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Wysyłanie {file_name} do grupy {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Połącz przez sieć" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Aby upewnić się że twoja {machine_name} jest wyposażona w najnowsze opcje rekomendowane jest aktualizowanie oprogramowania regularnie. Może to być wykonane na {machine_name} (kiedy jest podłączona do sieci) lub przez USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Nowe oprogramowanie %s jest dostępne" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Pobierz" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Nie można uzyskać dostępu do informacji o aktualizacji" @@ -713,7 +638,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Błąd podczas rozpoczynania %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura nie wyświetla dokładnie warstw kiedy drukowanie przewodowe jest włączone" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Modyfikuj G-Code" @@ -743,21 +683,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "Pliki G-code" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Widok warstwy" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura nie wyświetla dokładnie warstw kiedy drukowanie przewodowe jest włączone" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Widok warstwy" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -790,8 +715,9 @@ msgstr "Nie można pociąć z obecnym materiałem, ponieważ nie jest on kompaty #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Nie można pociąć" @@ -802,23 +728,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Nie można pociąć z bieżącymi ustawieniami. Następujące ustawienia mają błędy: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Nie można pociąć, ponieważ wieża czyszcząca lub jej pozycja(e) są niewłaściwe." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Nic do pocięcia, ponieważ żaden z modeli nie pasuje do obszaru roboczego. Proszę o przeskalowanie lub obrócenie modelu, żeby pasował." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Przetwarzanie warstw" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informacja" @@ -833,14 +765,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Konfiguruj ustawienia każdego modelu z osobna" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Zalecane" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Niestandardowe" @@ -851,29 +805,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Plik 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Dysza" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Przeglądaj wtyczki" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Nie udało się uzyskać ID wtyczki z {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Ostrzeżenie" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Przeglądarka wtyczek" @@ -888,18 +837,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Plik G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Analizowanie G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Szczegóły G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Przed wysłaniem pliku upewnij się, że G-code jest odpowiedni do konfiguracji drukarki. Przedstawienie G-kodu może nie być dokładne." @@ -941,73 +890,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Wypoziomuj stół" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Zewnętrzna ściana" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Ściany wewnętrzne" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Skin" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Wypełnienie" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Wypełnienie podpór" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Łączenie podpory" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Podpory " -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Obwódka" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Ruch jałowy" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrakcja" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Inny" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Plik pocięty wcześniej {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Nie załadowano materiału" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Nieznany materiał" @@ -1034,13 +988,13 @@ msgid "Can't Find Location" msgstr "Nie można Znaleźć Lokalizacji" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Plik już istnieje" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1056,12 +1010,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Niestandardowy materiał" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Wybrany materiał jest niezgodny z wybranym urządzeniem lub konfiguracją." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1082,62 +1046,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Cofnij zmianę średnicy materiału." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Nie udało się wyeksportować profilu do {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Nie można eksportować profilu do {0}: Wtyczka pisarza zgłosiła błąd." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Wyeksportowano profil do {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Szczegóły Eskportu" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Nie udało się zaimportować profilu z {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil zaimportowany {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profil {0} ma nieznany typ pliku lub jest uszkodzony." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Niestandardowy profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profilowi brakuje typu jakości." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1164,241 +1128,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Rozmieszczenie Obiektów" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Raport awarii" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    Pojawił się fatalny wyjątek, z którego nie możemy odzyskać!

    \n" -"

    Aby przesłać zgłoszenie błędu, skorzystaj z poniższych informacji http://github.com/Ultimaker/Cura/issues

    \n" -" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Otwórz stronę sieci Web" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Ładowanie drukarek..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Ustawianie sceny ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Ładowanie interfejsu ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Jednocześnie można załadować tylko jeden plik G-code. Pominięto importowanie {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się G-code. Pominięto importowanie {0}" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Ustawienia Drukarki" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Drukarka" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Ustawienia drukarki" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Szerokość)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Głębokość)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Wysokość)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Kształt stołu roboczego" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Początek na środku" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Podgrzewany stół" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Wersja Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Ustawienia głowic drukujących" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Odległość od lewej strony głowicy do środka dyszy. Używane do unikania kolizji pomiędzy poprzednimi wydrukami a głowicą podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Odległość od przedniej strony głowicy do środka dyszy. Używane do unikania kolizji pomiędzy poprzednimi wydrukami a głowicą podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Odległość od prawej strony głowicy do środka dyszy. Używane do unikania kolizji pomiędzy poprzednimi wydrukami a głowicą podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y max" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Odległość od tylnej strony głowicy do środka dyszy. Używane do unikania kolizji pomiędzy poprzednimi wydrukami a głowicą podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Wysokość ramy" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Różnica w wysokości pomiędzy końcówką dyszy i systemem suwnym (osie X i Y). Używane do unikania kolizji z poprzednimi wydrukami podczas drukowania \"Jeden na Raz\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Liczba ekstruderów" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Nominalna średnica filamentu wspierana przez drukarkę. Dokładna średnica będzie nadpisana przez materiał i/lub profil." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Średnica materiału" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Rozmiar dyszy" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Początk. Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Komendy Gcode wykonywane na samym początku." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Końcowy Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Komendy Gcode wykonywane na samym początku." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ustawienia dyszy" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Korekcja dyszy X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Korekcja dyszy Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Początkowy Gcode ekstrudera" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Końcowy Gcode ekstrudera" @@ -1411,12 +1450,11 @@ msgstr "Dziennik" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1468,13 +1506,11 @@ msgid "Unknown error code: %1" msgstr "Nieznany kod błędu: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Połącz się z drukarką sieciową" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" @@ -1486,20 +1522,17 @@ msgstr "" "Wybierz drukarkę z poniższej listy:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Dodaj" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Edycja" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1508,220 +1541,221 @@ msgid "Remove" msgstr "Usunąć" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Odśwież" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Jeżeli twojej drukarki nie ma na liście, przeczytaj poradnik o problemach z drukowaniem przez sieć" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Rodzaj" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Nieznany" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Wersja oprogramowania" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Adres" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Ta drukarka nie jest skonfigurowana do zarządzania grupą drukarek Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Ta drukarka jest gospodarzem grupy %1 drukarek Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "Drukarka pod tym adresem jeszcze nie odpowiedziała." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Połącz" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Adres drukarki" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Wpisz adres IP lub nazwę hosta drukarki w sieci." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Drukuj przez sieć" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Drukuj" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 nie została ustawiona do hostowania grupy podłączonych drukarek Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Zobacz zadania drukowania" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Przygotowywanie do druku" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Drukowanie" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Dostępna" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Utracone połączenie z drukarką" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Zajęta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Zakończono" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Drukowanie zostaje przerwane" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Nie akceptuje zadań drukowania" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Wykończenia na: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Oczyść platformę roboczą" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Oczekuje na zmianę konfiguracji" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Zadania drukowania" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Drukowanie" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "W kolejce" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Drukarki" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Zobacz drukarki" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Podłącz do drukarki" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Załaduj konfigurację drukarki do Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Uaktywnij konfigurację" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Ta drukarka nie została ustawiona do hostowania grupy podłączonych drukarek Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Ta drukarka nie została ustawiona do hostowania grupy %1 podłączonych drukarek Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Drukuj przez sieć" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Drukuj" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 nie została ustawiona do hostowania grupy podłączonych drukarek Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Drukowanie" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Zajęta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Zakończono" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Przygotowywanie" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Dostępna" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Zakończono:" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Oczyść platformę roboczą" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Przygotowywanie do druku" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Nie akceptuje zadań drukowania" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Otwiera stronę zadań drukowania za pomocą domyślnej przeglądarki." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Zobacz zadania drukowania" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "GRUPA DRUKAREK" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Zadania drukowania" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Drukowanie" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "W kolejce" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Oczekuje na zmianę konfiguracji" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Drukarki" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Zobacz drukarki" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1747,13 +1781,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Zawsze używaj Słabej jakości" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1780,11 +1807,91 @@ msgid "Fine" msgstr "Dobra" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Zapamiętaj mój wybór" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Schemat kolorów" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Kolor materiału" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Rodzaj linii" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Tryb zgodności" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Pokaż ruch jałowy" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Pokaż pomocnik" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Pokaż powłokę" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Pokaż wypełnienie" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Pokaż tylko najwyższe warstwy" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Pokaż 5 Szczegółowych Warstw" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Góra/ Dół" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Wewnętrzna ściana" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1795,81 +1902,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Skrypty post-processingu" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Dodaj skrypt" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Ustawienia" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Zmień aktywne skrypty post-processingu" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Schemat kolorów" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Kolor materiału" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Rodzaj linii" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Tryb zgodności" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Pokaż ruch jałowy" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Pokaż pomocnik" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Pokaż powłokę" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Pokaż wypełnienie" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Pokaż tylko najwyższe warstwy" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Pokaż 5 Szczegółowych Warstw" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Góra/ Dół" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Wewnętrzna ściana" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1961,129 +2008,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Pokaż wszystko" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Otwórz projekt" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Zaktualizuj istniejące" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Utwórz nowy" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Podsumowanie - Projekt Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Ustawienia drukarki" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Jak powinny być rozwiązywane błędy w maszynie?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Typ" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nazwa" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Ustawienia profilu" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Jak powinien zostać rozwiązany problem z profilem?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Nie w profilu" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 nadpisanie" msgstr[1] "%1 Zastępuje" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Pochodna z" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 nadpisanie" msgstr[1] "%1, %2 zastępuje" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Ustawienia materiału" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Jak powinien zostać rozwiązany problem z materiałem?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Ustawienie widoczności" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Tryb" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Widoczne ustawienie:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 poza %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Załadowanie projektu spowoduje usunięcie wszystkich modeli ze stołu" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Otwórz" @@ -2108,6 +2155,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Zainstalowane" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Pobierz" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2116,13 +2168,10 @@ msgstr "Akceptowanie Licencji Wtyczki" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -" wtyczka zawiera licencje.\n" -"Musisz zaakceptować tą licencję, aby zainstalować wtyczkę.\n" -"Akceptujesz poniższe postanowienia?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2134,6 +2183,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Odrzuć" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2319,30 +2373,25 @@ msgid "Printer does not accept commands" msgstr "Drukarka nie akceptuje poleceń" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "W naprawie. Sprawdź drukarkę" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Utracone połączenie z drukarką" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Drukowanie..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Wstrzymano" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Przygotowywanie ..." @@ -2560,7 +2609,7 @@ msgid "Unit" msgstr "Jednostka" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Ogólny" @@ -2791,7 +2840,7 @@ msgid "Send (anonymous) print information" msgstr "Wyślij (anonimowe) informacje o drukowaniu" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Drukarki" @@ -2809,39 +2858,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Zmień nazwę" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Typ drukarki:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Połączenie:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Drukarka nie jest podłączona." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Stan:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Oczekiwanie na wyczyszczenie stołu roboczego" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Oczekiwanie na zadanie drukowania" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profile" @@ -2939,7 +2988,7 @@ msgid "Export Profile" msgstr "Eksportuj Profil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materiał" @@ -2997,7 +3046,7 @@ msgid "Successfully exported material to %1" msgstr "Udało się wyeksportować materiał do %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Dodaj drukarkę" @@ -3017,6 +3066,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "O Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3111,12 +3165,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Biblioteka edytująca pola" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Czcionka" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Ikony SVG" @@ -3126,7 +3185,12 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3137,32 +3201,32 @@ msgstr "" "\n" "Kliknij, aby otworzyć menedżer profili." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Szukanie..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Skopiuj wartość do wszystkich ekstruderów" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ukryj tę opcję" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Nie pokazuj tej opcji" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Pozostaw tę opcję widoczną" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Skonfiguruj widoczność ustawień..." @@ -3220,12 +3284,12 @@ msgstr "" "\n" "Kliknij, aby przywrócić wartość obliczoną." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Ustawienia druku" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3234,42 +3298,59 @@ msgstr "" "Konfiguracja wydruku jest wyłączona\n" "Pliki G-code nie mogą zostać zmodyfikowane" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00h 00min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Informacje o czasie" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Czas druku" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Zalecana konfiguracja wydruku

    Drukowanie z zalecanymi ustawieniami dla wybranej drukarki, materiału i jakości." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Niestandardowa konfiguracja wydruku

    Drukowanie z precyzyjną kontrolą nad każdym elementem procesu cięcia." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automatyczny: %1" @@ -3279,7 +3360,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Widok" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automatyczny: %1" @@ -3308,13 +3389,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Otwórz &ostatnio używane" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Nie podłączono drukarki" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Ekstruder" @@ -3329,309 +3410,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Bieżąca temperatura głowicy drukującej." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Kolor materiału w tym ekstruderze." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Materiał w głowicy drukującej." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Dysza włożona do tego ekstrudera." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Stół roboczy" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Temperatura docelowa podgrzewanego stołu. Stół rozgrzeje się lub schłodzi w kierunku tej temperatury. Jeśli ustawione jest 0, grzanie stołu jest wyłączone." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Bieżąca temperatura podgrzewanego stołu." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Temperatura do wstępnego podgrzewania stołu." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Anuluj" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Podgrzewanie wstępne" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosowywać druk podczas nagrzewania, a nie będziesz musiał czekać na rozgrzanie stołu, gdy będziesz gotowy do drukowania." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Aktywny wydruk" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Nazwa pracy" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Czas druku" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Szacowany czas pozostały" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Przełącz tryb pełnoekranowy" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Cofnij" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Ponów" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Zamknij" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Konfiguruj Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Dodaj drukarkę..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Zarządzaj drukarkami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Zarządzaj materiałami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aktualizuj profil z bieżącymi ustawieniami" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Odrzuć bieżące zmiany" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Utwórz profil z bieżących ustawień..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Zarządzaj profilami..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Pokaż dokumentację internetową" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Zgłoś błąd" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&O..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Usuń &wybrany model" msgstr[1] "Usuń &wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Wyśrodkuj wybrany model" msgstr[1] "Wyśrodkuj wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Rozmnóż wybrany model" msgstr[1] "Rozmnóż wybrane modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Usuń model" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Wyśrodkuj model na platformie" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grupuj modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozgrupuj modele " -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Połącz modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Powiel model..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Wybierz wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Wyczyść stół" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Przeładuj wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Ułóż wszystkie modele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Wybór ułożenia" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Zresetuj wszystkie pozycje modelu" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Zresetuj wszystkie przekształcenia modelu" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Otwórz plik(i)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nowy projekt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Pokaż &dziennik silnika..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Pokaż folder konfiguracji" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Skonfiguruj widoczność ustawień ..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Przeglądaj wtyczki..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Zainstalowane wtyczki..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Proszę załaduj model 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Gotowy do cięcia" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Cięcie..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Gotowy do %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Nie można pociąć" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Cięcie niedostępne" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Przygotuj" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Anuluj" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Wybierz aktywne urządzenie wyjściowe" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Otwórz plik(i)" @@ -3648,112 +3769,117 @@ msgstr "Importuj wszystkie jako modele" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Plik" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Zapisz wybór w pliku" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Zapisz &jako..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Zapisz projekt" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Edytuj" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Widok" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Ustawienia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Drukarka" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Materiał" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Ustaw jako aktywną głowicę" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "&Rozszerzenia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "W&tyczki" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Preferencje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Pomoc" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Otwórz plik" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Ustawienia" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Nowy projekt" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Czy na pewno chcesz rozpocząć nowy projekt? Spowoduje to wyczyszczenie stołu i niezapisanych ustawień." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Zainstaluj Wtyczkę" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Otwórz plik(i)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Znaleziono jeden lub więcej plików G-code w wybranych plikach. Możesz otwierać tylko jeden plik G-code jednocześnie. Jeśli chcesz otworzyć plik G-code, proszę wybierz tylko jeden." @@ -3763,102 +3889,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Zapisz projekt" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Ekstruder %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & materiał" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Nie pokazuj podsumowania projektu podczas ponownego zapisywania" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Zapisz" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Przygotuj" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Monitor" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Wysokość warstwy" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Prędkość Druku" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Wolniej" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Szybciej" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Wypełnienie" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Stopniowe wypełnienie stopniowo zwiększa ilość wypełnień w górę." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Włącz stopniowane" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Generuj podpory" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Generuje podpory wspierające części modelu, które mają zwis. Bez tych podpór takie części mogłyby spaść podczas drukowania." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Ekstruder od podpór" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Wybierz, który ekstruder ma służyć do drukowania podpór. Powoduje to tworzenie podpór poniżej modelu, aby zapobiec spadaniu lub drukowaniu modelu w powietrzu." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Popraw przycz. modelu" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Włącz drukowanie obrysu lub tratwy. Spowoduje to dodanie płaskiej powierzchni wokół lub pod Twoim obiektem, która jest łatwa do usunięcia po wydruku." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Potrzebujesz pomocy w ulepszaniu wydruków?
    Przeczytaj instrukcje dotyczące rozwiązywania problemów" @@ -3875,17 +4011,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Otwórz plik projektu" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Jest to plik projektu Cura. Czy chcesz otworzyć go jako projekt, czy zaimportować z niego modele?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Otwórz jako projekt" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Importuj modele" @@ -3895,17 +4031,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Dziennik silnika" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Materiał" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Sprawdź kompatybilność materiału" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Kliknij, aby sprawdzić zgodność materiału na Ultimaker.com." @@ -4020,11 +4156,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Połączenie Sieciowe UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Połączenie Sieciowe UM3 (Grupa)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4045,6 +4176,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Integracja z SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4105,16 +4246,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Czytnik Profili GCode" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Zapewnia widok warstw." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Widok Warstw" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4135,6 +4266,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Ulepszenie Wersji 2.7 do 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4195,6 +4336,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Narzędzie Ustawień dla Każdego Modelu" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4255,6 +4406,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF Writer" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4275,6 +4436,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Czytnik Profili Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Zablokowany" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Nie mogę rozpocząć drukowania" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Otwórz Connect.." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Szczegółu druku" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Aby upewnić się że twoja {machine_name} jest wyposażona w najnowsze opcje rekomendowane jest aktualizowanie oprogramowania regularnie. Może to być wykonane na {machine_name} (kiedy jest podłączona do sieci) lub przez USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Widok warstwy" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Widok warstwy" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Przeglądaj wtyczki" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Szczegóły Eskportu" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Pojawił się fatalny wyjątek, z którego nie możemy odzyskać!

    \n" +#~ "

    Aby przesłać zgłoszenie błędu, skorzystaj z poniższych informacji http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Otwórz stronę sieci Web" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Ta drukarka nie została ustawiona do hostowania grupy podłączonych drukarek Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Ta drukarka nie została ustawiona do hostowania grupy %1 podłączonych drukarek Ultimaker 3" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Przygotowywanie" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Zakończono:" + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Otwiera stronę zadań drukowania za pomocą domyślnej przeglądarki." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "GRUPA DRUKAREK" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Załadowanie projektu spowoduje usunięcie wszystkich modeli ze stołu" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " wtyczka zawiera licencje.\n" +#~ "Musisz zaakceptować tą licencję, aby zainstalować wtyczkę.\n" +#~ "Akceptujesz poniższe postanowienia?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00h 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Informacje o czasie" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Czas druku" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Sprawdź kompatybilność materiału" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Połączenie Sieciowe UM3 (Grupa)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Zapewnia widok warstw." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Widok Warstw" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Prześwietlenie" @@ -4762,4 +5055,4 @@ msgstr "Czytnik Profili Cura" #~ msgid "Print Selected Model with %1" #~ msgid_plural "Print Selected Models With %1" #~ msgstr[0] "Wydrukuj wybrany model z %1" -#~ msgstr[1] "Wydrukuj wybrane modele z %1" \ No newline at end of file +#~ msgstr[1] "Wydrukuj wybrane modele z %1" diff --git a/resources/i18n/pl_PL/fdmextruder.def.json.po b/resources/i18n/pl_PL/fdmextruder.def.json.po index 7a75a558d6..beb84335cc 100644 --- a/resources/i18n/pl_PL/fdmextruder.def.json.po +++ b/resources/i18n/pl_PL/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-04 12:25+0200\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index f7a71f1a28..29929315e0 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-29 16:14+0200\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" @@ -610,6 +610,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "Wysokość początkowej warstwy w mm. Grubsza początkowa warstwa powoduje lepszą przyczepność do stołu." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -760,6 +785,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Powłoka" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Ekstruder Ściany" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Ekstruder używany do drukowania ścian. Używane w multi-esktruzji." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -772,8 +807,8 @@ msgstr "Esktruder używany do drukowania zewn. ściany. Używane w multi-ekstruz #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Esktruder Wewn. Ściany" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1205,6 +1240,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Zastępuje najbardziej zewnętrzną część wzoru górnego/dolnego za pomocą kilku koncentrycznych linii. Korzystanie z jednej lub dwóch linii poprawia dachy, które zaczynają się na wypełnieniu." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Włącz Prasowanie" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Przejedź nad górną powierzchnią dodatkowy raz, ale bez ekstrudowania materiału. Topi to plastyk na górze, co powoduje gładszą powierzchnię." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Prasuj Tylko Najwyższą Warstwę" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Przeprowadzaj prasowanie tylko na najwyższej warstwie siatki. Oszczędza to czas jeżeli niższe warstwy nie muszą mieć gładkie wykończenia powierzchni." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Wzór Prasowania" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Wzór używany dla górnych powierzchni prasowania." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Koncentryczny" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zygzak" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Przerwy Linii Prasowania" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Odległość pomiędzy liniami prasowania." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Przepływ Prasowania" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Ilość materiału, w odniesieniu do normalnej linii skóry, do ekstrudowania podczas prasowania. Pozostawianie dyszy napełnionej pomaga w wypełnianiu nierówności górnej powierzchni, ale zbyt duża ilość materiału może powodować nadekstruzję po stronie powierzchni." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Margines Prasowania" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Odległość utrzymywana od krawędzi modelu. Prasowanie do końca krawędzi siatki może powodować zadarte krawędzie na wydruku." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Prędkość Prasowania" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Prędkość, z jaką drukarka przejeżdża nad górnymi powierzchniami." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Przyspieszenie Prasowania" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "Przyspieszenie, z jakim przeprowadzane jest prasowanie." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Zryw Prasowania" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Maksymalna nagła zmiana prędkości podczas przeprowadzania prasowania." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1252,8 +1387,8 @@ msgstr "Wzór Wypełn." #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Wzór materiału wypełniającego wydruk. Linie i zygzaki zmieniają kierunek na przemiennych warstwach, redukując koszty materiału. Kratka, trójkąty, sześcienne, ośmiościenne, ćwierć sześcienny i koncentryczny wzór są drukowane w pełni na każdej warstwie. Sześcienne, ćwierć sześcienne i czworościenne wypełnienie zmienia się co każdą warstwę, aby zapewnić równy rozkład siły w każdym kierunku." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1270,6 +1405,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Trójkąty" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1322,8 +1462,8 @@ msgstr "Połącz Linie Wypełnienia" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Łączy końce gdzie wypełnienie spotyka się z wewn. ścianą za pomocą linii, które podążają za kształtem wewn. ściany. Włączenie tej opcji może spowodować lepsze łączenie się wypełnienia ze ścianą i redukuje efekty związane z jakością na pionowych ścianach. Wyłączenie tej opcji redukuje ilość użytego materiału." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1335,6 +1475,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Lista całkowitych kierunków linii do użycia. Elementy z listy są używane kolejno w miarę postępu warstw, a kiedy kończy się lista, zaczyna się od początku. Elementy listy są oddzielone przecinkami, a cała lista znajduje się w nawiasach kwadratowych. Domyślnie lista jest pusta, co oznacza tradycyjne domyślne kąty (45 i 135 stopni dla linii i wzorów zygzakowych i 45 stopni dla wszystkich pozostałych wzorów)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1645,6 +1805,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Dostosowuje średnicę stosowanego filamentu. Dopasuj tę wartość do średnicy stosowanego filamentu." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2835,36 +3015,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Połącz Zygzaki. To zwiększa wytrzymałość zygzakowatej podpory." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Podziel Podpory na Kawałki" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Pomijaj niektóre połączenia linii podpory, aby struktura podpory była łatwiejsza do odłamania. To ustawienie dotyczy wypełn. podpory Zygzak." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Wielkość Kawałka Podpory" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Pomiń połączenie pomiędzy liniami podpory co N milimetrów, aby struktura podpory była łatwiejsza do odłamania." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Liczba Linii Kawałka Podpory" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Pomijaj jedną z każdych N linii, aby struktura podpory była łatwiejsza do odłamania." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3404,10 +3554,8 @@ msgstr "Odległ. Obwódki" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" -"Pozioma odległość między obwódką a pierwszą warstwą nadruku.\n" -"Jest to o minimalnej odległości. Z tej odległości linie będą nakładane w kierunku zewnętrznym." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3449,26 +3597,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Drukuj obrys tylko na zewnątrz modelu. Zmniejsza to liczbę obrysu, który trzeba usunąć po wydruku, podczas gdy nie zmniejsza znacząco przyczepności do stołu." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Przesunięcie w Osi Z Warstwy Początk." - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "Ekstruder jest przesuwany z normalnej wysokości pierwszej warstwy o tą wartość. Może być dodatnia (uniesienie) lub ujemna (obniżenie). Niektóre typy filamentu przyklejają się lepiej do stołu jeżeli ekstruder jest lekko uniesiony." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Warstwy Zbieżne Przesunięcia Z" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Kiedy niezerowe, przesunięcie w osi Z jest redukowane do zera w trakcie drukowania takiej ilości warstw. Wartość 0 oznacza, że przesunięcie pozostaje stałe dla wszystkich warstw wydruku." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3486,8 +3614,8 @@ msgstr "Wygładzanie Tratwy" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "To ustawienie kontroluje jak bardzo wewn. narożniki zewn. linii tratwy są zaokrąglone. Wewn. narożniki są zaokrąglone do pół-okręgów o promieniu równym wartości podanej w tym miejscu. To ustawienie usuwa też otwory w zewn. linii tratwy, które są mniejsze niż taki okrąg." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3959,6 +4087,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Zwykle Cura próbuje zszywać małe dziury w siatce i usunąć części warstwy z dużymi otworami. Włączenie tej opcji powoduje zostawienie tych części, których nie można zszywać. Ta opcja powinna być używana jako ostatnia deska ratunku, gdy wszystko inne nie dostarczy właściwego G-code." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3989,6 +4127,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Przełącz się, to której przecinającej się siatki będą należały z każdą warstwą, tak że nakładające się siatki przeplatają się. Wyłączenie tej opcji spowoduje, że jedna siatka uzyska całą objętość podczas nakładania się, kiedy jest usunięta z pozostałych siatek." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4194,6 +4342,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Optymalizuj kolejność, według której drukowane są ściany, aby zredukować ilość retrakcji i długości ruchu jałowego. Większość części powinno na tym zyskać, ale niektóre mogą drukować się dłużej, dlatego prosimy o porównaniu czasu drukowania z i bez włączonej opcji." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Podziel Podpory na Kawałki" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Pomijaj niektóre połączenia linii podpory, aby struktura podpory była łatwiejsza do odłamania. To ustawienie dotyczy wypełn. podpory Zygzak." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Wielkość Kawałka Podpory" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Pomiń połączenie pomiędzy liniami podpory co N milimetrów, aby struktura podpory była łatwiejsza do odłamania." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Liczba Linii Kawałka Podpory" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Pomijaj jedną z każdych N linii, aby struktura podpory była łatwiejsza do odłamania." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4484,6 +4662,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Średnia odległość między losowymi punktami wprowadzonymi w każdym segmencie linii. Zwróć uwagę, że oryginalne punkty wielokąta są odrzucane, a zatem duża gładkość powoduje zmniejszenie rozdzielczości. Wartość ta musi być większa niż połowa Grubości Nierównej Skóry." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4743,106 +4941,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Odległość między dyszą a liniami skierowanymi w dół. Większe prześwity powodują ukośne linie skierowanie w dół o mniej stromym kącie, co z kolei skutkuje mniejszymi połączeniami z następną warstwą. Dotyczy tylko Drukowania Drutu." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Włącz Prasowanie" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Przejedź nad górną powierzchnią dodatkowy raz, ale bez ekstrudowania materiału. Topi to plastyk na górze, co powoduje gładszą powierzchnię." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Prasuj Tylko Najwyższą Warstwę" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Przeprowadzaj prasowanie tylko na najwyższej warstwie siatki. Oszczędza to czas jeżeli niższe warstwy nie muszą mieć gładkie wykończenia powierzchni." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Wzór Prasowania" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Wzór używany dla górnych powierzchni prasowania." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Koncentryczny" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zygzak" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Przerwy Linii Prasowania" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Odległość pomiędzy liniami prasowania." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Przepływ Prasowania" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Ilość materiału, w odniesieniu do normalnej linii skóry, do ekstrudowania podczas prasowania. Pozostawianie dyszy napełnionej pomaga w wypełnianiu nierówności górnej powierzchni, ale zbyt duża ilość materiału może powodować nadekstruzję po stronie powierzchni." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Margines Prasowania" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Odległość utrzymywana od krawędzi modelu. Prasowanie do końca krawędzi siatki może powodować zadarte krawędzie na wydruku." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Prędkość Prasowania" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Prędkość, z jaką drukarka przejeżdża nad górnymi powierzchniami." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Przyspieszenie Prasowania" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "Przyspieszenie, z jakim przeprowadzane jest prasowanie." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Zryw Prasowania" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Maksymalna nagła zmiana prędkości podczas przeprowadzania prasowania." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4903,13 +5001,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Forma przesunięcia, która ma być zastosowana do modelu podczas ładowania z pliku." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Ekstruder Ściany" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Esktruder Wewn. Ściany" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Ekstruder używany do drukowania ścian. Używane w multi-esktruzji." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Wzór materiału wypełniającego wydruk. Linie i zygzaki zmieniają kierunek na przemiennych warstwach, redukując koszty materiału. Kratka, trójkąty, sześcienne, ośmiościenne, ćwierć sześcienny i koncentryczny wzór są drukowane w pełni na każdej warstwie. Sześcienne, ćwierć sześcienne i czworościenne wypełnienie zmienia się co każdą warstwę, aby zapewnić równy rozkład siły w każdym kierunku." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Łączy końce gdzie wypełnienie spotyka się z wewn. ścianą za pomocą linii, które podążają za kształtem wewn. ściany. Włączenie tej opcji może spowodować lepsze łączenie się wypełnienia ze ścianą i redukuje efekty związane z jakością na pionowych ścianach. Wyłączenie tej opcji redukuje ilość użytego materiału." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Pozioma odległość między obwódką a pierwszą warstwą nadruku.\n" +#~ "Jest to o minimalnej odległości. Z tej odległości linie będą nakładane w kierunku zewnętrznym." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Przesunięcie w Osi Z Warstwy Początk." + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "Ekstruder jest przesuwany z normalnej wysokości pierwszej warstwy o tą wartość. Może być dodatnia (uniesienie) lub ujemna (obniżenie). Niektóre typy filamentu przyklejają się lepiej do stołu jeżeli ekstruder jest lekko uniesiony." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Warstwy Zbieżne Przesunięcia Z" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Kiedy niezerowe, przesunięcie w osi Z jest redukowane do zera w trakcie drukowania takiej ilości warstw. Wartość 0 oznacza, że przesunięcie pozostaje stałe dla wszystkich warstw wydruku." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "To ustawienie kontroluje jak bardzo wewn. narożniki zewn. linii tratwy są zaokrąglone. Wewn. narożniki są zaokrąglone do pół-okręgów o promieniu równym wartości podanej w tym miejscu. To ustawienie usuwa też otwory w zewn. linii tratwy, które są mniejsze niż taki okrąg." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5021,4 +5151,4 @@ msgstr "Forma przesunięcia, która ma być zastosowana do modelu podczas ładow #~ msgctxt "wall_thickness description" #~ msgid "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls." -#~ msgstr "Grubość ścian zewnętrznych w kierunku poziomym. Ta wartość podzielona przez szerokość linii ściany określa liczbę ścian." \ No newline at end of file +#~ msgstr "Grubość ścian zewnętrznych w kierunku poziomym. Ta wartość podzielona przez szerokość linii ściany określa liczbę ścian." diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index db4aa72f0b..52abe5a64a 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-10-05 12:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" @@ -17,66 +17,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "A impressão foi interrompida" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Bloqueado" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Necessária uma ação" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Não consigo começar a imprimir" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Termina em: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Esta impressora hospeda um grupo de %1 impressoras Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} acabou de imprimir '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Impressão Concluída" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Complementos" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Navegar complementos..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Complementos instalados..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -114,19 +54,17 @@ msgstr "Conectando ao Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Cancelar" @@ -153,15 +91,15 @@ msgstr "Arquivo enviado ao Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Abrir Connect.." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Abrir a interface web do Doodle3D Connect" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Exibir registro de alterações" @@ -196,37 +134,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Conectado via USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Incapaz de iniciar novo trabalho porque a impressora está ocupada ou não conectada." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Detalhes de Impressão" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Esta impressora não suporta impressão USB porque usa G-Code UltiGCode." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "Impressão USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Incapaz de iniciar um novo trabalho porque a impressora não suporta impressão USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Aviso" @@ -290,11 +229,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Não foi possível salvar em unidade removível {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Erro" @@ -343,346 +282,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Unidade Removível" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir pela rede" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprime pela rede" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Acesso à impressora solicitado. Por favor aprove a requisição na impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Status da Conexão" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Status da Conexão" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Tentar novamente" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Reenvia o pedido de acesso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Acesso à impressora confirmado" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Sem acesso para imprimir por esta impressora. Incapaz de enviar o trabalho de impressão." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Solicitar acesso" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Envia pedido de acesso à impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Conectado pela rede. Por favor aprove a requisição de acesso na impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Conectado pela rede." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Conectado pela rede. Sem acesso para controlar a impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Pedido de acesso foi negado na impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Pedido de acesso falhou devido a tempo esgotado." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "A conexão à rede foi perdida." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "A conexão com a impressora foi perdida. Verifique se sua impressora está conectada." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Incapaz de iniciar um novo trabalho de impressão, a impressora está ocupada. O estado atual da impressora é %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Status da Impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Incapaz de iniciar um novo trabalho de impressão. Nenhum Printcore carregado no slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Incapaz de iniciar um novo trabalho de impressão. Não há material carregado no slot {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Não há material suficiente para o carretel {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "PrintCore Diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Material diferente (Cura: {0}, Impressora: {1}) selecionado para o extrusor {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "O PrintCore {0} não está calibrado adequadamente. A calibração XY precisa ser executada na impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Tem certeza que quer imprimir com a configuração selecionada?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Há divergências entre a configuração ou calibração da impressora e do Cura. Para melhores resultados, sempre fatie com os PrintCores e materiais que estão carregados em sua impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Configuração divergente" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Envio de novos trabalhos (temporariamente) bloqueado, ainda enviando o trabalho de impressão anterior." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Enviando dados à impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Enviando Dados" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Incapaz de enviar dados à impressora. Há outro trabalho de impressão ativo?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Abortando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Impressão abortada. Por favor verifique a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Pausando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Continuando impressão..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Sincronizar com a impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Deseja usar a configuração atual de sua impressora no Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Os PrintCores e/ou materiais da sua impressora diferem dos que estão dentro de seu projeto atual. Para melhores resultados, sempre fatie para os PrintCores e materiais que estão na sua impressora." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Conectar pela rede" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Esta impressora hospeda um grupo de {count} impressoras Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} acabou de imprimir '{job_name}'. Por favor colete a impressão e confirme esvaziamento da mesa." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} está reservada para imprimir '{job_name}'. Por favor altere a configuração da impressora para combinar com este trabalho para que ela comece a imprimir." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Envio de novos trabalhos (temporariamente) bloqueado, ainda enviando o trabalho de impressão anterior." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Incapaz de enviar novo trabalho de impressão: esta impressora 3D (ainda) não está configurada para hospedar um grupo de impressoras Ultimaker 3 conectadas." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Enviando {file_name} ao grupo {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} enviado ao grupo {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Exibir trabalhos de impressão" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Abrir a interface de trabalhos de impressão em seu navegador." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Incapaz de enviar trabalho de impressão ao grupo {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} enviado ao grupo {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Exibir trabalhos de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Abrir a interface de trabalhos de impressão em seu navegador." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Desconhecido" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} acabou de imprimir '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Impressão Concluída" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Necessária uma ação" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Enviando {file_name} ao grupo {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Conectar pela rede" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Novo firmware de %s disponível" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Baixar" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Não foi possível acessar informação de atualização." @@ -712,7 +637,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Erro ao iniciar %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "O Cura não mostra as camadas corretamente quando Impressão em Arame estiver habilitada" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Modificar G-Code" @@ -742,21 +682,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "Arquivo G-Code" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Visão de Camadas" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "O Cura não mostra as camadas corretamente quando Impressão em Arame estiver habilitada" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Visão de Camadas" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -789,8 +714,9 @@ msgstr "Incapaz de fatiar com o material atual visto que é incompatível com a #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Incapaz de fatiar" @@ -801,23 +727,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Incapaz de fatiar com os ajustes atuais. Os seguintes ajustes têm erros: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Incapaz de fatiar porque a torre de purga ou posição de purga são inválidas." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Nada a fatiar porque nenhum dos modelos cabe no volume de impressão. Por favor redimensione ou rotacione os modelos para caberem." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Processando Camadas" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Informação" @@ -832,14 +764,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Configurar ajustes por Modelo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Recomendado" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Personalizado" @@ -850,29 +804,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Arquivo 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Bico" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Navegar complementos" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Falha ao pegar identificador do complemento de {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Aviso" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Navegador de complementos" @@ -887,18 +836,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Arquivo G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Interpretando G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Detalhes do G-Code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Assegure-se que o g-code é adequado para sua impressora e configuração antes de enviar o arquivo. A representação de g-code pode não ser acurada." @@ -940,73 +889,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Nivelar mesa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Parede Externa" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Paredes Internas" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Contorno" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Preenchimento" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Preenchimento de Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Interface de Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Suporte" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt (Saia)" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Percurso" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Retrações" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Outros" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Arquivo pré-fatiado {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Não há material carregado" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Material desconhecido" @@ -1033,13 +987,13 @@ msgid "Can't Find Location" msgstr "Não Foi Encontrada Localização" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "O Arquivo Já Existe" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1055,12 +1009,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Material Personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "O material selecionado é incompatível com a máquina ou configuração selecionada." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1081,62 +1045,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Desfaz a mudança no diâmetro do material." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Falha ao exportar perfil para {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Falha ao exportar perfil para {0}: complemento escritor relatou erro." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Perfil exportado para {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Detalhes da Exportação" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Falha ao importa perfil de {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Perfil {0} importado com sucesso" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "O Perfil {0} tem tipo de arquivo desconhecido ou está corrompido." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Perfil personalizado" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Falta um tipo de qualidade ao Perfil." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1163,241 +1127,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando Objeto" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Relatório de Problema" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    Uma exceção fatal ocorreu e não foi possível haver recuperação!

    \n" -"

    Por favor use a informação abaixo para publicar um relatório de erro em http://github.com/Ultimaker/Cura/issues

    \n" -" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Abrir Página Web" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Carregando máquinas..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Configurando cena..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Carregando interface..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Somente um arquivo G-Code pode ser carregado por vez. Pulando importação de {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Não é possível abrir nenhum outro arquivo se G-Code estiver sendo carregado. Pulando importação de {0}" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Ajustes da Máquina" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Impressora" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Ajustes da Impressora" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (largura)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Profundidade)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Altura)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Forma da plataforma de impressão" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Origem no centro" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Mesa aquecida" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Sabor de G-Code" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Ajustes da Cabeça de Impressão" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X mín." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distância da esquerda da cabeça de impressão ao centro do bico. Usado para prevenir colisões entre impressões anteriores e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y mín." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distância da frente da cabeça de impressão ao centro do bico. Usado para prevenir colisões entre impressões anteriores e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X máx." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distância da direita da cabeça de impressão ao centro do bico. Usado para prevenir colisões entre impressões anteriores e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y máx." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Distância da traseira da cabeça de impressão ao centro do bico. Usado para prevenir colisões entre impressões anteriores e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Altura do eixo" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "A diferença de altura entre a ponta do bico e o sistema de eixos X e Y. Usado para prevenir colisões entre impressões e a cabeça ao imprimir \"Um de cada Vez\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Número de Extrusores" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será sobrepujado pelo material e/ou perfil." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Diâmetro do material" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Tamanho do bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "G-Code Inicial" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Comandos de G-Code a serem executados no início da impressão." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "G-Code Final" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Comandos de G-Code a serem executados no final da impressão." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Ajustes do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Deslocamento X do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Deslocamento Y do Bico" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-Code Inicial do Extrusor" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-Code Final do Extrusor" @@ -1410,12 +1449,11 @@ msgstr "Registro de alterações" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1467,13 +1505,11 @@ msgid "Unknown error code: %1" msgstr "Código de erro desconhecido: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Conectar a Impressora de Rede" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" @@ -1485,20 +1521,17 @@ msgstr "" "Selecione sua impressora da lista abaixo:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Adicionar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Editar" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1507,220 +1540,221 @@ msgid "Remove" msgstr "Remover" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Atualizar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Se sua impressora não está listada, leia o guia de resolução de problemas de impressão em rede" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Desconhecido" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Versão do firmware" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Endereço" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Esta impressora hospeda um grupo de %1 impressoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "A impressora neste endereço ainda não respondeu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Conectar" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Endereço da Impressora" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Introduza o endereço IP ou hostname da sua impressora na rede." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "Ok" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Imprimir pela rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 não está configurada para hospedar um grupo de impressora Ultimaker 3 conectadas" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Visualizar trabalhos de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Preparando para imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Imprimindo" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Disponível" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "A conexão à impressora foi perdida" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Reservado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Finalizado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "A impressão foi interrompida" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Não aceitando trabalhos de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Termina em: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Esvaziar a mesa de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Esperando alteração de configuração" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Trabalhos de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Imprimindo" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Enfileirados" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Impressoras" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Visualizar impressoras" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Conecta a uma impressora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Carrega a configuração da impressora no Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Ativar Configuração" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras Ultimaker 3 conectadas." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Esta impressora hospeda um grupo de %1 impressoras Ultimaker 3 conectadas" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Imprimir pela rede" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Imprimir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 não está configurada para hospedar um grupo de impressora Ultimaker 3 conectadas" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Imprimindo" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Reservado" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Finalizado" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Preparando" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Disponível" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Completado em: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Esvaziar a mesa de impressão" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Preparando para imprimir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Não aceitando trabalhos de impressão" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Abre a página de trabalhos de impressão com seu navegador web default." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Visualizar trabalhos de impressão" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "GRUPO DE IMPRESSORAS" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Trabalhos de impressão" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Imprimindo" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Enfileirados" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Esperando alteração de configuração" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Impressoras" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Visualizar impressoras" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1746,13 +1780,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Sempre usar qualidade Baixa" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "Ok" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1779,11 +1806,91 @@ msgid "Fine" msgstr "Alta" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Lembrar minha escolha" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Esquema de Cores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Cor do Material" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Tipo de Linha" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Modo de Compatibilidade" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Exibir Percursos" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Exibir Assistentes" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Exibir Perímetro" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Exibir Preenchimento" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Somente Exibir Camadas Superiores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Exibir 5 Camadas Superiores Detalhadas" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Topo / Base" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Parede Interna" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1794,81 +1901,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Scripts de Pós-Processamento" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Adicionar um script" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Troca os scripts de pós-processamento ativos" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Esquema de Cores" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Cor do Material" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Tipo de Linha" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Modo de Compatibilidade" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Exibir Percursos" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Exibir Assistentes" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Exibir Perímetro" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Exibir Preenchimento" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Somente Exibir Camadas Superiores" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Exibir 5 Camadas Superiores Detalhadas" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Topo / Base" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Parede Interna" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1960,129 +2007,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Exibir tudo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Abrir Projeto" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Atualizar existente" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Criar novo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Resumo - Projeto do Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Ajustes da impressora" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Como o conflito na máquina deve ser resolvido?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Tipo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Nome" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Ajustes de perfil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Como o conflito no perfil deve ser resolvido?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Ausente no perfil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 sobrepujança" msgstr[1] "%1 sobrepujanças" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Derivado de" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 sobrepujança" msgstr[1] "%1, %2 sobrepujanças" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Ajustes de material" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Como o conflito no material deve ser resolvido?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Visibilidade dos ajustes" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Modo" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Ajustes visíveis:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 de %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Carregar um projeto removerá todos os modelos da mesa de impressão" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Abrir" @@ -2107,6 +2154,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Instalado" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Baixar" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2115,13 +2167,10 @@ msgstr "Acordo de Licença do Complemento" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -" complemento tem uma licença.\n" -"Você precisa aceitar esta licença para instalar este complemento.\n" -"Você está de acordo com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2133,6 +2182,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Recusar" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2318,30 +2372,25 @@ msgid "Printer does not accept commands" msgstr "A impressora não aceita comandos" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Em manutenção. Por favor verifique a impressora" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "A conexão à impressora foi perdida" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Imprimindo..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Pausado" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Preparando..." @@ -2559,7 +2608,7 @@ msgid "Unit" msgstr "Unidade" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Geral" @@ -2790,7 +2839,7 @@ msgid "Send (anonymous) print information" msgstr "Enviar informação (anônima) de impressão." #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Impressoras" @@ -2808,39 +2857,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Renomear" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Tipo de impressora:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Conexão:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "A impressora não está conectada." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Estado:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Esperando que alguém esvazie a mesa de impressão" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Esperando um trabalho de impressão" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Perfis" @@ -2938,7 +2987,7 @@ msgid "Export Profile" msgstr "Exportar Perfil" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Materiais" @@ -2996,7 +3045,7 @@ msgid "Successfully exported material to %1" msgstr "Material exportado para %1 com sucesso" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Adicionar Impressora" @@ -3016,6 +3065,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Sobre o Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3110,12 +3164,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Biblioteca de recorte de polígonos" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Fonte" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Ícones SVG" @@ -3125,7 +3184,12 @@ msgctxt "@label" msgid "Profile:" msgstr "Perfil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3136,32 +3200,32 @@ msgstr "" "\n" "Clique para abrir o gerenciador de perfis." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Buscar..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Copiar valor para todos os extrusores" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Ocultar este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Não exibir este ajuste" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Manter este ajuste visível" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Configurar a visibilidade dos ajustes..." @@ -3217,12 +3281,12 @@ msgstr "" "Este ajuste é normalmente calculado, mas atualmente tem um conjunto absoluto de valores.\n" "Clique para restaurar o valor calculado." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Configuração de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3231,42 +3295,59 @@ msgstr "" "Configuração de Impressão desabilitada\n" "Arquivos G-Code não podem ser modificados" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00h 00min" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Informação de tempo" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Tempo de impressão" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Configuração Recomendada de Impressão

    Imprimir com os ajustes recomendados para a impressora, material e qualidade selecionados." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Configuração de Impressão Personalizada

    Imprimir com controle fino sobre cada parte do processo de fatiamento." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3276,7 +3357,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Automático: %1" @@ -3305,13 +3386,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Abrir &Recente" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Nenhuma impressora conectada" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Extrusor" @@ -3326,309 +3407,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "A temperatura atual deste extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "A cor do material neste extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "O material neste extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "O bico inserido neste extrusor." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Mesa de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "A temperatura-alvo da mesa aquecida. A mesa aquecerá ou resfriará para esta temperatura. Se for zero, o aquecimento é desligado." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "A temperatura atual da mesa aquecida." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "A temperatura em que pré-aquecer a mesa." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Pré-aquecer" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Aquecer a mesa antes de imprimir. Você pode continuar ajustando sua impressão enquanto ela está aquecendo, e não terá que esperar o aquecimento quando estiver pronto pra imprimir." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Impressão ativa" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Nome do Trabalho" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Tempo de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Tempo restante estimado" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "A<ernar Tela Cheia" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Des&fazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Refazer" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Sair" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Adicionar Impressora..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar Impressoras..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar Materiais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Atualizar perfil com valores e sobrepujanças atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar ajustes atuais" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Criar perfil a partir de ajustes atuais..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfis..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Exibir &Documentação Online" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Relatar um &Bug" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "S&obre..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "Remover Modelo &Selecionado" msgstr[1] "Remover Modelos &Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Centralizar Modelo Selecionado" msgstr[1] "Centralizar Modelos Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar Modelos Selecionados" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Remover Modelo" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntralizar Modelo na Mesa" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar Modelo..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Selecionar Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Esvaziar a mesa de impressão" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "&Recarregar Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Posicionar Todos os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Posicionar Seleção" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reestabelecer as Posições de Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Remover as &Transformações de Todos Os Modelos" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Abrir Arquiv&os(s)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Novo Projeto..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "&Exibir o Registro do Motor de Fatiamento..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Exibir Pasta de Configuração" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar a visibilidade dos ajustes..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Navegar complementos..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Complementos instalados..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Por favor carregue um modelo 3D" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Pronto para fatiar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Fatiando..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Pronto para %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Incapaz de Fatiar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Fatiamento indisponível" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Cancelar" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Selecione o dispositivo de saída ativo" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Abrir arquivo(s)" @@ -3645,112 +3766,117 @@ msgstr "Importar todos como modelos" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Salvar &Seleção em Arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "S&alvar Como..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Salvar projeto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Editar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Ver" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "Aju&stes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Im&pressora" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Material" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Perfil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Definir Como Extrusor Ativo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "E&xtensões" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Complementos" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "P&referências" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "A&juda" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Abrir arquivo" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Ajustes" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Novo projeto" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Tem certeza que quer iniciar novo projeto? Isto esvaziará a mesa de impressão e quaisquer ajustes não salvos." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Instalar Complemento" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Abrir Arquivo(s)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Encontramos um ou mais arquivos de G-Code entre os arquivos que você selecionou. Você só pode abrir um arquivo de G-Code por vez. Se você quiser abrir um arquivo de G-Code, por favor selecione somente um." @@ -3760,102 +3886,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Salvar Projeto" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Extrusor %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & material" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Não exibir resumo do projeto ao salvar novamente" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Salvar" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Preparar" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Monitorar" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Altura de Camada" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Velocidade de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Mais Lento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Mais Rápido" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Preenchimento:" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Preenchimento gradual aumentará gradualmente a quantidade de preenchimento em direção ao topo." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Habilitar gradual" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Gerar Suportes" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Gera estrutura que suportarão partes do modelo que têm seções pendentes. Sem estas estruturas, tais partes desabariam durante a impressão." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Extrusor do Suporte" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Selecione qual extrusor a usar para o suporte. Isto construirá estruturas de suportes abaixo do modelo para prevenir que o modelo desabe ou seja impresso no ar." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Aderência à Mesa de Impressão" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Habilita imprimir um brim (bainha) ou raft (jangada). Adicionará uma área chata em volta ou sob o objeto que é fácil de remover após a impressão ter finalizado." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Precisa de ajuda para melhorar sua impressões?
    Leia os Guias de Resolução de Problema da Ultimaker" @@ -3872,17 +4008,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Abrir arquivo de projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Este é um arquivo de projeto do Cura. Gostaria de abri-lo como um projeto ou importar os modelos dele?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Abrir como projeto" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Importar modelos" @@ -3892,17 +4028,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Registro do Motor de Fatiamento" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Material" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Verificar compatibilidade de material" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Clique para verificar a compatibilidade do material em Ultimaker.com." @@ -4017,11 +4153,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Conexão de Rede UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Conexão de Rede UM3 (Cluster)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4042,6 +4173,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Integração ao SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4102,16 +4243,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Leitor de Perfis de G-Code" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Provê a visão de Camadas." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Visão de Camadas" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4132,6 +4263,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "Atualização de Versão de 2.7 para 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4192,6 +4333,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Ferramenta de Ajustes Por Modelo" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4252,6 +4403,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "Gerador de 3MF" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4272,6 +4433,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Leitor de Perfis do Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Bloqueado" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Não consigo começar a imprimir" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Abrir Connect.." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Detalhes de Impressão" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Visão de Camadas" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Navegar complementos" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Detalhes da Exportação" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Uma exceção fatal ocorreu e não foi possível haver recuperação!

    \n" +#~ "

    Por favor use a informação abaixo para publicar um relatório de erro em http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Abrir Página Web" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Esta impressora não está configurada para hospedar um grupo de impressoras Ultimaker 3 conectadas." + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Esta impressora hospeda um grupo de %1 impressoras Ultimaker 3 conectadas" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Preparando" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Completado em: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Abre a página de trabalhos de impressão com seu navegador web default." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "GRUPO DE IMPRESSORAS" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Carregar um projeto removerá todos os modelos da mesa de impressão" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " complemento tem uma licença.\n" +#~ "Você precisa aceitar esta licença para instalar este complemento.\n" +#~ "Você está de acordo com os termos abaixo?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00h 00min" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Informação de tempo" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Tempo de impressão" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Verificar compatibilidade de material" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Conexão de Rede UM3 (Cluster)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Provê a visão de Camadas." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Raios X" diff --git a/resources/i18n/pt_BR/fdmextruder.def.json.po b/resources/i18n/pt_BR/fdmextruder.def.json.po index 65e6e678fe..816a6ccb4a 100644 --- a/resources/i18n/pt_BR/fdmextruder.def.json.po +++ b/resources/i18n/pt_BR/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-10-06 08:00-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index 3458c5cafe..d0e806e768 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-10-06 10:00-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" @@ -610,6 +610,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "A altura da camada inicial em mm. Uma camada inicial mais espessa faz a aderência à mesa de impressão ser maior." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -760,6 +785,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Perímetro" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Extrusor das Paredes" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "O carro extrusor usado para imprimir paredes. Este ajuste é usado em multi-extrusão." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -772,8 +807,8 @@ msgstr "O carro extrusor usado para imprimir a parede externa. Este ajuste é us #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Extrusor das Paredes Internas" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1205,6 +1240,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Substitui a parte externa do padrão superior/inferir com um número de linhas concêntricas. Usar uma ou duas linhas melhora tetos e topos que começam a ser construídos em cima de padrões de preenchimento." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Habilitar Passar a Ferro" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Passar sobre a superfície superior depois de impressa, mas sem extrudar material. A idéia é derreter o plástico do topo ainda mais, criando uma superfície mais lisa." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Passar a Ferro Somente Camada Mais Alta" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Somente executar a passagem a ferro na última camada da malha. Isto economiza tempo se as camadas abaixo não precisarem de um acabamento de superfície amaciado." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Padrão de Passagem a Ferro" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "O padrão a usar quando se passa a ferro as superfícies superiores." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Espaçamento de Passagem a Ferro" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "A distância entre as trajetórias de passagem a ferro." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Fluxo de Passagem a Ferro" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "A quantidade de material, relativa ao filete normal de extrusão, para extrudar durante a passagem a ferro. Manter o bico com algum material ajuda a preencher algumas das lacunas e fendas da superfície superior, mas material demais resulta em superextrusão e verrugas nas laterais da superfície." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Penetração da Passagem a Ferro" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "A distância a manter das arestas do modelo. Passar a ferro as arestas da malha podem resultar em um aspecto entalhado da sua peça." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Velocidade de Passar o Ferro" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "A velocidade com a qual o ajuste de passar ferro é aplicado sobre a superfície superior." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Aceleração de Passar a Ferro" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "A aceleração com que o recurso de passar a ferro é feito." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Jerk de Passar a Ferro" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "A máxima mudança de velocidade instantânea em uma direção com que o recurso de passar a ferro é feito." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1252,7 +1387,7 @@ msgstr "Padrão de Preenchimento" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." msgstr "" #: fdmprinter.def.json @@ -1270,6 +1405,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Triângulos" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1322,8 +1462,8 @@ msgstr "Conectar Linhas de Preenchimento" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Conecta as extremidades onde o padrão de preenchimento se encontra com a parede interna usando linhas que seguem a forma dessa parede. Habilitar este ajuste pode fazer o preenchimento aderir melhor às paredes e reduz os efeitos do preenchimento na qualidade das superfícies verticais. Desabilitar este ajuste reduz a quantidade de material usado." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1335,6 +1475,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Uma lista de direções de filetes em números inteiros a usar. Elementos da lista são usados sequencialmente de acordo com o progresso das camadas e quando o fim da lista é alcançado, ela volta ao começo. Os itens da lista são separados por vírgula e a lista inteira é contida em colchetes. O default é uma lista vazia que implica em usar os ângulos default tradicionais (45 e 135 graus para os padrões linha e ziguezague e 45 graus para todos os outros padrões)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1645,6 +1805,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Ajusta o diâmetro do filamento utilizado. Acerte este valor com o diâmetro real do filamento." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2835,36 +3015,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Conecta os ziguezagues. Isto aumentará a força da estrutura de suporte em ziguezague." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Quebrar Suportes em Pedaços" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Evitar algumas conexões de linha de suporte para fazer a estrutura de suporte mais fácil de ser removida. Este ajuste é aplicável ao padrão de preenchimento de suporte de ziguezague." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Tamanho do Pedaço de Suporte" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Evita uma conexão entre linhas de suporte uma vez a cada N milímetros para fazer a estrutura de suporte mais fácil de ser removida." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Contagem de Linhas de Pedaço de Suporte" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Evitar uma em cada N linhas de conexão para fazer a estrutura de suporte mais fácil de ser removida." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3404,10 +3554,8 @@ msgstr "Distância do Skirt" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" -"A distância horizontal entre o skirt e a primeira camada da impressão.\n" -"Esta é a distância mínima; múltiplas linhas de skirt se estenderão pra fora a partir desta distância." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3449,26 +3597,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Imprimir o Brim somente no lado de fora do modelo. Isto reduz a quantidade de brim a ser removida no final, e não reduz tanto a aderência à mesa." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Deslocamento em Z da Camada Inicial" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "O extrusor é deslocado da altura normal da primeira camada por esta distância. Pode ser positiva (elevada) ou negativa (abaixada). Alguns tipos de filamento aderem à camada de impressão melhor se o extrusor for elevado ligeiramente." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Camadas de Amenização do Deslocamento Z" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Quando não for zero, o deslocamento em Z é reduzido a zero depois deste número de camadas. O valor zero significa que o deslocamento em Z permanece constante para todas as camadas da impressão." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3486,8 +3614,8 @@ msgstr "Amaciamento do Raft" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Este ajuste controla quantos cantos interiores no contorno do raft são arredondados. Cantos no sentido interior são arredondados para um semicírculo com raio igual ao valor dado aqui. Este ajuste também remove buracos que sejam menores que tal círculo no contorno do raft." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3959,6 +4087,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normalmente o Cura tenta costurar pequenos furos na malha e remover partes de uma camada com grandes furos. Habilitar esta opção mantém aquelas partes que não podem ser costuradas. Este opção deve ser usada somente como uma última alternativa quando tudo o mais falha em produzir G-Code apropriado." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3989,6 +4127,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Troca quais volumes sobrepondo malhas vão pertencer a cada camada, de modo que as malhas sobrepostas se tornem entrelaçadas. Desligar esta opção vai fazer com que uma das malhas obtenha todo o volume da sobreposiçào, removendo este volume das outras malhas." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4194,6 +4342,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Otimiza a ordem em que paredes são impressas de modo a reduzir o número de retrações e a distância percorrida. A maioria das peças se beneficiarão deste ajuste habilitado mas algumas podem acabar levando mais tempo, portanto por favor compare as estimativas de tempo de impressão com e sem otimização." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Quebrar Suportes em Pedaços" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Evitar algumas conexões de linha de suporte para fazer a estrutura de suporte mais fácil de ser removida. Este ajuste é aplicável ao padrão de preenchimento de suporte de ziguezague." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Tamanho do Pedaço de Suporte" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Evita uma conexão entre linhas de suporte uma vez a cada N milímetros para fazer a estrutura de suporte mais fácil de ser removida." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Contagem de Linhas de Pedaço de Suporte" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Evitar uma em cada N linhas de conexão para fazer a estrutura de suporte mais fácil de ser removida." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4484,6 +4662,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "A distância média entre os pontos aleatórios introduzidos em cada segmento de linha. Note que os pontos originais do polígono são descartados, portanto umo alto alisamento resulta em redução da resolução. Este valor deve ser maior que a metade da Espessura do Contorno Felpudo." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4743,106 +4941,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Distância entre o bico e os filetes descendentes horizontais. Espaços livres maiores resultarão em filetes descendentes diagonais com ângulo menos acentuado, o que por sua vez resulta em menos conexões ascendentes à próxima camada. Somente se aplica à Impressão em Arame." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Habilitar Passar a Ferro" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Passar sobre a superfície superior depois de impressa, mas sem extrudar material. A idéia é derreter o plástico do topo ainda mais, criando uma superfície mais lisa." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Passar a Ferro Somente Camada Mais Alta" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Somente executar a passagem a ferro na última camada da malha. Isto economiza tempo se as camadas abaixo não precisarem de um acabamento de superfície amaciado." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Padrão de Passagem a Ferro" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "O padrão a usar quando se passa a ferro as superfícies superiores." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Concêntrico" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Ziguezague" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Espaçamento de Passagem a Ferro" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "A distância entre as trajetórias de passagem a ferro." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Fluxo de Passagem a Ferro" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "A quantidade de material, relativa ao filete normal de extrusão, para extrudar durante a passagem a ferro. Manter o bico com algum material ajuda a preencher algumas das lacunas e fendas da superfície superior, mas material demais resulta em superextrusão e verrugas nas laterais da superfície." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Penetração da Passagem a Ferro" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "A distância a manter das arestas do modelo. Passar a ferro as arestas da malha podem resultar em um aspecto entalhado da sua peça." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Velocidade de Passar o Ferro" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "A velocidade com a qual o ajuste de passar ferro é aplicado sobre a superfície superior." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Aceleração de Passar a Ferro" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "A aceleração com que o recurso de passar a ferro é feito." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Jerk de Passar a Ferro" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "A máxima mudança de velocidade instantânea em uma direção com que o recurso de passar a ferro é feito." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4903,13 +5001,41 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Matriz de transformação a ser aplicada ao modelo após o carregamento do arquivo." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Extrusor das Paredes" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Extrusor das Paredes Internas" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "O carro extrusor usado para imprimir paredes. Este ajuste é usado em multi-extrusão." +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Conecta as extremidades onde o padrão de preenchimento se encontra com a parede interna usando linhas que seguem a forma dessa parede. Habilitar este ajuste pode fazer o preenchimento aderir melhor às paredes e reduz os efeitos do preenchimento na qualidade das superfícies verticais. Desabilitar este ajuste reduz a quantidade de material usado." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "A distância horizontal entre o skirt e a primeira camada da impressão.\n" +#~ "Esta é a distância mínima; múltiplas linhas de skirt se estenderão pra fora a partir desta distância." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Deslocamento em Z da Camada Inicial" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "O extrusor é deslocado da altura normal da primeira camada por esta distância. Pode ser positiva (elevada) ou negativa (abaixada). Alguns tipos de filamento aderem à camada de impressão melhor se o extrusor for elevado ligeiramente." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Camadas de Amenização do Deslocamento Z" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Quando não for zero, o deslocamento em Z é reduzido a zero depois deste número de camadas. O valor zero significa que o deslocamento em Z permanece constante para todas as camadas da impressão." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Este ajuste controla quantos cantos interiores no contorno do raft são arredondados. Cantos no sentido interior são arredondados para um semicírculo com raio igual ao valor dado aqui. Este ajuste também remove buracos que sejam menores que tal círculo no contorno do raft." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index 34f7262a1f..28f3ceae2c 100755 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-23 10:40+0300\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" @@ -18,66 +18,6 @@ msgstr "" "X-Generator: Poedit 2.0.4\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Печать прервана" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "блокированный" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Необходимое действие" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Не удается начать печать" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Данный принтер не настроен для управления группой принтеров Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Заканчивается на: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Данный принтер управляет группой из %1 принтеров Ultimaker 3." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name} завершил печать '{job_name}'." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Печать завершена" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "Плагины" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Просмотр плагинов..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Установленные плагины..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -115,19 +55,17 @@ msgstr "Соединение с Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "Отмена" @@ -154,15 +92,15 @@ msgstr "Файл отправлен через Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Открыть соединение..." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Открыть Doodle3D Connect web интерфейс" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Показать журнал изменений" @@ -197,37 +135,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "Подключено через USB" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Невозможно запустить новое задание, потому что принтер занят или не подключен." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Подробности печати" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Данный принтер не поддерживает печать через USB, потому что он использует UltiGCode диалект." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB печать" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Невозможно запустить новую задачу, так как принтер не поддерживает печать через USB." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Внимание" @@ -291,11 +230,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Невозможно сохранить на внешний носитель {0}: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Ошибка" @@ -344,346 +283,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Внешний носитель" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Печать через сеть" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Печать через сеть" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "Запрошен доступ к принтеру. Пожалуйста, подтвердите запрос на принтере" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Состояние соединения" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Состояние соединения" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Повторить" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Послать запрос доступа ещё раз" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Доступ к принтеру получен" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Нет доступа к использованию этого принтера. Невозможно отправить задачу на печать." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Запросить доступ" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Отправить запрос на доступ к принтеру" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Подключен по сети. Пожалуйста, подтвердите запрос на принтере." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Подключен по сети." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Подключен по сети. Нет доступа к управлению принтером." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Запрос доступа к принтеру был отклонён." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Запрос доступа был неудачен из-за таймаута." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Соединение с сетью было потеряно." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Соединение с принтером было потеряно. Проверьте свой принтер, подключен ли он." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Невозможно запустить новую задачу на печать, принтер занят. Текущий статус принтера %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Состояние принтера" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Невозможно запустить новую задачу на печать. PrinterCore не был загружен в слот {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Невозможно запустить новую задачу на печать. Материал не загружен в слот {0}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Недостаточно материала в катушке {0}." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Разный PrintCore (Cura: {0}, Принтер: {1}) выбран для экструдера {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Разный материал (Cura: {0}, Принтер: {1}) выбран для экструдера {2}" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} не откалибровано. Необходимо выполнить XY калибровку для принтера." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Вы уверены, что желаете печатать с использованием выбранной конфигурации?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Есть несовпадение между конфигурацией или калибровкой принтера и Cura. Для лучшего результата, всегда производите слайсинг для PrintCore и материала, которые установлены в вашем принтере." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Несовпадение конфигурации" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Отправка новых заданий (временно) заблокирована, идёт отправка предыдущего задания." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Отправка данных на принтер" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Отправка данных" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Невозможно отправить данные на принтер. Другая задача всё ещё активна?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Прерывание печати…" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Печать прервана. Пожалуйста, проверьте принтер" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Печать приостановлена..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Печать возобновлена..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Синхронизация с вашим принтером" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Желаете использовать текущую конфигурацию принтера в Cura?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Модуль PrintCore и/или материал в вашем принтере отличается от тех, что вы используете в текущем проекте. Для наилучшего результата всегда указывайте правильный модуль PrintCore и материалы, которые вставлены в ваш принтер." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Подключиться через сеть" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Данный принтер не настроен для управления группой подключенных принтеров Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Данный принтер управляет группой из {count} подключенных принтеров Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} завершил печать '{job_name}'. Пожалуйста, освободите область печати." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} назначен для печати '{job_name}'. Пожалуйста, измените конфигурацию принтера, чтобы она соответствовала заданию." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Отправка новых заданий (временно) заблокирована, идёт отправка предыдущего задания." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Невозможно отправить новое задание: данный 3D принтер (ещё) не настроен на управление группой подключенных принтеров Ultimaker 3." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "Отправляем {file_name} на группу {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "Отправка {file_name} на группу {cluster_name}." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Показать задания на печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Открыть интерфейс с заданиями печати в вашем браузере." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Невозможно отправить задание на группу {cluster_name}." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "Отправка {file_name} на группу {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Показать задания на печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Открыть интерфейс с заданиями печати в вашем браузере." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Неизвестный" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name} завершил печать '{job_name}'." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Печать завершена" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Необходимое действие" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "Отправляем {file_name} на группу {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Подключиться через сеть" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Рекомендуется регулярно обновлять прошивку принтера {machine_name}. Это может сделано когда {machine_name} подключен к сети или к USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Доступна новая прошивка %s" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "Скачать" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Не могу получить информацию об обновлениях." @@ -713,7 +638,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "Ошибка при запуске %s!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Cura не аккуратно отображает слои при использовании печати через кабель" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "Изменить G-код" @@ -743,21 +683,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "Файл G-code" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Просмотр слоёв" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Cura не аккуратно отображает слои при использовании печати через кабель" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Просмотр слоёв" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -790,8 +715,9 @@ msgstr "Невозможно нарезать модель, используя #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Невозможно нарезать" @@ -802,23 +728,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Не могу выполнить слайсинг на текущих настройках. Проверьте следующие настройки: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "Слайсинг невозможен так как черновая башня или её позиция неверные." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Нечего нарезать, так как ни одна модель не попадает в объём принтера. Пожалуйста, отмасштабируйте или поверните модель." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Обработка слоёв" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Информация" @@ -833,14 +765,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Правка параметров модели" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Рекомендованная" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Своя" @@ -851,29 +805,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "Файл 3MF" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Сопло" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Просмотр плагинов" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Невозможно получить идентификатор плагин {0}" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Внимание" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Браузер плагинов" @@ -888,18 +837,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "Файл G" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "Обработка G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "Параметры G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Перед отправкой G-code на принтер удостоверьтесь в его соответствии вашему принтеру и его настройкам. Возможны неточности в G-code." @@ -941,73 +890,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Выравнивание стола" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Внешняя стенка" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "Внутренние стенки" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Покрытие" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Заполнение" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Заполнение поддержек" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Связующий слой поддержек" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Поддержки" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Юбка" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Перемещение" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Откаты" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Другое" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Предообратка файла {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Материал не загружен" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Неизвестный материал" @@ -1034,13 +988,13 @@ msgid "Can't Find Location" msgstr "Не могу найти место" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Файл уже существует" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1056,12 +1010,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Собственный материал" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Выбранный материал несовместим с выбранным принтером или конфигурацией." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1082,62 +1046,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Отмена изменения диаметра материала." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Невозможно экспортировать профиль в {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Невозможно экспортировать профиль в {0}: Плагин записи уведомил об ошибке." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Экспортирование профиля в {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Экспорт подробностей" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "Невозможно импортировать профиль из {0}: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Успешно импортирован профиль {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Профиль {0} имеет неизвестный тип файла или повреждён." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Собственный профиль" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "У профайла отсутствует тип качества." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1164,240 +1128,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Размещение объекта" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Отчёт о сбое" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    Произошла неожиданная ошибка и мы не смогли её исправить!

    \n" -"

    Пожалуйста, используйте информацию ниже для создания отчёта об ошибке на http://github.com/Ultimaker/Cura/issues

    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Открыть веб страницу" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Загрузка принтеров..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Настройка сцены..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Загрузка интерфейса..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f мм" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Только один G-code файла может быть загружен в момент времени. Пропускаю импортирование {0}" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Невозможно открыть любой другой файл, если G-code файл уже загружен. Пропускаю импортирование {0}" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Параметры принтера" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Принтер" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Параметры принтера" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Ширина)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "мм" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Глубина)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Высота)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Форма стола" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Начало координат в центре" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Нагреваемый стол" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Вариант G-кода" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Параметры головы" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X минимум" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Расстояние от левого края головы до центра сопла. Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y минимум" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Расстояние от переднего края головы до центра сопла. Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X максимум" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Расстояние от правого края головы до центра сопла. Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y максимум" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Расстояние от заднего края головы до центра сопла. Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Высота портала" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Разница в высоте от кончика сопла до портала (по осям X и Y). Используется для предотвращения столкновений с уже напечатанной частью и головой в режиме \"По отдельности\"." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Количество экструдеров" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Номинальный диаметр материала, поддерживаемый принтером. Точный диаметр будет указан в материале и/или в профиле." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Диаметр материала" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Диаметр сопла" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Начало G-кода" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Команды в G-коде, которые будут выполнены при старте печати." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Конец G-кода" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Команды в G-коде, которые будут выполнены в конце печати." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Параметры сопла" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Смещение сопла по оси X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Смещение сопла по оси Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "G-код старта экструдера" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "G-код завершения экструдера" @@ -1410,12 +1450,11 @@ msgstr "Журнал изменений" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1467,13 +1506,11 @@ msgid "Unknown error code: %1" msgstr "Неизвестный код ошибки: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Подключение к сетевому принтеру" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" @@ -1485,20 +1522,17 @@ msgstr "" "Укажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Добавить" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Правка" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1507,220 +1541,221 @@ msgid "Remove" msgstr "Удалить" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Обновить" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Если ваш принтер отсутствует в списке, обратитесь к руководству по решению проблем с сетевой печатью" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Тип" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Расширенный" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Неизвестный" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Версия прошивки" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Адрес" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Данный принтер не настроен для управления группой принтеров Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Данный принтер управляет группой из %1 принтеров Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "Принтер по этому адресу ещё не отвечал." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Подключить" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Адрес принтера" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "Введите IP адрес принтера или его имя в сети." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Ok" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Печать через сеть" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 не настроен для управления группой подключенных принтеров Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Просмотреть задания на печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Подготовка к печати" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Доступен" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Потеряно соединение с принтером" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Занят" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Завершено" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Печать прервана" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Не принимает задания на печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Заканчивается на: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Очистите стол" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Ожидание изменения конфигурации" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Задания на печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Печать" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Запланировано" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Принтеры" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Просмотреть принтеры" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Подключение к принтеру" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Загрузка конфигурации принтера в Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Активировать конфигурацию" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Данный принтер не настроен для управления группой подключенных принтеров Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Данный принтер управляет группой из {count} подключенных принтеров Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Печать через сеть" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 не настроен для управления группой подключенных принтеров Ultimaker 3" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Занят" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Завершено" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Подготовка" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Доступен" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Выполнено на:" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Очистите стол" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Подготовка к печати" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Не принимает задания на печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Открывает страницу с заданиями на печать в вашем браузере." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Просмотреть задания на печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "ГРУППА ПРИНТЕРОВ" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Задания на печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Печать" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Запланировано" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Ожидание изменения конфигурации" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Принтеры" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Просмотреть принтеры" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1746,13 +1781,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Всегда использовать грубое качество" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "OK" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1779,11 +1807,91 @@ msgid "Fine" msgstr "Хорошее" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Запомнить мой выбор" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Цветовая схема" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Цвет материала" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Тип линии" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Режим совместимости" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Показать движения" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Показать поддержку" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Показать стенки" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Показать заполнение" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Показать только верхние слои" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Показать 5 детализированных слоёв сверху" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Дно / крышка" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Внутренняя стенка" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1794,81 +1902,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Скрипты пост-обработки" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Добавить скрипт" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Изменить активные скрипты пост-обработки" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Цветовая схема" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Цвет материала" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Тип линии" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Режим совместимости" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Показать движения" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Показать поддержку" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Показать стенки" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Показать заполнение" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Показать только верхние слои" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "Показать 5 детализированных слоёв сверху" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Дно / крышка" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "Внутренняя стенка" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1960,72 +2008,72 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Показать всё" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Открытие проекта" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Обновить существующий" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Создать новый" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Сводка - Проект Cura" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Параметры принтера" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Как следует решать конфликт в принтере?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Тип" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "Название" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Параметры профиля" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Как следует решать конфликт в профиле?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Вне профиля" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" @@ -2033,12 +2081,12 @@ msgstr[0] "%1 перекрыт" msgstr[1] "%1 перекрыто" msgstr[2] "%1 перекрыто" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Производное от" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" @@ -2046,45 +2094,45 @@ msgstr[0] "%1, %2 перекрыто" msgstr[1] "%1, %2 перекрыто" msgstr[2] "%1, %2 перекрыто" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Параметры материала" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Как следует решать конфликт в материале?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Видимость параметров" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Режим" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Видимые параметры:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 из %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Загрузка проекта уберёт все модели со стола" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Открыть" @@ -2109,6 +2157,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Установлено" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Скачать" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2117,13 +2170,10 @@ msgstr "Лицензионное соглашение плагина" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -" плагин содержит лицензию.\n" -"Вам требуется принять лицензию для установки данного плагина.\n" -"Вы согласны с написанным ниже?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2135,6 +2185,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Отклонить" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2320,30 +2375,25 @@ msgid "Printer does not accept commands" msgstr "Принтер не принимает команды" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "В режиме обслуживания. Пожалуйста, проверьте принтер" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Потеряно соединение с принтером" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Печать..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Приостановлен" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Подготовка..." @@ -2561,7 +2611,7 @@ msgid "Unit" msgstr "Единица" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Общее" @@ -2792,7 +2842,7 @@ msgid "Send (anonymous) print information" msgstr "Отправлять (анонимно) информацию о печати" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Принтеры" @@ -2810,39 +2860,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Переименовать" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Тип принтера:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Соединение:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Принтер не подключен." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Состояние:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Ожидаем, чтобы кто-нибудь освободил стол" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Ожидаем задание на печать" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Профили" @@ -2940,7 +2990,7 @@ msgid "Export Profile" msgstr "Экспортировать профиль" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Материалы" @@ -2998,7 +3048,7 @@ msgid "Successfully exported material to %1" msgstr "Материал успешно экспортирован в %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Добавление принтера" @@ -3018,6 +3068,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "О Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3112,12 +3167,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Библиотека обрезки полигонов" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Шрифт" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "Иконки SVG" @@ -3127,7 +3187,12 @@ msgctxt "@label" msgid "Profile:" msgstr "Профиль:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3138,32 +3203,32 @@ msgstr "" "\n" "Нажмите для открытия менеджера профилей." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Поиск..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Скопировать значение для всех экструдеров" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Спрятать этот параметр" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Не показывать этот параметр" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Оставить этот параметр видимым" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Настроить видимость параметров..." @@ -3221,12 +3286,12 @@ msgstr "" "\n" "Щёлкните для восстановления вычисленного значения." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Настройка печати" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3235,42 +3300,59 @@ msgstr "" "Настройка принтера отключена\n" "G-code файлы нельзя изменять" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00ч 00мин" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Информация о времени" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Время печати" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1м / ~ %2гр / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1м / ~ %2гр" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Рекомендованные параметры печати

    Печатайте с рекомендованными параметрами для выбранных принтера, материала и качества." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Свои параметры печати

    Печатайте с полным контролем над каждой особенностью процесса слайсинга." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Автоматически: %1" @@ -3280,7 +3362,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "Вид" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Автоматически: %1" @@ -3311,13 +3393,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "Открыть недавние" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Принтер не подключен" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Экструдер" @@ -3332,152 +3414,182 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Текущая температура экструдера." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Цвет материала в данном экструдере." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Материал в данном экструдере." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Сопло, вставленное в данный экструдер." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Стол" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Целевая температура горячего стола. Стол будет нагреваться и охлаждаться, оставаясь на этой температуре. Если установлена в 0, значит нагрев стола отключен." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Текущая температура горячего стола." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Температура преднагрева горячего стола." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "Отмена" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Преднагрев" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Нагрев горячего стола перед печатью. Вы можете продолжать настройки вашей печати, пока стол нагревается, и вам не понадобится ждать нагрева стола для старта печати." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Идёт печать" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "Имя задачи" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Время печати" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Осталось примерно" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Полный экран" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Отмена" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Возврат" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "Выход" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Настроить Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "Добавить принтер..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Управление принтерами..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Управление материалами…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Обновить профиль, используя текущие параметры" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Сбросить текущие параметры" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Создать профиль из текущих параметров…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Управление профилями..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Показать онлайн документацию" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Отправить отчёт об ошибке" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "О Cura..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" @@ -3485,7 +3597,7 @@ msgstr[0] "Удалить выбранную модель" msgstr[1] "Удалить выбранные модели" msgstr[2] "Удалить выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" @@ -3493,7 +3605,7 @@ msgstr[0] "Центрировать выбранную модель" msgstr[1] "Центрировать выбранные модели" msgstr[2] "Центрировать выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" @@ -3501,143 +3613,153 @@ msgstr[0] "Размножить выбранную модель" msgstr[1] "Размножить выбранные модели" msgstr[2] "Размножить выбранные модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Удалить модель" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Поместить модель по центру" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Сгруппировать модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Разгруппировать модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Объединить модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Дублировать модель..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "Выбрать все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "Очистить стол" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Перезагрузить все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Выровнять все модели" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Выровнять выбранные" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Сбросить позиции всех моделей" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Сбросить преобразования всех моделей" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Открыть файл(ы)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "Новый проект..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Показать журнал движка..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Показать конфигурационный каталог" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Видимость параметров…" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Просмотр плагинов..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Установленные плагины..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Пожалуйста, загрузите 3D модель" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Готов к нарезке" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Нарезка на слои..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "Готов к %1" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Невозможно нарезать" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Нарезка недоступна" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Подготовка" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "Отмена" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Выберите активное целевое устройство" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Открыть файл(ы)" @@ -3654,112 +3776,117 @@ msgstr "Импортировать всё как модели" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "Файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "Сохранить выделенное в файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "Сохранить как..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Сохранить проект" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "Правка" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "Вид" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "Принтер" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "Материал" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "Профиль" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Установить как активный экструдер" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Расширения" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "Плагины" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Настройки" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "Справка" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Открыть файл" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Параметры" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Новый проект" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Вы действительно желаете начать новый проект? Это действие очистит область печати и сбросит все несохранённые настройки." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Установка плагина" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Открыть файл(ы)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Среди выбранных файлов мы нашли несколько файлов с G-кодом. Вы можете открыть только один файл за раз. Измените свой выбор, пожалуйста." @@ -3769,102 +3896,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Сохранить проект" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Экструдер %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 и материал" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Больше не показывать сводку по проекту" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Сохранить" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Подготовка" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "Монитор" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Высота слоя" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Скорость печати" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Медленнее" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Быстрее" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Заполнение" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Постепенное заполнение будет постепенно увеличивать объём заполнения по направлению вверх." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Постепенное" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Генерация поддержек" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Генерация структур для поддержки нависающих частей модели. Без этих структур такие части будут складываться во время печати." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Экструдер поддержек" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Выбирает какой экструдер следует использовать для поддержек. Будут созданы поддерживающие структуры под моделью для предотвращения проседания краёв или печати в воздухе." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Тип прилипания к столу" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Разрешает печать каймы или подложки. Это добавляет плоскую область вокруг или под вашим объектом, которую легко удалить после печати." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Требуется помощь в улучшении вашей печати?
    Обратитесь к Руководству Ultimaker по решению проблем" @@ -3882,17 +4019,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Открыть файл проекта" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Это проект Cura. Следует открыть его как проект или просто импортировать из него модели?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Открыть как проект" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Импортировать модели" @@ -3902,17 +4039,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Журнал движка" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Материал" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Проверить совместимость материала" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Нажмите для проверки совместимости материала на Ultimaker.com." @@ -4027,11 +4164,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "Соединение с сетью UM3" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "Соединение с сетью UM3 (кластер)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4052,6 +4184,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "Интеграция с SolidWorks" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4112,16 +4254,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "Чтение профиля из G-Code" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Предоставляет послойный просмотр." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Просмотр слоёв" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4142,6 +4274,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4202,6 +4344,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Инструмент для настройки каждой модели" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4262,6 +4414,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "Запись 3MF" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4282,6 +4444,137 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Чтение профиля Cura" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "блокированный" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Не удается начать печать" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Открыть соединение..." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Подробности печати" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Рекомендуется регулярно обновлять прошивку принтера {machine_name}. Это может сделано когда {machine_name} подключен к сети или к USB." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Просмотр слоёв" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Просмотр слоёв" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Просмотр плагинов" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Экспорт подробностей" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Произошла неожиданная ошибка и мы не смогли её исправить!

    \n" +#~ "

    Пожалуйста, используйте информацию ниже для создания отчёта об ошибке на http://github.com/Ultimaker/Cura/issues

    " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Открыть веб страницу" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Ok" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Данный принтер не настроен для управления группой подключенных принтеров Ultimaker 3" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Данный принтер управляет группой из {count} подключенных принтеров Ultimaker 3" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Подготовка" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Выполнено на:" + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Открывает страницу с заданиями на печать в вашем браузере." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "ГРУППА ПРИНТЕРОВ" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Загрузка проекта уберёт все модели со стола" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " плагин содержит лицензию.\n" +#~ "Вам требуется принять лицензию для установки данного плагина.\n" +#~ "Вы согласны с написанным ниже?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00ч 00мин" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Информация о времени" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Время печати" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1м / ~ %2гр / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1м / ~ %2гр" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Проверить совместимость материала" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "Соединение с сетью UM3 (кластер)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Предоставляет послойный просмотр." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Просмотр слоёв" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "Рентген" diff --git a/resources/i18n/ru_RU/fdmextruder.def.json.po b/resources/i18n/ru_RU/fdmextruder.def.json.po index 7c5abae3bc..7d44d19ee0 100644 --- a/resources/i18n/ru_RU/fdmextruder.def.json.po +++ b/resources/i18n/ru_RU/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-09 19:26+0300\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index d47ace8f7d..6172a55199 100755 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-23 11:19+0300\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" @@ -611,6 +611,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "Высота первого слоя в миллиметрах. Более толстый слой упрощает прилипание пластика к столу." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -761,6 +786,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Ограждение" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Экструдер стенок" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Этот экструдер используется для печати стенок. Используется при наличии нескольких экструдеров." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -773,8 +808,8 @@ msgstr "Этот экструдер используется для печати #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "Печать внутренних стенок" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1206,6 +1241,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Заменяет внешнюю часть шаблона крышки/дна рядом концентрических линий. Использование одной или двух линий улучшает мосты, которые печатаются поверх материала заполнения." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Разрешить разглаживание" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Проходить по верхней оболочке ещё раз, но без выдавливания материала. Это приводит к плавлению пластика, что создаёт более гладкую поверхность." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Самый высокий слой разглаживания" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Выполняет разглаживание только на самом последнем слое модели. Экономит время, когда нижние слои не требуют сглаживания поверхности." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Шаблон разглаживания" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Шаблон, который будет использоваться для разглаживания верхней оболочки." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Концентрический" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Расстояние между линиями разглаживания" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Расстояние между линиями разглаживания." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Поток разглаживания" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Объём материала, относительно от обычной линии, который будет выдавлен в процессе разглаживания. Наличие в сопле наличие материала помогает заполнять щели на верхней оболочке, но слишком большое значение приводит к излишнему выдавливанию материала и ухудшает качество оболочки." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Границы разглаживания" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Расстояние от краёв модели. Разглаживание от края до края может выразится в загибании краёв при печати." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Скорость разглаживания" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Скорость, на которой голова проходит над верхней оболочкой." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Ускорение разглаживания" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "Ускорение, с которым производится разглаживание." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Рывок разглаживания" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Изменение максимальной мгновенной скорости, с которой выполняется разглаживание." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1253,8 +1388,8 @@ msgstr "Шаблон заполнения" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Шаблон заполнения при печати. Заполнение линиями или зиг-загом меняет направление на соседних слоях, уменьшая стоимость материала. Сетчатый, треугольный, кубический, восьмигранный и концентрический шаблоны полностью печатаются на каждом слое. Кубическое, четверть кубическое и восьмигранное заполнение меняется на каждом слое для получения более равного распределения по каждому направлению." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1271,6 +1406,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Треугольник" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1323,8 +1463,8 @@ msgstr "Соединять линии заполнения" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "Соединять концы линий заполнения где они соприкасаются со внутренней стенкой, используя линии, которые продолжают форму внутренней стенки. Активация этого параметра поможет крепче связывать заполнение со стенками и уменьшить влияние на качество заполнения вертикальных поверхностей. Отключение этого параметра уменьшает объём используемого материала." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1336,6 +1476,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Список направлений линии при печати слоёв. Элементы списка используются последовательно по мере печати слоёв и когда конец списка будет достигнут, он начнётся сначала. Элементы списка отделяются запятыми и сам список заключён в квадратные скобки. По умолчанию, он пустой, что означает использование стандартных углов (45 и 135 градусов для линий из зигзага и 45 градусов для всех остальных шаблонов)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1646,6 +1806,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Укажите диаметр используемой нити." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2836,36 +3016,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Соединяет зигзаги. Это увеличивает прочность такой поддержки." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Разбить поддержки на части" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Пропускать некоторые соединения в поддержках для облегчения их последующего удаления. Этот параметр влияет на зиг-заг шаблон заполнения." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Размер части поддержек" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Пропускать соединение между линиями поддержки каждые N миллиметров для облегчения последующего удаления поддержек." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Количество частей линий поддержки" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Пропускать одну линию на каждые N соединительных линий, облегчая последующее удаление поддержек." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3405,10 +3555,8 @@ msgstr "Дистанция до юбки" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" -"Расстояние по горизонтали между юбкой и первым слоем печатаемого объекта.\n" -"Это минимальное расстояние, следующие линии юбки будут печататься наружу." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3450,26 +3598,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Печатать кайму только на внешней стороне модели. Это сокращает объём каймы, которую вам потребуется удалить в дальнейшем, и не снижает качество прилипания к столу." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "Смещение первого Z слоя" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "Экструдер смещается от стола на указанное значение при печати первого слоя. Значение может быть положительным (выше) или отрицательным (ниже). Некоторые типы материала связываются со столом лучше, когда экструдер чуть приподнят над столом." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Компенсация Z смещения" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Если не ноль, то Z смещение уменьшается до 0 на указанном слое. Значение 0 указывает, что Z смещение остаётся постоянным на всех слоях печати." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3487,8 +3615,8 @@ msgstr "Сглаживание подложки" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Данный параметр управляет тем, сколько внутренних углов в контуре будет сглажено. Внутренние углы сглаживаются полукругами с радиусом равным указанному значению. Данный параметр также убирает отверстия в контуре подложки, которые меньше получающегося круга." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3960,6 +4088,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Обычно Cura пытается закрыть небольшие отверстия в объекте и убрать части слоя с большими отверстиями. Включение этого параметра сохраняет те части, что не могут быть сшиты. Этот параметр должен использоваться как последний вариант, когда уже ничего не помогает получить нормальный GCode." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3990,6 +4128,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Чередует какой из объектов, пересекающихся в объёме, будет участвовать в печати каждого слоя таким образом, что пересекающиеся объекты становятся вплетёнными друг в друга. Выключение этого параметра приведёт к тому, что один из объектов займёт весь объём пересечения, в то время как данный объём будет исключён из других объектов." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4195,6 +4343,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Оптимизирует порядок, в котором печатаются стенки для уменьшения количества откатов и перемещений. Большинство моделей будут распечатываться быстрее, но не все. Сравнивайте печать с оптимизацией и без." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Разбить поддержки на части" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Пропускать некоторые соединения в поддержках для облегчения их последующего удаления. Этот параметр влияет на зиг-заг шаблон заполнения." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Размер части поддержек" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Пропускать соединение между линиями поддержки каждые N миллиметров для облегчения последующего удаления поддержек." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Количество частей линий поддержки" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Пропускать одну линию на каждые N соединительных линий, облегчая последующее удаление поддержек." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4485,6 +4663,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Среднее расстояние между случайными точками, который вносятся в каждый сегмент линии. Следует отметить, что оригинальные точки полигона отбрасываются, таким образом, сильное сглаживание приводит к уменьшению разрешения. Это значение должно быть больше половины толщины шершавой оболочки." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4744,106 +4942,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Зазор между соплом и горизонтально нисходящими линиями. Большее значение уменьшает угол нисхождения, что приводит уменьшению восходящих соединений на следующем слое. Применяется только при каркасной печати." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Разрешить разглаживание" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Проходить по верхней оболочке ещё раз, но без выдавливания материала. Это приводит к плавлению пластика, что создаёт более гладкую поверхность." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Самый высокий слой разглаживания" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Выполняет разглаживание только на самом последнем слое модели. Экономит время, когда нижние слои не требуют сглаживания поверхности." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Шаблон разглаживания" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Шаблон, который будет использоваться для разглаживания верхней оболочки." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Концентрический" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Зигзаг" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Расстояние между линиями разглаживания" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Расстояние между линиями разглаживания." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Поток разглаживания" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Объём материала, относительно от обычной линии, который будет выдавлен в процессе разглаживания. Наличие в сопле наличие материала помогает заполнять щели на верхней оболочке, но слишком большое значение приводит к излишнему выдавливанию материала и ухудшает качество оболочки." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Границы разглаживания" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Расстояние от краёв модели. Разглаживание от края до края может выразится в загибании краёв при печати." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Скорость разглаживания" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Скорость, на которой голова проходит над верхней оболочкой." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Ускорение разглаживания" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "Ускорение, с которым производится разглаживание." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Рывок разглаживания" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Изменение максимальной мгновенной скорости, с которой выполняется разглаживание." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4904,13 +5002,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Матрица преобразования, применяемая к модели при её загрузки из файла." -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Экструдер стенок" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "Печать внутренних стенок" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Этот экструдер используется для печати стенок. Используется при наличии нескольких экструдеров." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Шаблон заполнения при печати. Заполнение линиями или зиг-загом меняет направление на соседних слоях, уменьшая стоимость материала. Сетчатый, треугольный, кубический, восьмигранный и концентрический шаблоны полностью печатаются на каждом слое. Кубическое, четверть кубическое и восьмигранное заполнение меняется на каждом слое для получения более равного распределения по каждому направлению." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "Соединять концы линий заполнения где они соприкасаются со внутренней стенкой, используя линии, которые продолжают форму внутренней стенки. Активация этого параметра поможет крепче связывать заполнение со стенками и уменьшить влияние на качество заполнения вертикальных поверхностей. Отключение этого параметра уменьшает объём используемого материала." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Расстояние по горизонтали между юбкой и первым слоем печатаемого объекта.\n" +#~ "Это минимальное расстояние, следующие линии юбки будут печататься наружу." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "Смещение первого Z слоя" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "Экструдер смещается от стола на указанное значение при печати первого слоя. Значение может быть положительным (выше) или отрицательным (ниже). Некоторые типы материала связываются со столом лучше, когда экструдер чуть приподнят над столом." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Компенсация Z смещения" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Если не ноль, то Z смещение уменьшается до 0 на указанном слое. Значение 0 указывает, что Z смещение остаётся постоянным на всех слоях печати." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Данный параметр управляет тем, сколько внутренних углов в контуре будет сглажено. Внутренние углы сглаживаются полукругами с радиусом равным указанному значению. Данный параметр также убирает отверстия в контуре подложки, которые меньше получающегося круга." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 129c2bbe6b..8c5a8439e2 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" @@ -16,66 +16,6 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "Yazdırma durduruldu" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "Tıkalı" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "Eylem gerekli" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "Baskı başlatılamıyor" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "Bu yazıcı, Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "Şu tarihlerde bitirir: " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "Bu yazıcı, %1 Ultimaker 3 yazıcı grubunun ana makinesidir." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "{printer_name}, '{job_name}' yazdırmayı tamamladı." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "Baskı tamamlandı" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "&Eklentiler" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "Eklentilere göz at..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "Yüklü eklentiler..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -113,19 +53,17 @@ msgstr "Doodle3D Connect’e bağlanıyor" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "İptal et" @@ -152,15 +90,15 @@ msgstr "Doodle3D Connect’e dosya gönderildi" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "Connect’i aç.." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect web arayüzünü aç" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "Değişiklik Günlüğünü Göster" @@ -195,37 +133,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "USB ile bağlı" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "Yazıcı meşgul veya bağlı olmadığı için yeni bir işlem başlatılamıyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "Yazdırma Ayrıntıları" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "Yazıcı, UltiGCode türü kullandığı için USB yazdırmayı desteklemiyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB Yazdırma" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "Yazıcı USB ile yazdırmayı desteklemediği için yeni bir işlem başlatılamıyor." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "Uyarı" @@ -289,11 +228,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "Çıkarılabilir aygıta {0} kaydedilemedi: {1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "Hata" @@ -342,346 +281,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "Çıkarılabilir Sürücü" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Ağ üzerinden yazdır" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Ağ üzerinden yazdır" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "İstenen yazıcıya erişim. Lütfen yazıcı isteğini onaylayın" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "Bağlantı durumu" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "Bağlantı Durumu" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "Yeniden dene" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "Erişim talebini yeniden gönder" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "Kabul edilen yazıcıya erişim" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "Bu yazıcıyla yazdırmaya erişim yok. Yazdırma işi gönderilemedi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "Erişim Talep Et" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "Yazıcıya erişim talebi gönder" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "Ağ üzerinden bağlandı. Lütfen yazıcıya erişim isteğini onaylayın." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "Ağ üzerinden bağlandı." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "Ağ üzerinden bağlandı. Yazıcıyı kontrol etmek için erişim yok." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "Yazıcıya erişim talebi reddedildi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "Erişim talebi zaman aşımı nedeniyle başarısız oldu." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "Ağ bağlantısı kaybedildi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "Yazıcı bağlantısı kaybedildi. Yazıcınızın bağlı olup olmadığını kontrol edin." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "Yazıcı meşgul, yeni bir yazdırma başlatılamıyor. Geçerli yazıcı durumu: %s." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "Yazıcı Durumu" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "Yeni yazdırma işi başlatılamıyor. {0} yuvasına PrintCore yüklenmedi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "Yeni bir yazdırma başlatılamıyor. {0} yuvasına Malzeme yüklenmedi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "Biriktirme {0} için yeterli malzeme yok." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Ekstruder {2} için farklı bir PrintCore (Cura: {0}, Yazıcı: {1}) seçildi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "Farklı malzeme (Cura: {0}, Yazıcı: {1}), ekstrüder {2} için seçildi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore {0} düzgün bir şekilde ayarlanmadı. XY ayarının yazıcıda yapılması gerekiyor." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "Seçilen yapılandırma ile yazdırmak istediğinizden emin misiniz?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Yazıcı yapılandırması veya kalibrasyonu ile Cura arasında eşleşme sorunu var. En iyi sonucu almak istiyorsanız her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "Uyumsuz yapılandırma" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "Yeni işlerin gönderilmesi (geçici olarak) engellenmiştir, hala bir önceki yazdırma işi gönderiliyor." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "Veriler yazıcıya gönderiliyor" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "Veri gönderiliyor" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "Veriler yazıcıya gönderilemedi. Hala etkin olan başka bir iş var mı?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "Yazdırma durduruluyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "Yazdırma durduruldu. Lütfen yazıcıyı kontrol edin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "Yazdırma duraklatılıyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "Yazdırma devam ediyor..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "Yazıcınız ile eşitleyin" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Cura’da geçerli yazıcı yapılandırmanızı kullanmak istiyor musunuz?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "Yazıcınızda bulunan PrintCore’lar ve/veya malzemeler geçerli projenizde bulunandan farklı. En iyi sonucu almak istiyorsanız, her zaman PrintCore ve yazıcıya eklenen malzemeler için dilimleme yapın." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "Ağ ile Bağlan" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "Bu yazıcı, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "Bu yazıcı, bağlı {count} Ultimaker 3 yazıcı grubunun ana makinesidir." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name}, '{job_name}' yazdırmayı tamamladı. Lütfen çıktıyı alın ve yapı levhasının temizlenmesini onaylayın." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name}, '{job_name}' yazdırmak için ayrılmıştır. Yazıcının yazdırmayı başlatması için lütfen yazıcı yapılandırmasını işe uygun olacak şekilde değiştirin." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "Yeni işlerin gönderilmesi (geçici olarak) engellenmiştir, hala bir önceki yazdırma işi gönderiliyor." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "Yeni yazdırma işi gönderilemiyor: bu 3D yazıcı, bağlı Ultimaker 3 yazıcı grubunu barındırmak için (henüz) ayarlı değildir." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "{file_name}, {cluster_name} grubuna gönderiliyor" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name}, {cluster_name} grubuna gönderildi." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "Yazdırma işlerini göster" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "Yazdırma işleri arayüzünü tarayıcınızda açar." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "Yazdırma işi, {cluster_name} grubuna gönderilemiyor." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name}, {cluster_name} grubuna gönderildi." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Yazdırma işlerini göster" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Yazdırma işleri arayüzünü tarayıcınızda açar." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Bilinmiyor" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "{printer_name}, '{job_name}' yazdırmayı tamamladı." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Baskı tamamlandı" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Eylem gerekli" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "{file_name}, {cluster_name} grubuna gönderiliyor" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Ağ ile Bağlan" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "Makinenizin {machine_name} en son özellikler ile donanımlı olmasını sağlamak için bellenimi düzenli olarak güncellenmeniz önerilir. Bu, (ağa bağlı olduğunuzda) {machine_name} üzerinde veya USB ile gerçekleştirilebilir." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "Yeni %s bellenimi mevcut" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "İndir" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "Güncelleme bilgilerine erişilemedi." @@ -711,7 +636,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "%s başlatılırken hata oluştu!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "Tel Yazma etkinleştirildiğinde, Cura katmanları doğru olarak görüntülemez." + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "GCode Değiştir" @@ -741,21 +681,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-code dosyası" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Katman görünümü" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "Tel Yazma etkinleştirildiğinde, Cura katmanları doğru olarak görüntülemez." - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "Katman Görünümü" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -788,8 +713,9 @@ msgstr "Mevcut malzeme, seçilen makine veya yapılandırma ile uyumlu olmadığ #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "Dilimlenemedi" @@ -800,23 +726,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "Geçerli ayarlarla dilimlenemiyor. Şu ayarlarda hata var: {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "İlk direk veya ilk konum(lar) geçersiz olduğu için dilimlenemiyor." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "Modeller yapı hacmine sığmadığı için dilimlenecek bir şey yok. Lütfen sığdırmak için modelleri ölçeklendirin veya döndürün." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "Katmanlar İşleniyor" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "Bilgi" @@ -831,14 +763,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "Model Başına Ayarları Yapılandır" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "Önerilen Ayarlar" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "Özel" @@ -849,29 +803,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF Dosyası" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "Nozül" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "Eklentilere göz at" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "Eklenti kimliği, {0} dosyasından alınamadı" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "Uyarı" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "Eklenti tarayıcısı" @@ -886,18 +835,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G Dosyası" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G-code ayrıştırma" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code Ayrıntıları" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "Dosya göndermeden önce g-code’un yazıcınız ve yazıcı yapılandırmanız için uygun olduğundan emin olun. G-code temsili doğru olmayabilir." @@ -939,73 +888,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "Yapı levhasını dengele" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "Dış Duvar" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "İç Duvarlar" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "Yüzey Alanı" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "Dolgu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "Destek Dolgusu" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "Destek Arayüzü" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "Destek" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Etek" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "Hareket" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "Geri Çekmeler" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "Diğer" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "Önceden dilimlenmiş dosya {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "Hiçbir malzeme yüklenmedi" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "Bilinmeyen malzeme" @@ -1032,13 +986,13 @@ msgid "Can't Find Location" msgstr "Konum Bulunamıyor" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "Dosya Zaten Mevcut" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1054,12 +1008,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "Özel Malzeme" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "Seçilen malzeme, seçilen makine veya yapılandırma ile uyumlu değil." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1080,62 +1044,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "Malzeme çapını değiştirme işlemini geri al." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "Profilin {0} dosyasına aktarımı başarısız oldu: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "Profilin {0} dosyasına aktarımı başarısız oldu: Yazıcı eklentisinde rapor edilen hata." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "Profil {0} dosyasına aktarıldı" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "Dışa Aktarım Ayrıntıları" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "{0} dosyasından profil içe aktarımı başarısız oldu: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "Profil başarıyla içe aktarıldı {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "Profil {0} öğesinde bilinmeyen bir dosya türü var veya profil bozuk." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "Özel profil" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "Profilde eksik bir kalite tipi var." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1162,238 +1126,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "Nesne Yerleştiriliyor" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "Çökme Raporu" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    Kurtulunamayan ciddi bir olağanüstü durum oluştu!

    \n

    Yazılım hatası raporunu http://github.com/Ultimaker/Cura/issues adresine gönderirken aşağıdaki bilgileri kullanınız

    \n " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "Web Sayfasını Aç" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "Makineler yükleniyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "Görünüm ayarlanıyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "Arayüz yükleniyor..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Aynı anda yalnızca bir G-code dosyası yüklenebilir. {0} içe aktarma atlandı" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-code yüklenirken başka bir dosya açılamaz. {0} içe aktarma atlandı" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "Makine Ayarları" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "Yazıcı" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "Yazıcı Ayarları" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (Genişlik)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (Derinlik)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (Yükseklik)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "Yapı levhası şekli" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "Merkez nokta" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "Isıtılmış yatak" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Gcode türü" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "Yazıcı Başlığı Ayarları" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Yazıcı başlığının solundan nozülün ortasına kadar olan mesafe. “Birer birer” çıktı alırken önceki çıktılar ile yazıcı başlığının çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y min" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Yazıcı başlığının ön kısmından nozülün ortasına kadar olan mesafe. “Birer birer” çıktı alırken önceki çıktılar ile yazıcı başlığının çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X maks" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Yazıcı başlığının sağından nozülün ortasına kadar olan mesafe. “Birer birer” çıktı alırken önceki çıktılar ile yazıcı başlığının çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y maks" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "Yazıcı başlığının arkasından nozülün ortasına kadar olan mesafe. “Birer birer” çıktı alırken önceki çıktılar ile yazıcı başlığının çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "Portal yüksekliği" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "Nozül ucu ve portal sistemi (X ve Y aksları) arasındaki yükseklik farkı. “Birer birer” çıktı alırken önceki çıktılar ile portalın çakışmasını önlemek için kullanılır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "Ekstrüder Sayısı" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "Yazıcı tarafından desteklenen nominal filaman çapı. Tam çap malzeme ve/veya profil tarafından etkisiz kılınacaktır." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "Malzeme çapı" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "Nozzle boyutu" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Gcode’u başlat" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "Başlangıçta yürütülecek Gcode komutları." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Gcode’u sonlandır" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Bitişte yürütülecek Gcode komutları." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "Nozül Ayarları" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "Nozül X ofseti" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "Nozül Y ofseti" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "Ekstrüder Gcode’u başlat" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "Ekstrüder Gcode’u sonlandır" @@ -1406,12 +1448,11 @@ msgstr "Değişiklik Günlüğü" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1463,35 +1504,33 @@ msgid "Unknown error code: %1" msgstr "Bilinmeyen hata kodu: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "Ağ Yazıcısına Bağlan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" +msgstr "" +"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" +"\n" +"Aşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "Ekle" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "Düzenle" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1500,220 +1539,221 @@ msgid "Remove" msgstr "Kaldır" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "Yenile" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "Yazıcınız listede yoksa ağ yazdırma sorun giderme kılavuzunu okuyun" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "Tür" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Genişletilmiş Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "Bilinmiyor" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "Üretici yazılımı sürümü" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "Adres" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Bu yazıcı, Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Bu yazıcı, %1 Ultimaker 3 yazıcı grubunun ana makinesidir." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "Bu adresteki yazıcı henüz yanıt vermedi." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "Bağlan" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "Yazıcı Adresi" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "IP adresini veya yazıcınızın ağ üzerindeki ana bilgisayar adını girin." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" -msgstr "Tamam" +msgid "OK" +msgstr "TAMAM" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Ağ üzerinden yazdır" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Yazdır" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Yazdırma işlerini görüntüle" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "Yazdırmaya hazırlanıyor" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "Yazdırma" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Mevcut" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Yazıcı bağlantısı koptu" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Rezerve edildi" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Tamamlandı" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Yazdırma durduruldu" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Yazdırma işleri kabul edilmiyor" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Şu tarihlerde bitirir: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Yapı levhasını temizle" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "Yapılandırma değişikliğini bekliyor" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Yazdırma görevleri" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "Yazdırma" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Kuyrukta" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Yazıcılar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Yazıcıları görüntüle" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "Yazıcıya Bağlan" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Yazıcı yapılandırmasını Cura’ya yükle" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "Yapılandırmayı Etkinleştir" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "Bu yazıcı, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "Bu yazıcı, %1 bağlı Ultimaker 3 yazıcı grubunun ana makinesidir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "Ağ üzerinden yazdır" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "Yazdır" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "Yazdırma" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "Rezerve edildi" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "Tamamlandı" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "Hazırlanıyor" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "Mevcut" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "Tamamlandığı tarih: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "Yapı levhasını temizle" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "Yazdırmaya hazırlanıyor" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "Yazdırma işleri kabul edilmiyor" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "Yazdırma işlerini varsayılan web tarayıcınızda açar." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "Yazdırma işlerini görüntüle" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "YAZICI GRUBU" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "Yazdırma görevleri" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "Yazdırma" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "Kuyrukta" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "Yapılandırma değişikliğini bekliyor" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "Yazıcılar" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "Yazıcıları görüntüle" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1739,13 +1779,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "Her zaman Düşük kalite modunu kullan" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "TAMAM" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1772,11 +1805,91 @@ msgid "Fine" msgstr "İnce" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "Seçimimi hatırla" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Renk şeması" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Malzeme Rengi" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Çizgi Tipi" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Uyumluluk Modu" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Geçişleri Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Yardımcıları Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Kabuğu Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Dolguyu Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Yalnızca Üst Katmanları Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "En Üstteki 5 Ayrıntılı Katmanı Göster" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Üst / Alt" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "İç Duvar" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1787,81 +1900,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "Son İşleme Dosyaları" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "Dosya ekle" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "Ayarlar" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "Etkin son işleme dosyalarını değiştir" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "Renk şeması" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "Malzeme Rengi" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "Çizgi Tipi" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "Uyumluluk Modu" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "Geçişleri Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "Yardımcıları Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "Kabuğu Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "Dolguyu Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "Yalnızca Üst Katmanları Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "En Üstteki 5 Ayrıntılı Katmanı Göster" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "Üst / Alt" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "İç Duvar" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1953,129 +2006,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "Tümünü göster" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "Proje Aç" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "Var olanları güncelleştir" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "Yeni oluştur" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "Özet - Cura Projesi" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "Yazıcı ayarları" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "Makinedeki çakışma nasıl çözülmelidir?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "Tür" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "İsim" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "Profil ayarları" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "Profildeki çakışma nasıl çözülmelidir?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "Profilde değil" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 geçersiz kılma" msgstr[1] "%1 geçersiz kılmalar" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "Kaynağı" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 geçersiz kılma" msgstr[1] "%1, %2 geçersiz kılmalar" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "Malzeme ayarları" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "Malzemedeki çakışma nasıl çözülmelidir?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "Görünürlük ayarı" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "Mod" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "Görünür ayarlar:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 / %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "Bir projenin yüklenmesi, yapı levhasındaki tüm modelleri silecektir" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "Aç" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "Yüklü" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "İndir" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "Eklenti Lisans Anlaşması" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " eklenti lisans içerir.\nBu eklentiyi kurmak için bu lisans kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "Reddet" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "Yazıcı komutları kabul etmiyor" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "Bakımda. Lütfen yazıcıyı kontrol edin" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "Yazıcı bağlantısı koptu" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "Yazdırılıyor..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "Duraklatıldı" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "Hazırlanıyor..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "" +"Bazı profil ayarlarını özelleştirdiniz.\n" +"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "Birim" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "Genel" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "(Anonim) yazdırma bilgisi gönder" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "Yazıcılar" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "Yeniden adlandır" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "Yazıcı türü:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "Bağlantı:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "Yazıcı bağlı değil." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "Durum:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "Yapı levhasının temizlenmesi bekleniyor" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "Yazdırma işlemi bekleniyor" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "Profiller" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "Profili Dışa Aktar" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "Malzemeler" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "Malzeme %1 dosyasına başarıyla dışa aktarıldı" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "Yazıcı Ekle" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Cura hakkında" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "" +"Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" +"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "Poligon kırpma kitaplığı" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "Yazı tipi" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG simgeleri" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "Profil:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." +msgstr "" +"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" +"\n" +"Profil yöneticisini açmak için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "Ara..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "Değeri tüm ekstruderlere kopyala" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "Bu ayarı gizle" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "Bu ayarı gösterme" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "Bu ayarı görünür yap" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "Görünürlük ayarını yapılandır..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." +msgstr "" +"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" +"\n" +"Bu ayarları görmek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." +msgstr "" +"Bu ayarın değeri profilden farklıdır.\n" +"\n" +"Profil değerini yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." +msgstr "" +"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" +"\n" +"Hesaplanan değeri yenilemek için tıklayın." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "Yazıcı Ayarları" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "" +"Yazdırma Ayarı devre dışı\n" +"G-code dosyaları üzerinde değişiklik yapılamaz" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00sa 00dk" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "Süre bilgisi" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "Yazdırma süresi" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "Önerilen Yazıcı Ayarları

    Seçilen yazıcı, malzeme ve kalite için önerilen ayarları kullanarak yazdırın." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "Özel Yazıcı Ayarları

    Dilimleme işleminin her bir bölümünü detaylıca kontrol ederek yazdırın." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "Otomatik: %1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "&Görünüm" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "Otomatik: %1" @@ -3279,13 +3387,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "En Son Öğeyi Aç" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "Yazıcı bağlı değil" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "Ekstrüder" @@ -3300,309 +3408,349 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "Bu ekstruderin geçerli sıcaklığı." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "Bu ekstruderdeki malzemenin rengi." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "Bu ekstruderdeki malzeme." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "Bu ekstrudere takılan nozül." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "Yapı levhası" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "Isıtılmış yatağın hedef sıcaklığı. Yatak, bu sıcaklığa doğru ısıtılır veya soğutulur. Bu ayar 0 olarak belirlenirse yatak ısıtma kapatılır." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "Isıtılmış yatağın geçerli sıcaklığı." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "Yatağın ön ısıtma sıcaklığı." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "İptal Et" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "Ön ısıtma" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "Yazdırma öncesinde yatağı ısıt. Isıtma sırasında yazdırma işinizi ayarlamaya devam edebilirsiniz. Böylece yazdırmaya hazır olduğunuzda yatağın ısınmasını beklemeniz gerekmez." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "Geçerli yazdırma" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "İşin Adı" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "Yazdırma süresi" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "Kalan tahmini süre" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Tam Ekrana Geç" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Geri Al" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Yinele" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Çıkış" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura’yı yapılandır..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Yazıcı Ekle..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Yazıcıları Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Malzemeleri Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profili geçerli ayarlar/geçersiz kılmalar ile güncelle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Geçerli değişiklikleri iptal et" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Geçerli ayarlardan/geçersiz kılmalardan profil oluştur..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profilleri Yönet..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Çevrimiçi Belgeleri Göster" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Hata Bildir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "&Hakkında..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "&Seçili Modeli Sil" msgstr[1] "&Seçili Modelleri Sil" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "Seçili Modeli Ortala" msgstr[1] "Seçili Modelleri Ortala" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Seçili Modeli Çoğalt" msgstr[1] "Seçili Modelleri Çoğalt" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modeli Sil" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modeli Platformda Ortala" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelleri Gruplandır" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Model Grubunu Çöz" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Modelleri Birleştir" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Modeli Çoğalt..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "&Tüm modelleri Seç" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "&Yapı Levhasını Temizle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "Tüm Modelleri Yeniden Yükle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Tüm Modelleri Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Seçimi Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Tüm Model Konumlarını Sıfırla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "Tüm Model ve Dönüşümleri Sıfırla" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Dosya Aç..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Yeni Proje..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "Motor Günlüğünü Göster..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Yapılandırma Klasörünü Göster" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Görünürlük ayarını yapılandır..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Eklentilere göz at..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Yüklü eklentiler..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "Lütfen bir 3D model yükleyin" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "Dilimlemeye hazır" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "Dilimleniyor..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 Hazır" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "Dilimlenemedi" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "Dilimleme kullanılamıyor" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "Hazırla" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "İptal Et" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "Etkin çıkış aygıtını seçin" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "Dosya aç" @@ -3619,112 +3767,117 @@ msgstr "Tümünü model olarak içe aktar" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "&Dosya" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "&Seçimi Dosyaya Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "&Farklı Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "Projeyi kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "&Düzenle" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "&Görünüm" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "&Ayarlar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "&Yazıcı" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "&Malzeme" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "&Profil" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "Etkin Ekstruder olarak ayarla" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "Uzantılar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "&Eklentiler" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "Tercihler" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "&Yardım" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "Dosya Aç" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "Ayarlar" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "Yeni proje" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "Yeni bir proje başlatmak istediğinizden emin misiniz? Bu işlem yapı levhasını ve kaydedilmemiş tüm ayarları silecektir." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "Eklenti Kur" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "Dosya Aç" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "Seçtiğiniz dosyalar arasında bir veya daha fazla G-code dosyası bulduk. Tek seferde sadece bir G-code dosyası açabilirsiniz. Bir G-code dosyası açmak istiyorsanız, sadece birini seçiniz." @@ -3734,102 +3887,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "Projeyi Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "Ekstruder %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & malzeme" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "Kaydederken proje özetini bir daha gösterme" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "Kaydet" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "Hazırla" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "İzle" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "Katman Yüksekliği" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "Yazdırma Hızı" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "Daha yavaş" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "Daha Hızlı" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "Dolgu" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "Kademeli dolgu, yukarıya doğru dolgu miktarını kademeli olarak yükselecektir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "Kademeli özelliği etkinleştir" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "Oluşturma Desteği" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "Modellerin askıda kalan kısımlarını destekleyen yapılar oluşturun. Bu yapılar olmadan, yazdırma sırasında söz konusu kısımlar düşebilir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "Destek Ekstrüderi" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "Destek için kullanacağınız ekstruderi seçin. Bu, modelin havadayken düşmesini veya yazdırılmasını önlemek için modelin altındaki destekleyici yapıları güçlendirir." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "Yapı Levhası Yapıştırması" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "Bir kenar veya radye yazdırın. Bu nesnenizin etrafına veya altına daha sonra kesilmesi kolay olan düz bir alan sağlayacak." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "Yazıcı çıktılarınızı iyileştirmek için yardıma mı ihtiyacınız var?
    Ultimaker Sorun Giderme Kılavuzlarını okuyun" @@ -3846,17 +4009,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "Proje dosyası aç" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "Bu bir Cura proje dosyasıdır. Bir proje olarak açmak mı yoksa içindeki modelleri içe aktarmak mı istiyorsunuz?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "Proje olarak aç" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "Modelleri içe aktar" @@ -3866,17 +4029,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "Motor Günlüğü" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "Malzeme" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "Malzeme uyumunu denetle" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Malzemenin uyumluluğunu Ultimaker.com üzerinden kontrol etmek için tıklayın." @@ -3991,11 +4154,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 Ağ Bağlantısı" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 Ağ Bağlantısı (Küme)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4016,6 +4174,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks Entegrasyonu" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4076,16 +4244,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "GCode Profil Okuyucu" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "Katman görünümü sağlar." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "Katman Görünümü" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4106,6 +4264,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "2.7’den 3.0’a Sürüm Yükseltme" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4166,6 +4334,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "Model Başına Ayarlar Aracı" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4226,6 +4404,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF Yazıcı" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4246,6 +4434,138 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura Profil Okuyucu" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "Tıkalı" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "Baskı başlatılamıyor" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "Connect’i aç.." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "Yazdırma Ayrıntıları" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "Makinenizin {machine_name} en son özellikler ile donanımlı olmasını sağlamak için bellenimi düzenli olarak güncellenmeniz önerilir. Bu, (ağa bağlı olduğunuzda) {machine_name} üzerinde veya USB ile gerçekleştirilebilir." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Katman görünümü" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Katman Görünümü" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "Eklentilere göz at" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "Dışa Aktarım Ayrıntıları" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    Kurtulunamayan ciddi bir olağanüstü durum oluştu!

    \n" +#~ "

    Yazılım hatası raporunu http://github.com/Ultimaker/Cura/issues adresine gönderirken aşağıdaki bilgileri kullanınız

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "Web Sayfasını Aç" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "Tamam" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "Bu yazıcı, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı değildir" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "Bu yazıcı, %1 bağlı Ultimaker 3 yazıcı grubunun ana makinesidir" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "Hazırlanıyor" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "Tamamlandığı tarih: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "Yazdırma işlerini varsayılan web tarayıcınızda açar." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "YAZICI GRUBU" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "Bir projenin yüklenmesi, yapı levhasındaki tüm modelleri silecektir" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " eklenti lisans içerir.\n" +#~ "Bu eklentiyi kurmak için bu lisans kabul etmeniz gerekir.\n" +#~ "Aşağıdaki koşulları kabul ediyor musunuz?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00sa 00dk" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "Süre bilgisi" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "Yazdırma süresi" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "Malzeme uyumunu denetle" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 Ağ Bağlantısı (Küme)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "Katman görünümü sağlar." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Katman Görünümü" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "X-Ray" diff --git a/resources/i18n/tr_TR/fdmextruder.def.json.po b/resources/i18n/tr_TR/fdmextruder.def.json.po index c1ffae36d3..2a90c14cfe 100644 --- a/resources/i18n/tr_TR/fdmextruder.def.json.po +++ b/resources/i18n/tr_TR/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-11 14:30+0200\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index b67557a126..072041b428 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" @@ -56,7 +56,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "​\n ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr "" +"​\n" +" ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -68,7 +70,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "​\n ile ayrılan, bitişte yürütülecek Gcode komutları." +msgstr "" +"​\n" +" ile ayrılan, bitişte yürütülecek Gcode komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -605,6 +609,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "İlk katmanın milimetre cinsinden yüksekliği. Kalın ilk katmanlar yapı levhasına yapışmayı kolaylaştırır." +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -755,6 +784,16 @@ msgctxt "shell description" msgid "Shell" msgstr "Kovan" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Duvar Ekstruderi" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "Duvarları yazdırmak için kullanılan ekstruder dişli çarkı. Çoklu ekstrüzyon işlemi için kullanılır." + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -767,8 +806,8 @@ msgstr "Dış Duvarı yazdırmak için kullanılan ekstruder dişli çarkı. Ço #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "İç Duvar Ekstruderi" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1200,6 +1239,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "Üst/alt şeklin en dıştaki parçasını eş merkezli hatlar ile değiştirir. Bir veya iki hat kullanmak, dolgu malzemesinde başlayan tavanları geliştirir." +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Ütülemeyi Etkinleştir" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "Malzeme ekstrude edilmeden önce üst yüzey üzerinden bir kere daha geçilir. Bu işlem en üstte bulunan plastiği eriterek daha pürüzsüz bir yüzey elde etmek için kullanılır." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Sadece En Yüksek Katmanı Ütüle" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "Ütüleme işlemini bileşimin sadece en son katmanı üzerinde gerçekleştirin. Bu, alt katmanlarda pürüzsüz bir yüzey tesviyesine gerek olmadığı durumlarda zaman kazandırır." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Ütüleme Modeli" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "Üst yüzeyleri ütülemek için kullanılacak model." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Eş merkezli" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Zikzak" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Ütüleme Hattı Boşluğu" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "Ütüleme hatları arasında bulunan mesafe." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Ütüleme Akışı" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "Ütüleme sırasında normal yüzey hattına göre ekstrude edilecek malzeme miktarı. Nozülü dolu tutmak üst yüzeyde oluşan çatlakların bir kısmının doldurulmasını sağlar fakat nozülün fazla dolu olması aşırı ekstrüzyona ve yüzey yanlarında noktalar oluşmasına neden olur." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Ütüleme İlave Mesafesi" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "Modelin kenarlarından bırakılması gereken mesafe. Ağın kenarlarına kadar ütülemek baskınızın kenarlarının pürüzlü olmasına neden olabilir." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Ütüleme Hızı" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "Üst yüzeyi geçmek için gereken süre." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Ütüleme İvmesi" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "Ütülemenin gerçekleştiği ivme." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Ütüleme İvmesi Değişimi" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "Ütüleme sırasında oluşan maksimum anlık hız değişimi." + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1247,8 +1386,8 @@ msgstr "Dolgu Şekli" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "Yazdırma dolgu malzemesinin şeklidir. Hat ve zikzak dolgu, farklı katmanlar üzerinde yön değiştirerek malzeme maliyetini azaltır. Izgara, üçgen, kübik, sekizlik, çeyrek kübik ve eş merkezli şekiller, her katmanda tam olarak yazdırılır. Kübik, çeyrek kübik ve sekizlik dolgu, her yönde daha eşit bir kuvvet dağılımı sağlamak için her katmanda değişir." +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1265,6 +1404,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "Üçgenler" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1317,8 +1461,8 @@ msgstr "Dolgu Hatlarını Bağlayın" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "İç duvarın şeklini takip eden bir hattı kullanarak, dolgu şeklinin iç duvarla buluştuğu noktada uçları bağlayın. Bu ayarın etkinleştirilmesi, dolgunun duvarlara daha iyi yapışmasını sağlayabilir ve dolgunun dikey yüzeylerin kalitesi üzerindeki etkilerini azaltır. Bu ayarın devre dışı bırakılması, kullanılan malzemenin miktarını azaltır." +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1330,6 +1474,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "Kullanılacak tam sayı hat yönü listesi. Listedeki öğeler, katmanlar ilerledikçe sıralı olarak kullanılır. Listenin sonuna ulaşıldığında baştan başlanır. Liste öğeleri virgülle ayrılır ve tüm liste köşeli parantez içine alınır. Varsayılan ayar boş listedir ve geleneksel varsayılan açılar kullanılır (çizgiler ve zikzak şekiller için 45 ve 135 derece; diğer tüm şekiller için 45 derece)." +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1640,6 +1804,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "Kullanılan filamanın çapını ayarlar. Bu değeri kullanılan filaman çapı ile eşitleyin." +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2830,36 +3014,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "Zikzakları Bağla Zik zak destek yapısının sağlamlığını artırır." -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Parçalarda Döküm Desteği" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "Destek yapısının daha kolay kırılması için bazı destek hattı bağlantılarını atlayın. Bu ayar, Zikzak destek dolgusu şekli için geçerlidir." - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "Destek Parçasının Boyutu" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "Destek yapısının daha kolay kırılması için her N milimetresinde bir destek hatları arasında bağlantı atlayın." - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Destek Parçası Hattı Sayısı" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "Destek yapısının daha kolay kırılması için her N bağlantı hattında bir zikzak atlayın." - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3399,8 +3553,8 @@ msgstr "Etek Mesafesi" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "Etek ve baskının ilk katmanı arasındaki yatay mesafe.\nBu minimum mesafedir ve çoklu etek hatları bu mesafeden dışa doğru genişleyecektir." +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3442,26 +3596,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "Sadece modelin dış kısmındaki kenarı yazdırır. Yatak yapışmasını büyük oranda azaltmasa da daha sonra kaldırmanız gereken kenar sayısını azaltır." -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "İlk Katman Z Ofseti" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "Ekstrüder, birinci katmanın normal yüksekliğinden bu miktarda mesafe bırakılır. Negatif (yükseltilmiş) veya pozitif (alçaltılmış) olabilir. Ekstrüderin hafifçe yükseltilmesi durumunda, bazı filaman türleri yapı levhasına daha iyi yapışır." - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z Ofseti Konik Katmanları" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "Sıfır olmadığında, Z ofseti birçok katman üzerinde 0’a düşürülür. 0 değeri, Z ofsetinin yazdırmada yer alan tüm katmanlarda sabit kalması anlamına gelir." - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3479,8 +3613,8 @@ msgstr "Radye Düzeltme" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Bu ayar, radye ana hattında yer alan iç köşelerin ne kadar yuvarlandığını kontrol eder. İç köşeler, burada belirtilen değere eşit yarıçapa sahip yarım daire şeklinde yuvarlanır. Ayrıca bu ayar, söz konusu daireden daha küçük olan radye ana hattındaki delikleri ortadan kaldırır." +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3952,6 +4086,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "Normal koşullarda, Cura ağdaki küçük boşlukları diker ve büyük boşluklu katman parçalarını ortadan kaldırır. Bu seçeneği etkinleştirmek, dikilemeyen parçaları muhafaza eder. Bu seçenek, hiçbir işlemin uygun bir GCode oluşturamaması durumunda başvurulacak son seçenek olarak kullanılmalıdır." +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3982,6 +4126,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "Çakışan bileşimlerin birbirine karışması için her bir katmanda bileşim kesişimi hacimlerine göre değişiklik yapın. Bu ayarın kapatılması, bir bileşimin diğer bileşimlerden ayrılarak çakışmadaki tüm hacmi almasına neden olur." +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4187,6 +4341,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "Geri çekmelerin sayısını ve kat edilen mesafeyi azaltmak için duvarların yazdırıldığı sırayı optimize edin. Çoğu parça, bunun etkinleştirilmesinden yararlanır, ancak bazılarının yararlanması için gerçekte daha uzun bir süre gerekebilir. Bu yüzden, yazdırma süresi tahminlerini optimizasyonlu ve optimizasyonsuz olarak karşılaştırın." +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Parçalarda Döküm Desteği" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Destek yapısının daha kolay kırılması için bazı destek hattı bağlantılarını atlayın. Bu ayar, Zikzak destek dolgusu şekli için geçerlidir." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Destek Parçasının Boyutu" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "Destek yapısının daha kolay kırılması için her N milimetresinde bir destek hatları arasında bağlantı atlayın." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Destek Parçası Hattı Sayısı" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "Destek yapısının daha kolay kırılması için her N bağlantı hattında bir zikzak atlayın." + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4477,6 +4661,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "Her bir hat dilimine tanıtılan rastgele noktalar arasındaki ortalama mesafe. Poligonların asıl noktalarının çıkarıldığını dikkate alın; bunun sonucunda yüksek pürüzsüzlük sonuçları çözünürlük azalmasıyla sonuçlanabilir. Bu değer, Belirsiz Dış Katman Kalınlığından yüksek olmalıdır." +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4627,7 +4831,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "" +"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" +"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4734,106 +4940,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "Nozül ve aşağı yöndeki hatlar arasındaki mesafe. Daha büyük açıklık, dik açısı daha küçük çapraz şekilde aşağı yöndeki hatların oluşmasına neden olur, dolayısıyla bu durum bir sonraki katman ile yukarı yönde daha az bağlantıya yol açar. Sadece kablo yazdırmaya uygulanır." -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "Ütülemeyi Etkinleştir" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "Malzeme ekstrude edilmeden önce üst yüzey üzerinden bir kere daha geçilir. Bu işlem en üstte bulunan plastiği eriterek daha pürüzsüz bir yüzey elde etmek için kullanılır." - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "Sadece En Yüksek Katmanı Ütüle" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "Ütüleme işlemini bileşimin sadece en son katmanı üzerinde gerçekleştirin. Bu, alt katmanlarda pürüzsüz bir yüzey tesviyesine gerek olmadığı durumlarda zaman kazandırır." - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "Ütüleme Modeli" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "Üst yüzeyleri ütülemek için kullanılacak model." - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "Eş merkezli" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "Zikzak" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "Ütüleme Hattı Boşluğu" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "Ütüleme hatları arasında bulunan mesafe." - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "Ütüleme Akışı" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "Ütüleme sırasında normal yüzey hattına göre ekstrude edilecek malzeme miktarı. Nozülü dolu tutmak üst yüzeyde oluşan çatlakların bir kısmının doldurulmasını sağlar fakat nozülün fazla dolu olması aşırı ekstrüzyona ve yüzey yanlarında noktalar oluşmasına neden olur." - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "Ütüleme İlave Mesafesi" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "Modelin kenarlarından bırakılması gereken mesafe. Ağın kenarlarına kadar ütülemek baskınızın kenarlarının pürüzlü olmasına neden olabilir." - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "Ütüleme Hızı" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "Üst yüzeyi geçmek için gereken süre." - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "Ütüleme İvmesi" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "Ütülemenin gerçekleştiği ivme." - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "Ütüleme İvmesi Değişimi" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "Ütüleme sırasında oluşan maksimum anlık hız değişimi." - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4894,13 +5000,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "Modeli dosyadan indirirken modele uygulanacak olan dönüşüm matrisi" -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "Duvar Ekstruderi" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "İç Duvar Ekstruderi" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "Duvarları yazdırmak için kullanılan ekstruder dişli çarkı. Çoklu ekstrüzyon işlemi için kullanılır." +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "Yazdırma dolgu malzemesinin şeklidir. Hat ve zikzak dolgu, farklı katmanlar üzerinde yön değiştirerek malzeme maliyetini azaltır. Izgara, üçgen, kübik, sekizlik, çeyrek kübik ve eş merkezli şekiller, her katmanda tam olarak yazdırılır. Kübik, çeyrek kübik ve sekizlik dolgu, her yönde daha eşit bir kuvvet dağılımı sağlamak için her katmanda değişir." + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "İç duvarın şeklini takip eden bir hattı kullanarak, dolgu şeklinin iç duvarla buluştuğu noktada uçları bağlayın. Bu ayarın etkinleştirilmesi, dolgunun duvarlara daha iyi yapışmasını sağlayabilir ve dolgunun dikey yüzeylerin kalitesi üzerindeki etkilerini azaltır. Bu ayarın devre dışı bırakılması, kullanılan malzemenin miktarını azaltır." + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "Etek ve baskının ilk katmanı arasındaki yatay mesafe.\n" +#~ "Bu minimum mesafedir ve çoklu etek hatları bu mesafeden dışa doğru genişleyecektir." + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "İlk Katman Z Ofseti" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "Ekstrüder, birinci katmanın normal yüksekliğinden bu miktarda mesafe bırakılır. Negatif (yükseltilmiş) veya pozitif (alçaltılmış) olabilir. Ekstrüderin hafifçe yükseltilmesi durumunda, bazı filaman türleri yapı levhasına daha iyi yapışır." + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z Ofseti Konik Katmanları" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "Sıfır olmadığında, Z ofseti birçok katman üzerinde 0’a düşürülür. 0 değeri, Z ofsetinin yazdırmada yer alan tüm katmanlarda sabit kalması anlamına gelir." + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "Bu ayar, radye ana hattında yer alan iç köşelerin ne kadar yuvarlandığını kontrol eder. İç köşeler, burada belirtilen değere eşit yarıçapa sahip yarım daire şeklinde yuvarlanır. Ayrıca bu ayar, söz konusu daireden daha küçük olan radye ana hattındaki delikleri ortadan kaldırır." #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -5116,4 +5254,4 @@ msgstr "Modeli dosyadan indirirken modele uygulanacak olan dönüşüm matrisi" #~ msgctxt "multiple_mesh_overlap label" #~ msgid "Dual Extrusion Overlap" -#~ msgstr "İkili Ekstrüzyon Çakışması" \ No newline at end of file +#~ msgstr "İkili Ekstrüzyon Çakışması" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 092ce5120b..8857f5b7b0 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" @@ -18,66 +18,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.7.3\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "打印已中止" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "冻结操作" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "需要采取行动" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "不能开始打印" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "这台打印机未设置为运行一组连接的 Ultimaker 3 打印机。" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "完成时间:" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "这台打印机是一组共 %1 台已连接 Ultimaker 3 打印机的主机。" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "打印机 '{printer_name}' 完成了打印任务 '{job_name}'。" - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "打印完成" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "插件" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "浏览插件..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "已安装插件..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -115,19 +55,17 @@ msgstr "连接至 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "取消" @@ -154,15 +92,15 @@ msgstr "已发送至 Doodle3D Connect 的文件" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "打开 Connect" +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "打开 Doodle3D Connect Web 界面" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "显示更新日志" @@ -197,37 +135,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "通过 USB 连接" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "无法启动新作业,因为打印机处于忙碌状态或未连接。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "打印品详细信息" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "此打印机不支持通过 USB 打印,因为其使用 UltiGCode 类型的 G-code 文件。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 打印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "无法启动新作业,因为该打印机不支持通过 USB 打印。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "警告" @@ -291,11 +230,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "无法保存到可移动磁盘 {0}:{1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "错误" @@ -344,346 +283,332 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "可移动磁盘" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "通过网络打印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "通过网络打印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "已发送打印机访问请求,请在打印机上批准该请求。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "连接状态" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "连接状态" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "重试" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "重新发送访问请求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "打印机接受了访问请求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "无法使用本打印机进行打印,无法发送打印作业。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "请求访问" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "向打印机发送访问请求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "已通过网络连接。请在打印机上接受访问请求。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "已通过网络连接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "已通过网络连接,但没有打印机的控制权限。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "访问请求在打印机上被拒绝。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "访问请求失败(原因:超时)。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "网络连接中断。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "与打印机的连接中断,请检查打印机是否已连接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "打印机无法启动新的打印作业,当前的打印机状态为 %s。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "打印机状态" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "无法启动新的打印作业。插槽 {0} 中未加载打印头。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "无法启动新的打印作业。插槽 {0} 中未加载材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "线轴 {0} 上没有足够的材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "不同的打印头(Cura: {0},打印机: 为挤出机 {2} 选择了 {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "您为挤出机 {2} 选择了不同的材料(Cura:{0},打印机:{1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "打印头 {0} 未正确校准。 需要在打印机上执行 XY 校准。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "您确定要使用所选配置进行打印吗?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "打印机的配置或校准与 Cura 之间不匹配。为了获得最佳打印效果,请务必切换打印头和打印机中插入的材料。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "配置不匹配" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "发送新作业(暂时)受阻,仍在发送前一份打印作业。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "向打印机发送数据" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "正在发送数据" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "无法向打印机发送数据。请确认是否有另一项打印任务仍在进行?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "中止打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "打印已中止。请检查打印机" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "暂停打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "恢复打印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "与您的打印机同步" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "您想在 Cura 中使用当前的打印机配置吗?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." msgstr "打印机上的打印头和/或材料与当前项目中的不同。 为获得最佳打印效果,请始终使用已插入打印机的打印头和材料进行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "通过网络连接" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "这台打印机未设置为运行一组连接的 Ultimaker 3 打印机。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "这台打印机是一组共 {count} 台已连接 Ultimaker 3 打印机的主机。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "{printer_name} 已完成打印 '{job_name}'。 请收起打印品并确认清空打印平台。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "{printer_name} 已保留用于打印 '{job_name}'。 请更改打印机配置以匹配此项作业,以便开始打印。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "发送新作业(暂时)受阻,仍在发送前一份打印作业。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "无法发送新打印作业:此 3D 打印机(尚)未设置为运行一组连接的 Ultimaker 3 打印机。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "发送 {file_name} 至组 {cluster_name}" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "已发送 {file_name} 至组 {cluster_name}。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "显示打印作业" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "在您的浏览器中打开打印作业界面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "无法发送打印作业至组 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "已发送 {file_name} 至组 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "显示打印作业" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "在您的浏览器中打开打印作业界面。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "打印机 '{printer_name}' 完成了打印任务 '{job_name}'。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "打印完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "需要采取行动" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "发送 {file_name} 至组 {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "通过网络连接" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." -msgstr "为确保您的 {machine_name} 具备最新功能,建议定期更新固件。 更新可在 {machine_name} 上(连接至网络时)或通过 USB 进行。" +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "新 %s 固件可用" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "下载" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "无法获取更新信息。" @@ -713,7 +638,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "启动 %s 时发生错误!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "当单线打印(Wire Printing)功能开启时,Cura 将无法准确地显示打印层(Layers)" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "修改 G-Code 文件" @@ -743,21 +683,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "GCode 文件" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "分层视图" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "当单线打印(Wire Printing)功能开启时,Cura 将无法准确地显示打印层(Layers)" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "分层视图" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -790,8 +715,9 @@ msgstr "无法使用当前材料进行切片,因为该材料与所选机器或 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "无法切片" @@ -802,23 +728,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "无法使用当前设置进行切片。以下设置存在错误:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "无法切片(原因:主塔或主位置无效)。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "无法执行,因为没有一个模型符合成形空间体积。请缩放或旋转模型以适应打印平台。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "正在处理层" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "信息" @@ -833,14 +765,36 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "设置对每个模型的单独设定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "推荐" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "自定义" @@ -851,29 +805,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 文件" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "喷嘴" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "浏览插件" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "无法从 {0} 获取插件 ID" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "插件浏览器" @@ -888,18 +837,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G 文件" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "解析 G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code 详细信息" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." msgstr "发送文件之前,请确保 G-code 适用于当前打印机和打印机配置。当前 G-code 文件可能不准确。" @@ -941,73 +890,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "调平打印平台" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "外壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "内壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "表层" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "支撑填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "支撑接触面" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "支撑" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "Skirt" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "移动" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "回抽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "其它" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "预切片文件 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "未加载材料" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "未知材料" @@ -1034,13 +988,13 @@ msgid "Can't Find Location" msgstr "找不到位置" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "文件已存在" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1056,12 +1010,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "自定义材料" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "所选材料与所选机器或配置不兼容。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1082,62 +1046,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "撤销更改材料直径。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "无法将配置文件导出至 {0} {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "无法将配置文件导出至 {0} : 写入器插件报告故障。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "配置文件已导出至: {0} " -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "导出详细信息" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "无法从 {0} 导入配置文件: {1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "已成功导入配置文件 {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "配置 {0} 文件类型未知或已损坏。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "自定义配置文件" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "配置文件缺少打印质量类型定义。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1164,238 +1128,316 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "放置模型" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "错误报告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " -msgstr "

    发生了致命错误,我们无法恢复!

    \n

    请在以下网址中使用下方的信息提交错误报告:http://github.com/Ultimaker/Cura/issues

    " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "打开网页" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "正在载入打印机..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "正在设置场景..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "正在载入界面…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能加载一个 G-code 文件。{0} 已跳过导入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果加载 G-code,则无法打开其他任何文件。{0} 已跳过导入" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "打印机设置" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "打印机" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "打印机设置" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (宽度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (深度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (高度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "打印平台形状" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "置中" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "加热床" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "GCode 类型" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "打印头设置" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "打印头左侧至喷嘴中心的距离。 用于防止“排队”打印时之前的打印品与打印头发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "打印头前端至喷嘴中心的距离。 用于防止“排队”打印时之前的打印品与打印头发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "打印头右侧至喷嘴中心的距离。 用于防止“排队”打印时之前的打印品与打印头发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." msgstr "打印头后部至喷嘴中心的距离。 用于防止“排队”打印时之前的打印品与打印头发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "十字轴高度" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." msgstr "喷嘴尖端与十字轴系统(X 轴和 Y 轴)之间的高度差。 用于防止“排队”打印时之前的打印品与十字轴发生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "挤出机数目" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "打印机所支持耗材的公称直径。 材料和/或配置文件将覆盖精确直径。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "材料直径" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "喷嘴孔径" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "GCode 开始部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "将在开始时执行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "GCode 结束部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "将在结束时执行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "喷嘴设置" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "喷嘴偏移 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "喷嘴偏移 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "挤出机 Gcode 开始部分" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "挤出机 Gcode 结束部分" @@ -1408,12 +1450,11 @@ msgstr "更新日志" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1465,35 +1506,33 @@ msgid "Unknown error code: %1" msgstr "未知错误代码: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "连接到网络打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" +msgstr "" +"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" +"\n" +"从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "添加" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "编辑" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1502,220 +1541,221 @@ msgid "Remove" msgstr "删除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "刷新" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "如果您的打印机未列出,请阅读网络打印故障排除指南" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "类型" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "未知" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "固件版本" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "地址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "这台打印机未设置为运行一组连接的 Ultimaker 3 打印机。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "这台打印机是一组共 %1 台已连接 Ultimaker 3 打印机的主机。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "该网络地址的打印机尚未响应。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "连接" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "打印机网络地址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "输入打印机在网络上的 IP 地址或主机名。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "确定" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "通过网络打印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "打印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 未设置为运行一组连接的 Ultimaker 3 打印机" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "查看打印作业" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "准备打印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "打印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "可用" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "与打印机的连接中断" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "保留" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "已完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "打印已中止" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "不接受打印作业" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "完成时间:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "清空打印平台" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "正在等待配置更改" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "打印作业" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "打印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "已排队" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "打印机" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "查看打印机" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "连接到打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "将打印机配置导入 Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "应用配置" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "这台打印机未设置为运行一组连接的 Ultimaker 3 打印机" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "这台打印机是一组 %1 台已连接 Ultimaker 3 打印机的主机" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "通过网络打印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "打印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 未设置为运行一组连接的 Ultimaker 3 打印机" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "打印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "保留" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "已完成" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "准备" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "可用" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "完成时间: " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "清空打印平台" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "准备打印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "不接受打印作业" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "使用默认 Web 浏览器打开打印作业页面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "查看打印作业" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "打印机组" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "打印作业" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "打印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "已排队" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "正在等待配置更改" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "打印机" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "查看打印机" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1741,13 +1781,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "总是使用粗糙品质" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "确定" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1774,11 +1807,91 @@ msgid "Fine" msgstr "精细" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "记住我的选择" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "颜色方案" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "材料颜色" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "走线类型" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "兼容模式" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "显示移动轨迹" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "显示打印辅助结构" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "显示外壳" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "显示填充" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "只显示顶层" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "在顶部显示 5 层打印细节" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "顶 / 底层" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "内壁" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1789,81 +1902,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "后期处理脚本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "添加一个脚本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "设置" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "更改目前启用的后期处理脚本" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "颜色方案" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "材料颜色" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "走线类型" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "兼容模式" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "显示移动轨迹" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "显示打印辅助结构" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "显示外壳" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "显示填充" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "只显示顶层" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "在顶部显示 5 层打印细节" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "顶 / 底层" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "内壁" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1955,127 +2008,127 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "显示全部" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "打开项目" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "更新已有配置" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "新建" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "摘要 - Cura 项目" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "打印机设置" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "机器的设置冲突应如何解决?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "类型" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "名字" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "配置文件设置" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "配置文件中的冲突如何解决?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "不在配置文件中" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 重写" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "衍生自" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 重写" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "材料设置" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "材料的设置冲突应如何解决?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "设置可见性" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "模式" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "可见设置:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 / %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "加载项目将清除打印平台上的所有模型" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "打开" @@ -2100,6 +2153,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "已安装" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "下载" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2108,10 +2166,10 @@ msgstr "插件许可协议" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr " 插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" +msgstr "" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2123,6 +2181,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "拒绝" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2308,30 +2371,25 @@ msgid "Printer does not accept commands" msgstr "打印机不接受命令" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "维护中。请检查打印机" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "与打印机的连接中断" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "打印中..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "已暂停" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "初始化中..." @@ -2376,7 +2434,9 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" +msgstr "" +"您已自定义某些配置文件设置。\n" +"您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -2547,7 +2607,7 @@ msgid "Unit" msgstr "单位" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "基本" @@ -2778,7 +2838,7 @@ msgid "Send (anonymous) print information" msgstr "(匿名)发送打印信息" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "打印机" @@ -2796,39 +2856,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "重命名" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "打印机类型:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "连接:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "尚未连接到打印机。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "状态:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "等待清理打印平台" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "等待打印作业" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "配置文件" @@ -2926,7 +2986,7 @@ msgid "Export Profile" msgstr "导出配置文件" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "材料" @@ -2984,7 +3044,7 @@ msgid "Successfully exported material to %1" msgstr "成功导出材料至: %1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "新增打印机" @@ -3004,6 +3064,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "关于 Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3014,7 +3079,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" +msgstr "" +"Cura 由 Ultimaker B.V. 与社区合作开发。\n" +"Cura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3096,12 +3163,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "多边形剪辑库" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "字体" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG 图标" @@ -3111,40 +3183,48 @@ msgctxt "@label" msgid "Profile:" msgstr "配置文件:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" +msgstr "" +"某些设置/重写值与存储在配置文件中的值不同。\n" +"\n" +"点击打开配置文件管理器。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "搜索..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "将值复制到所有挤出机" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "隐藏此设置" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "不再显示此设置" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "保持此设置可见" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "配置设置可见性..." @@ -3155,7 +3235,10 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" +msgstr "" +"一些隐藏设置正在使用有别于一般设置的计算值。\n" +"\n" +"单击以使这些设置可见。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3183,7 +3266,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" +msgstr "" +"此设置的值与配置文件不同。\n" +"\n" +"单击以恢复配置文件的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3191,56 +3277,78 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" +msgstr "" +"此设置通常可被自动计算,但其当前已被绝对定义。\n" +"\n" +"单击以恢复自动计算的值。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "打印设置" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "打印设置已禁用\nG-code 文件无法被修改" +msgstr "" +"打印设置已禁用\n" +"G-code 文件无法被修改" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00 小时 00 分" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "时间信息" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "打印时间" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "%1m / ~ %2g / ~ %4 %3" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "%1m / ~ %2g" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "推荐的打印设置

    使用针对所选打印机、材料和质量的推荐设置进行打印。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "自定义打印设置
    对切片过程中的每一个细节进行精细控制。" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自动:%1" @@ -3250,7 +3358,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "视图(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "自动: %1" @@ -3277,13 +3385,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "打开最近使用过的文件(&R)" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "没有连接打印机" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "挤出机" @@ -3298,306 +3406,346 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "该挤出机的当前温度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "该挤出机中材料的颜色。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "该挤出机中的材料。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "该挤出机所使用的喷嘴。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "打印平台" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "热床的目标温度。热床将加热或冷却至此温度。若设置为 0,则不使用热床。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "热床当前温度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "热床的预热温度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "预热" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." msgstr "打印前请预热热床。您可以在热床加热时继续调整相关项,让您在准备打印时不必等待热床加热完毕。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "正在打印" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "作业名" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "打印时间" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "预计剩余时间" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "切换完整界面(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "撤销(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "重做(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "配置 Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增打印机(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理打印机(&I)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理材料…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用当前设置 / 重写值更新配置文件(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "舍弃当前更改(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "从当前设置 / 重写值创建配置文件(&C)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理配置文件.." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "显示在线文档(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 反馈(&B)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "关于(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "删除所选模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "居中所选模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "复制所选模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "删除模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "使模型居于平台中央(&N)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "绑定模型(&G)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "拆分模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "合并模型(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "复制模型…(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "选择所有模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "清空打印平台(&C)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "重新载入所有模型(&L)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "编位所有的模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "为所选模型编位" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "复位所有模型的位置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "复位所有模型的变动(&T)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "打开文件(&O)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建项目(&N)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "显示引擎日志(&L)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "显示配置文件夹" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "配置设定可见性..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "浏览插件..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "已安装插件..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "请载入一个 3D 模型" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "切片已准备就绪" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "正在切片..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 已准备就绪" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "无法切片" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "切片不可用" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "准备" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "选择活动的输出装置" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "打开文件" @@ -3614,112 +3762,117 @@ msgstr "导入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "文件(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "保存到文件(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "另存为(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "保存项目" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "编辑(&E)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "视图(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "设置(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "打印机(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "材料(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "配置文件(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "设为主要挤出机" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "扩展(&X)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "插件" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "偏好设置(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "帮助(&H)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "打开文件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "设置" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "新建项目" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "你确定要开始一个新项目吗?这将清除打印平台及任何未保存的设置。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "安装插件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "打开文件" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." msgstr "我们已经在您选择的文件中找到一个或多个 G-Code 文件。您一次只能打开一个 G-Code 文件。若需打开 G-Code 文件,请仅选择一个。" @@ -3729,102 +3882,112 @@ msgctxt "@title:window" msgid "Save Project" msgstr "保存项目" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "挤出机 %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & 材料" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "保存时不再显示项目摘要" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "保存" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "准备" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "监控" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "层高" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "打印速度" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "更慢" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "更快" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "渐层填充(Gradual infill)将随着打印高度的提升而逐渐加大填充密度。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "启用渐层" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "生成支撑" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "在模型的悬垂(Overhangs)部分生成支撑结构。若不这样做,这些部分在打印时将倒塌。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "支撑用挤出机" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." msgstr "选择用于支撑的挤出机。该挤出机将在模型之下建立支撑结构,以防止模型下垂或在空中打印。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "打印平台附着" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "允许打印 Brim 或 Raft。这将在您的对象周围或下方添加一个容易切断的平面区域。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "需要帮助改善您的打印?阅读 Ultimaker 故障排除指南" @@ -3840,17 +4003,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "打开项目文件" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "这是一个 Cura 项目文件。您想将其作为一个项目打开还是从中导入模型?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "作为项目打开" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "导入模型" @@ -3860,17 +4023,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "引擎日志" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "材料" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "检查材料兼容性" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "点击查看 Ultimaker.com 上的材料兼容情况。" @@ -3985,11 +4148,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 网络连接" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 网络连接(群集)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4010,6 +4168,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks 集成" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4070,16 +4238,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "GCode 配置文件读取器" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "提供分层视图。" - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "分层视图" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4100,6 +4258,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "版本自 2.7 升级到 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4160,6 +4328,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "单一模型设置工具" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4220,6 +4398,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF 写入器" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4240,6 +4428,137 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 配置文件读取器" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "冻结操作" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "不能开始打印" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "打开 Connect" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "打印品详细信息" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "为确保您的 {machine_name} 具备最新功能,建议定期更新固件。 更新可在 {machine_name} 上(连接至网络时)或通过 USB 进行。" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "分层视图" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "分层视图" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "浏览插件" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "导出详细信息" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    发生了致命错误,我们无法恢复!

    \n" +#~ "

    请在以下网址中使用下方的信息提交错误报告:http://github.com/Ultimaker/Cura/issues

    " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "打开网页" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "确定" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "这台打印机未设置为运行一组连接的 Ultimaker 3 打印机" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "这台打印机是一组 %1 台已连接 Ultimaker 3 打印机的主机" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "准备" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "完成时间: " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "使用默认 Web 浏览器打开打印作业页面。" + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "打印机组" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "加载项目将清除打印平台上的所有模型" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ " 插件包含一个许可。\n" +#~ "您需要接受此许可才能安装此插件。\n" +#~ "是否同意下列条款?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00 小时 00 分" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "时间信息" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "打印时间" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g / ~ %4 %3" +#~ msgstr "%1m / ~ %2g / ~ %4 %3" + +#~ msgctxt "@label" +#~ msgid "%1m / ~ %2g" +#~ msgstr "%1m / ~ %2g" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "检查材料兼容性" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 网络连接(群集)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "提供分层视图。" + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "分层视图" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "透视" diff --git a/resources/i18n/zh_CN/fdmextruder.def.json.po b/resources/i18n/zh_CN/fdmextruder.def.json.po index 49c7430422..e6e4c21306 100644 --- a/resources/i18n/zh_CN/fdmextruder.def.json.po +++ b/resources/i18n/zh_CN/fdmextruder.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-08-28 11:00+0200\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 78650174db..3d191eec96 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" -"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-27 12:27+0200\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" @@ -58,7 +58,9 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "在开始后执行的 G-code 命令 - 以 \n 分行" +msgstr "" +"在开始后执行的 G-code 命令 - 以 \n" +" 分行" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,7 +72,9 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "在结束前执行的 G-code 命令 - 以 \n 分行" +msgstr "" +"在结束前执行的 G-code 命令 - 以 \n" +" 分行" #: fdmprinter.def.json msgctxt "material_guid label" @@ -607,6 +611,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "起始层高(以毫米为单位)。起始层越厚,与打印平台的粘着越轻松。" +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -757,6 +786,16 @@ msgctxt "shell description" msgid "Shell" msgstr "外壳" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "壁挤出机" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "用于打印壁的挤出机组。 用于多重挤出。" + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -769,8 +808,8 @@ msgstr "用于打印外壁的挤出机组。 用于多重挤出。" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "内壁挤出机" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1202,6 +1241,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "用多个同心线代替顶部/底部图案的最外面部分。 使用一条或两条线改善从填充材料开始的顶板。" +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "启用熨平" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "再一次经过顶部表面,但不挤出材料。 这是为了进一步融化顶部的塑料,打造更平滑的表面。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "仅熨平最高层" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "仅在网格的最后一层执行熨平。 如果较低的层不需要平滑的表面效果,这将节省时间。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "熨平图案" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "用于熨平顶部表面的图案。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "锯齿形" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "熨平走线间距" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "熨平走线之间的距离。" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "熨平流量" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "熨平期间相对于正常皮肤走线的挤出材料量。 保持喷嘴填充状态有助于填充顶层表面的一些缝隙,但如填充过多则会导致表面上过度挤出和光点。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "熨平嵌入" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "与模型边缘保持的距离。 一直熨平至网格的边缘可能导致打印品出现锯齿状边缘。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "熨平速度" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "通过顶部表面的速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "熨平加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "执行熨平的加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "熨平抖动速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "执行熨平时的最大瞬时速度变化。" + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1249,8 +1388,8 @@ msgstr "填充图案" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "打印填充材料的图案。 线条和锯齿形填充在交替层上交换方向,从而降低材料成本。 网格、三角形、立方体、八角形、四面体和同心图案在每层完整打印。 立方体、四面体和八角形填充随每层变化,以在各个方向提供更均衡的强度分布。" +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1267,6 +1406,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "三角形" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1319,8 +1463,8 @@ msgstr "连接填充走线" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "使用沿内壁形状的走线连接填充图案与内壁相接的各端。 启用此设置会使填充更好地粘着在壁上,减少填充物效果对垂直表面质量的影响。 禁用此设置可减少使用的材料量。" +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1332,6 +1476,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "要使用的整数走线方向列表。 列表中的元素随层的进度依次使用,当达到列表末尾时,它将从头开始。 列表项以逗号分隔,整个列表包含在方括号中。 默认是一个空列表,即意味着使用传统的默认角度(线条和锯齿形图案为 45 和 135 度,其他所有图案为 45 度)。" +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1642,6 +1806,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "调整所用耗材的直径。 将此值与所用耗材的直径匹配。" +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2832,36 +3016,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "连接锯齿形。 这将增加锯齿形支撑结构的强度。" -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "将支撑结构分拆成块状" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "跳过部分支撑线连接,让支撑结构更容易脱离。 此设置适用于锯齿形支撑结构填充图案。" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "支撑块大小" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "每隔 N 毫米在支撑线之间略去一个连接,让支撑结构更容易脱离。" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "支撑块走线数" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "每隔 N 个连接线跳过一个连接,让支撑结构更容易脱离。" - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3401,8 +3555,8 @@ msgstr "Skirt 距离" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "skirt 和打印第一层之间的水平距离。\n这是最小距离,多个 skirt 走线将从此距离向外延伸。" +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3444,26 +3598,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "仅在模型外部打印 brim。 这会减少您之后需要移除的 brim 量,而不会过度影响热床附着。" -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "起始层 Z 偏移量" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "此值为挤出机与第一层正常高度之间的偏移量。 该值可以为正(升起),也可以为负(降下)。 如果挤出机略微升起,部分耗材类型会与打印平台实现更好的粘着。" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z 偏移锥形层" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "当非零时,Z 偏移在多个层中逐步降至零。 值为 0 则表示,在打印品的各个层中 Z 偏移量保持不变。" - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3481,8 +3615,8 @@ msgstr "Raft 平滑度" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "该设置控制 Raft 轮廓中的内角呈圆形的程度。 内向角被设置为半圆形,半径等于此处的值。 此设置还会移除 raft 轮廓中小于此半圆形的孔。" +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3954,6 +4088,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "一般情况下,Cura 会尝试缝合网格中的小孔,并移除有大孔的部分层。 启用此选项将保留那些无法缝合的部分。 当其他所有方法都无法产生正确的 GCode 时,该选项应该被用作最后手段。" +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3984,6 +4128,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "切换为与每个层相交的网格相交体积,以便重叠的网格交织在一起。 关闭此设置将使其中一个网格获得重叠中的所有体积,同时将其从其他网格中移除。" +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4189,6 +4343,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "优化打印各个壁的顺序,以减少回抽次数和空驶距离。 启用此设置将对大部分零件有益,但有的则会耗费更长时间,因此请将优化和不优化的打印时间估计值进行对比。" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "将支撑结构分拆成块状" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "跳过部分支撑线连接,让支撑结构更容易脱离。 此设置适用于锯齿形支撑结构填充图案。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "支撑块大小" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "每隔 N 毫米在支撑线之间略去一个连接,让支撑结构更容易脱离。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "支撑块走线数" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "每隔 N 个连接线跳过一个连接,让支撑结构更容易脱离。" + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4479,6 +4663,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "在每个走线部分引入的随机点之间的平均距离。 注意,多边形的原始点被舍弃,因此高平滑度导致分辨率降低。 该值必须大于模糊皮肤厚度的一半。" +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4629,7 +4833,9 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "" +"以半速挤出的上行移动的距离。\n" +"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" @@ -4736,106 +4942,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "喷嘴和水平下行线之间的距离。 较大的间隙会让斜下行线角度较平缓,进而使第二层的上行连接较少。 仅应用于单线打印。" -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "启用熨平" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "再一次经过顶部表面,但不挤出材料。 这是为了进一步融化顶部的塑料,打造更平滑的表面。" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "仅熨平最高层" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "仅在网格的最后一层执行熨平。 如果较低的层不需要平滑的表面效果,这将节省时间。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "熨平图案" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "用于熨平顶部表面的图案。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "同心" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "锯齿形" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "熨平走线间距" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "熨平走线之间的距离。" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "熨平流量" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "熨平期间相对于正常皮肤走线的挤出材料量。 保持喷嘴填充状态有助于填充顶层表面的一些缝隙,但如填充过多则会导致表面上过度挤出和光点。" - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "熨平嵌入" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "与模型边缘保持的距离。 一直熨平至网格的边缘可能导致打印品出现锯齿状边缘。" - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "熨平速度" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "通过顶部表面的速度。" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "熨平加速度" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "执行熨平的加速度。" - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "熨平抖动速度" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "执行熨平时的最大瞬时速度变化。" - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4896,13 +5002,45 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "在将模型从文件中载入时应用在模型上的转换矩阵。" -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "壁挤出机" +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "内壁挤出机" -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "用于打印壁的挤出机组。 用于多重挤出。" +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "打印填充材料的图案。 线条和锯齿形填充在交替层上交换方向,从而降低材料成本。 网格、三角形、立方体、八角形、四面体和同心图案在每层完整打印。 立方体、四面体和八角形填充随每层变化,以在各个方向提供更均衡的强度分布。" + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "使用沿内壁形状的走线连接填充图案与内壁相接的各端。 启用此设置会使填充更好地粘着在壁上,减少填充物效果对垂直表面质量的影响。 禁用此设置可减少使用的材料量。" + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "" +#~ "skirt 和打印第一层之间的水平距离。\n" +#~ "这是最小距离,多个 skirt 走线将从此距离向外延伸。" + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "起始层 Z 偏移量" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "此值为挤出机与第一层正常高度之间的偏移量。 该值可以为正(升起),也可以为负(降下)。 如果挤出机略微升起,部分耗材类型会与打印平台实现更好的粘着。" + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z 偏移锥形层" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "当非零时,Z 偏移在多个层中逐步降至零。 值为 0 则表示,在打印品的各个层中 Z 偏移量保持不变。" + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "该设置控制 Raft 轮廓中的内角呈圆形的程度。 内向角被设置为半圆形,半径等于此处的值。 此设置还会移除 raft 轮廓中小于此半圆形的孔。" #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." @@ -4998,4 +5136,4 @@ msgstr "在将模型从文件中载入时应用在模型上的转换矩阵。" #~ msgctxt "machine_gcode_flavor option RepRap (Volumatric)" #~ msgid "RepRap (Volumetric)" -#~ msgstr "RepRap (Volumetric)" \ No newline at end of file +#~ msgstr "RepRap (Volumetric)" From 72954e758ca707676a117715bf91ed1eaeb96f96 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 21 Nov 2017 17:15:07 +0100 Subject: [PATCH 296/764] CURA-4593 Workaround to fix the rendering glitches when the last layer has no data --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 14646cbac1..51fcf3ec59 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -106,6 +106,12 @@ class ProcessSlicedLayersJob(Job): for layer in self._layers: abs_layer_number = layer.id + abs(min_layer_number) + # Workaround when the last layer doesn't have paths, this layer is skipped because this was generating + # some glitches when rendering. + if layer.id == len(self._layers)-1 and layer.repeatedMessageCount("path_segment") == 0: + Logger.log("i", "No sliced data in the layer", layer.id) + continue + layer_data.addLayer(abs_layer_number) this_layer = layer_data.getLayer(abs_layer_number) layer_data.setLayerHeight(abs_layer_number, layer.height) From 31c859b3d7b91b72ba831fc1c42bbba2944d525c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 22 Nov 2017 09:18:20 +0100 Subject: [PATCH 297/764] Show Keep/Discard dialog after the containers have been changed CURA-4599 Or the default values will reflect those before the switch. --- cura/Settings/MachineManager.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0daf54c018..db092c0974 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -864,17 +864,10 @@ class MachineManager(QObject): "quality_changes": stack_quality_changes }) - has_user_interaction = False - - if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: - # Show the keep/discard user settings dialog - has_user_interaction = Application.getInstance().discardOrKeepProfileChanges() - - # If there is no interaction with the user (it means the dialog showing "keep" or "discard" was not shown) - # because either there are not user changes or because the used already decided to always keep or discard, - # then the quality instance container is replaced, in which case, the activeQualityChanged signal is emitted. - if not has_user_interaction: - self._executeDelayedActiveContainerStackChanges() + # show the keep/discard dialog after the containers have been switched. Otherwise, the default values on + # the dialog will be the those before the switching. + self._executeDelayedActiveContainerStackChanges() + Application.getInstance().discardOrKeepProfileChanges() ## Used to update material and variant in the active container stack with a delay. # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) From aeb478bb4bd944249fa7107ec404b446c94d0da1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 22 Nov 2017 09:32:17 +0100 Subject: [PATCH 298/764] Should only show Keep/Discard dialog when it's needed CURA-4599 --- cura/Settings/MachineManager.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index db092c0974..e49e90c4ab 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -867,7 +867,9 @@ class MachineManager(QObject): # show the keep/discard dialog after the containers have been switched. Otherwise, the default values on # the dialog will be the those before the switching. self._executeDelayedActiveContainerStackChanges() - Application.getInstance().discardOrKeepProfileChanges() + + if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + Application.getInstance().discardOrKeepProfileChanges() ## Used to update material and variant in the active container stack with a delay. # This delay prevents the stack from triggering a lot of signals (eventually resulting in slicing) From 0a2a9a258956fc9be0b6e7ec888f711f181cb5b3 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 22 Nov 2017 09:42:03 +0100 Subject: [PATCH 299/764] CURA-4533 added setting 'Filter out tiny gaps' --- resources/definitions/fdmprinter.def.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index be2c5d9757..88ec34274e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1218,7 +1218,17 @@ }, "default_value": "everywhere", "limit_to_extruder": "wall_0_extruder_nr", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": { + "filter_out_tiny_gaps": { + "label": "Filter Out Tiny Gaps", + "description": "Filter out tiny gaps to reduce blobs on outside of model.", + "type": "bool", + "default_value": true, + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + } + } }, "fill_outline_gaps": { "label": "Print Thin Walls", From f8fe6cd455a60ba5d20c9112eefa66b0c1a74523 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 22 Nov 2017 10:17:53 +0100 Subject: [PATCH 300/764] Treat project files the same way as model files for job name CURA-4553 --- cura/PrintInformation.py | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 0a5db439c3..3cced2f85c 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -67,11 +67,9 @@ class PrintInformation(QObject): self._base_name = "" self._abbr_machine = "" self._job_name = "" - self._project_name = "" Application.getInstance().globalContainerStackChanged.connect(self._updateJobName) Application.getInstance().fileLoaded.connect(self.setBaseName) - Application.getInstance().workspaceLoaded.connect(self.setProjectName) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._active_material_container = None @@ -253,26 +251,13 @@ class PrintInformation(QObject): self._job_name = name self.jobNameChanged.emit() - @pyqtSlot(str) - def setProjectName(self, name): - self._project_name = name - self.setJobName(name) - jobNameChanged = pyqtSignal() @pyqtProperty(str, notify = jobNameChanged) def jobName(self): return self._job_name - def _updateJobName(self, is_project_name_empty = False): - # if the project name is set, we use the project name as the job name, so the job name should not get updated - # if a model file is loaded after that. - if self._project_name != "": - if is_project_name_empty: - self._project_name = "" - else: - return - + def _updateJobName(self): if self._base_name == "": self._job_name = "" self.jobNameChanged.emit() @@ -313,7 +298,7 @@ class PrintInformation(QObject): if name.endswith(".curaproject"): name = name[:name.rfind(".curaproject")] self._base_name = name - self._updateJobName(is_project_name_empty = is_empty) + self._updateJobName() ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched From 532cfd840498c0abef1a01363e54a2508c418e2b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 22 Nov 2017 10:48:21 +0100 Subject: [PATCH 301/764] Fix showing correct quality changes in dropdown list after upgrading - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 6 ++++++ cura/Settings/MachineManager.py | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 5cfe867bc2..7abe5b35f5 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -449,6 +449,12 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setVariantById(variant_id) extruder_stack.setMaterialById("default") extruder_stack.setQualityById("default") + quality_changes_id = "default" + if machine.qualityChanges.getId() != "empty_quality_changes": + extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) + if extruder_quality_changes_container: + quality_changes_id = extruder_quality_changes_container[0].getId() + extruder_stack.setQualityChangesById(quality_changes_id) self.addContainer(extruder_stack) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e49e90c4ab..002c84fb67 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -620,11 +620,9 @@ class MachineManager(QObject): @pyqtProperty(str, notify=activeQualityChanged) def activeQualityId(self) -> str: if self._active_container_stack: - quality = self._active_container_stack.qualityChanges - if quality and not isinstance(quality, type(self._empty_quality_changes_container)): - return quality.getId() quality = self._active_container_stack.quality - if quality: + quality_changes = self._active_container_stack.qualityChanges + if quality and quality_changes and isinstance(quality_changes, type(self._empty_quality_changes_container)) and not isinstance(quality, type(self._empty_quality_container)): return quality.getId() return "" @@ -690,9 +688,9 @@ class MachineManager(QObject): @pyqtProperty(str, notify = activeQualityChanged) def activeQualityChangesId(self) -> str: if self._active_container_stack: - changes = self._active_container_stack.qualityChanges - if changes and changes.getId() != "empty": - return changes.getId() + quality_changes = self._active_container_stack.qualityChanges + if quality_changes and not isinstance(quality_changes, type(self._empty_quality_changes_container)): + return quality_changes.getId() return "" ## Check if a container is read_only From d7b230269b7685c9800f24f0d556ff93edbb4bbe Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 22 Nov 2017 11:10:25 +0100 Subject: [PATCH 302/764] The icons changed CURA-4527 --- resources/qml/Topbar.qml | 3 +- resources/themes/cura-light/icons/view_3d.svg | 70 ++++------------- .../themes/cura-light/icons/view_fron.svg | 56 -------------- .../themes/cura-light/icons/view_front.svg | 19 +++++ .../themes/cura-light/icons/view_left.svg | 77 +++++-------------- .../themes/cura-light/icons/view_right.svg | 77 +++++-------------- .../themes/cura-light/icons/view_top.svg | 77 +++++-------------- 7 files changed, 97 insertions(+), 282 deletions(-) delete mode 100644 resources/themes/cura-light/icons/view_fron.svg create mode 100644 resources/themes/cura-light/icons/view_front.svg diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index dfc4562017..033e1a55f9 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -242,7 +242,6 @@ Rectangle anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("3d", 0); - console.log("WIDTH : " + base.width) } visible: base.width > 1100 } @@ -250,7 +249,7 @@ Rectangle // #2 Front view Button { - iconSource: UM.Theme.getIcon("view_fron") + iconSource: UM.Theme.getIcon("view_front") style: UM.Theme.styles.orientation_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ diff --git a/resources/themes/cura-light/icons/view_3d.svg b/resources/themes/cura-light/icons/view_3d.svg index de803ab2a6..cfe394e65d 100644 --- a/resources/themes/cura-light/icons/view_3d.svg +++ b/resources/themes/cura-light/icons/view_3d.svg @@ -1,56 +1,14 @@ - - - - - - image/svg+xml - - - - - - - - - + + + + icn_perspectives_white + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/view_fron.svg b/resources/themes/cura-light/icons/view_fron.svg deleted file mode 100644 index 68e43c43a0..0000000000 --- a/resources/themes/cura-light/icons/view_fron.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - diff --git a/resources/themes/cura-light/icons/view_front.svg b/resources/themes/cura-light/icons/view_front.svg new file mode 100644 index 0000000000..7de9abe0af --- /dev/null +++ b/resources/themes/cura-light/icons/view_front.svg @@ -0,0 +1,19 @@ + + + + icn_front_white + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/view_left.svg b/resources/themes/cura-light/icons/view_left.svg index 729a7f18cd..1770da4c81 100644 --- a/resources/themes/cura-light/icons/view_left.svg +++ b/resources/themes/cura-light/icons/view_left.svg @@ -1,56 +1,21 @@ - - - - - - image/svg+xml - - - - - - - - - + + + + icn_left_white + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/view_right.svg b/resources/themes/cura-light/icons/view_right.svg index 802da651ef..5e0628e60e 100644 --- a/resources/themes/cura-light/icons/view_right.svg +++ b/resources/themes/cura-light/icons/view_right.svg @@ -1,56 +1,21 @@ - - - - - - image/svg+xml - - - - - - - - - + + + + icn_right_white + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/view_top.svg b/resources/themes/cura-light/icons/view_top.svg index 8c94744df0..3eb32e9878 100644 --- a/resources/themes/cura-light/icons/view_top.svg +++ b/resources/themes/cura-light/icons/view_top.svg @@ -1,56 +1,21 @@ - - - - - - image/svg+xml - - - - - - - - - + + + + icn_top_white + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file From 9fab4070a66ebbb40298adf4630200dba251ea32 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 22 Nov 2017 12:11:18 +0100 Subject: [PATCH 303/764] Fix quality_changes upgrade from 2.7 to 3.1 --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index b966ae5192..7b788f96ba 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -114,8 +114,10 @@ class VersionUpgrade30to31(VersionUpgrade): # Copy global quality changes to extruder quality changes for single extrusion machines if parser["metadata"]["type"] == "quality_changes": all_quality_changes = self._getSingleExtrusionMachineQualityChanges(parser) - if len(all_quality_changes) == 1 and not all_quality_changes[0].has_option("metadata", "extruder"): - self._createExtruderQualityChangesForSingleExtrusionMachine(filename, all_quality_changes[0]) + # Note that DO NOT!!! use the quality_changes returned from _getSingleExtrusionMachineQualityChanges(). + # Those are loaded from the hard drive which are original files that haven't been upgraded yet. + if len(all_quality_changes) == 1 and not parser.has_option("metadata", "extruder"): + self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) # Update version numbers parser["general"]["version"] = "2" From 62113df3bd473c670003e125a4a6e21732877467 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 22 Nov 2017 11:29:15 +0100 Subject: [PATCH 304/764] Update Korean translations with 3.0 translations These are so wrong that Cura won't start with these translations loaded. We're asking for corrections. Contributes to issue CURA-4601. --- resources/i18n/ko_KR/cura.po | 3562 ++++++++--------- resources/i18n/ko_KR/fdmextruder.def.json.po | 4 +- resources/i18n/ko_KR/fdmprinter.def.json.po | 3752 +++++++++--------- 3 files changed, 3580 insertions(+), 3738 deletions(-) diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 65346b16d8..8c508c1e51 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -3,2310 +3,2325 @@ # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. # -#, fuzzy msgid "" msgstr "" "Project-Id-Version: Cura 3.1\n" -"Report-Msgid-Bugs-To: \n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: TEAM\n" -"Language: xx_XX\n" +"PO-Revision-Date: 2017-11-14 22:13+0900\n" +"Language-Team: Brule\n" +"Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"Last-Translator: Brule\n" +"X-Generator: Poedit 2.0.4\n" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Print aborted" +msgstr "프린트 정지" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Blocked" +msgstr "막힘" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Action required" +msgstr "필요한 조치" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Can't start print" +msgstr "인쇄를 시작할 수 없습니다" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "이 프린터는 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니다." + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label" +msgid "Finishes at: " +msgstr "종료시간 : " + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "이 프린터는 1% Ultimaker 3 프린터 그룹의 호스트입니다." + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "프린터가 인쇄를 완료했습니다." + +#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Print finished" +msgstr "프린트가 완료됐습니다" + +#: Manually added for resources/Cura/Cura.qml +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "플러그인" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "플러그인 찾아보기 ..." + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "설치된 플러그인 ..." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" -msgstr "" +msgstr "기계 설정" #: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 msgctxt "@item:inlistbox" msgid "X-Ray view" -msgstr "" +msgstr "X 선보기" #: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 msgctxt "@item:inlistbox" msgid "X3D File" -msgstr "" +msgstr "X3D 파일" #: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 msgctxt "@item:inlistbox" msgid "GCode File" -msgstr "" +msgstr "GCode 파일" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 msgctxt "@action:button" msgid "Print with Doodle3D WiFi-Box" -msgstr "" +msgstr "Doodle3D WiFi-Box로 인쇄" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 msgctxt "@properties:tooltip" msgid "Print with Doodle3D WiFi-Box" -msgstr "" +msgstr "Doodle3D WiFi-Box로 인쇄" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 msgctxt "@info:status" msgid "Connecting to Doodle3D Connect" -msgstr "" +msgstr "Doodle3D Connect에 연결" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 msgctxt "@action:button" msgid "Cancel" -msgstr "" +msgstr "취소" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 msgctxt "@info:status" msgid "Sending data to Doodle3D Connect" -msgstr "" +msgstr "Doodle3D Connect에 데이터 보내기" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 msgctxt "@info:status" msgid "Unable to send data to Doodle3D Connect. Is another job still active?" -msgstr "" +msgstr "Doodle3D Connect에 데이터를 보낼 수 없습니다. 다른 작업이 진행중ㅇ가요?" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 msgctxt "@info:status" msgid "Storing data on Doodle3D Connect" -msgstr "" +msgstr "Doodle3D Connect에 데이터 저장" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 msgctxt "@info:status" msgid "File sent to Doodle3D Connect" -msgstr "" +msgstr "Doodle3D Connect에 파일 전송" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect..." -msgstr "" +msgid "Open Connect.." +msgstr "열기 연결 .." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" -msgstr "" +msgstr "Doodle3D Connect 웹 인터페이스 열기" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 msgctxt "@item:inmenu" msgid "Show Changelog" -msgstr "" +msgstr "변경 내역 표시" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 msgctxt "@item:inmenu" msgid "Flatten active settings" -msgstr "" +msgstr "활성 설정 병합" #: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 msgctxt "@info:status" msgid "Profile has been flattened & activated." -msgstr "" +msgstr "프로필이 병합되고 활성화되었습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 msgctxt "@item:inmenu" msgid "USB printing" -msgstr "" +msgstr "USB 인쇄" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print via USB" -msgstr "" +msgstr "USB를 통해 인쇄" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 msgctxt "@info:tooltip" msgid "Print via USB" -msgstr "" +msgstr "USB를 통해 인쇄" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 msgctxt "@info:status" msgid "Connected via USB" -msgstr "" +msgstr "USB를 통해 연결" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." -msgstr "" +msgstr "프린터가 사용 중이거나 연결되어 있지 않아 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 msgctxt "@info:title" -msgid "Printer Unavailable" -msgstr "" +msgid "Print Details" +msgstr "인쇄 세부 정보" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." -msgstr "" +msgstr "이 프린터는 UltiGCode flavor를 사용하기 때문에 USB 인쇄를 지원하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 msgctxt "@info:title" msgid "USB Printing" -msgstr "" +msgstr "USB 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." -msgstr "" +msgstr "프린터가 USB 인쇄를 지원하지 않기 때문에 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 msgctxt "@info:title" msgid "Warning" -msgstr "" +msgstr "경고" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 msgctxt "@info" msgid "Unable to update firmware because there are no printers connected." -msgstr "" +msgstr "프린터가 연결되어 있지 않으므로 펌웨어를 업데이트 할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 #, python-format msgctxt "@info" msgid "Could not find firmware required for the printer at %s." -msgstr "" +msgstr "프린터에 필요한 펌웨어를 찾을 수 없습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 msgctxt "@info:title" msgid "Printer Firmware" -msgstr "" +msgstr "프린터 펌웨어" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 msgctxt "@action:button Preceded by 'Ready to'." msgid "Save to Removable Drive" -msgstr "" +msgstr "이동식 드라이브에 저장" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 #, python-brace-format msgctxt "@item:inlistbox" msgid "Save to Removable Drive {0}" -msgstr "" +msgstr "이동식 드라이브에 저장" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 #, python-brace-format msgctxt "@info:progress Don't translate the XML tags !" msgid "Saving to Removable Drive {0}" -msgstr "" +msgstr "이동식 드라이브에 저장" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 msgctxt "@info:title" msgid "Saving" -msgstr "" +msgstr "저장" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not save to {0}: {1}" -msgstr "" +msgstr "?에 저장할 수 없습니다" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 #, python-brace-format msgctxt "@info:status Don't translate the tag {device}!" msgid "Could not find a file name when trying to write to {device}." -msgstr "" +msgstr "장치에 쓸 때 파일 이름을 찾을 수 없습니다." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #, python-brace-format msgctxt "@info:status" msgid "Could not save to removable drive {0}: {1}" -msgstr "" +msgstr "이동식 드라이브에 저장할 수 없습니다 :" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 msgctxt "@info:title" msgid "Error" -msgstr "" +msgstr "에러" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 #, python-brace-format msgctxt "@info:status" msgid "Saved to Removable Drive {0} as {1}" -msgstr "" +msgstr "이동식 드라이브에 ?로 저장되었습니다." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 msgctxt "@info:title" msgid "File Saved" -msgstr "" +msgstr "저장된 파일" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 msgctxt "@action:button" msgid "Eject" -msgstr "" +msgstr "꺼내기" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 #, python-brace-format msgctxt "@action" msgid "Eject removable device {0}" -msgstr "" +msgstr "이동시기 장치 꺼내기" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 #, python-brace-format msgctxt "@info:status" msgid "Ejected {0}. You can now safely remove the drive." -msgstr "" +msgstr "꺼내기. 이제 드라이브를 안전하게 제거 할 수 있습니다." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 msgctxt "@info:title" msgid "Safely Remove Hardware" -msgstr "" +msgstr "하드웨어 안전하게 제거" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 #, python-brace-format msgctxt "@info:status" msgid "Failed to eject {0}. Another program may be using the drive." -msgstr "" +msgstr "배출하지 못했습니다. 다른 프로그램이 드라이브를 사용 중일 수 있습니다." #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 msgctxt "@item:intext" msgid "Removable Drive" -msgstr "" +msgstr "이동식 드라이브" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" -msgstr "" +msgstr "네트워크를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 msgctxt "@properties:tooltip" msgid "Print over network" -msgstr "" +msgstr "네트워크를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" -msgstr "" +msgstr "요청 된 프린터에 대한 액세스. 프린터에서 요청을 승인하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 msgctxt "@info:title" msgid "Connection status" -msgstr "" +msgstr "연결 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 msgctxt "@info:title" msgid "Connection Status" -msgstr "" +msgstr "연결 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 msgctxt "@action:button" msgid "Retry" -msgstr "" +msgstr "재시도" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 msgctxt "@info:tooltip" msgid "Re-send the access request" -msgstr "" +msgstr "접근 요청 다시 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 msgctxt "@info:status" msgid "Access to the printer accepted" -msgstr "" +msgstr "허용 된 프린터에 대한 접근 허용" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." -msgstr "" +msgstr "이 프린터로 인쇄 할 수 없습니다. 인쇄 작업을 보낼 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" -msgstr "" +msgstr "접근 요청" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" -msgstr "" +msgstr "프린터에 접근 요청 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." -msgstr "" +msgstr "네트워크를 통해 연결되었습니다. 프린터에서 접근 요청을 승인하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 msgctxt "@info:status" msgid "Connected over the network." -msgstr "" +msgstr "네트워크를 통해 연결되었습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." -msgstr "" +msgstr "네트워크를 통해 연결되었습니다. 프린터를 제어 할 수있는 권한이 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 msgctxt "@info:status" msgid "Access request was denied on the printer." -msgstr "" +msgstr "접근 요청이 프린터에서 거부되었습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Access request failed due to a timeout." -msgstr "" +msgstr "접근 요청이 시간 초과로 인해 실패했습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 msgctxt "@info:status" msgid "The connection with the network was lost." -msgstr "" +msgstr "네트워크 연결이 끊어졌습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." -msgstr "" +msgstr "프린터와의 연결이 끊어졌습니다. 프린터가 연결되어 있는지 확인하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." -msgstr "" +msgstr "프린터가 사용중이라 새 인쇄 작업을 시작할 수 없습니다. 현재 프린터 상태는 % s입니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 msgctxt "@info:title" msgid "Printer Status" -msgstr "" +msgstr "프린터 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" -msgstr "" +msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 Printcore가 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" -msgstr "" +msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 자료 없음" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." -msgstr "" +msgstr "스풀 {0}의 재료가 충분하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "" +msgstr "압출기 {2}에 대해 선택된 다른 PrintCore (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" -msgstr "" +msgstr "압출기 {2}에 대해 선택된 다른 재료 (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." -msgstr "" +msgstr "PrintCore가 올바르게 조정되지 않았습니다. XY 교정은 프린터에서 수행해야합니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" -msgstr "" +msgstr "선택한 구성으로 인쇄 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 msgctxt "@label" -msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgid "" +"There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice " +"for the PrintCores and materials that are inserted in your printer." msgstr "" +"프린터 및 Cura의 구성 또는 교정간에 불일치가 있습니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 " +"슬라이스하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 msgctxt "@window:title" msgid "Mismatched configuration" -msgstr "" +msgstr "일치하지 않는 구성" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 msgctxt "@info:status" msgid "Sending data to printer" -msgstr "" +msgstr "프린터로 데이터 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 msgctxt "@info:title" msgid "Sending Data" -msgstr "" +msgstr "데이터 전송 중" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" -msgstr "" +msgstr "프린터로 데이터를 보낼 수 없습니다. 다른 작업이 여전히 작동중인가요?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 msgctxt "@label:MonitorStatus" msgid "Aborting print..." -msgstr "" +msgstr "인쇄 중단 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" -msgstr "" +msgstr "인쇄가 중단되었습니다. 프린터를 확인하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 msgctxt "@label:MonitorStatus" msgid "Pausing print..." -msgstr "" +msgstr "인쇄 일시 중지 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 msgctxt "@label:MonitorStatus" msgid "Resuming print..." -msgstr "" +msgstr "인쇄 재개 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 msgctxt "@window:title" msgid "Sync with your printer" -msgstr "" +msgstr "프린터와 동기화" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" -msgstr "" +msgstr "Cura에서 현재 프린터 구성을 사용 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 msgctxt "@label" -msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgid "" +"The PrintCores and/or materials on your printer differ from those within your current project. For the best result, " +"always slice for the PrintCores and materials that are inserted in your printer." msgstr "" +"프린터의 PrintCores 및 / 또는 자료는 현재 프로젝트 내의 자료와 다릅니다. 최상의 결과를 얻으려면 프린터에 삽입 된 " +"PrintCores 및 재료를 항상 슬라이스하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "네트워크를 통해 연결" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." -msgstr "" +msgstr "이 프린터는 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되어 있지 않습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." -msgstr "" +msgstr "이 프린터는 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되어 있지 않습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." -msgstr "" +msgstr "인쇄를 완료했습니다. 인쇄물을 수거하고 빌드 플레이트를 지우십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 #, python-brace-format -msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." -msgstr "" +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to " +"start printing." +msgstr "?을 인쇄하기 위해 예약되어 있습니다. 인쇄를 시작하려면 프린터의 구성을 작업에 맞게 변경하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "새 작업 전송 (일시적)이 차단되어 이전 인쇄 작업을 계속 보냅니다." + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." msgstr "" +"새로운 인쇄 작업을 보낼 수 없습니다 :이 3D 프린터는 아직 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니" +"다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 -#, python-brace-format -msgctxt "@info:status" -msgid "Unable to send print job to group {cluster_name}." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 -msgctxt "@label" -msgid "Unknown" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 -#, python-brace-format -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 -msgctxt "@info:status" -msgid "Print finished" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 -msgctxt "@label:status" -msgid "Action required" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 #, python-brace-format msgctxt "@info:progress" msgid "Sending {file_name} to group {cluster_name}" -msgstr "" +msgstr "{filename} {file_name} 을 {cluster_name} 그룹에 보냄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "" +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "파일이름을 cluster_name 그룹에 보냈습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "인쇄 작업 표시" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "브라우저에서 인쇄 작업 인터페이스를 엽니다." + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "{cluster_name} 그룹에 인쇄 작업을 보낼 수 없습니다." + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." +msgid "" +"To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware " +"regularly. This can be done on the {machine_name} (when connected to the network) or via USB." msgstr "" +"{machine_name}에 최신 기능이 탑재되어 있는지 확인하려면 정기적으로 펌웨어를 업데이트하는 것이 좋습니다. 이 작업은 " +"{machine_name} (네트워크에 연결된 경우) 또는 USB를 통해 수행 할 수 있습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" -msgstr "" +msgstr "새로운 펌웨어를 사용할 수 있습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 msgctxt "@action:button" -msgid "How to update" -msgstr "" +msgid "Download" +msgstr "다운로드" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 msgctxt "@info" msgid "Could not access update information." -msgstr "" +msgstr "업데이트 정보에 액세스 할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" -msgid "Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" -msgstr "" +msgid "" +"Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in " +"SolidWorks itself without any problems as well!" +msgstr "SolidWorks 파일을 여는 중 오류가 발생했습니다! 문제없이 SolidWorks에서 파일을 열 수 있는지 확인하십시오" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 msgctxt "@item:inlistbox" msgid "SolidWorks part file" -msgstr "" +msgstr "SolidWorks 파트 파일" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 msgctxt "@item:inlistbox" msgid "SolidWorks assembly file" -msgstr "" +msgstr "SolidWorks 어셈블리 파일" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 msgid "Configure" -msgstr "" +msgstr "구성" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 #, python-format msgctxt "@info:status" msgid "Error while starting %s!" -msgstr "" +msgstr "시작하는 도중 오류가 발생했습니다!" -#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 -msgctxt "@item:inlistbox" -msgid "Simulation view" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 -msgctxt "@info:title" -msgid "Simulation View" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 msgid "Modify G-Code" -msgstr "" +msgstr "G 코드 수정" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 msgctxt "@info" msgid "Cura collects anonymised slicing statistics. You can disable this in the preferences." -msgstr "" +msgstr "Cura는 익명의 슬라이싱 통계를 수집합니다. 환경 설정에서 이 기능을 비활성화 할 수 있습니다." #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 msgctxt "@info:title" msgid "Collecting Data" -msgstr "" +msgstr "데이터 수집" #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 msgctxt "@action:button" msgid "Dismiss" -msgstr "" +msgstr "버리다" #: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura 15.04 profiles" -msgstr "" +msgstr "Cura 15.04 프로필" #: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "G-code File" -msgstr "" +msgstr "G-code 파일" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "레이어 보기" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "와이어 인쇄가 활성화되어있을 때 Cura는 레이어를 정확하게 표시하지 않습니다" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 +msgctxt "@info:title" +msgid "Layer View" +msgstr "레이어 보기" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" -msgstr "" +msgstr "JPG 이미지" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 msgctxt "@item:inlistbox" msgid "JPEG Image" -msgstr "" +msgstr "JPEG 이미지" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 msgctxt "@item:inlistbox" msgid "PNG Image" -msgstr "" +msgstr "PNG 이미지" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 msgctxt "@item:inlistbox" msgid "BMP Image" -msgstr "" +msgstr "BMP 이미지" #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 msgctxt "@item:inlistbox" msgid "GIF Image" -msgstr "" +msgstr "GIF 이미지" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 msgctxt "@info:status" msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration." -msgstr "" +msgstr "선택한 소재 또는 구성과 호환되지 않기 때문에 현재 소재로 슬라이스 할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 msgctxt "@info:title" msgid "Unable to slice" -msgstr "" +msgstr "슬라이스 할 수 없습니다" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" -msgstr "" +msgstr "현재 설정으로 슬라이스 할 수 없습니다. 다음 설정에는 오류가 있습니다 : {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 -#, python-brace-format -msgctxt "@info:status" -msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." -msgstr "" +msgstr "프라임 탑 또는 주요 위치가 유효하지 않아 슬라이스 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." -msgstr "" +msgstr "어떤 모델도 빌드 볼륨에 맞지 않으므로 슬라이스 할 수 없습니다. 크기에 맞게 모형을 회전하거나 회전하십시오." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 msgctxt "@info:status" msgid "Processing Layers" -msgstr "" +msgstr "레이어 처리 중" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 msgctxt "@info:title" msgid "Information" -msgstr "" +msgstr "정보" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 msgctxt "@label" msgid "Per Model Settings" -msgstr "" +msgstr "모델 별 설정" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 msgctxt "@info:tooltip" msgid "Configure Per Model Settings" -msgstr "" +msgstr "모델 별 설정 구성" -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 -msgid "Install" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 -msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 -msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 -msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 -msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 msgctxt "@title:tab" msgid "Recommended" -msgstr "" +msgstr "추천" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 msgctxt "@title:tab" msgid "Custom" -msgstr "" +msgstr "관습" -#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 -#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 msgctxt "@item:inlistbox" msgid "3MF File" -msgstr "" +msgstr "3MF 파일" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 msgctxt "@label" msgid "Nozzle" -msgstr "" +msgstr "노즐" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 +msgctxt "@menuitem" +msgid "Browse plugins" +msgstr "플러그인 찾아보기" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" -msgstr "" +msgstr "?에서 플러그인 ID를 가져 오는 데 실패했습니다" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 msgctxt "@info:tile" msgid "Warning" -msgstr "" +msgstr "경고" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 msgctxt "@window:title" msgid "Plugin browser" -msgstr "" +msgstr "플러그인 브라우저" #: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 msgctxt "@item:inmenu" msgid "Solid view" -msgstr "" +msgstr "단색보기" #: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 msgctxt "@item:inlistbox" msgid "G File" -msgstr "" +msgstr "G파일" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 msgctxt "@info:status" msgid "Parsing G-code" -msgstr "" +msgstr "G 코드 파싱" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 msgctxt "@info:title" msgid "G-code Details" -msgstr "" +msgstr "G 코드 세부 정보" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 msgctxt "@info:generic" -msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code " +"representation may not be accurate." msgstr "" +"파일을 보내기 전에 g 코드가 프린터 및 프린터 구성에 적합한 지 확인하십시오. g 코드 표현이 정확하지 않을 수 있습니다." #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "Cura Profile" -msgstr "" +msgstr "Cura 프로필" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 msgctxt "@item:inlistbox" msgid "3MF file" -msgstr "" +msgstr "3MF 파일" #: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 msgctxt "@item:inlistbox" msgid "Cura Project 3MF file" -msgstr "" +msgstr "Cura Project 3MF 파일" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 msgctxt "@action" msgid "Select upgrades" -msgstr "" +msgstr "업그레이드 선택" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 msgctxt "@action" msgid "Upgrade Firmware" -msgstr "" +msgstr "업그레이드 펌웨어" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 msgctxt "@action" msgid "Checkup" -msgstr "" +msgstr "대조" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 msgctxt "@action" msgid "Level build plate" -msgstr "" +msgstr "레벨 빌드 플레이트" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "외벽" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" -msgid "Outer Wall" -msgstr "" +msgid "Inner Walls" +msgstr "내벽" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" -msgid "Inner Walls" -msgstr "" +msgid "Skin" +msgstr "외판" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" -msgid "Skin" -msgstr "" +msgid "Infill" +msgstr "빈 공간 채우기" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" -msgid "Infill" -msgstr "" +msgid "Support Infill" +msgstr "빈 공간 채우기 지지" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" -msgid "Support Infill" -msgstr "" +msgid "Support Interface" +msgstr "지원 인터페이스" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" -msgid "Support Interface" -msgstr "" +msgid "Support" +msgstr "지지물" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" -msgid "Support" -msgstr "" +msgid "Skirt" +msgstr "둘러싸다" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" -msgid "Skirt" -msgstr "" +msgid "Travel" +msgstr "움직여 가다" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" -msgid "Travel" -msgstr "" +msgid "Retractions" +msgstr "취소" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" -msgid "Retractions" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 -msgctxt "@tooltip" msgid "Other" -msgstr "" +msgstr "다른" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 -msgctxt "@label unknown material" -msgid "Unknown" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" -msgstr "" +msgstr "미리 잘라낸 파일 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 msgctxt "@item:material" msgid "No material loaded" -msgstr "" +msgstr "로드 된 자료 없음" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 msgctxt "@item:material" msgid "Unknown material" -msgstr "" +msgstr "알 수없는 자료" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 msgctxt "@info:status" msgid "Finding new location for objects" -msgstr "" +msgstr "객체의 새 위치 삽입" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 msgctxt "@info:title" msgid "Finding Location" -msgstr "" +msgstr "위치 찾기" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" -msgstr "" +msgstr "모든 개체에 대한 빌드 볼륨 내의 위치를 찾을 수 없습니다" #: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 msgctxt "@info:title" msgid "Can't Find Location" -msgstr "" +msgstr "위치를 찾을 수 없음" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 msgctxt "@title:window" msgid "File Already Exists" -msgstr "" +msgstr "파일이 이미 있습니다" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" -msgstr "" +msgstr "파일이 이미 있습니다. 덮어 쓰시겠습니까?" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 msgctxt "@label" msgid "Custom" -msgstr "" +msgstr "맞춤" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 msgctxt "@label" msgid "Custom Material" -msgstr "" +msgstr "맞춤 소재" -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 -msgctxt "@menuitem" -msgid "Global" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 -msgctxt "@menuitem" -msgid "Not overridden" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." -msgstr "" +msgstr "선택한 재료가 선택한 기계 또는 구성과 호환되지 않습니다." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" -msgstr "" +msgstr "호환되지 않는 재료" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:status Has a cancel button next to it." msgid "The selected material diameter causes the material to become incompatible with the current printer." -msgstr "" +msgstr "선택한 재료 직경으로 인해 재료가 현재 프린터와 호환되지 않습니다." #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 msgctxt "@action:button" msgid "Undo" -msgstr "" +msgstr "풀어 놓다" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 msgctxt "@action" msgid "Undo changing the material diameter." -msgstr "" +msgstr "재료 직경 변경을 취소하십시오." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" -msgstr "" +msgstr "프로필을 ?로 내보내는데 실패했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." -msgstr "" +msgstr "프로필을 ?로 내보내지 못했습니다. Writer 플러그인이 오류를 보고했습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" -msgstr "" +msgstr "프로파일을 ?에 내보냅니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 msgctxt "@info:title" -msgid "Export succeeded" -msgstr "" +msgid "Export Details" +msgstr "세부 정보 내보내기" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" -msgstr "" +msgstr "?에서 프로필을 가져 오지 못했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" -msgstr "" +msgstr "프로필 {0}을 (를) 성공적으로 가져 왔습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." -msgstr "" +msgstr "프로파일 {0}에 알 수없는 파일 유형이 있거나 손상되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 msgctxt "@label" msgid "Custom profile" -msgstr "" +msgstr "사용자 정의 프로필" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 msgctxt "@info:status" msgid "Profile is missing a quality type." -msgstr "" +msgstr "프로필에 품질 유형이 누락되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." -msgstr "" +msgstr "현재 구성에 대해 품질 유형 {0}을 (를) 찾을 수 없습니다." #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" -msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." -msgstr "" +msgid "" +"The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from " +"colliding with printed models." +msgstr "\"인쇄 순서\"설정 값으로 인해 갠트리가 인쇄 된 모델과 충돌하지 않도록 빌드 볼륨 높이가 줄어 들었습니다." #: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 msgctxt "@info:title" msgid "Build Volume" -msgstr "" +msgstr "빌드 볼륨" #: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 msgctxt "@info:status" msgid "Multiplying and placing objects" -msgstr "" +msgstr "객체 곱하기 및 배치" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:title" msgid "Placing Object" -msgstr "" +msgstr "개체 배치 중" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 msgctxt "@title:window" msgid "Crash Report" -msgstr "" +msgstr "오류 보고서" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 -msgctxt "@label crash message" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" msgid "" -"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" -"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" -" " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 -msgctxt "@title:groupbox" -msgid "System information" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 -msgctxt "@label unknown version of Cura" -msgid "Unknown" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 -#, python-brace-format -msgctxt "@label Cura version" -msgid "Cura version: {version}
    " +"

    A fatal exception has occurred that we could not recover from!

    \n" +"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +" " msgstr "" +"복구 할 수없는 치명적인 예외가 발생했습니다!\n" +"http://github.com/Ultimaker/Cura/issues에 버그 보고서를 게시하십시오. " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -#, python-brace-format -msgctxt "@label Platform" -msgid "Platform: {platform}
    " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 -#, python-brace-format -msgctxt "@label Qt version" -msgid "Qt version: {qt}
    " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 -#, python-brace-format -msgctxt "@label PyQt version" -msgid "PyQt version: {pyqt}
    " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 -#, python-brace-format -msgctxt "@label OpenGL" -msgid "OpenGL: {opengl}
    " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 -#, python-brace-format -msgctxt "@label OpenGL version" -msgid "
  • OpenGL Version: {version}
  • " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 -#, python-brace-format -msgctxt "@label OpenGL vendor" -msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 -#, python-brace-format -msgctxt "@label OpenGL renderer" -msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 -msgctxt "@title:groupbox" -msgid "Exception traceback" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 -msgctxt "@title:groupbox" -msgid "Logs" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 -msgctxt "@title:groupbox" -msgid "User description" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" -msgid "Send report" -msgstr "" +msgid "Open Web Page" +msgstr "웹 페이지 열기" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 msgctxt "@info:progress" msgid "Loading machines..." -msgstr "" +msgstr "기계로드 중 ..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "장면 설정 중 ..." #: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" -msgid "Setting up scene..." -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 -msgctxt "@info:progress" msgid "Loading interface..." -msgstr "" +msgstr "인터페이스로드 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 #, python-format -msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " +"mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "" +msgstr "% (너비) .1f x % (깊이) .1f x % (높이) .1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" -msgstr "" +msgstr "한 번에 하나의 G 코드 파일만 로드 할 수 있습니다. 가져 오기를 건너 뛰었습니다." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" -msgstr "" - -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 -msgctxt "@info:status" -msgid "The selected model was too small to load." -msgstr "" +msgstr "G 코드가 로드되어 있으면 다른 파일을 열 수 없습니다. 가져 오기를 건너 뛰었습니다." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" -msgstr "" +msgstr "기계 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 msgctxt "@title:tab" msgid "Printer" -msgstr "" +msgstr "프린터" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 msgctxt "@label" msgid "Printer Settings" -msgstr "" +msgstr "프린터 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 msgctxt "@label" msgid "X (Width)" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 -msgctxt "@label" -msgid "mm" -msgstr "" +msgstr "X (너비)" +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -msgctxt "@label" -msgid "Y (Depth)" -msgstr "" - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -msgctxt "@label" -msgid "Z (Height)" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 -msgctxt "@label" -msgid "Build plate shape" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 -msgctxt "@option:check" -msgid "Origin at center" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 -msgctxt "@option:check" -msgid "Heated bed" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 -msgctxt "@label" -msgid "Gcode flavor" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 -msgctxt "@label" -msgid "Printhead Settings" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 -msgctxt "@label" -msgid "X min" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 -msgctxt "@tooltip" -msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 -msgctxt "@label" -msgid "Y min" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 -msgctxt "@tooltip" -msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 -msgctxt "@label" -msgid "X max" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 -msgctxt "@tooltip" -msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 -msgctxt "@label" -msgid "Y max" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 -msgctxt "@tooltip" -msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." -msgstr "" - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -msgctxt "@label" -msgid "Gantry height" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 -msgctxt "@tooltip" -msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 -msgctxt "@label" -msgid "Number of Extruders" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 -msgctxt "@tooltip" -msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 -msgctxt "@label" -msgid "Material diameter" -msgstr "" - +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (깊이)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (높이)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +msgctxt "@label" +msgid "Build plate shape" +msgstr "판 모양 만들기" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "센터 원점" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "가열된 베드" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "Gcode 플레이버" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "프린트 헤드 설정" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +msgctxt "@label" +msgid "X min" +msgstr "X 최소값" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"프린트 헤드 왼쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 " +"데 사용됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +msgctxt "@label" +msgid "Y min" +msgstr "Y 최소값" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"프린트 헤드 전면에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 " +"데 사용됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +msgctxt "@label" +msgid "X max" +msgstr "X 최대값" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"프린트 헤드의 오른쪽에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하" +"는 데 사용됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +msgctxt "@label" +msgid "Y max" +msgstr "Y 최대가" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " +"and the printhead when printing \"One at a Time\"." +msgstr "" +"프린트 헤드의 뒤쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하" +"는 데 사용됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +msgctxt "@label" +msgid "Gantry height" +msgstr "갠트리 높이" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions " +"between previous prints and the gantry when printing \"One at a Time\"." +msgstr "" +"노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 갠트리 사이의 충돌을 방" +"지하는 데 사용됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "압출기의 수" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or " +"the profile." +msgstr "프린터가 지원하는 필라멘트의 공칭 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 무시됩니다." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +msgctxt "@label" +msgid "Material diameter" +msgstr "재료 직경" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 msgctxt "@label" msgid "Nozzle size" -msgstr "" +msgstr "노즐 크기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 msgctxt "@label" msgid "Start Gcode" -msgstr "" +msgstr "Gcode 시작" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." -msgstr "" +msgstr "시작시 Gcode 명령이 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 msgctxt "@label" msgid "End Gcode" -msgstr "" +msgstr "Gcode 끝내기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." -msgstr "" +msgstr "Gcode 명령어가 맨 마지막에 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 msgctxt "@label" msgid "Nozzle Settings" -msgstr "" +msgstr "노즐 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 msgctxt "@label" msgid "Nozzle offset X" -msgstr "" +msgstr "노즐 오프셋 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 msgctxt "@label" msgid "Nozzle offset Y" -msgstr "" +msgstr "노즐 오프셋 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 msgctxt "@label" msgid "Extruder Start Gcode" -msgstr "" +msgstr "압출기 시작 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 msgctxt "@label" msgid "Extruder End Gcode" -msgstr "" +msgstr "압출기 종료 Gcode" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 msgctxt "@label" msgid "Changelog" -msgstr "" +msgstr "변경 내역" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 -#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" -msgstr "" +msgstr "닫기" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 msgctxt "@title:window" msgid "Firmware Update" -msgstr "" +msgstr "펌웨어 업데이트" #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 msgctxt "@label" msgid "Firmware update completed." -msgstr "" +msgstr "펌웨어 업데이트가 완료되었습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 msgctxt "@label" msgid "Starting firmware update, this may take a while." -msgstr "" +msgstr "펌웨어 업데이트를 시작하는 데 시간이 걸릴 수 있습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 msgctxt "@label" msgid "Updating firmware." -msgstr "" +msgstr "펌웨어 업데이트 중." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 msgctxt "@label" msgid "Firmware update failed due to an unknown error." -msgstr "" +msgstr "알 수없는 오류로 인해 펌웨어 업데이트에 실패했습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 msgctxt "@label" msgid "Firmware update failed due to an communication error." -msgstr "" +msgstr "통신 오류로 인해 펌웨어 업데이트에 실패했습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 msgctxt "@label" msgid "Firmware update failed due to an input/output error." -msgstr "" +msgstr "입 / 출력 오류로 인해 펌웨어 업데이트에 실패했습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 msgctxt "@label" msgid "Firmware update failed due to missing firmware." -msgstr "" +msgstr "펌웨어 누락으로 인해 펌웨어 업데이트에 실패했습니다." #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 msgctxt "@label" msgid "Unknown error code: %1" -msgstr "" +msgstr "알 수없는 오류 코드 : % 1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" -msgstr "" +msgstr "네트워크 프린터에 연결" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" -"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a " +"network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can " +"still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" msgstr "" +":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크" +"에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전" +"송할 수 있습니다\n" +"\n" +"아래 목록에서 프린터를 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" -msgstr "" +msgstr "추가" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" -msgstr "" +msgstr "편집" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 msgctxt "@action:button" msgid "Remove" -msgstr "" +msgstr "제거" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" -msgstr "" +msgstr "새롭게 하다" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" -msgstr "" +msgstr "프린터가 목록에 없으면 네트워크 인쇄 문제 해결 가이드를 읽어보십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 msgctxt "@label" msgid "Type" -msgstr "" +msgstr "유형" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 msgctxt "@label" msgid "Ultimaker 3" -msgstr "" +msgstr "얼티메이커 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 msgctxt "@label" msgid "Ultimaker 3 Extended" -msgstr "" +msgstr "얼티메이커 3 확장판" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "알 수 없는" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 msgctxt "@label" msgid "Firmware version" -msgstr "" +msgstr "펌웨어 버전" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 msgctxt "@label" msgid "Address" -msgstr "" +msgstr "주소" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 msgctxt "@label" msgid "The printer at this address has not yet responded." -msgstr "" +msgstr "이 주소의 프린터가 아직 응답하지 않았습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" -msgstr "" +msgstr "연결" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 msgctxt "@title:window" msgid "Printer Address" -msgstr "" +msgstr "프린터 주소" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." -msgstr "" +msgstr "네트워크에 프린터의 IP 주소 또는 호스트 이름을 입력하십시오." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +msgctxt "@action:button" +msgid "Ok" +msgstr "승인" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "프린터에 연결" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "Cura에 프린터 구성 로드" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "구성 활성화" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 +msgctxt "@label" +msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +msgstr "이 프린터는 Ultimaker 3 프린터에 연결된 그룹을 호스트하도록 설정되지 않았습니다" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 +msgctxt "@label" +msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +msgstr "이 프린터는 Ultimaker 3에 연결된 프린터 그룹의 호스트입니다" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "네트워크를 통해 인쇄" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하도록 설정되지 않았습니다" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 +msgctxt "@label:status" +msgid "Printing" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 +msgctxt "@label:status" +msgid "Reserved" +msgstr "예약된" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 +msgctxt "@label:status" +msgid "Finished" +msgstr "끝마친" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 +msgctxt "@label:status" +msgid "Preparing" +msgstr "준비중인" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 +msgctxt "@label:status" +msgid "Available" +msgstr "유효한" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 +msgctxt "@label" +msgid "Completed on: " +msgstr "완료일 " + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 +msgctxt "@label" +msgid "Clear build plate" +msgstr "클리어 빌드 플레이트" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 +msgctxt "@label" +msgid "Preparing to print" +msgstr "인쇄 준비" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "인쇄 작업을 수락하지 않음" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "기본 웹 브라우저로 인쇄 작업 페이지를 엽니다." + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "인쇄 작업보기" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 +msgctxt "@label" +msgid "PRINTER GROUP" +msgstr "프린터 그룹" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 +msgctxt "@title" +msgid "Print jobs" +msgstr "인쇄 작업" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 +msgctxt "@label" +msgid "Printing" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 +msgctxt "@label" +msgid "Queued" +msgstr "대기 중" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "구성 변경 대기" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 +msgctxt "@label:title" +msgid "Printers" +msgstr "프린터" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 +msgctxt "@action:button" +msgid "View printers" +msgstr "프린터보기" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Cura SolidWorks Plugin 설정" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "내 보낸 STL의 기본 품질 :" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "항상 물어보다" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "항상 좋은 품질을 사용하십시오" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "거친 품질을 항상 사용하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" msgid "OK" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 -msgctxt "@label" -msgid "Preparing to print" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 -msgctxt "@label:status" -msgid "Printing" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 -msgctxt "@label:status" -msgid "Available" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 -msgctxt "@label:status" -msgid "Disabled" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 -msgctxt "@label:status" -msgid "Reserved" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 -msgctxt "@label:status" -msgid "Finished" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 -msgctxt "@label:status" -msgid "Paused" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 -msgctxt "@label:status" -msgid "Resuming" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 -msgctxt "@label:status" -msgid "Print aborted" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 -msgctxt "@label" -msgid "Finishes at: " -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 -msgctxt "@label" -msgid "Clear build plate" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 -msgctxt "@title" -msgid "Print jobs" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 -msgctxt "@label" -msgid "Printing" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 -msgctxt "@label" -msgid "Queued" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 -msgctxt "@label:title" -msgid "Printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 -msgctxt "@action:button" -msgid "View printers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -msgctxt "@info:tooltip" -msgid "Connect to a printer" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -msgctxt "@info:tooltip" -msgid "Load the configuration of the printer into Cura" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -msgctxt "@action:button" -msgid "Activate Configuration" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 -msgctxt "@title:window" -msgid "Cura SolidWorks Plugin Configuration" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 -msgctxt "@action:label" -msgid "Default quality of the exported STL:" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Always ask" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Fine quality" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 -msgctxt "@option:curaSolidworksStlQuality" -msgid "Always use Coarse quality" -msgstr "" +msgstr "승인" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." -msgstr "" +msgstr "SolidWorks 파일을 STL로 가져 오기 ..." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 msgctxt "@info:tooltip" msgid "Quality of the Exported STL" -msgstr "" +msgstr "내보낸 STL의 품질" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 msgctxt "@action:label" msgid "Quality" -msgstr "" +msgstr "품질" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 msgctxt "@option:curaSolidworksStlQuality" msgid "Coarse" -msgstr "" +msgstr "결이 거친" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 msgctxt "@option:curaSolidworksStlQuality" msgid "Fine" -msgstr "" +msgstr "우수한" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 msgctxt "@text:window" msgid "Remember my choice" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 -msgctxt "@label" -msgid "Color scheme" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 -msgctxt "@label:listbox" -msgid "Feedrate" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 -msgctxt "@label:listbox" -msgid "Layer thickness" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 -msgctxt "@label" -msgid "Show Travels" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 -msgctxt "@label" -msgid "Show Helpers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 -msgctxt "@label" -msgid "Show Shell" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 -msgctxt "@label" -msgid "Show Infill" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 -msgctxt "@label" -msgid "Inner Wall" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 -msgctxt "@label" -msgid "min" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 -msgctxt "@label" -msgid "max" -msgstr "" +msgstr "내 선택을 기억하라" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" -msgstr "" +msgstr "사후 처리 플러그인" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 msgctxt "@label" msgid "Post Processing Scripts" -msgstr "" +msgstr "사후 처리 스크립트" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 msgctxt "@action" msgid "Add a script" -msgstr "" +msgstr "스크립트 추가" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 msgctxt "@label" msgid "Settings" -msgstr "" +msgstr "설정" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" -msgstr "" +msgstr "활성 사후 처리 스크립트 변경" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 +msgctxt "@label" +msgid "Color scheme" +msgstr "색 구성표" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "재질 색상" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "라인 유형" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "호환 모드" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 +msgctxt "@label" +msgid "Show Travels" +msgstr "이동 표시" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 +msgctxt "@label" +msgid "Show Helpers" +msgstr "도움말 보이기" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 +msgctxt "@label" +msgid "Show Shell" +msgstr "셸 표시" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 +msgctxt "@label" +msgid "Show Infill" +msgstr "충전물 표시" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "상단 레이어 만 표시" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "상단에 5 개의 세부 레이어 표시" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "위 / 아래" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 +msgctxt "@label" +msgid "Inner Wall" +msgstr "내벽" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." -msgstr "" +msgstr "이미지 변환 ..." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 msgctxt "@info:tooltip" msgid "The maximum distance of each pixel from \"Base.\"" -msgstr "" +msgstr "\"Base\"에서 각 픽셀까지의 최대 거리입니다" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 msgctxt "@action:label" msgid "Height (mm)" -msgstr "" +msgstr "높이 (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 msgctxt "@info:tooltip" msgid "The base height from the build plate in millimeters." -msgstr "" +msgstr "밀리미터 단위의 빌드 플레이트에서 기저부 높이." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 msgctxt "@action:label" msgid "Base (mm)" -msgstr "" +msgstr "바다 (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 msgctxt "@info:tooltip" msgid "The width in millimeters on the build plate." -msgstr "" +msgstr "빌드 플레이트의 폭 (밀리미터)." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 msgctxt "@action:label" msgid "Width (mm)" -msgstr "" +msgstr "너비 (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "" +msgstr "빌드 플레이트의 깊이 (밀리미터)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" msgid "Depth (mm)" -msgstr "" +msgstr "깊이 (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 msgctxt "@info:tooltip" -msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." +msgid "" +"By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this " +"option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low " +"points on the mesh." msgstr "" +"기본적으로 흰색 픽셀은 메쉬에서 높은 점을 나타내고 검정색 픽셀은 메쉬에서 낮은 점을 나타냅니다. 이 옵션을 변경하면 검은 픽" +"셀이 메쉬의 높은 점을 나타내고 흰색 픽셀은 메쉬의 낮은 점을 나타냅니다." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" msgid "Lighter is higher" -msgstr "" +msgstr "환하다" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" msgid "Darker is higher" -msgstr "" +msgstr "어둡다" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 msgctxt "@info:tooltip" msgid "The amount of smoothing to apply to the image." -msgstr "" +msgstr "이미지를 부드럽게 적용 할 정도입니다." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 msgctxt "@action:label" msgid "Smoothing" -msgstr "" +msgstr "부드럽게하기" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 msgctxt "@action:button" msgid "Select settings" -msgstr "" +msgstr "설정 선택" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 msgctxt "@title:window" msgid "Select Settings to Customize for this model" -msgstr "" +msgstr "이 모델에 맞게 사용자 정의 설정을 선택하십시오" #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 msgctxt "@label:textbox" msgid "Filter..." -msgstr "" +msgstr "필터..." #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 msgctxt "@label:checkbox" msgid "Show all" -msgstr "" +msgstr "모두 보이기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 msgctxt "@title:window" msgid "Open Project" -msgstr "" +msgstr "프로젝트 열기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 msgctxt "@action:ComboBox option" msgid "Update existing" -msgstr "" +msgstr "기존 업데이트" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 msgctxt "@action:ComboBox option" msgid "Create new" -msgstr "" +msgstr "새로 만들기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 msgctxt "@action:title" msgid "Summary - Cura Project" -msgstr "" +msgstr "요약 - Cura 프로젝트" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 msgctxt "@action:label" msgid "Printer settings" -msgstr "" +msgstr "프린터 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" -msgstr "" +msgstr "기계의 충돌을 어떻게 해결해야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 msgctxt "@action:label" msgid "Type" -msgstr "" +msgstr "유형" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 msgctxt "@action:label" msgid "Name" -msgstr "" +msgstr "이름" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 msgctxt "@action:label" msgid "Profile settings" -msgstr "" +msgstr "프로필 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" -msgstr "" +msgstr "프로필의 충돌을 어떻게 해결해야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 msgctxt "@action:label" msgid "Not in profile" -msgstr "" +msgstr "프로필에 없음" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "무시하다" +msgstr[1] "무시하다" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 msgctxt "@action:label" msgid "Derivative from" -msgstr "" +msgstr "파생 상품" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "무시하다" +msgstr[1] "무시하다" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 msgctxt "@action:label" msgid "Material settings" -msgstr "" +msgstr "재질 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" -msgstr "" +msgstr "자료의 충돌은 어떻게 해결되어야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 msgctxt "@action:label" msgid "Setting visibility" -msgstr "" +msgstr "가시성 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 msgctxt "@action:label" msgid "Mode" -msgstr "" +msgstr "종류" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 msgctxt "@action:label" msgid "Visible settings:" -msgstr "" +msgstr "표시 설정 :" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 msgctxt "@action:label" msgid "%1 out of %2" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgid "Loading a project will clear all models on the buildplate" +msgstr "프로젝트를 로드하면 빌드 플레이트의 모든 모델이 지워집니다" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 msgctxt "@action:button" msgid "Open" -msgstr "" +msgstr "열다" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 msgctxt "@title:window" msgid "Find & Update plugins" -msgstr "" +msgstr "플러그인 찾기 및 업데이트" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 msgctxt "@label" msgid "Here you can find a list of Third Party plugins." -msgstr "" +msgstr "여기서 제 3 자 플러그인 목록을 찾을 수 있습니다." #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 msgctxt "@action:button" msgid "Upgrade" -msgstr "" +msgstr "업그레이드" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 msgctxt "@action:button" msgid "Installed" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 -msgctxt "@action:button" -msgid "Download" -msgstr "" +msgstr "설치됨" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" -msgstr "" +msgstr "플러그인 라이센스 계약" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -"This plugin contains a license.\n" +" plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" +"플러그인에는 라이센스가 포함되어 있습니다.\n" +"이 플러그인을 설치하려면이 라이센스를 수락해야합니다.\n" +"아래 약관에 동의하십니까?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" msgid "Accept" -msgstr "" +msgstr "동의" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 msgctxt "@action:button" msgid "Decline" -msgstr "" - -#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 -msgctxt "@title:window" -msgid "User Agreement" -msgstr "" +msgstr "거절" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" msgid "Select Printer Upgrades" -msgstr "" +msgstr "프린터 업그레이드 선택" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker 2." -msgstr "" +msgstr "이 Ultimaker 2 업그레이드를 선택하십시오." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 msgctxt "@label" msgid "Olsson Block" -msgstr "" +msgstr "올손 블록" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 msgctxt "@title" msgid "Build Plate Leveling" -msgstr "" +msgstr "빌드 플레이트 평준화" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 msgctxt "@label" -msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." +msgid "" +"To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' " +"the nozzle will move to the different positions that can be adjusted." msgstr "" +"지문이 크게 나오지 않도록 빌드 플레이트를 조정할 수 있습니다. '다음 위치로 이동'을 클릭하면 노즐이 조정할 수있는 다른 위치" +"로 이동합니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 msgctxt "@label" -msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build " +"plate height is right when the paper is slightly gripped by the tip of the nozzle." msgstr "" +"모든 자리를 위해; 노즐 아래에 종이 한 장을 넣고 인쇄 빌드 플레이트 높이를 조정하십시오. 인쇄물 받침판 높이는 용지의 끝 부" +"분이 용지를 살짝 쥐었을 때의 높이입니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" msgid "Start Build Plate Leveling" -msgstr "" +msgstr "Build Plate Leveling 시작하기" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 msgctxt "@action:button" msgid "Move to Next Position" -msgstr "" +msgstr "다음 위치로 이동" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 msgctxt "@title" msgid "Upgrade Firmware" -msgstr "" +msgstr "펌웨어 업그레이드" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 msgctxt "@label" -msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates " +"the temperature and ultimately makes your printer work." msgstr "" +"펌웨어는 3D 프린터에서 직접 실행되는 소프트웨어입니다. 이 펌웨어는 스텝 모터를 제어하고 온도를 조절하며 궁극적으로 프린터" +"를 작동시킵니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 msgctxt "@label" msgid "The firmware shipping with new printers works, but new versions tend to have more features and improvements." -msgstr "" +msgstr "새 프린터와 함께 제공되는 펌웨어는 작동하지만 새 버전은 더 많은 기능과 향상된 기능을 제공하는 경향이 있습니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 msgctxt "@action:button" msgid "Automatically upgrade Firmware" -msgstr "" +msgstr "펌웨어 자동 업그레이드" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 msgctxt "@action:button" msgid "Upload custom Firmware" -msgstr "" +msgstr "맞춤 펌웨어 업로드" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 msgctxt "@title:window" msgid "Select custom firmware" -msgstr "" +msgstr "사용자 정의 펌웨어 선택" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 msgctxt "@label" msgid "Please select any upgrades made to this Ultimaker Original" -msgstr "" +msgstr "이 Ultimaker Original로 업그레이드 한 항목을 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 msgctxt "@label" msgid "Heated Build Plate (official kit or self-built)" -msgstr "" +msgstr "가열 된 빌드 플레이트 (공식 키트 또는 자체 조립식)" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 msgctxt "@title" msgid "Check Printer" -msgstr "" +msgstr "프린터 확인" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 msgctxt "@label" -msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" -msgstr "" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is " +"functional" +msgstr "Ultimaker에서 몇 가지 분별 검사를 하는 것이 좋습니다. 기계가 작동하는지 알면 이 단계를 건너 뛸 수 있습니다" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 msgctxt "@action:button" msgid "Start Printer Check" -msgstr "" +msgstr "프린터 확인 시작" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 msgctxt "@label" msgid "Connection: " -msgstr "" +msgstr "연결 " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" msgid "Connected" -msgstr "" +msgstr "연결됨" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 msgctxt "@info:status" msgid "Not connected" -msgstr "" +msgstr "연결되지 않은" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 msgctxt "@label" msgid "Min endstop X: " -msgstr "" +msgstr "최소 엔드 스톱 X " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 msgctxt "@info:status" msgid "Works" -msgstr "" +msgstr "작업" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 @@ -2315,118 +2330,123 @@ msgstr "" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 msgctxt "@info:status" msgid "Not checked" -msgstr "" +msgstr "확인되지 않음" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 msgctxt "@label" msgid "Min endstop Y: " -msgstr "" +msgstr "최소 엔드 스톱 Y " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 msgctxt "@label" msgid "Min endstop Z: " -msgstr "" +msgstr "최소 엔드 스톱 Z " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 msgctxt "@label" msgid "Nozzle temperature check: " -msgstr "" +msgstr "노즐 온도 확인 " #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 msgctxt "@action:button" msgid "Stop Heating" -msgstr "" +msgstr "난방 장치 중지" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 msgctxt "@action:button" msgid "Start Heating" -msgstr "" +msgstr "난방 시작" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 msgctxt "@label" msgid "Build plate temperature check:" -msgstr "" +msgstr "빌드 플레이트 온도 확인 :" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 msgctxt "@info:status" msgid "Checked" -msgstr "" +msgstr "체크 됨" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 msgctxt "@label" msgid "Everything is in order! You're done with your CheckUp." -msgstr "" +msgstr "당신의 점검으로 모든 것이 순조롭게 끝났습니다." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 msgctxt "@label:MonitorStatus" msgid "Not connected to a printer" -msgstr "" +msgstr "프린터에 연결되지 않음" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 msgctxt "@label:MonitorStatus" msgid "Printer does not accept commands" -msgstr "" +msgstr "프린터가 명령을 받아들이지 않습니다" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" -msgstr "" +msgstr "유지 보수 중. 프린터를 확인하십시오" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "프린터와의 연결이 끊어졌습니다" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 -msgctxt "@label:MonitorStatus" -msgid "Printing..." -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" -msgid "Paused" -msgstr "" +msgid "Printing..." +msgstr "인쇄..." -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "일시 중지됨" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" msgid "Preparing..." -msgstr "" +msgstr "준비 중 ..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 msgctxt "@label:MonitorStatus" msgid "Please remove the print" -msgstr "" +msgstr "인쇄를 제거하십시오" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 msgctxt "@label:" msgid "Resume" -msgstr "" +msgstr "다시 시작하다" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 msgctxt "@label:" msgid "Pause" -msgstr "" +msgstr "중지" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 msgctxt "@label:" msgid "Abort Print" -msgstr "" +msgstr "인쇄 중단" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 msgctxt "@window:title" msgid "Abort print" -msgstr "" +msgstr "인쇄 중단" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 msgctxt "@label" msgid "Are you sure you want to abort the print?" -msgstr "" +msgstr "인쇄를 중단 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 msgctxt "@title:window" msgid "Discard or Keep changes" -msgstr "" +msgstr "변경 사항 삭제 또는 유지" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 msgctxt "@text:window" @@ -2434,642 +2454,648 @@ msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" msgstr "" +"일부 프로필 설정을 사용자 지정했습니다.\n" +"이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" msgid "Profile settings" -msgstr "" +msgstr "프로필 설정" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 msgctxt "@title:column" msgid "Default" -msgstr "" +msgstr "기본값" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 msgctxt "@title:column" msgid "Customized" -msgstr "" +msgstr "맞춤형" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 msgctxt "@option:discardOrKeep" msgid "Always ask me this" -msgstr "" +msgstr "항상 이걸 내게 부탁해" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 msgctxt "@option:discardOrKeep" msgid "Discard and never ask again" -msgstr "" +msgstr "버리고 다시 묻지 마십시오" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 msgctxt "@option:discardOrKeep" msgid "Keep and never ask again" -msgstr "" +msgstr "계속하고 다시 묻지 마라" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 msgctxt "@action:button" msgid "Discard" -msgstr "" +msgstr "폐기하다" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 msgctxt "@action:button" msgid "Keep" -msgstr "" +msgstr "유지하다" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 msgctxt "@action:button" msgid "Create New Profile" -msgstr "" +msgstr "새 프로필 만들기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 msgctxt "@title" msgid "Information" -msgstr "" +msgstr "정보" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 msgctxt "@label" msgid "Display Name" -msgstr "" +msgstr "표시 이름" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 msgctxt "@label" msgid "Brand" -msgstr "" +msgstr "상표" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 msgctxt "@label" msgid "Material Type" -msgstr "" +msgstr "자재 유형" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 msgctxt "@label" msgid "Color" -msgstr "" +msgstr "색깔" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 msgctxt "@label" msgid "Properties" -msgstr "" +msgstr "속성" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 msgctxt "@label" msgid "Density" -msgstr "" +msgstr "밀도" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 msgctxt "@label" msgid "Diameter" -msgstr "" +msgstr "직경" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 msgctxt "@label" msgid "Filament Cost" -msgstr "" +msgstr "필라멘트 비용" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 msgctxt "@label" msgid "Filament weight" -msgstr "" +msgstr "필라멘트 무게" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 msgctxt "@label" msgid "Filament length" -msgstr "" +msgstr "필라멘트 길이" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 msgctxt "@label" msgid "Cost per Meter" -msgstr "" +msgstr "미터 당 비용" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 msgctxt "@label" msgid "This material is linked to %1 and shares some of its properties." -msgstr "" +msgstr "이 자료는 ?에 연결되어 있으며 일부 속성을 공유합니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 msgctxt "@label" msgid "Unlink Material" -msgstr "" +msgstr "재질 연결 해제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 msgctxt "@label" msgid "Description" -msgstr "" +msgstr "기술" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 msgctxt "@label" msgid "Adhesion Information" -msgstr "" +msgstr "접착 정보" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 msgctxt "@label" msgid "Print settings" -msgstr "" +msgstr "인쇄 설정" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 msgctxt "@title:tab" msgid "Setting Visibility" -msgstr "" +msgstr "공개 설정하기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 msgctxt "@label:textbox" msgid "Check all" -msgstr "" +msgstr "모두 확인" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 msgctxt "@info:status" msgid "Calculated" -msgstr "" +msgstr "계획된" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 msgctxt "@title:column" msgid "Setting" -msgstr "" +msgstr "설정" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 msgctxt "@title:column" msgid "Profile" -msgstr "" +msgstr "윤곽" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 msgctxt "@title:column" msgid "Current" -msgstr "" +msgstr "흐름" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 msgctxt "@title:column" msgid "Unit" -msgstr "" +msgstr "단위" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 msgctxt "@title:tab" msgid "General" -msgstr "" +msgstr "일반" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 msgctxt "@label" msgid "Interface" -msgstr "" +msgstr "인터페이스" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 msgctxt "@label" msgid "Language:" -msgstr "" +msgstr "언어:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 msgctxt "@label" msgid "Currency:" -msgstr "" +msgstr "통화:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 msgctxt "@label" msgid "Theme:" -msgstr "" +msgstr "테마:" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 msgctxt "@label" msgid "You will need to restart the application for these changes to have effect." -msgstr "" +msgstr "이러한 변경 사항을 적용하려면 응용 프로그램을 다시 시작해야합니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 msgctxt "@info:tooltip" msgid "Slice automatically when changing settings." -msgstr "" +msgstr "설정을 변경할 때 자동으로 슬라이스합니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 msgctxt "@option:check" msgid "Slice automatically" -msgstr "" +msgstr "자동으로 슬라이스" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 msgctxt "@label" msgid "Viewport behavior" -msgstr "" +msgstr "뷰포트 동작" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 msgctxt "@info:tooltip" msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly." -msgstr "" +msgstr "지원되지 않는 모델 영역을 빨간색으로 강조 표시하십시오. 지지무이 없으면 이 영역이 제대로 인쇄되지 않습니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 msgctxt "@option:check" msgid "Display overhang" -msgstr "" +msgstr "오버행 표시" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 msgctxt "@info:tooltip" msgid "Moves the camera so the model is in the center of the view when a model is selected" -msgstr "" +msgstr "모델을 선택하면 모델이 뷰의 가운데에 오도록 카메라를 이동합니다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 msgctxt "@action:button" msgid "Center camera when item is selected" -msgstr "" +msgstr "항목을 선택하면 중앙 카메라" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 msgctxt "@info:tooltip" msgid "Should the default zoom behavior of cura be inverted?" -msgstr "" +msgstr "cura의 기본 확대 / 축소 동작을 반전시켜야합니까" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 msgctxt "@action:button" msgid "Invert the direction of camera zoom." -msgstr "" +msgstr "카메라 줌의 방향을 반전시킵니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 msgctxt "@info:tooltip" msgid "Should zooming move in the direction of the mouse?" -msgstr "" +msgstr "확대 / 축소가 마우스 방향으로 이동해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 msgctxt "@action:button" msgid "Zoom toward mouse direction" -msgstr "" +msgstr "마우스 방향으로 확대 / 축소" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 msgctxt "@info:tooltip" msgid "Should models on the platform be moved so that they no longer intersect?" -msgstr "" +msgstr "플랫폼의 모델을 더 이상 교차시키지 않도록 이동해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 msgctxt "@option:check" msgid "Ensure models are kept apart" -msgstr "" +msgstr "모델이 분리되어 있는지 확인하십시오" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 msgctxt "@info:tooltip" msgid "Should models on the platform be moved down to touch the build plate?" -msgstr "" +msgstr "플랫폼의 모델을 빌드 플레이트에 닿도록 아래로 움직여야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 msgctxt "@option:check" msgid "Automatically drop models to the build plate" -msgstr "" +msgstr "모델을 빌드 플레이트에 자동으로 놓기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 msgctxt "@info:tooltip" msgid "Show caution message in gcode reader." -msgstr "" +msgstr "gcode 리더에 주의 메시지를 표시하십시오" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 msgctxt "@option:check" msgid "Caution message in gcode reader" -msgstr "" +msgstr "gcode 리더의 주의 메시지" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 msgctxt "@info:tooltip" msgid "Should layer be forced into compatibility mode?" -msgstr "" +msgstr "레이어가 호환 모드로 강제 설정되어야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 msgctxt "@option:check" msgid "Force layer view compatibility mode (restart required)" -msgstr "" +msgstr "강제 레이어보기 호환성 모드 (다시 시작해야 함)" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 msgctxt "@label" msgid "Opening and saving files" -msgstr "" +msgstr "파일 열기 및 저장" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 msgctxt "@info:tooltip" msgid "Should models be scaled to the build volume if they are too large?" -msgstr "" +msgstr "크기가 너무 큰 경우 모델을 빌드 볼륨에 맞게 조정해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 msgctxt "@option:check" msgid "Scale large models" -msgstr "" +msgstr "대형 모델 확장" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 msgctxt "@info:tooltip" -msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" -msgstr "" +msgid "" +"An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be " +"scaled up?" +msgstr "단위가 밀리미터가 아닌 미터 단위 인 경우 모델이 매우 작게 나타날 수 있습니다. 이 모델을 확장해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 msgctxt "@option:check" msgid "Scale extremely small models" -msgstr "" +msgstr "매우 작은 모델의 크기 조정" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 msgctxt "@info:tooltip" msgid "Should a prefix based on the printer name be added to the print job name automatically?" -msgstr "" +msgstr "프린터 이름에 기반한 접두어가 인쇄 작업 이름에 자동으로 추가되어야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 msgctxt "@option:check" msgid "Add machine prefix to job name" -msgstr "" +msgstr "작업 이름에 기계 접두어 추가" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 msgctxt "@info:tooltip" msgid "Should a summary be shown when saving a project file?" -msgstr "" +msgstr "프로젝트 파일을 저장할 때 요약이 표시되어야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 msgctxt "@option:check" msgid "Show summary dialog when saving project" -msgstr "" +msgstr "프로젝트 저장시 요약 대화 상자 표시" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 msgctxt "@info:tooltip" msgid "Default behavior when opening a project file" -msgstr "" +msgstr "프로젝트 파일을 열 때 기본 동작" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 msgctxt "@window:text" msgid "Default behavior when opening a project file: " -msgstr "" +msgstr "프로젝트 파일을 열 때 기본 동작 " #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 msgctxt "@option:openProject" msgid "Always ask" -msgstr "" +msgstr "항상 물어보다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 msgctxt "@option:openProject" msgid "Always open as a project" -msgstr "" +msgstr "항상 프로젝트로 여십시오" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 msgctxt "@option:openProject" msgid "Always import models" -msgstr "" +msgstr "항상 모델 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 msgctxt "@info:tooltip" -msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgid "" +"When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want " +"to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." msgstr "" +"프로필을 변경하고 다른 프로필로 전환하면 수정 사항을 유지할지 여부를 묻는 대화 상자가 표시되거나 기본 행동을 선택하고 해" +"당 대화 상자를 다시 표시 할 수 없습니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 msgctxt "@label" msgid "Override Profile" -msgstr "" +msgstr "프로필 재정의" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 msgctxt "@label" msgid "Privacy" -msgstr "" +msgstr "은둔" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 msgctxt "@info:tooltip" msgid "Should Cura check for updates when the program is started?" -msgstr "" +msgstr "Cura가 프로그램이 시작될 때 업데이트를 확인해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 msgctxt "@option:check" msgid "Check for updates on start" -msgstr "" +msgstr "시작시 업데이트 확인" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 msgctxt "@info:tooltip" -msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally " +"identifiable information is sent or stored." msgstr "" +"인쇄물에 대한 익명의 데이터를 Ultimaker로 보내야합니까? 모델, IP 주소 또는 기타 개인 식별 정보는 전송되거나 저장되지 않습" +"니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 msgctxt "@option:check" msgid "Send (anonymous) print information" -msgstr "" +msgstr "인쇄 (익명) 인쇄 정보" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 msgctxt "@title:tab" msgid "Printers" -msgstr "" +msgstr "프린터" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 msgctxt "@action:button" msgid "Activate" -msgstr "" +msgstr "활성화" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 msgctxt "@action:button" msgid "Rename" -msgstr "" +msgstr "이름 바꾸기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 msgctxt "@label" msgid "Printer type:" -msgstr "" +msgstr "프린터 유형 :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 msgctxt "@label" msgid "Connection:" -msgstr "" +msgstr "연결:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." -msgstr "" +msgstr "프린터가 연결되어 있지 않습니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 msgctxt "@label" msgid "State:" -msgstr "" +msgstr "상태:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" -msgstr "" +msgstr "누군가가 빌드 플레이트를 지울 때까지 기다리는 중입니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" -msgstr "" +msgstr "인쇄거리를 기다리는 중" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 msgctxt "@title:tab" msgid "Profiles" -msgstr "" +msgstr "프로필" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 msgctxt "@label" msgid "Protected profiles" -msgstr "" +msgstr "보호 된 프로필" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 msgctxt "@label" msgid "Custom profiles" -msgstr "" +msgstr "사용자 정의 프로파일" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 msgctxt "@label" msgid "Create" -msgstr "" +msgstr "창조하다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 msgctxt "@label" msgid "Duplicate" -msgstr "" +msgstr "복제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 msgctxt "@action:button" msgid "Import" -msgstr "" +msgstr "가져오다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 msgctxt "@action:button" msgid "Export" -msgstr "" +msgstr "내보내다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 msgctxt "@label %1 is printer name" msgid "Printer: %1" -msgstr "" +msgstr "프린터" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 msgctxt "@action:button" msgid "Update profile with current settings/overrides" -msgstr "" +msgstr "현재 설정 / 재정의 프로필 업데이트" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 msgctxt "@action:button" msgid "Discard current changes" -msgstr "" +msgstr "현재 변경 사항 삭제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 msgctxt "@action:label" msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below." -msgstr "" +msgstr "이 프로필은 프린터에서 지정한 기본값을 사용하므로 아래 목록에 아무런 설정 / 재정의가 없습니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 msgctxt "@action:label" msgid "Your current settings match the selected profile." -msgstr "" +msgstr "현재 설정이 선택한 프로필과 일치합니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 msgctxt "@title:tab" msgid "Global Settings" -msgstr "" +msgstr "전역 설정" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 msgctxt "@title:window" msgid "Rename Profile" -msgstr "" +msgstr "프로필 이름 바꾸기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 msgctxt "@title:window" msgid "Create Profile" -msgstr "" +msgstr "프로필 작성" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 msgctxt "@title:window" msgid "Duplicate Profile" -msgstr "" +msgstr "중복 프로필" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 msgctxt "@window:title" msgid "Import Profile" -msgstr "" +msgstr "프로필 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 msgctxt "@title:window" msgid "Import Profile" -msgstr "" +msgstr "프로필 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 msgctxt "@title:window" msgid "Export Profile" -msgstr "" +msgstr "프로필 내보내기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 msgctxt "@title:tab" msgid "Materials" -msgstr "" +msgstr "자재" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 msgctxt "@action:label %1 is printer name, %2 is how this printer names variants, %3 is variant name" msgid "Printer: %1, %2: %3" -msgstr "" +msgstr "프린터" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 msgctxt "@action:label %1 is printer name" msgid "Printer: %1" -msgstr "" +msgstr "프린터" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 msgctxt "@action:button" msgid "Create" -msgstr "" +msgstr "창조하다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 msgctxt "@action:button" msgid "Duplicate" -msgstr "" +msgstr "복제" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 msgctxt "@title:window" msgid "Import Material" -msgstr "" +msgstr "재료 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 msgctxt "@info:status Don't translate the XML tags or !" msgid "Could not import material %1: %2" -msgstr "" +msgstr "자재를 가져올 수 없습니다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully imported material %1" -msgstr "" +msgstr "자재를 성공적으로 가져왔습니다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 msgctxt "@title:window" msgid "Export Material" -msgstr "" +msgstr "자재 내보내기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 msgctxt "@info:status Don't translate the XML tags and !" msgid "Failed to export material to %1: %2" -msgstr "" +msgstr "자재를 내보내는데 실패했습니다" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" -msgstr "" +msgstr "자재를 성공적으로 내보냈습니다" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 msgctxt "@title:window" msgid "Add Printer" -msgstr "" +msgstr "프린터 추가" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 msgctxt "@label" msgid "Printer Name:" -msgstr "" +msgstr "프린터 이름 :" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 msgctxt "@action:button" msgid "Add Printer" -msgstr "" +msgstr "프린터 추가" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 msgctxt "@title:window" msgid "About Cura" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 -msgctxt "@label" -msgid "version: %1" -msgstr "" +msgstr "Cura 소개" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." -msgstr "" +msgstr "3D 인쇄를 위해 필라멘트를 한줄로 용" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 msgctxt "@info:credit" @@ -3077,149 +3103,144 @@ msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" msgstr "" +"Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\n" +"Cura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" msgid "Graphical user interface" -msgstr "" +msgstr "그래픽 사용자 인터페이스" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 msgctxt "@label" msgid "Application framework" -msgstr "" +msgstr "애플리케이션 프레임 워크" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 msgctxt "@label" msgid "GCode generator" -msgstr "" +msgstr "GCode 생성기" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 msgctxt "@label" msgid "Interprocess communication library" -msgstr "" +msgstr "프로세스간 통신 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 msgctxt "@label" msgid "Programming language" -msgstr "" +msgstr "프로그래밍 언어" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 msgctxt "@label" msgid "GUI framework" -msgstr "" +msgstr "GUI 프레임 워크" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 msgctxt "@label" msgid "GUI framework bindings" -msgstr "" +msgstr "GUI 프레임 워크 바인딩" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 msgctxt "@label" msgid "C/C++ Binding library" -msgstr "" +msgstr "C / C ++ 바인딩 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 msgctxt "@label" msgid "Data interchange format" -msgstr "" +msgstr "데이터 교환 형식" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 msgctxt "@label" msgid "Support library for scientific computing" -msgstr "" +msgstr "과학 컴퓨팅을위한 지원 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 msgctxt "@label" msgid "Support library for faster math" -msgstr "" +msgstr "더 빠른 수학을 위한 지원 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 msgctxt "@label" msgid "Support library for handling STL files" -msgstr "" +msgstr "STL 파일 처리를 위한 지원 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 msgctxt "@label" msgid "Support library for handling 3MF files" -msgstr "" +msgstr "3MF 파일 처리를 위한 지원 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 msgctxt "@label" msgid "Serial communication library" -msgstr "" +msgstr "직렬 통신 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 msgctxt "@label" msgid "ZeroConf discovery library" -msgstr "" +msgstr "ZeroConf 발견 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 msgctxt "@label" msgid "Polygon clipping library" -msgstr "" +msgstr "다각형 클리핑 라이브러리" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 -msgctxt "@Label" -msgid "Python HTTP library" -msgstr "" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "폰트" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" -msgid "Font" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 -msgctxt "@label" msgid "SVG icons" -msgstr "" +msgstr "SVG 아이콘" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 msgctxt "@label" msgid "Profile:" -msgstr "" +msgstr "윤곽:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -msgctxt "@" -msgid "No Profile Available" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." msgstr "" +"일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n" +"\n" +"프로파일 매니저를 열려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 msgctxt "@label:textbox" msgid "Search..." -msgstr "" +msgstr "찾다..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Copy value to all extruders" -msgstr "" +msgstr "모든 압출기에 값 복사" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 msgctxt "@action:menu" msgid "Hide this setting" -msgstr "" +msgstr "이 설정 숨기기" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 msgctxt "@action:menu" msgid "Don't show this setting" -msgstr "" +msgstr "이 설정을 표시하지 않음" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 msgctxt "@action:menu" msgid "Keep this setting visible" -msgstr "" +msgstr "이 설정을 계속 표시하십시오" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 msgctxt "@action:menu" msgid "Configure setting visiblity..." -msgstr "" +msgstr "설정 표시 설정 ..." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 msgctxt "@label" @@ -3228,26 +3249,29 @@ msgid "" "\n" "Click to make these settings visible." msgstr "" +"일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n" +"\n" +"이 설정을 표시하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." msgid "Affects" -msgstr "" +msgstr "영향" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 msgctxt "@label Header for list of settings." msgid "Affected By" -msgstr "" +msgstr "영향을 받다" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 msgctxt "@label" msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders" -msgstr "" +msgstr "이 설정은 항상 모든 압출기간에 공유됩니다. 여기에서 변경하면 모든 압출기의 값이 변경됩니다" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 msgctxt "@label" msgid "The value is resolved from per-extruder values " -msgstr "" +msgstr "이 값은 압출기 값마다 결정됩니다 " #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 msgctxt "@label" @@ -3256,6 +3280,9 @@ msgid "" "\n" "Click to restore the value of the profile." msgstr "" +"이 설정에는 프로필과 다른 값이 있습니다.\n" +"\n" +"프로필 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3264,1153 +3291,1090 @@ msgid "" "\n" "Click to restore the calculated value." msgstr "" +"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" +"\n" +"계산 된 값을 복원하려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 msgctxt "@label:listbox" msgid "Print Setup" -msgstr "" +msgstr "인쇄 설정" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" msgstr "" +"인쇄 설정 사용 안 함\n" +"G 코드 파일은 수정할 수 없습니다" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 -msgctxt "@label Hours and minutes" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 +msgctxt "@label" msgid "00h 00min" -msgstr "" +msgstr "00시간 00 분" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 msgctxt "@tooltip" -msgid "Time specification
    " -msgstr "" +msgid "Time information" +msgstr "시간 정보" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 +msgctxt "@description" +msgid "Print time" +msgstr "인쇄 시간" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 msgctxt "@label" -msgid "Cost specification" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 -msgctxt "@label m for meter" -msgid "%1m" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 -msgctxt "@label g for grams" -msgid "%1g" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 -msgctxt "@label" -msgid "Total:" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 -msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 -msgctxt "@label Print estimates: m for meters, g for grams" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 +msgctxt "@label" msgid "%1m / ~ %2g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 msgctxt "@tooltip" -msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." +msgid "" +"Recommended Print Setup

    Print with the recommended settings for the selected printer, material and " +"quality." msgstr "" +"권장 인쇄 설정\n" +"선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "" +"사용자 정의 인쇄 설정\n" +"마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" -msgstr "" +msgstr "자동" #: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&View" -msgstr "" +msgstr "조망" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" -msgstr "" +msgstr "자동" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택된 모델 인쇄 :" +msgstr[1] "선택된 모델ㄷ 인쇄 :" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택한 모델 곱하기" +msgstr[1] "선택한 모델ㄷ 곱하기" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 msgctxt "@label" msgid "Number of Copies" -msgstr "" +msgstr "매수" #: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 msgctxt "@title:menu menubar:file" msgid "Open &Recent" -msgstr "" +msgstr "열기 및 최근" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 msgctxt "@info:status" msgid "No printer connected" -msgstr "" +msgstr "연결된 프린터 없음" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 msgctxt "@label" msgid "Extruder" -msgstr "" +msgstr "압출기" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 msgctxt "@tooltip" -msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." -msgstr "" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the " +"hotend heating is turned off." +msgstr "핫 엔드의 목표 온도입니다. 핫 엔드는 이 온도를 향해 가열되거나 냉각됩니다. 이 값이 0이면 온열 가열이 꺼집니다." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 msgctxt "@tooltip" msgid "The current temperature of this extruder." -msgstr "" +msgstr "이 압출기의 현재 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 msgctxt "@tooltip" msgid "The colour of the material in this extruder." -msgstr "" +msgstr "이 압출기의 재료 색." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 msgctxt "@tooltip" msgid "The material in this extruder." -msgstr "" +msgstr "이 압출기의 재료." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." -msgstr "" +msgstr "이 압출기에 삽입 된 노즐." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 msgctxt "@label" msgid "Build plate" -msgstr "" +msgstr "빌드 플레이트" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 msgctxt "@tooltip" -msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." -msgstr "" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the " +"bed heating is turned off." +msgstr "가열 된 베드의 목표 온도. 베드가 이 온도로 가열되거나 식을 것입니다. 이 값이 0이면 베드 가열이 꺼집니다." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 msgctxt "@tooltip" msgid "The current temperature of the heated bed." -msgstr "" +msgstr "가열 된 베드의 현재 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." -msgstr "" +msgstr "베드를 예열하기위한 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 msgctxt "@button Cancel pre-heating" msgid "Cancel" -msgstr "" +msgstr "취소" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 msgctxt "@button" msgid "Pre-heat" -msgstr "" +msgstr "예열" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 msgctxt "@tooltip of pre-heat" -msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to " +"wait for the bed to heat up when you're ready to print." msgstr "" +"인쇄하기 전에 베드를 미리 가열하십시오. 가열되는 동안 계속해서 인쇄물을 조정할 수 있으며, 인쇄 준비가 되면 베드가 가열 될 " +"때까지 기다릴 필요가 없습니다." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 -msgctxt "@label" -msgid "Printer control" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 -msgctxt "@label" -msgid "Jog Position" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 -msgctxt "@label" -msgid "X/Y" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 -msgctxt "@label" -msgid "Z" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 -msgctxt "@label" -msgid "Jog Distance" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 msgctxt "@label" msgid "Active print" -msgstr "" +msgstr "인쇄 활성" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 msgctxt "@label" msgid "Job Name" -msgstr "" +msgstr "작업 이름" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 msgctxt "@label" msgid "Printing Time" -msgstr "" +msgstr "인쇄 시간" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 msgctxt "@label" msgid "Estimated time left" -msgstr "" +msgstr "예상 남은 시간" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" -msgstr "" +msgstr "Fu & ll 화면 토글" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" -msgstr "" +msgstr "풀어 놓다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" -msgstr "" +msgstr "다시하다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 msgctxt "@action:inmenu menubar:file" msgid "&Quit" -msgstr "" +msgstr "그만두다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -msgctxt "@action:inmenu menubar:view" -msgid "&Reset camera position" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 msgctxt "@action:inmenu" msgid "Configure Cura..." -msgstr "" +msgstr "Cura 구성 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." -msgstr "" +msgstr "프린터 추가 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." -msgstr "" +msgstr "프린터 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 msgctxt "@action:inmenu" msgid "Manage Materials..." -msgstr "" +msgstr "자료 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" -msgstr "" +msgstr "현재 설정 / 재정의로 프로필 업데이트" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "현재 변경 사항 무시" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" -msgid "&Discard current changes" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 -msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." -msgstr "" +msgstr "현재 설정 / 재정의 프로필 작성" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." -msgstr "" +msgstr "프로필 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" -msgstr "" +msgstr "온라인 및 문서 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" -msgstr "" +msgstr "버그보고" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 msgctxt "@action:inmenu menubar:help" msgid "&About..." -msgstr "" +msgstr "대략..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택한 모델 삭제 및 선택" +msgstr[1] "선택한 모델들 삭제 및 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택한 모델 중심" +msgstr[1] "선택한 모델들 중심" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택한 모델 곱하기" +msgstr[1] "선택한 모델ㄷ 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 msgctxt "@action:inmenu" msgid "Delete Model" -msgstr "" +msgstr "모델 삭제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" -msgstr "" +msgstr "플랫폼에 대한 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" -msgstr "" +msgstr "그룹 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" -msgstr "" +msgstr "모델 그룹 해제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" -msgstr "" +msgstr "모델 합치기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 msgctxt "@action:inmenu" msgid "&Multiply Model..." -msgstr "" +msgstr "모델 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" -msgstr "" +msgstr "모든 모델 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" -msgstr "" +msgstr "빌드 플레이트 지우기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" -msgstr "" +msgstr "모든 모델 새로고치" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" -msgstr "" +msgstr "모든 모델 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" -msgstr "" +msgstr "선택 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" -msgstr "" +msgstr "모든 모델 위치 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" -msgstr "" +msgstr "모든 모델 및 변환 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." -msgstr "" +msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." -msgstr "" +msgstr "새 프로젝트..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." -msgstr "" +msgstr "엔진 및 로그 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" -msgstr "" +msgstr "구성 폴더 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 msgctxt "@action:menu" msgid "Configure setting visibility..." -msgstr "" +msgstr "설정 표시 설정 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" -msgstr "" +msgstr "3D 모델을 로드하십시오" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "슬라이스 준비 완료" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" -msgid "Ready to slice" -msgstr "" +msgid "Slicing..." +msgstr "슬라이싱 ..." #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 -msgctxt "@label:PrintjobStatus" -msgid "Slicing..." -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" -msgstr "" +msgstr "준비 완료" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "슬라이스 할 수 없음" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" -msgid "Unable to Slice" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 -msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" -msgstr "" +msgstr "슬라이스 사용 불가" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 msgctxt "@label:Printjob" msgid "Prepare" -msgstr "" +msgstr "준비하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 msgctxt "@label:Printjob" msgid "Cancel" -msgstr "" +msgstr "취소하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 msgctxt "@info:tooltip" msgid "Select the active output device" -msgstr "" +msgstr "활성 출력 장치 선택" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 msgctxt "@title:window" msgid "Open file(s)" -msgstr "" +msgstr "열린 파일" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 msgctxt "@text:window" -msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" +msgid "" +"We have found one or more project file(s) within the files you have selected. You can open only one project file at a " +"time. We suggest to only import models from those files. Would you like to proceed?" msgstr "" +"선택한 파일 내에 하나 이상의 프로젝트 파일이 있습니다. 한 번에 하나의 프로젝트 파일 만 열 수 있습니다. 해당 파일에서 모델 " +"만 가져 오기를 권장합니다. 계속 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" msgid "Import all as models" -msgstr "" +msgstr "모델로 모두 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Ultimaker Cura" -msgstr "" +msgid "Cura" +msgstr "큐라" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 msgctxt "@title:menu menubar:toplevel" msgid "&File" -msgstr "" +msgstr "파일" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" -msgstr "" +msgstr "선택 사항을 파일에 저장" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 msgctxt "@title:menu menubar:file" msgid "Save &As..." -msgstr "" +msgstr "다른 이름으로 저장..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 msgctxt "@title:menu menubar:file" msgid "Save project" -msgstr "" +msgstr "프로젝트 저장" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" -msgstr "" +msgstr "편집하다" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 msgctxt "@title:menu" msgid "&View" -msgstr "" +msgstr "조망" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 msgctxt "@title:menu" msgid "&Settings" -msgstr "" +msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" -msgstr "" +msgstr "프린터" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 msgctxt "@title:menu" msgid "&Material" -msgstr "" +msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 msgctxt "@title:menu" msgid "&Profile" -msgstr "" +msgstr "윤곽" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@action:inmenu" msgid "Set as Active Extruder" -msgstr "" +msgstr "활성 압출기로 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" -msgstr "" +msgstr "확장 프로그램" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 msgctxt "@title:menu menubar:toplevel" msgid "P&references" -msgstr "" +msgstr "환경 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 msgctxt "@title:menu menubar:toplevel" msgid "&Help" -msgstr "" +msgstr "도움" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 msgctxt "@action:button" msgid "Open File" -msgstr "" +msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "Settings" -msgstr "" +msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 msgctxt "@title:window" msgid "New project" -msgstr "" +msgstr "새 프로젝트" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." -msgstr "" +msgstr "새 프로젝트를 시작 하시겠습니까? 빌드 플레이트 및 저장하지 않은 설정이 지워집니다." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 msgctxt "@window:title" msgid "Install Plugin" -msgstr "" +msgstr "플러그인 설치" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 msgctxt "@title:window" msgid "Open File(s)" -msgstr "" +msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 msgctxt "@text:window" -msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." +msgid "" +"We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. " +"If you want to open a G-Code file, please just select only one." msgstr "" +"선택한 파일 내에 하나 이상의 G 코드 파일이 있습니다. 한 번에 하나의 G 코드 파일 만 열 수 있습니다. G 코드 파일을 열려면 하" +"나만 선택하십시오." #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" msgid "Save Project" -msgstr "" +msgstr "프로젝트 저장" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 msgctxt "@action:label" msgid "Extruder %1" -msgstr "" +msgstr "압출기" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 msgctxt "@action:label" msgid "%1 & material" -msgstr "" +msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 msgctxt "@action:label" msgid "Don't show project summary on save again" -msgstr "" +msgstr "프로젝트 요약을 다시 저장하지 마십시오" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 msgctxt "@action:button" msgid "Save" -msgstr "" +msgstr "저장하다" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 msgctxt "@title:tab" msgid "Prepare" -msgstr "" +msgstr "준비하다" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 msgctxt "@title:tab" msgid "Monitor" -msgstr "" +msgstr "감시 장치" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 msgctxt "@label" msgid "Layer Height" -msgstr "" +msgstr "층 높이" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 -msgctxt "@tooltip" -msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 msgctxt "@label" msgid "Print Speed" -msgstr "" +msgstr "인쇄 속도" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 msgctxt "@label" msgid "Slower" -msgstr "" +msgstr "천천히" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 msgctxt "@label" msgid "Faster" -msgstr "" +msgstr "빨리" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 -msgctxt "@tooltip" -msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" - -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 msgctxt "@label" msgid "Infill" -msgstr "" +msgstr "빈 공간 채우기" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." -msgstr "" +msgstr "점차적인 빈 공간 채우기는 점차적으로 빈 공간 채우기의 양을 증가시킵니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 msgctxt "@label" msgid "Enable gradual" -msgstr "" +msgstr "점진적으로 사용" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 msgctxt "@label" msgid "Generate Support" -msgstr "" +msgstr "지지물 생성" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 msgctxt "@label" -msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." -msgstr "" +msgid "" +"Generate structures to support parts of the model which have overhangs. Without these structures, such parts would " +"collapse during printing." +msgstr "돌출부가있는 모델의 부분을 지원하는 구조를 생성합니다. 이러한 구조가 없으면 이러한 부분이 인쇄 중에 붕괴됩니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 msgctxt "@label" msgid "Support Extruder" -msgstr "" +msgstr "압출기 지지물" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 msgctxt "@label" -msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." +msgid "" +"Select which extruder to use for support. This will build up supporting structures below the model to prevent the model " +"from sagging or printing in mid air." msgstr "" +"지원할 압출기를 선택하십시오. 이렇게하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 인쇄되는 것을 방지" +"합니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 msgctxt "@label" msgid "Build Plate Adhesion" -msgstr "" +msgstr "플레이트 접착력 강화" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 msgctxt "@label" -msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." msgstr "" +"테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 주변이나 아래에 평평한 영역이 추가되어 나중에 쉽게자를 수 있습니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "" +"인쇄물 개선에 도움이 필요하십니까?\n" +"Ultimaker 문제 해결 가이드 읽기" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" msgid "Print Selected Model with %1" msgid_plural "Print Selected Models with %1" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "선택한 모델을 ?로 인쇄하십시오" +msgstr[1] "선택한 모델들을 ?로 인쇄하십시오" #: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 msgctxt "@title:window" msgid "Open project file" -msgstr "" +msgstr "프로젝트 파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" -msgstr "" +msgstr "이 파일은 Cura 프로젝트 파일입니다. 프로젝트로 열거나 모델을 가져 오시겠습니까?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 msgctxt "@action:button" msgid "Open as project" -msgstr "" +msgstr "프로젝트로 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 msgctxt "@action:button" msgid "Import models" -msgstr "" +msgstr "모델 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 msgctxt "@title:window" msgid "Engine Log" -msgstr "" +msgstr "엔진 로그" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 msgctxt "@label" msgid "Material" -msgstr "" +msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 msgctxt "@label" -msgid "Check compatibility" -msgstr "" +msgid "Check material compatibility" +msgstr "재질 호환성 확인" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." -msgstr "" +msgstr "Ultimaker.com의 재질 호환성을 확인하려면 클릭하십시오." #: MachineSettingsAction/plugin.json msgctxt "description" msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc)" -msgstr "" +msgstr "기계 설정 (예 : 빌드 볼륨, 노즐 크기 등)을 변경하는 방법을 제공합니다." #: MachineSettingsAction/plugin.json msgctxt "name" msgid "Machine Settings action" -msgstr "" +msgstr "컴퓨터 설정 작업" #: XRayView/plugin.json msgctxt "description" msgid "Provides the X-Ray view." -msgstr "" +msgstr "X 선보기를 제공합니다." #: XRayView/plugin.json msgctxt "name" msgid "X-Ray View" -msgstr "" +msgstr "엑스레이 보기" #: X3DReader/plugin.json msgctxt "description" msgid "Provides support for reading X3D files." -msgstr "" +msgstr "X3D 파일을 읽을 수 있도록 지원합니다." #: X3DReader/plugin.json msgctxt "name" msgid "X3D Reader" -msgstr "" +msgstr "X3D 리더" #: GCodeWriter/plugin.json msgctxt "description" msgid "Writes GCode to a file." -msgstr "" +msgstr "GCode를 파일에 씁니다." #: GCodeWriter/plugin.json msgctxt "name" msgid "GCode Writer" -msgstr "" +msgstr "GCode 작성자" #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "description" msgid "Dump the contents of all settings to a HTML file." -msgstr "" +msgstr "모든 설정의 내용을 HTML 파일로 덤프하십시오." #: cura-god-mode-plugin/src/GodMode/plugin.json msgctxt "name" msgid "God Mode" -msgstr "" +msgstr "God 모드" #: Doodle3D-cura-plugin/Doodle3D/plugin.json msgctxt "description" msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." -msgstr "" +msgstr "G 코드를 받아 들여 WiFi를 통해 Doodle3D WiFi-Box로 보냅니다." #: Doodle3D-cura-plugin/Doodle3D/plugin.json msgctxt "name" msgid "Doodle3D WiFi-Box" -msgstr "" +msgstr "Doodle 3D WiFi-Box" #: ChangeLogPlugin/plugin.json msgctxt "description" msgid "Shows changes since latest checked version." -msgstr "" +msgstr "최신 체크 버전 이후로 변경 사항을 표시합니다." #: ChangeLogPlugin/plugin.json msgctxt "name" msgid "Changelog" -msgstr "" +msgstr "변경 내역" #: ProfileFlattener/plugin.json msgctxt "description" msgid "Create a flattend quality changes profile." -msgstr "" +msgstr "평평한 품질 변경 프로필을 만듭니다." #: ProfileFlattener/plugin.json msgctxt "name" msgid "Profile flatener" -msgstr "" +msgstr "프로필 플래트너" #: USBPrinting/plugin.json msgctxt "description" msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." -msgstr "" +msgstr "G 코드를 승인하고 프린터로 보냅니다. 플러그인은 또한 펌웨어를 업데이트 할 수 있습니다." #: USBPrinting/plugin.json msgctxt "name" msgid "USB printing" -msgstr "" +msgstr "USB 인쇄" #: RemovableDriveOutputDevice/plugin.json msgctxt "description" msgid "Provides removable drive hotplugging and writing support." -msgstr "" +msgstr "이동식 드라이브 핫 플러그 및 쓰기 지원을 제공합니다." #: RemovableDriveOutputDevice/plugin.json msgctxt "name" msgid "Removable Drive Output Device Plugin" -msgstr "" +msgstr "이동식 드라이브 출력 장치 플러그인" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker 3 printers" -msgstr "" +msgstr "Ultimaker 3 프린터에 대한 네트워크 연결을 관리합니다" #: UM3NetworkPrinting/plugin.json msgctxt "name" msgid "UM3 Network Connection" -msgstr "" +msgstr "UM3 네트워크 연결" + +#: CuraPrintClusterUpload/plugin.json +msgctxt "name" +msgid "UM3 Network Connection (Cluster)" +msgstr "UM3 네트워크 연결 (클러스터)" #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." -msgstr "" +msgstr "펌웨어 업데이트를 확인합니다." #: FirmwareUpdateChecker/plugin.json msgctxt "name" msgid "Firmware Update Checker" -msgstr "" +msgstr "펌웨어 업데이트 검사기" #: CuraSolidWorksPlugin/plugin.json msgctxt "description" msgid "Gives you the possibility to open certain files via SolidWorks itself. These are then converted and loaded into Cura" -msgstr "" +msgstr "SolidWorks 자체를 통해 특정 파일을 열 수 있습니다. 이것들은 변환되어 Cura에 로드됩니다" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" msgid "SolidWorks Integration" -msgstr "" - -#: SimulationView/plugin.json -msgctxt "description" -msgid "Provides the Simulation view." -msgstr "" - -#: SimulationView/plugin.json -msgctxt "name" -msgid "Simulation View" -msgstr "" +msgstr "SolidWorks 통합" #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" -msgstr "" +msgstr "후 처리를 위해 사용자가 만든 스크립트를 허용하는 확장 프로그램" #: PostProcessingPlugin/plugin.json msgctxt "name" msgid "Post Processing" -msgstr "" +msgstr "후 처리" #: AutoSave/plugin.json msgctxt "description" msgid "Automatically saves Preferences, Machines and Profiles after changes." -msgstr "" +msgstr "변경 후 환경 설정, 기계 및 프로파일을 자동으로 저장합니다." #: AutoSave/plugin.json msgctxt "name" msgid "Auto Save" -msgstr "" +msgstr "자동 저장" #: SliceInfoPlugin/plugin.json msgctxt "description" msgid "Submits anonymous slice info. Can be disabled through preferences." -msgstr "" +msgstr "익명의 조각 정보를 제출하십시오. 환경 설정을 통해 비활성화 할 수 있습니다." #: SliceInfoPlugin/plugin.json msgctxt "name" msgid "Slice info" -msgstr "" +msgstr "슬라이스 정보" #: XmlMaterialProfile/plugin.json msgctxt "description" msgid "Provides capabilities to read and write XML-based material profiles." -msgstr "" +msgstr "XML 기반 머티리얼 프로파일을 읽고 쓸 수있는 기능을 제공합니다." #: XmlMaterialProfile/plugin.json msgctxt "name" msgid "Material Profiles" -msgstr "" +msgstr "재료 프로파일" #: LegacyProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from legacy Cura versions." -msgstr "" +msgstr "레거시 Cura 버전에서 프로파일 가져 오기를 지원합니다." #: LegacyProfileReader/plugin.json msgctxt "name" msgid "Legacy Cura Profile Reader" -msgstr "" +msgstr "레거시 Cura 프로필 리더" #: GCodeProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from g-code files." -msgstr "" +msgstr "g-code 파일에서 프로파일 가져 오기를 지원합니다." #: GCodeProfileReader/plugin.json msgctxt "name" msgid "GCode Profile Reader" -msgstr "" +msgstr "GCode 프로필 리더" + +#: LayerView/plugin.json +msgctxt "description" +msgid "Provides the Layer view." +msgstr "레이어 보기를 제공합니다." + +#: LayerView/plugin.json +msgctxt "name" +msgid "Layer View" +msgstr "레이어보기" #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." -msgstr "" +msgstr "Cura 2.5에서 Cura 2.6으로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "name" msgid "Version Upgrade 2.5 to 2.6" -msgstr "" +msgstr "버전 업그레이드 2.5에서 2.6" #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." -msgstr "" +msgstr "Cura 2.7에서 Cura 3.0으로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" -msgstr "" - -#: VersionUpgrade/VersionUpgrade30to31/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" - -#: VersionUpgrade/VersionUpgrade30to31/plugin.json -msgctxt "name" -msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "버전 업그레이드 2.7에서 3.0" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." -msgstr "" +msgstr "Cura 2.6에서 Cura 2.7로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "name" msgid "Version Upgrade 2.6 to 2.7" -msgstr "" +msgstr "버전 업그레이드 2.6에서 2.7" #: VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." -msgstr "" +msgstr "Cura 2.1에서 Cura 2.2로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "name" msgid "Version Upgrade 2.1 to 2.2" -msgstr "" +msgstr "버전 업그레이드 2.1에서 2.2" #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." -msgstr "" +msgstr "Cura 2.2에서 Cura 2.4로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "name" msgid "Version Upgrade 2.2 to 2.4" -msgstr "" +msgstr "버전 업그레이드 2.2에서 2.4" #: ImageReader/plugin.json msgctxt "description" msgid "Enables ability to generate printable geometry from 2D image files." -msgstr "" +msgstr "2D 이미지 파일에서 인쇄 가능한 지오메트리를 생성 할 수 있습니다." #: ImageReader/plugin.json msgctxt "name" msgid "Image Reader" -msgstr "" +msgstr "이미지 리더" #: CuraEngineBackend/plugin.json msgctxt "description" msgid "Provides the link to the CuraEngine slicing backend." -msgstr "" +msgstr "CuraEngine 슬라이스 백엔드 링크를 제공합니다." #: CuraEngineBackend/plugin.json msgctxt "name" msgid "CuraEngine Backend" -msgstr "" +msgstr "CuraEngine 백엔드" #: PerObjectSettingsTool/plugin.json msgctxt "description" msgid "Provides the Per Model Settings." -msgstr "" +msgstr "모델 별 설정을 제공합니다." #: PerObjectSettingsTool/plugin.json msgctxt "name" msgid "Per Model Settings Tool" -msgstr "" - -#: cura-siemensnx-plugin/plugin.json -msgctxt "description" -msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" - -#: cura-siemensnx-plugin/plugin.json -msgctxt "name" -msgid "Siemens NX Integration" -msgstr "" +msgstr "모델 별 설정 도구" #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." -msgstr "" +msgstr "3MF 파일 읽기 지원." #: 3MFReader/plugin.json msgctxt "name" msgid "3MF Reader" -msgstr "" +msgstr "3MF 판독기" #: PluginBrowser/plugin.json msgctxt "description" msgid "Find, manage and install new plugins." -msgstr "" +msgstr "새 플러그인을 찾고, 관리하고 설치하십시오." #: PluginBrowser/plugin.json msgctxt "name" msgid "Plugin Browser" -msgstr "" +msgstr "플러그인 브라우저" #: SolidView/plugin.json msgctxt "description" msgid "Provides a normal solid mesh view." -msgstr "" +msgstr "일반 솔리드 메쉬보기를 제공합니다." #: SolidView/plugin.json msgctxt "name" msgid "Solid View" -msgstr "" +msgstr "솔리드 뷰" #: GCodeReader/plugin.json msgctxt "description" msgid "Allows loading and displaying G-code files." -msgstr "" +msgstr "G 코드 파일을 로드하고 표시 할 수 있습니다." #: GCodeReader/plugin.json msgctxt "name" msgid "G-code Reader" -msgstr "" +msgstr "G 코드 판독기" #: CuraProfileWriter/plugin.json msgctxt "description" msgid "Provides support for exporting Cura profiles." -msgstr "" +msgstr "Cura 프로파일 내보내기 지원을 제공합니다." #: CuraProfileWriter/plugin.json msgctxt "name" msgid "Cura Profile Writer" -msgstr "" +msgstr "Cura 프로필 작성자" #: 3MFWriter/plugin.json msgctxt "description" msgid "Provides support for writing 3MF files." -msgstr "" +msgstr "3MF 파일 작성 지원을 제공합니다." #: 3MFWriter/plugin.json msgctxt "name" msgid "3MF Writer" -msgstr "" - -#: UserAgreementPlugin/plugin.json -msgctxt "description" -msgid "Ask the user once if he/she agrees with our license" -msgstr "" - -#: UserAgreementPlugin/plugin.json -msgctxt "name" -msgid "UserAgreement" -msgstr "" +msgstr "3MF 기록기" #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" -msgstr "" +msgstr "Ultimaker 기계에 대한 기계 작동 제공(예 : 침대 수평 조정 마법사, 업그레이드 선택 등)" #: UltimakerMachineActions/plugin.json msgctxt "name" msgid "Ultimaker machine actions" -msgstr "" +msgstr "Ultimaker 기계 동작" #: CuraProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing Cura profiles." -msgstr "" +msgstr "Cura 프로파일 가져 오기 지원을 제공합니다." #: CuraProfileReader/plugin.json msgctxt "name" msgid "Cura Profile Reader" -msgstr "" +msgstr "Cura 프로필 판독기" diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po index 401dac7ff0..3e5890b31b 100644 --- a/resources/i18n/ko_KR/fdmextruder.def.json.po +++ b/resources/i18n/ko_KR/fdmextruder.def.json.po @@ -5,8 +5,8 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"Project-Id-Version: Cura 3.1\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" "PO-Revision-Date: 2017-09-20 14:31+0900\n" "Last-Translator: Brule\n" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index d39f06d408..fa9570f57f 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -6,9 +6,9 @@ msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" -"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-21 14:58+0900\n" +"PO-Revision-Date: 2017-11-15 21:07+0900\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ko_KR\n" @@ -16,12 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.0.3\n" +"X-Generator: Poedit 2.0.4\n" #: fdmprinter.def.json msgctxt "machine_settings label" msgid "Machine" -msgstr "" +msgstr "기계" #: fdmprinter.def.json msgctxt "machine_settings description" @@ -31,7 +31,7 @@ msgstr "기계 별 설정 " #: fdmprinter.def.json msgctxt "machine_name label" msgid "Machine Type" -msgstr "" +msgstr "기계 유형" #: fdmprinter.def.json msgctxt "machine_name description" @@ -41,7 +41,7 @@ msgstr "3D 프린터 모델의 이름입니다. " #: fdmprinter.def.json msgctxt "machine_show_variants label" msgid "Show Machine Variants" -msgstr "" +msgstr "기계 변형 표시" #: fdmprinter.def.json msgctxt "machine_show_variants description" @@ -51,7 +51,7 @@ msgstr "별도의 json 파일에 설명 된이 기계의 다양한 변형을 표 #: fdmprinter.def.json msgctxt "machine_start_gcode label" msgid "Start GCode" -msgstr "" +msgstr "GCode 시작" #: fdmprinter.def.json msgctxt "machine_start_gcode description" @@ -63,7 +63,7 @@ msgstr "G 시작과 동시에 실행될 코드 명령어 " #: fdmprinter.def.json msgctxt "machine_end_gcode label" msgid "End GCode" -msgstr "" +msgstr "GCode 종료" #: fdmprinter.def.json msgctxt "machine_end_gcode description" @@ -75,7 +75,7 @@ msgstr "G 맨 마지막에 실행될 코드 명령 " #: fdmprinter.def.json msgctxt "material_guid label" msgid "Material GUID" -msgstr "" +msgstr "재료 GUID" #: fdmprinter.def.json msgctxt "material_guid description" @@ -85,7 +85,7 @@ msgstr "재료의 GUID. 자동으로 설정됩니다. " #: fdmprinter.def.json msgctxt "material_bed_temp_wait label" msgid "Wait for Build Plate Heatup" -msgstr "" +msgstr "Build Plate Heat Up을 기다리십시오" #: fdmprinter.def.json msgctxt "material_bed_temp_wait description" @@ -95,7 +95,7 @@ msgstr "시작 시, 빌드 플레이트 온도에 도달 할 때까지 대기하 #: fdmprinter.def.json msgctxt "material_print_temp_wait label" msgid "Wait for Nozzle Heatup" -msgstr "" +msgstr "노즐 가열 기다리기" #: fdmprinter.def.json msgctxt "material_print_temp_wait description" @@ -105,7 +105,7 @@ msgstr "시작 시, 노즐 온도에 도달 할 때까지 대기할지 여부 " #: fdmprinter.def.json msgctxt "material_print_temp_prepend label" msgid "Include Material Temperatures" -msgstr "" +msgstr "재료 온도 포함" #: fdmprinter.def.json msgctxt "material_print_temp_prepend description" @@ -115,7 +115,7 @@ msgstr "gcode의 시작 부분에 노즐 온도 명령을 포함할지 여부. s #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" msgid "Include Build Plate Temperature" -msgstr "" +msgstr "빌드 플레이트 온도 포함" #: fdmprinter.def.json msgctxt "material_bed_temp_prepend description" @@ -125,7 +125,7 @@ msgstr "gcode가 시작될 때 빌드 플레이트 온도 명령을 포함할지 #: fdmprinter.def.json msgctxt "machine_width label" msgid "Machine Width" -msgstr "" +msgstr "기계 너비" #: fdmprinter.def.json msgctxt "machine_width description" @@ -135,7 +135,7 @@ msgstr "인쇄 가능 영역의 폭 (X 방향) " #: fdmprinter.def.json msgctxt "machine_depth label" msgid "Machine Depth" -msgstr "" +msgstr "기계 깊이" #: fdmprinter.def.json msgctxt "machine_depth description" @@ -145,7 +145,7 @@ msgstr "인쇄 가능 영역의 깊이 (Y 방향) " #: fdmprinter.def.json msgctxt "machine_shape label" msgid "Build Plate Shape" -msgstr "" +msgstr "판 모양 만들기" #: fdmprinter.def.json msgctxt "machine_shape description" @@ -155,17 +155,17 @@ msgstr "인쇄 할 수없는 영역을 고려하지 않고 빌드 플레이트 #: fdmprinter.def.json msgctxt "machine_shape option rectangular" msgid "Rectangular" -msgstr "" +msgstr "직사각형" #: fdmprinter.def.json msgctxt "machine_shape option elliptic" msgid "Elliptic" -msgstr "" +msgstr "타원" #: fdmprinter.def.json msgctxt "machine_height label" msgid "Machine Height" -msgstr "" +msgstr "기계 높이" #: fdmprinter.def.json msgctxt "machine_height description" @@ -175,7 +175,7 @@ msgstr "인쇄 가능 영역의 높이 (Z 방향)입니다. " #: fdmprinter.def.json msgctxt "machine_heated_bed label" msgid "Has Heated Build Plate" -msgstr "" +msgstr "가열된 빌드 플레이트가 있음" #: fdmprinter.def.json msgctxt "machine_heated_bed description" @@ -185,7 +185,7 @@ msgstr "기계에 가열 된 빌드 플레이트가 있는지 여부 " #: fdmprinter.def.json msgctxt "machine_center_is_zero label" msgid "Is Center Origin" -msgstr "" +msgstr "센터 원점" #: fdmprinter.def.json msgctxt "machine_center_is_zero description" @@ -195,7 +195,7 @@ msgstr "프린터의 \"0\" 위치의 X / Y 좌표가 인쇄 가능 영역의 중 #: fdmprinter.def.json msgctxt "machine_extruder_count label" msgid "Number of Extruders" -msgstr "" +msgstr "압출기의 수" #: fdmprinter.def.json msgctxt "machine_extruder_count description" @@ -205,7 +205,7 @@ msgstr "압출기 열차의 수. 압출기 트레인은 피더, 보우 덴 튜 #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" -msgstr "" +msgstr "외부 노즐 지름" #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter description" @@ -215,7 +215,7 @@ msgstr "노즐 끝의 외경 " #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" -msgstr "" +msgstr "노즐 길이" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance description" @@ -225,7 +225,7 @@ msgstr "노즐의 끝과 프린트 헤드의 가장 낮은 부분 사이의 높 #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" -msgstr "" +msgstr "노즐 각도" #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle description" @@ -235,7 +235,7 @@ msgstr "노즐 끝 바로 위의 수평면과 원뿔 부분 사이의 각도입 #: fdmprinter.def.json msgctxt "machine_heat_zone_length label" msgid "Heat zone length" -msgstr "" +msgstr "가열 영역 길이" #: fdmprinter.def.json msgctxt "machine_heat_zone_length description" @@ -245,7 +245,7 @@ msgstr "노즐의 열이 필라멘트로 전달되는 노즐의 끝에서부터 #: fdmprinter.def.json msgctxt "machine_filament_park_distance label" msgid "Filament Park Distance" -msgstr "" +msgstr "필라멘트 park 거리" #: fdmprinter.def.json msgctxt "machine_filament_park_distance description" @@ -255,7 +255,7 @@ msgstr "압출기가 더 이상 사용되지 않을 때 필라멘트를 파킹 #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled label" msgid "Enable Nozzle Temperature Control" -msgstr "" +msgstr "노즐 온도 조절 가능" #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled description" @@ -265,7 +265,7 @@ msgstr "Cura에서 온도를 제어할지 여부. Cura 외부에서 노즐 온 #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed label" msgid "Heat up speed" -msgstr "" +msgstr "가열 속도" #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed description" @@ -275,7 +275,7 @@ msgstr "노즐이 가열되는 속도 (° C / s)는 일반적인 인쇄 온도 #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed label" msgid "Cool down speed" -msgstr "" +msgstr "냉각 속도" #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed description" @@ -285,7 +285,7 @@ msgstr "노즐이 냉각되는 속도 (° C / s)는 일반적인 인쇄 온도 #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window label" msgid "Minimal Time Standby Temperature" -msgstr "" +msgstr "최소 대기 시간" #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window description" @@ -295,7 +295,7 @@ msgstr "노즐이 냉각되기 전에 압출기가 비활성이어야하는 최 #: fdmprinter.def.json msgctxt "machine_gcode_flavor label" msgid "Gcode flavour" -msgstr "" +msgstr "Gcode flavour" #: fdmprinter.def.json msgctxt "machine_gcode_flavor description" @@ -305,52 +305,52 @@ msgstr "생성 될 gcode 유형입니다. " #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" msgid "Marlin" -msgstr "" +msgstr "Marlin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Volumetric)" msgid "Marlin (Volumetric)" -msgstr "" +msgstr "Marlin(부피 측정법)" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (RepRap)" msgid "RepRap" -msgstr "" +msgstr "RepRap" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option UltiGCode" msgid "Ultimaker 2" -msgstr "" +msgstr "Ultimaker 2" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Griffin" msgid "Griffin" -msgstr "" +msgstr "그리핀" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Makerbot" msgid "Makerbot" -msgstr "" +msgstr "Makerbot" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option BFB" msgid "Bits from Bytes" -msgstr "" +msgstr "바이트 수" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option MACH3" msgid "Mach3" -msgstr "" +msgstr "마하 3" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" -msgstr "" +msgstr "반복기" #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" -msgstr "" +msgstr "허용되지 않는 지역" #: fdmprinter.def.json msgctxt "machine_disallowed_areas description" @@ -360,7 +360,7 @@ msgstr "인쇄 헤드가있는 영역이있는 다각형 목록입니다. " #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas label" msgid "Nozzle Disallowed Areas" -msgstr "" +msgstr "노즐 금지 구역" #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas description" @@ -370,7 +370,7 @@ msgstr "노즐이 들어갈 수없는 영역이있는 다각형 목록입니다. #: fdmprinter.def.json msgctxt "machine_head_polygon label" msgid "Machine head polygon" -msgstr "" +msgstr "머신 헤드 폴리곤" #: fdmprinter.def.json msgctxt "machine_head_polygon description" @@ -380,7 +380,7 @@ msgstr "프린트 헤드의 2D 실루엣 (팬 캡 제외). " #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon label" msgid "Machine head & Fan polygon" -msgstr "" +msgstr "머신 헤드 및 팬 폴리곤" #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon description" @@ -390,7 +390,7 @@ msgstr "프린트 헤드의 2D 실루엣 (팬 뚜껑 포함). " #: fdmprinter.def.json msgctxt "gantry_height label" msgid "Gantry height" -msgstr "" +msgstr "갠트리 높이" #: fdmprinter.def.json msgctxt "gantry_height description" @@ -400,7 +400,7 @@ msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). #: fdmprinter.def.json msgctxt "machine_nozzle_id label" msgid "Nozzle ID" -msgstr "" +msgstr "노즐 ID" #: fdmprinter.def.json msgctxt "machine_nozzle_id description" @@ -410,7 +410,7 @@ msgstr "\"AA 0.4\"및 \"BB 0.8\"과 같은 압출기 트레인의 노즐 ID. " #: fdmprinter.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "" +msgstr "노즐 지름" #: fdmprinter.def.json msgctxt "machine_nozzle_size description" @@ -420,7 +420,7 @@ msgstr "노즐의 내경. 비표준 노즐 크기를 사용할 때이 설정을 #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords label" msgid "Offset With Extruder" -msgstr "" +msgstr "압출기로 오프셋" #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords description" @@ -430,7 +430,7 @@ msgstr "압출기 오프셋을 좌표계에 적용하십시오. " #: fdmprinter.def.json msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "" +msgstr "압출기 프라임 Z 포지션" #: fdmprinter.def.json msgctxt "extruder_prime_pos_z description" @@ -440,7 +440,7 @@ msgstr "인쇄가 시작될 때 노즐이 끝나는 위치의 Z 좌표입니다. #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs label" msgid "Absolute Extruder Prime Position" -msgstr "" +msgstr "독립 압출 기 프라임 포지션" #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs description" @@ -450,7 +450,7 @@ msgstr "헤드의 마지막으로 알려진 위치에 상대적이 아닌 압출 #: fdmprinter.def.json msgctxt "machine_max_feedrate_x label" msgid "Maximum Speed X" -msgstr "" +msgstr "최대 속도 X" #: fdmprinter.def.json msgctxt "machine_max_feedrate_x description" @@ -460,7 +460,7 @@ msgstr "X 방향의 모터 최대 속도입니다." #: fdmprinter.def.json msgctxt "machine_max_feedrate_y label" msgid "Maximum Speed Y" -msgstr "" +msgstr "최대 속도 Y" #: fdmprinter.def.json msgctxt "machine_max_feedrate_y description" @@ -470,7 +470,7 @@ msgstr "Y 방향 모터의 최대 속도입니다." #: fdmprinter.def.json msgctxt "machine_max_feedrate_z label" msgid "Maximum Speed Z" -msgstr "" +msgstr "최대 속도 Z" #: fdmprinter.def.json msgctxt "machine_max_feedrate_z description" @@ -480,7 +480,7 @@ msgstr "Z 방향의 모터 최대 속도입니다. " #: fdmprinter.def.json msgctxt "machine_max_feedrate_e label" msgid "Maximum Feedrate" -msgstr "" +msgstr "최대 이송 속도" #: fdmprinter.def.json msgctxt "machine_max_feedrate_e description" @@ -490,7 +490,7 @@ msgstr "필라멘트의 최대 속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_x label" msgid "Maximum Acceleration X" -msgstr "" +msgstr "최대 가속도 X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" @@ -500,7 +500,7 @@ msgstr "X 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" msgid "Maximum Acceleration Y" -msgstr "" +msgstr "최대 가속도 Y" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y description" @@ -510,7 +510,7 @@ msgstr "Y 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_z label" msgid "Maximum Acceleration Z" -msgstr "" +msgstr "최대 가속도 Z" #: fdmprinter.def.json msgctxt "machine_max_acceleration_z description" @@ -520,7 +520,7 @@ msgstr "Z 방향 모터의 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_max_acceleration_e label" msgid "Maximum Filament Acceleration" -msgstr "" +msgstr "최대 필라멘트 가속도" #: fdmprinter.def.json msgctxt "machine_max_acceleration_e description" @@ -530,7 +530,7 @@ msgstr "필라멘트의 모터에 대한 최대 가속도. " #: fdmprinter.def.json msgctxt "machine_acceleration label" msgid "Default Acceleration" -msgstr "" +msgstr "기본 가속도" #: fdmprinter.def.json msgctxt "machine_acceleration description" @@ -540,7 +540,7 @@ msgstr "프린트 헤드 이동의 기본 가속. " #: fdmprinter.def.json msgctxt "machine_max_jerk_xy label" msgid "Default X-Y Jerk" -msgstr "" +msgstr "기본 X-Y 저크" #: fdmprinter.def.json msgctxt "machine_max_jerk_xy description" @@ -550,7 +550,7 @@ msgstr "수평면에서의 이동을위한 기본 저크. " #: fdmprinter.def.json msgctxt "machine_max_jerk_z label" msgid "Default Z Jerk" -msgstr "" +msgstr "기본 Z Jerk" #: fdmprinter.def.json msgctxt "machine_max_jerk_z description" @@ -560,7 +560,7 @@ msgstr "Z 방향 모터의 기본 저크. " #: fdmprinter.def.json msgctxt "machine_max_jerk_e label" msgid "Default Filament Jerk" -msgstr "" +msgstr "기본 필라멘트 저크" #: fdmprinter.def.json msgctxt "machine_max_jerk_e description" @@ -570,7 +570,7 @@ msgstr "필라멘트 모터의 기본 저크. " #: fdmprinter.def.json msgctxt "machine_minimum_feedrate label" msgid "Minimum Feedrate" -msgstr "" +msgstr "최소 이송 속도" #: fdmprinter.def.json msgctxt "machine_minimum_feedrate description" @@ -580,7 +580,7 @@ msgstr "프린트 헤드의 최소 이동 속도. " #: fdmprinter.def.json msgctxt "resolution label" msgid "Quality" -msgstr "" +msgstr "품질" #: fdmprinter.def.json msgctxt "resolution description" @@ -590,7 +590,7 @@ msgstr "인쇄물의 해상도에 영향을 미치는 모든 설정. 이러한 #: fdmprinter.def.json msgctxt "layer_height label" msgid "Layer Height" -msgstr "" +msgstr "층 높이" #: fdmprinter.def.json msgctxt "layer_height description" @@ -600,42 +600,17 @@ msgstr "각 층의 높이 (mm)입니다. 값이 높을수록 해상도가 낮을 #: fdmprinter.def.json msgctxt "layer_height_0 label" msgid "Initial Layer Height" -msgstr "" +msgstr "초기 레이어 높이" #: fdmprinter.def.json msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 빌드 플레이트에 쉽게 접착합니다. " -#: fdmprinter.def.json -msgctxt "slicing_tolerance label" -msgid "Slicing Tolerance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance description" -msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option middle" -msgid "Middle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option exclusive" -msgid "Exclusive" -msgstr "" - -#: fdmprinter.def.json -msgctxt "slicing_tolerance option inclusive" -msgid "Inclusive" -msgstr "" - #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" -msgstr "" +msgstr "선의 폭" #: fdmprinter.def.json msgctxt "line_width description" @@ -645,7 +620,7 @@ msgstr "한 줄의 너비. 일반적으로 각 라인의 너비는 노즐 폭과 #: fdmprinter.def.json msgctxt "wall_line_width label" msgid "Wall Line Width" -msgstr "" +msgstr "벽 선 너비" #: fdmprinter.def.json msgctxt "wall_line_width description" @@ -655,7 +630,7 @@ msgstr "단일 벽 선의 너비입니다. " #: fdmprinter.def.json msgctxt "wall_line_width_0 label" msgid "Outer Wall Line Width" -msgstr "" +msgstr "바깥 선 선폭" #: fdmprinter.def.json msgctxt "wall_line_width_0 description" @@ -665,7 +640,7 @@ msgstr "가장 바깥 쪽 벽 선의 너비. 이 값을 낮춤으로써 높은 #: fdmprinter.def.json msgctxt "wall_line_width_x label" msgid "Inner Wall(s) Line Width" -msgstr "" +msgstr "내부 벽 선 너비" #: fdmprinter.def.json msgctxt "wall_line_width_x description" @@ -675,7 +650,7 @@ msgstr "가장 바깥 쪽 벽 선을 제외한 모든 벽 선에 대해 단일 #: fdmprinter.def.json msgctxt "roofing_line_width label" msgid "Top Surface Skin Line Width" -msgstr "" +msgstr "상단 표면 스킨 선 너비" #: fdmprinter.def.json msgctxt "roofing_line_width description" @@ -685,7 +660,7 @@ msgstr "인쇄 상단 부분의 한 줄 너비. " #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" -msgstr "" +msgstr "상단 / 하단 라인 폭" #: fdmprinter.def.json msgctxt "skin_line_width description" @@ -695,7 +670,7 @@ msgstr "단일 위쪽 / 아래쪽 선의 너비입니다. " #: fdmprinter.def.json msgctxt "infill_line_width label" msgid "Infill Line Width" -msgstr "" +msgstr "Infill 선 폭" #: fdmprinter.def.json msgctxt "infill_line_width description" @@ -705,7 +680,7 @@ msgstr "단일 infill 라인의 너비. " #: fdmprinter.def.json msgctxt "skirt_brim_line_width label" msgid "Skirt/Brim Line Width" -msgstr "" +msgstr "Skirt/Brim 선 너비" #: fdmprinter.def.json msgctxt "skirt_brim_line_width description" @@ -715,7 +690,7 @@ msgstr "단일 스커트 또는 고리 선의 너비. " #: fdmprinter.def.json msgctxt "support_line_width label" msgid "Support Line Width" -msgstr "" +msgstr "지지대 선 너비" #: fdmprinter.def.json msgctxt "support_line_width description" @@ -725,7 +700,7 @@ msgstr "단일 지원 구조 선의 너비입니다. " #: fdmprinter.def.json msgctxt "support_interface_line_width label" msgid "Support Interface Line Width" -msgstr "" +msgstr "지지대 인터페이스 선 너비" #: fdmprinter.def.json msgctxt "support_interface_line_width description" @@ -735,7 +710,7 @@ msgstr "지붕 또는 바닥을지지하는 한 줄의 폭. " #: fdmprinter.def.json msgctxt "support_roof_line_width label" msgid "Support Roof Line Width" -msgstr "" +msgstr "지지대 위쪽 선 너비" #: fdmprinter.def.json msgctxt "support_roof_line_width description" @@ -745,7 +720,7 @@ msgstr "단일 지원 지붕 선의 너비. " #: fdmprinter.def.json msgctxt "support_bottom_line_width label" msgid "Support Floor Line Width" -msgstr "" +msgstr "지지대 바닥 선 너비" #: fdmprinter.def.json msgctxt "support_bottom_line_width description" @@ -755,7 +730,7 @@ msgstr "단일 지원 플로어 라인의 너비. " #: fdmprinter.def.json msgctxt "prime_tower_line_width label" msgid "Prime Tower Line Width" -msgstr "" +msgstr "프라임 타워 라인 폭" #: fdmprinter.def.json msgctxt "prime_tower_line_width description" @@ -765,7 +740,7 @@ msgstr "단일 주요 타워 선의 너비. " #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor label" msgid "Initial Layer Line Width" -msgstr "" +msgstr "초기 레이어 선 너비" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor description" @@ -775,27 +750,17 @@ msgstr "첫 번째 레이어의 선 너비 승수입니다. 이것을 늘리면 #: fdmprinter.def.json msgctxt "shell label" msgid "Shell" -msgstr "" +msgstr "내관" #: fdmprinter.def.json msgctxt "shell description" msgid "Shell" -msgstr "겉면 " - -#: fdmprinter.def.json -msgctxt "wall_extruder_nr label" -msgid "Wall Extruder" -msgstr "" - -#: fdmprinter.def.json -msgctxt "wall_extruder_nr description" -msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " +msgstr "내관" #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" -msgstr "" +msgstr "외벽 압출기" #: fdmprinter.def.json msgctxt "wall_0_extruder_nr description" @@ -804,8 +769,8 @@ msgstr "외벽 인쇄에 사용되는 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Wall Extruder" -msgstr "" +msgid "Inner Walls Extruder" +msgstr "내벽 압출기" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -815,7 +780,7 @@ msgstr "내벽 인쇄에 사용되는 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "wall_thickness label" msgid "Wall Thickness" -msgstr "" +msgstr "벽 두께" #: fdmprinter.def.json msgctxt "wall_thickness description" @@ -825,7 +790,7 @@ msgstr "가로 방향의 벽 두께입니다. 이 값을 벽 선 너비로 나 #: fdmprinter.def.json msgctxt "wall_line_count label" msgid "Wall Line Count" -msgstr "" +msgstr "벽 선 조사" #: fdmprinter.def.json msgctxt "wall_line_count description" @@ -835,7 +800,7 @@ msgstr "벽의 수. 벽 두께로 계산할 때이 값은 정수로 반올림됩 #: fdmprinter.def.json msgctxt "wall_0_wipe_dist label" msgid "Outer Wall Wipe Distance" -msgstr "" +msgstr "외벽 Wipe 거리" #: fdmprinter.def.json msgctxt "wall_0_wipe_dist description" @@ -845,7 +810,7 @@ msgstr "바깥 쪽 벽 뒤에 삽입 된 이동 거리. Z 솔기를 더 잘 숨 #: fdmprinter.def.json msgctxt "roofing_extruder_nr label" msgid "Top Surface Skin Extruder" -msgstr "" +msgstr "상단 표면 피부 압출기" #: fdmprinter.def.json msgctxt "roofing_extruder_nr description" @@ -855,7 +820,7 @@ msgstr "압출기 트레인은 최상층의 스킨을 인쇄하는 데 사용됩 #: fdmprinter.def.json msgctxt "roofing_layer_count label" msgid "Top Surface Skin Layers" -msgstr "" +msgstr "상단 표면 스킨 레이어" #: fdmprinter.def.json msgctxt "roofing_layer_count description" @@ -865,7 +830,7 @@ msgstr "최상층의 스킨 층의 수. 일반적으로 고품질 맨 위 표면 #: fdmprinter.def.json msgctxt "roofing_pattern label" msgid "Top Surface Skin Pattern" -msgstr "" +msgstr "탑 표면 스킨 패턴" #: fdmprinter.def.json msgctxt "roofing_pattern description" @@ -875,22 +840,22 @@ msgstr "최상위 레이어의 패턴입니다. " #: fdmprinter.def.json msgctxt "roofing_pattern option lines" msgid "Lines" -msgstr "" +msgstr "윤곽" #: fdmprinter.def.json msgctxt "roofing_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "동심원의" #: fdmprinter.def.json msgctxt "roofing_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "지그재그" #: fdmprinter.def.json msgctxt "roofing_angles label" msgid "Top Surface Skin Line Directions" -msgstr "" +msgstr "상단 표면 스킨 라인 방향" #: fdmprinter.def.json msgctxt "roofing_angles description" @@ -900,7 +865,7 @@ msgstr "상단 표면 스킨 층이 선 또는 지그재그 패턴을 사용할 #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" -msgstr "" +msgstr "상단 / 하단 압출기" #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr description" @@ -910,7 +875,7 @@ msgstr "상단 및 하단 스킨 인쇄에 사용되는 압출기 트레인. 이 #: fdmprinter.def.json msgctxt "top_bottom_thickness label" msgid "Top/Bottom Thickness" -msgstr "" +msgstr "상단 / 하단 두께" #: fdmprinter.def.json msgctxt "top_bottom_thickness description" @@ -920,7 +885,7 @@ msgstr "인쇄물의 상단 / 하단 레이어의 두께. 이 값을 레이어 #: fdmprinter.def.json msgctxt "top_thickness label" msgid "Top Thickness" -msgstr "" +msgstr "탑 두께" #: fdmprinter.def.json msgctxt "top_thickness description" @@ -930,7 +895,7 @@ msgstr "인쇄물의 상단 레이어의 두께입니다. 이 값을 레이어 #: fdmprinter.def.json msgctxt "top_layers label" msgid "Top Layers" -msgstr "" +msgstr "상단 레이어" #: fdmprinter.def.json msgctxt "top_layers description" @@ -940,7 +905,7 @@ msgstr "인쇄물의 상단 레이어의 두께입니다. 이 값과 레이어 #: fdmprinter.def.json msgctxt "bottom_thickness label" msgid "Bottom Thickness" -msgstr "" +msgstr "바닥 두께" #: fdmprinter.def.json msgctxt "bottom_thickness description" @@ -950,7 +915,7 @@ msgstr "인쇄물의 아래쪽 레이어의 두께입니다. 이 값을 레이 #: fdmprinter.def.json msgctxt "bottom_layers label" msgid "Bottom Layers" -msgstr "" +msgstr "하단 레이어" #: fdmprinter.def.json msgctxt "bottom_layers description" @@ -960,7 +925,7 @@ msgstr "아래층의 수. 바닥 두께로 계산할 때이 값은 정수로 반 #: fdmprinter.def.json msgctxt "top_bottom_pattern label" msgid "Top/Bottom Pattern" -msgstr "" +msgstr "상단 / 하단 패턴" #: fdmprinter.def.json msgctxt "top_bottom_pattern description" @@ -970,22 +935,22 @@ msgstr "상단 / 하단 레이어의 패턴. " #: fdmprinter.def.json msgctxt "top_bottom_pattern option lines" msgid "Lines" -msgstr "" +msgstr "윤곽" #: fdmprinter.def.json msgctxt "top_bottom_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "동심원의" #: fdmprinter.def.json msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "지그재그" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 label" msgid "Bottom Pattern Initial Layer" -msgstr "" +msgstr "하단 패턴 초기 레이어" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 description" @@ -995,22 +960,22 @@ msgstr "첫 번째 레이어의 인쇄 아래쪽에있는 패턴입니다. " #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option lines" msgid "Lines" -msgstr "" +msgstr "윤곽" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option concentric" msgid "Concentric" -msgstr "" +msgstr "동심원의" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "지그재그" #: fdmprinter.def.json msgctxt "skin_angles label" msgid "Top/Bottom Line Directions" -msgstr "" +msgstr "상단 / 하단 라인 길 찾기" #: fdmprinter.def.json msgctxt "skin_angles description" @@ -1020,7 +985,7 @@ msgstr "상단 / 하단 레이어가 선 또는 지그재그 패턴을 사용할 #: fdmprinter.def.json msgctxt "wall_0_inset label" msgid "Outer Wall Inset" -msgstr "" +msgstr "외벽 삽입" #: fdmprinter.def.json msgctxt "wall_0_inset description" @@ -1030,7 +995,7 @@ msgstr "외벽의 경로에 삽입이 적용됩니다. 외벽이 노즐보다 #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" -msgstr "" +msgstr "내벽 앞부분 바깥 쪽" #: fdmprinter.def.json msgctxt "outer_inset_first description" @@ -1040,7 +1005,7 @@ msgstr "사용 가능한 경우 외부에서 내부로 벽을 인쇄합니다. #: fdmprinter.def.json msgctxt "alternate_extra_perimeter label" msgid "Alternate Extra Wall" -msgstr "" +msgstr "대체 여분 벽" #: fdmprinter.def.json msgctxt "alternate_extra_perimeter description" @@ -1050,7 +1015,7 @@ msgstr "다른 모든 레이어에 여분의 벽을 인쇄합니다. 이렇게 #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled label" msgid "Compensate Wall Overlaps" -msgstr "" +msgstr "벽 겹침 보정" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled description" @@ -1060,7 +1025,7 @@ msgstr "이미 벽이있는 곳에 인쇄중인 벽의 부분에 대한 흐름 #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled label" msgid "Compensate Outer Wall Overlaps" -msgstr "" +msgstr "외벽 겹침 보정" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled description" @@ -1070,7 +1035,7 @@ msgstr "이미 벽이있는 곳에 인쇄되는 외벽 부분에 대한 흐름 #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled label" msgid "Compensate Inner Wall Overlaps" -msgstr "" +msgstr "내부 벽 겹침 보정" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled description" @@ -1080,7 +1045,7 @@ msgstr "이미 벽이있는 곳에 인쇄되는 내부 벽 부분에 대한 흐 #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" msgid "Fill Gaps Between Walls" -msgstr "" +msgstr "벽 사이의 간격 채우기" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps description" @@ -1090,17 +1055,17 @@ msgstr "벽이 딱 맞지 않는 벽 사이의 간격을 채 웁니다. " #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option nowhere" msgid "Nowhere" -msgstr "" +msgstr "아무데도" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" -msgstr "" +msgstr "어디에나" #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" -msgstr "" +msgstr "얇은 벽 인쇄" #: fdmprinter.def.json msgctxt "fill_outline_gaps description" @@ -1110,7 +1075,7 @@ msgstr "노즐 크기보다 수평으로 더 얇은 모델 조각을 인쇄하 #: fdmprinter.def.json msgctxt "xy_offset label" msgid "Horizontal Expansion" -msgstr "" +msgstr "수평 확장" #: fdmprinter.def.json msgctxt "xy_offset description" @@ -1120,7 +1085,7 @@ msgstr "각 레이어의 모든 다각형에 적용된 오프셋의 양입니다 #: fdmprinter.def.json msgctxt "xy_offset_layer_0 label" msgid "Initial Layer Horizontal Expansion" -msgstr "" +msgstr "초기 레이어 수평 확장" #: fdmprinter.def.json msgctxt "xy_offset_layer_0 description" @@ -1130,7 +1095,7 @@ msgstr "첫 번째 레이어의 모든 다각형에 적용된 오프셋의 양 #: fdmprinter.def.json msgctxt "z_seam_type label" msgid "Z Seam Alignment" -msgstr "" +msgstr "Z Seam Alignment" #: fdmprinter.def.json msgctxt "z_seam_type description" @@ -1140,27 +1105,27 @@ msgstr "레이어의 각 패스의 시작점입니다. 연속 레이어의 패 #: fdmprinter.def.json msgctxt "z_seam_type option back" msgid "User Specified" -msgstr "" +msgstr "사용자 지정" #: fdmprinter.def.json msgctxt "z_seam_type option shortest" msgid "Shortest" -msgstr "" +msgstr "최단" #: fdmprinter.def.json msgctxt "z_seam_type option random" msgid "Random" -msgstr "" +msgstr "랜덤" #: fdmprinter.def.json msgctxt "z_seam_type option sharpest_corner" msgid "Sharpest Corner" -msgstr "" +msgstr "날카로운 모서리" #: fdmprinter.def.json msgctxt "z_seam_x label" msgid "Z Seam X" -msgstr "" +msgstr "Z 경계선 X" #: fdmprinter.def.json msgctxt "z_seam_x description" @@ -1170,7 +1135,7 @@ msgstr "레이어의 각 파트 인쇄를 시작할 위치 근처의 X 좌표입 #: fdmprinter.def.json msgctxt "z_seam_y label" msgid "Z Seam Y" -msgstr "" +msgstr "Z 경계선 Y" #: fdmprinter.def.json msgctxt "z_seam_y description" @@ -1180,37 +1145,37 @@ msgstr "레이어의 각 부분을 인쇄 할 위치 근처의 위치에 대한 #: fdmprinter.def.json msgctxt "z_seam_corner label" msgid "Seam Corner Preference" -msgstr "" +msgstr "경계선 코너 환경 설정" #: fdmprinter.def.json msgctxt "z_seam_corner description" msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner." -msgstr "" +msgstr "모형 외곽선의 모서리가 솔기의 위치에 영향을 줄지 여부를 제어합니다. 코너가 경계선 위치에 영향을 미치지 않는다는 것을 의미하지 않ㅅ니다. 경계선 숨기기는 이음새가 안쪽 모서리에서 발생할 가능성을 높입니다. 노출 시임은 외부 모서리에서 이음새가 발생할 가능성을 높입니다. 숨김 또는 경게선 노출은 내부 또는 외부 모서리에서 발생할 가능성을 높입니다." #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_none" msgid "None" -msgstr "" +msgstr "없음" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_inner" msgid "Hide Seam" -msgstr "" +msgstr "경계선 숨기기" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_outer" msgid "Expose Seam" -msgstr "" +msgstr "경계선 노출" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_any" msgid "Hide or Expose Seam" -msgstr "" +msgstr "경계선 숨기기 또는 노출" #: fdmprinter.def.json msgctxt "z_seam_relative label" msgid "Z Seam Relative" -msgstr "" +msgstr "Z 관련있는 경계선" #: fdmprinter.def.json msgctxt "z_seam_relative description" @@ -1220,7 +1185,7 @@ msgstr "활성화 된 경우 z 심 좌표는 각 부품의 중심을 기준으 #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" msgid "Ignore Small Z Gaps" -msgstr "" +msgstr "작은 Z 간격 무시" #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic description" @@ -1230,117 +1195,17 @@ msgstr "모델에 수직 간격이 작 으면이 좁은 공간에서 상단 및 #: fdmprinter.def.json msgctxt "skin_outline_count label" msgid "Extra Skin Wall Count" -msgstr "" +msgstr "여분 피부 벽 조사" #: fdmprinter.def.json msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "위쪽 / 아래쪽 패턴의 가장 바깥 쪽 부분을 여러 동심 선으로 바꿉니다. 하나 또는 두 개의 선을 사용하면 충진재로 시작하는 지붕이 향상됩니다. " -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "윗면을 다림질 할 때 사용하는 패턴. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "다림질 라인 사이의 거리. " - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "상단 표면을 통과하는 속도. " - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "다림질이 수행되는 가속도. " - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "다림질을하는 동안 최대 순간 속도 변화. " - #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" -msgstr "" +msgstr "충진" #: fdmprinter.def.json msgctxt "infill description" @@ -1350,7 +1215,7 @@ msgstr "충진 " #: fdmprinter.def.json msgctxt "infill_extruder_nr label" msgid "Infill Extruder" -msgstr "" +msgstr "충진 압출기" #: fdmprinter.def.json msgctxt "infill_extruder_nr description" @@ -1360,17 +1225,17 @@ msgstr "충진용 인쇄에 사용되는 압출기 트레인. 이것은 다중 #: fdmprinter.def.json msgctxt "infill_sparse_density label" msgid "Infill Density" -msgstr "" +msgstr "충진 밀도" #: fdmprinter.def.json msgctxt "infill_sparse_density description" msgid "Adjusts the density of infill of the print." -msgstr "인쇄물의 충진율를 조절합니다." +msgstr "인쇄물의 충진을 조절합니다." #: fdmprinter.def.json msgctxt "infill_line_distance label" msgid "Infill Line Distance" -msgstr "" +msgstr "충진 선간 거리" #: fdmprinter.def.json msgctxt "infill_line_distance description" @@ -1380,122 +1245,97 @@ msgstr "인쇄 된 충진 선 사이의 거리. 이 설정은 충전 밀도 및 #: fdmprinter.def.json msgctxt "infill_pattern label" msgid "Infill Pattern" -msgstr "" +msgstr "충진 패턴" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " #: fdmprinter.def.json msgctxt "infill_pattern option grid" msgid "Grid" -msgstr "" +msgstr "그리드" #: fdmprinter.def.json msgctxt "infill_pattern option lines" msgid "Lines" -msgstr "" +msgstr "윤곽" #: fdmprinter.def.json msgctxt "infill_pattern option triangles" msgid "Triangles" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_pattern option trihexagon" -msgid "Tri-Hexagon" -msgstr "" +msgstr "삼각형" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" -msgstr "" +msgstr "입방체" #: fdmprinter.def.json msgctxt "infill_pattern option cubicsubdiv" msgid "Cubic Subdivision" -msgstr "" +msgstr "입방체 세분" #: fdmprinter.def.json msgctxt "infill_pattern option tetrahedral" msgid "Octet" -msgstr "" +msgstr "팔중주" #: fdmprinter.def.json msgctxt "infill_pattern option quarter_cubic" msgid "Quarter Cubic" -msgstr "" +msgstr "쿼터 큐브" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "동심원의" #: fdmprinter.def.json msgctxt "infill_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "동심원 3D" #: fdmprinter.def.json msgctxt "infill_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "지그재그" #: fdmprinter.def.json msgctxt "infill_pattern option cross" msgid "Cross" -msgstr "" +msgstr "십자형" #: fdmprinter.def.json msgctxt "infill_pattern option cross_3d" msgid "Cross 3D" -msgstr "" +msgstr "십자형 3D" #: fdmprinter.def.json msgctxt "zig_zaggify_infill label" msgid "Connect Infill Lines" -msgstr "" +msgstr "충진 선 연결" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " #: fdmprinter.def.json msgctxt "infill_angles label" msgid "Infill Line Directions" -msgstr "" +msgstr "충진 선 방향" #: fdmprinter.def.json msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호 안에 들어 있습니다. 기본값은 전통적인 기본 각도 (선 및 지그재그 패턴의 경우 45 및 135도, 다른 모든 패턴의 경우 45도)를 사용한다는 의미의 빈 목록입니다. " -#: fdmprinter.def.json -msgctxt "infill_offset_x label" -msgid "Infill X Offset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_offset_x description" -msgid "The infill pattern is offset this distance along the X axis." -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_offset_y label" -msgid "Infill Y Offset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_offset_y description" -msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" - #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" -msgstr "" +msgstr "입방 세분 내관" #: fdmprinter.def.json msgctxt "sub_div_rad_add description" @@ -1505,7 +1345,7 @@ msgstr "모델의 경계를 확인하기 위해 각 큐브의 중심에서 반 #: fdmprinter.def.json msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" -msgstr "" +msgstr "충진 오버랩 비율" #: fdmprinter.def.json msgctxt "infill_overlap description" @@ -1515,7 +1355,7 @@ msgstr "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전 #: fdmprinter.def.json msgctxt "infill_overlap_mm label" msgid "Infill Overlap" -msgstr "" +msgstr "충진 오버랩" #: fdmprinter.def.json msgctxt "infill_overlap_mm description" @@ -1525,7 +1365,7 @@ msgstr "충진재와 벽 사이의 겹침 정도. 약간 겹치면 벽이 충전 #: fdmprinter.def.json msgctxt "skin_overlap label" msgid "Skin Overlap Percentage" -msgstr "" +msgstr "피부 겹침 비율" #: fdmprinter.def.json msgctxt "skin_overlap description" @@ -1535,7 +1375,7 @@ msgstr "선 두께의 백분율로 스킨과 벽 사이의 겹치는 정도입 #: fdmprinter.def.json msgctxt "skin_overlap_mm label" msgid "Skin Overlap" -msgstr "" +msgstr "피부 겹침" #: fdmprinter.def.json msgctxt "skin_overlap_mm description" @@ -1545,7 +1385,7 @@ msgstr "피부와 벽 사이의 겹침 정도입니다. 약간 겹치면 벽이 #: fdmprinter.def.json msgctxt "infill_wipe_dist label" msgid "Infill Wipe Distance" -msgstr "" +msgstr "충진 Wipe 거리" #: fdmprinter.def.json msgctxt "infill_wipe_dist description" @@ -1555,7 +1395,7 @@ msgstr "각 충진 라인 다음에 삽입 된 이동 이동 거리. infill 스 #: fdmprinter.def.json msgctxt "infill_sparse_thickness label" msgid "Infill Layer Thickness" -msgstr "" +msgstr "충진 층 두께" #: fdmprinter.def.json msgctxt "infill_sparse_thickness description" @@ -1565,7 +1405,7 @@ msgstr "충진물 층의 두께. 이 값은 항상 레이어 높이의 배수 #: fdmprinter.def.json msgctxt "gradual_infill_steps label" msgid "Gradual Infill Steps" -msgstr "" +msgstr "점진적인 충진 단계" #: fdmprinter.def.json msgctxt "gradual_infill_steps description" @@ -1575,7 +1415,7 @@ msgstr "상면 아래로 갈 때 충진 밀도를 반으로 줄이는 횟수입 #: fdmprinter.def.json msgctxt "gradual_infill_step_height label" msgid "Gradual Infill Step Height" -msgstr "" +msgstr "점진적인 충진 단계 높이" #: fdmprinter.def.json msgctxt "gradual_infill_step_height description" @@ -1585,7 +1425,7 @@ msgstr "밀도의 절반으로 전환하기 전에 주어진 밀도의 infill #: fdmprinter.def.json msgctxt "infill_before_walls label" msgid "Infill Before Walls" -msgstr "" +msgstr "벽 앞에 충진" #: fdmprinter.def.json msgctxt "infill_before_walls description" @@ -1595,7 +1435,7 @@ msgstr "벽을 인쇄하기 전에 충진물을 인쇄하십시오. 벽을 먼 #: fdmprinter.def.json msgctxt "min_infill_area label" msgid "Minimum Infill Area" -msgstr "" +msgstr "최소 충진 지역" #: fdmprinter.def.json msgctxt "min_infill_area description" @@ -1605,7 +1445,7 @@ msgstr "이보다 작은 충진물 영역을 생성하지 마십시오 (대신 #: fdmprinter.def.json msgctxt "skin_preshrink label" msgid "Skin Removal Width" -msgstr "" +msgstr "피부 제거 폭" #: fdmprinter.def.json msgctxt "skin_preshrink description" @@ -1615,7 +1455,7 @@ msgstr "제거 할 외부스킨 영역의 가장 큰 너비. 이 값보다 작 #: fdmprinter.def.json msgctxt "top_skin_preshrink label" msgid "Top Skin Removal Width" -msgstr "" +msgstr "상단 피부 제거 폭" #: fdmprinter.def.json msgctxt "top_skin_preshrink description" @@ -1625,7 +1465,7 @@ msgstr "제거 할 상단 스킨 영역의 가장 큰 너비. 이 값보다 작 #: fdmprinter.def.json msgctxt "bottom_skin_preshrink label" msgid "Bottom Skin Removal Width" -msgstr "" +msgstr "밑면 피부 제거 폭" #: fdmprinter.def.json msgctxt "bottom_skin_preshrink description" @@ -1635,7 +1475,7 @@ msgstr "제거 할 바닥 스킨 영역의 최대 너비. 이 값보다 작은 #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" msgid "Skin Expand Distance" -msgstr "" +msgstr "피부 확장 거리" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" @@ -1645,7 +1485,7 @@ msgstr "스킨이 infill로 확장되는 거리입니다. 값이 높을수록 #: fdmprinter.def.json msgctxt "top_skin_expand_distance label" msgid "Top Skin Expand Distance" -msgstr "" +msgstr "윗면 피부 확장 거리" #: fdmprinter.def.json msgctxt "top_skin_expand_distance description" @@ -1655,7 +1495,7 @@ msgstr "상단 스킨의 거리가 infill로 확장됩니다. 값이 높을수 #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance label" msgid "Bottom Skin Expand Distance" -msgstr "" +msgstr "밑면 피부 확장 거리" #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance description" @@ -1665,7 +1505,7 @@ msgstr "바닥 스킨의 거리가 infill로 확장됩니다. 값이 높을수 #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion label" msgid "Maximum Skin Angle for Expansion" -msgstr "" +msgstr "확장을 위한 최대 피부 각" #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion description" @@ -1675,7 +1515,7 @@ msgstr "이 설정보다 큰 각도로 객체의 상단 및 또는 하단 표면 #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion label" msgid "Minimum Skin Width for Expansion" -msgstr "" +msgstr "확장을 위한 최소 피부 폭" #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion description" @@ -1685,7 +1525,7 @@ msgstr "이보다 좁은 스킨 영역은 확장되지 않습니다. 이렇게 #: fdmprinter.def.json msgctxt "material label" msgid "Material" -msgstr "" +msgstr "자재" #: fdmprinter.def.json msgctxt "material description" @@ -1695,7 +1535,7 @@ msgstr "재료 " #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" msgid "Auto Temperature" -msgstr "" +msgstr "자동 온도" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature description" @@ -1705,7 +1545,7 @@ msgstr "해당 레이어의 평균 유속으로 각 레이어의 온도를 자 #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" -msgstr "" +msgstr "기본 인쇄 온도" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" @@ -1715,7 +1555,7 @@ msgstr "인쇄에 사용되는 기본 온도입니다. 이것은 재료의 \"기 #: fdmprinter.def.json msgctxt "material_print_temperature label" msgid "Printing Temperature" -msgstr "" +msgstr "인쇄 온도" #: fdmprinter.def.json msgctxt "material_print_temperature description" @@ -1725,7 +1565,7 @@ msgstr "인쇄에 사용되는 온도. " #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 label" msgid "Printing Temperature Initial Layer" -msgstr "" +msgstr "인쇄 온도 초기 레이어" #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 description" @@ -1735,7 +1575,7 @@ msgstr "첫 번째 레이어 인쇄에 사용되는 온도입니다. 초기 레 #: fdmprinter.def.json msgctxt "material_initial_print_temperature label" msgid "Initial Printing Temperature" -msgstr "" +msgstr "초기 인쇄 온도" #: fdmprinter.def.json msgctxt "material_initial_print_temperature description" @@ -1745,7 +1585,7 @@ msgstr "인쇄가 이미 시작될 수있는 인쇄 온도까지 가열하는 #: fdmprinter.def.json msgctxt "material_final_print_temperature label" msgid "Final Printing Temperature" -msgstr "" +msgstr "최종 인쇄 온도" #: fdmprinter.def.json msgctxt "material_final_print_temperature description" @@ -1755,7 +1595,7 @@ msgstr "인쇄 종료 직전에 이미 냉각이 시작될 온도입니다. " #: fdmprinter.def.json msgctxt "material_flow_temp_graph label" msgid "Flow Temperature Graph" -msgstr "" +msgstr "유동 온도 그래프" #: fdmprinter.def.json msgctxt "material_flow_temp_graph description" @@ -1765,7 +1605,7 @@ msgstr "데이터 흐름 (mm3 / 초) - 온도 (섭씨). " #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" -msgstr "" +msgstr "압출 냉각 속도 조절기" #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed description" @@ -1775,7 +1615,7 @@ msgstr "압출하는 동안 노즐이 냉각되는 추가 속도. 압출하는 #: fdmprinter.def.json msgctxt "material_bed_temperature label" msgid "Build Plate Temperature" -msgstr "" +msgstr "빌드 플레이트 온도" #: fdmprinter.def.json msgctxt "material_bed_temperature description" @@ -1785,7 +1625,7 @@ msgstr "가열 된 빌드 플레이트에 사용되는 온도. 이 값이 0이 #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" msgid "Build Plate Temperature Initial Layer" -msgstr "" +msgstr "빌드 플레이트 온도 초기 레이어" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 description" @@ -1795,37 +1635,17 @@ msgstr "첫 번째 레이어에서 가열 된 빌드 플레이트에 사용되 #: fdmprinter.def.json msgctxt "material_diameter label" msgid "Diameter" -msgstr "" +msgstr "직경" #: fdmprinter.def.json msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "사용 된 필라멘트의 직경을 조정합니다. 이 값을 사용 필라멘트의 직경과 일치시킵니다. " -#: fdmprinter.def.json -msgctxt "material_adhesion_tendency label" -msgid "Adhesion Tendency" -msgstr "" - -#: fdmprinter.def.json -msgctxt "material_adhesion_tendency description" -msgid "Surface adhesion tendency." -msgstr "" - -#: fdmprinter.def.json -msgctxt "material_surface_energy label" -msgid "Surface Energy" -msgstr "" - -#: fdmprinter.def.json -msgctxt "material_surface_energy description" -msgid "Surface energy." -msgstr "" - #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" -msgstr "" +msgstr "공급량" #: fdmprinter.def.json msgctxt "material_flow description" @@ -1835,7 +1655,7 @@ msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. " #: fdmprinter.def.json msgctxt "retraction_enable label" msgid "Enable Retraction" -msgstr "" +msgstr "후퇴 가능" #: fdmprinter.def.json msgctxt "retraction_enable description" @@ -1845,7 +1665,7 @@ msgstr "노즐이 인쇄되지 않은 영역 위로 움직일 때 필라멘트 #: fdmprinter.def.json msgctxt "retract_at_layer_change label" msgid "Retract at Layer Change" -msgstr "" +msgstr "레이어 변경시 취소" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" @@ -1855,7 +1675,7 @@ msgstr "노즐이 다음 층으로 이동할 때 필라멘트를 후퇴시킵니 #: fdmprinter.def.json msgctxt "retraction_amount label" msgid "Retraction Distance" -msgstr "" +msgstr "후퇴 거리" #: fdmprinter.def.json msgctxt "retraction_amount description" @@ -1865,7 +1685,7 @@ msgstr "후퇴 이동 중에 수축 된 재료의 길이입니다. " #: fdmprinter.def.json msgctxt "retraction_speed label" msgid "Retraction Speed" -msgstr "" +msgstr "후퇴 속도" #: fdmprinter.def.json msgctxt "retraction_speed description" @@ -1875,7 +1695,7 @@ msgstr "후퇴 이동 중에 필라멘트가 수축되고 프라이밍되는 속 #: fdmprinter.def.json msgctxt "retraction_retract_speed label" msgid "Retraction Retract Speed" -msgstr "" +msgstr "후퇴 속도" #: fdmprinter.def.json msgctxt "retraction_retract_speed description" @@ -1885,7 +1705,7 @@ msgstr "후퇴 이동 중에 필라멘트가 후퇴하는 속도입니다. " #: fdmprinter.def.json msgctxt "retraction_prime_speed label" msgid "Retraction Prime Speed" -msgstr "" +msgstr "후퇴 초기 속도" #: fdmprinter.def.json msgctxt "retraction_prime_speed description" @@ -1895,7 +1715,7 @@ msgstr "후퇴 이동 중에 필라멘트가 프라이밍되는 속도입니다. #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount label" msgid "Retraction Extra Prime Amount" -msgstr "" +msgstr "후퇴 Extra 초기 속도" #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount description" @@ -1905,7 +1725,7 @@ msgstr "여행 중에 이동할 수있는 물질이 있습니다.이 물질은 #: fdmprinter.def.json msgctxt "retraction_min_travel label" msgid "Retraction Minimum Travel" -msgstr "" +msgstr "후퇴 최소 움직임" #: fdmprinter.def.json msgctxt "retraction_min_travel description" @@ -1915,7 +1735,7 @@ msgstr "수축이 일어나기 위해 필요한 최소한의 이동 거리. 이 #: fdmprinter.def.json msgctxt "retraction_count_max label" msgid "Maximum Retraction Count" -msgstr "" +msgstr "최대 후퇴 수" #: fdmprinter.def.json msgctxt "retraction_count_max description" @@ -1925,7 +1745,7 @@ msgstr "이 설정은 최소 돌출 거리 창 내에서 발생하는 후퇴 수 #: fdmprinter.def.json msgctxt "retraction_extrusion_window label" msgid "Minimum Extrusion Distance Window" -msgstr "" +msgstr "최소 돌출 거리 창" #: fdmprinter.def.json msgctxt "retraction_extrusion_window description" @@ -1935,7 +1755,7 @@ msgstr "최대 후퇴 횟수가 시행되는 창입니다. 이 값은 수축 거 #: fdmprinter.def.json msgctxt "material_standby_temperature label" msgid "Standby Temperature" -msgstr "" +msgstr "대기 온도" #: fdmprinter.def.json msgctxt "material_standby_temperature description" @@ -1945,7 +1765,7 @@ msgstr "다른 노즐이 현재 인쇄에 사용되는 경우의 노즐 온도. #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount label" msgid "Nozzle Switch Retraction Distance" -msgstr "" +msgstr "노즐 스위치 후퇴 거리" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount description" @@ -1955,7 +1775,7 @@ msgstr "수축 양 : 수축이 전혀없는 경우 0으로 설정합니다. 일 #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds label" msgid "Nozzle Switch Retraction Speed" -msgstr "" +msgstr "노즐 스위치 후퇴 속도" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds description" @@ -1965,7 +1785,7 @@ msgstr "필라멘트가 수축되는 속도입니다. 후퇴 속도가 빠르면 #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed label" msgid "Nozzle Switch Retract Speed" -msgstr "" +msgstr "노즐 스위치 후퇴 속도" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed description" @@ -1975,7 +1795,7 @@ msgstr "노즐 스위치가 들어갈 때 필라멘트가 후퇴하는 속도. " #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed label" msgid "Nozzle Switch Prime Speed" -msgstr "" +msgstr "노즐 스위치 프라임 속도" #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed description" @@ -1985,7 +1805,7 @@ msgstr "노즐 스위치 수축 후 필라멘트가 뒤로 밀리는 속도. " #: fdmprinter.def.json msgctxt "speed label" msgid "Speed" -msgstr "" +msgstr "속도" #: fdmprinter.def.json msgctxt "speed description" @@ -1995,7 +1815,7 @@ msgstr "속도 " #: fdmprinter.def.json msgctxt "speed_print label" msgid "Print Speed" -msgstr "" +msgstr "인쇄 속도" #: fdmprinter.def.json msgctxt "speed_print description" @@ -2005,7 +1825,7 @@ msgstr "인쇄 속도. " #: fdmprinter.def.json msgctxt "speed_infill label" msgid "Infill Speed" -msgstr "" +msgstr "충진 속도" #: fdmprinter.def.json msgctxt "speed_infill description" @@ -2015,7 +1835,7 @@ msgstr "충진물이 인쇄되는 속도. " #: fdmprinter.def.json msgctxt "speed_wall label" msgid "Wall Speed" -msgstr "" +msgstr "벽 속도" #: fdmprinter.def.json msgctxt "speed_wall description" @@ -2025,7 +1845,7 @@ msgstr "벽이 인쇄되는 속도입니다. " #: fdmprinter.def.json msgctxt "speed_wall_0 label" msgid "Outer Wall Speed" -msgstr "" +msgstr "외벽 속도" #: fdmprinter.def.json msgctxt "speed_wall_0 description" @@ -2035,7 +1855,7 @@ msgstr "가장 바깥 쪽 벽이 인쇄되는 속도입니다. 외벽을 더 낮 #: fdmprinter.def.json msgctxt "speed_wall_x label" msgid "Inner Wall Speed" -msgstr "" +msgstr "내벽 속도" #: fdmprinter.def.json msgctxt "speed_wall_x description" @@ -2045,7 +1865,7 @@ msgstr "모든 내부 벽이 인쇄되는 속도입니다. 내벽을 외벽보 #: fdmprinter.def.json msgctxt "speed_roofing label" msgid "Top Surface Skin Speed" -msgstr "" +msgstr "상단 표면 피부 속도" #: fdmprinter.def.json msgctxt "speed_roofing description" @@ -2055,7 +1875,7 @@ msgstr "상단 표면 스킨 층이 인쇄되는 속도." #: fdmprinter.def.json msgctxt "speed_topbottom label" msgid "Top/Bottom Speed" -msgstr "" +msgstr "상단 / 하단 속도" #: fdmprinter.def.json msgctxt "speed_topbottom description" @@ -2065,7 +1885,7 @@ msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 속도입니다. " #: fdmprinter.def.json msgctxt "speed_support label" msgid "Support Speed" -msgstr "" +msgstr "지지물 속도" #: fdmprinter.def.json msgctxt "speed_support description" @@ -2075,7 +1895,7 @@ msgstr "지지 구조가 인쇄되는 속도입니다. 고속 인쇄 지원은 #: fdmprinter.def.json msgctxt "speed_support_infill label" msgid "Support Infill Speed" -msgstr "" +msgstr "지지물 충진 속도" #: fdmprinter.def.json msgctxt "speed_support_infill description" @@ -2085,7 +1905,7 @@ msgstr "지지대의 충전물이 인쇄되는 속도. infill을 저속으로 #: fdmprinter.def.json msgctxt "speed_support_interface label" msgid "Support Interface Speed" -msgstr "" +msgstr "지지물 인터페이스 속도" #: fdmprinter.def.json msgctxt "speed_support_interface description" @@ -2095,7 +1915,7 @@ msgstr "지지대의 지붕과 바닥이 인쇄되는 속도. 인쇄 속도를 #: fdmprinter.def.json msgctxt "speed_support_roof label" msgid "Support Roof Speed" -msgstr "" +msgstr "지지물 상단 속도" #: fdmprinter.def.json msgctxt "speed_support_roof description" @@ -2105,7 +1925,7 @@ msgstr "지지대의 지붕이 인쇄되는 속도입니다. 인쇄 속도를 #: fdmprinter.def.json msgctxt "speed_support_bottom label" msgid "Support Floor Speed" -msgstr "" +msgstr "지지물 바닥 속도" #: fdmprinter.def.json msgctxt "speed_support_bottom description" @@ -2115,7 +1935,7 @@ msgstr "지지대 바닥 인쇄 속도. 더 낮은 속도로 인쇄하면 모델 #: fdmprinter.def.json msgctxt "speed_prime_tower label" msgid "Prime Tower Speed" -msgstr "" +msgstr "프라임 타워 속도" #: fdmprinter.def.json msgctxt "speed_prime_tower description" @@ -2125,7 +1945,7 @@ msgstr "프라임 타워가 인쇄되는 속도. 프라임 타워를 더 천천 #: fdmprinter.def.json msgctxt "speed_travel label" msgid "Travel Speed" -msgstr "" +msgstr "움직임 속도" #: fdmprinter.def.json msgctxt "speed_travel description" @@ -2135,7 +1955,7 @@ msgstr "움직일때의 이동 속도." #: fdmprinter.def.json msgctxt "speed_layer_0 label" msgid "Initial Layer Speed" -msgstr "" +msgstr "초기 레이어 속도" #: fdmprinter.def.json msgctxt "speed_layer_0 description" @@ -2145,7 +1965,7 @@ msgstr "초기 레이어의 속도입니다. 빌드 플레이트에 대한 접 #: fdmprinter.def.json msgctxt "speed_print_layer_0 label" msgid "Initial Layer Print Speed" -msgstr "" +msgstr "초기 레이어 인쇄 속도" #: fdmprinter.def.json msgctxt "speed_print_layer_0 description" @@ -2155,7 +1975,7 @@ msgstr "초기 레이어의 인쇄 속도입니다. 빌드 플레이트에 대 #: fdmprinter.def.json msgctxt "speed_travel_layer_0 label" msgid "Initial Layer Travel Speed" -msgstr "" +msgstr "초기 레이어 이동 속도" #: fdmprinter.def.json msgctxt "speed_travel_layer_0 description" @@ -2165,7 +1985,7 @@ msgstr "이동 속도는 초기 레이어에서 이동합니다. 이전에 인 #: fdmprinter.def.json msgctxt "skirt_brim_speed label" msgid "Skirt/Brim Speed" -msgstr "" +msgstr "Skirt/Brim 속도" #: fdmprinter.def.json msgctxt "skirt_brim_speed description" @@ -2175,7 +1995,7 @@ msgstr "스커트와 가장자리가 인쇄되는 속도입니다. 일반적으 #: fdmprinter.def.json msgctxt "max_feedrate_z_override label" msgid "Maximum Z Speed" -msgstr "" +msgstr "최대 Z 속도" #: fdmprinter.def.json msgctxt "max_feedrate_z_override description" @@ -2185,7 +2005,7 @@ msgstr "빌드 플레이트가 움직이는 최대 속도. 이 값을 0으로 #: fdmprinter.def.json msgctxt "speed_slowdown_layers label" msgid "Number of Slower Layers" -msgstr "" +msgstr "느린 레이어 수" #: fdmprinter.def.json msgctxt "speed_slowdown_layers description" @@ -2195,7 +2015,7 @@ msgstr "처음 몇 개의 레이어는 모델의 나머지 부분보다 느리 #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" msgid "Equalize Filament Flow" -msgstr "" +msgstr "필라멘트 흐름 균일화" #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled description" @@ -2205,7 +2025,7 @@ msgstr "일반 라인보다 얇게 인쇄하여 초당 압출되는 재료의 #: fdmprinter.def.json msgctxt "speed_equalize_flow_max label" msgid "Maximum Speed for Flow Equalization" -msgstr "" +msgstr "유량 균등화를위한 최대 속도" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max description" @@ -2215,7 +2035,7 @@ msgstr "인쇄 속도를 조정할 때 최대 인쇄 속도로 흐름을 균등 #: fdmprinter.def.json msgctxt "acceleration_enabled label" msgid "Enable Acceleration Control" -msgstr "" +msgstr "가속 제어 사용" #: fdmprinter.def.json msgctxt "acceleration_enabled description" @@ -2225,7 +2045,7 @@ msgstr "프린트 헤드 가속도를 조정할 수 있습니다. 가속도를 #: fdmprinter.def.json msgctxt "acceleration_print label" msgid "Print Acceleration" -msgstr "" +msgstr "인쇄 가속도" #: fdmprinter.def.json msgctxt "acceleration_print description" @@ -2235,7 +2055,7 @@ msgstr "인쇄 속도가 빨라집니다. " #: fdmprinter.def.json msgctxt "acceleration_infill label" msgid "Infill Acceleration" -msgstr "" +msgstr "충진 가속도" #: fdmprinter.def.json msgctxt "acceleration_infill description" @@ -2245,7 +2065,7 @@ msgstr "충진물이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_wall label" msgid "Wall Acceleration" -msgstr "" +msgstr "벽 가속도" #: fdmprinter.def.json msgctxt "acceleration_wall description" @@ -2255,7 +2075,7 @@ msgstr "벽이 가속되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_wall_0 label" msgid "Outer Wall Acceleration" -msgstr "" +msgstr "외벽 가속도" #: fdmprinter.def.json msgctxt "acceleration_wall_0 description" @@ -2265,7 +2085,7 @@ msgstr "가장 바깥 쪽 벽이 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_wall_x label" msgid "Inner Wall Acceleration" -msgstr "" +msgstr "내벽 가속도" #: fdmprinter.def.json msgctxt "acceleration_wall_x description" @@ -2275,7 +2095,7 @@ msgstr "모든 내부 벽이 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_roofing label" msgid "Top Surface Skin Acceleration" -msgstr "" +msgstr "상단 표면 피부 가속도" #: fdmprinter.def.json msgctxt "acceleration_roofing description" @@ -2285,7 +2105,7 @@ msgstr "상단 표면 스킨 층이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_topbottom label" msgid "Top/Bottom Acceleration" -msgstr "" +msgstr "상단 / 하단 가속도" #: fdmprinter.def.json msgctxt "acceleration_topbottom description" @@ -2295,7 +2115,7 @@ msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_support label" msgid "Support Acceleration" -msgstr "" +msgstr "지지물 가속도" #: fdmprinter.def.json msgctxt "acceleration_support description" @@ -2305,7 +2125,7 @@ msgstr "지지 구조가 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_support_infill label" msgid "Support Infill Acceleration" -msgstr "" +msgstr "지지물 충진 가속도" #: fdmprinter.def.json msgctxt "acceleration_support_infill description" @@ -2315,7 +2135,7 @@ msgstr "지지대의 충전물이 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_support_interface label" msgid "Support Interface Acceleration" -msgstr "" +msgstr "지지물 인터페이스 가속도" #: fdmprinter.def.json msgctxt "acceleration_support_interface description" @@ -2325,7 +2145,7 @@ msgstr "지지대의 지붕과 바닥이 인쇄되는 가속도. 낮은 가속 #: fdmprinter.def.json msgctxt "acceleration_support_roof label" msgid "Support Roof Acceleration" -msgstr "" +msgstr "지지물 상단 가속도" #: fdmprinter.def.json msgctxt "acceleration_support_roof description" @@ -2335,7 +2155,7 @@ msgstr "지지대의 지붕이 인쇄되는 가속도. 낮은 가속도로 인 #: fdmprinter.def.json msgctxt "acceleration_support_bottom label" msgid "Support Floor Acceleration" -msgstr "" +msgstr "지지대 바닥 가속도" #: fdmprinter.def.json msgctxt "acceleration_support_bottom description" @@ -2345,7 +2165,7 @@ msgstr "지면의 가속도가 인쇄됩니다. 보다 낮은 가속도로 인 #: fdmprinter.def.json msgctxt "acceleration_prime_tower label" msgid "Prime Tower Acceleration" -msgstr "" +msgstr "프라임 타워 가속" #: fdmprinter.def.json msgctxt "acceleration_prime_tower description" @@ -2355,7 +2175,7 @@ msgstr "프라임 타워가 인쇄되는 가속도. " #: fdmprinter.def.json msgctxt "acceleration_travel label" msgid "Travel Acceleration" -msgstr "" +msgstr "움직임 가속" #: fdmprinter.def.json msgctxt "acceleration_travel description" @@ -2365,7 +2185,7 @@ msgstr "여행이 움직이는 가속도가 만들어집니다. " #: fdmprinter.def.json msgctxt "acceleration_layer_0 label" msgid "Initial Layer Acceleration" -msgstr "" +msgstr "초기 레이어 가속" #: fdmprinter.def.json msgctxt "acceleration_layer_0 description" @@ -2375,7 +2195,7 @@ msgstr "초기 레이어의 가속도입니다. " #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 label" msgid "Initial Layer Print Acceleration" -msgstr "" +msgstr "초기 레이어 인쇄 가속" #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 description" @@ -2385,7 +2205,7 @@ msgstr "초기 레이어 인쇄 중 가속도. " #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 label" msgid "Initial Layer Travel Acceleration" -msgstr "" +msgstr "초기 레이어 움직임 가속도" #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 description" @@ -2395,7 +2215,7 @@ msgstr "이동 가속도는 초기 레이어에서 이동합니다. " #: fdmprinter.def.json msgctxt "acceleration_skirt_brim label" msgid "Skirt/Brim Acceleration" -msgstr "" +msgstr "Skirt/Brim 가속도" #: fdmprinter.def.json msgctxt "acceleration_skirt_brim description" @@ -2405,7 +2225,7 @@ msgstr "치마와 가장자리가 인쇄되는 가속도. 일반적으로 이것 #: fdmprinter.def.json msgctxt "jerk_enabled label" msgid "Enable Jerk Control" -msgstr "" +msgstr "저크 컨트롤 사용" #: fdmprinter.def.json msgctxt "jerk_enabled description" @@ -2415,7 +2235,7 @@ msgstr "X 또는 Y 축의 속도가 변경 될 때 프린트 헤드의 속도를 #: fdmprinter.def.json msgctxt "jerk_print label" msgid "Print Jerk" -msgstr "" +msgstr "Jerk 인쇄" #: fdmprinter.def.json msgctxt "jerk_print description" @@ -2425,7 +2245,7 @@ msgstr "프린트 헤드의 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_infill label" msgid "Infill Jerk" -msgstr "" +msgstr "Jerk 충진" #: fdmprinter.def.json msgctxt "jerk_infill description" @@ -2435,7 +2255,7 @@ msgstr "충진물이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall label" msgid "Wall Jerk" -msgstr "" +msgstr "벽 Jerk" #: fdmprinter.def.json msgctxt "jerk_wall description" @@ -2445,7 +2265,7 @@ msgstr "벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall_0 label" msgid "Outer Wall Jerk" -msgstr "" +msgstr "외벽 Jerk" #: fdmprinter.def.json msgctxt "jerk_wall_0 description" @@ -2455,7 +2275,7 @@ msgstr "가장 바깥 쪽 벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_wall_x label" msgid "Inner Wall Jerk" -msgstr "" +msgstr "내벽 Jerk" #: fdmprinter.def.json msgctxt "jerk_wall_x description" @@ -2465,7 +2285,7 @@ msgstr "모든 내부 벽이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_roofing label" msgid "Top Surface Skin Jerk" -msgstr "" +msgstr "피부 윗 표면 Jerk" #: fdmprinter.def.json msgctxt "jerk_roofing description" @@ -2475,7 +2295,7 @@ msgstr "상단 표면 스킨 층이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_topbottom label" msgid "Top/Bottom Jerk" -msgstr "" +msgstr "위 / 아래 Jerk" #: fdmprinter.def.json msgctxt "jerk_topbottom description" @@ -2485,7 +2305,7 @@ msgstr "상단 / 하단 레이어가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support label" msgid "Support Jerk" -msgstr "" +msgstr "지지대 Jerk" #: fdmprinter.def.json msgctxt "jerk_support description" @@ -2495,7 +2315,7 @@ msgstr "지지 구조가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_infill label" msgid "Support Infill Jerk" -msgstr "" +msgstr "지지대 충진 Jerk" #: fdmprinter.def.json msgctxt "jerk_support_infill description" @@ -2505,7 +2325,7 @@ msgstr "지지대가 채워지는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_interface label" msgid "Support Interface Jerk" -msgstr "" +msgstr "지원 인터페이스 Jerk" #: fdmprinter.def.json msgctxt "jerk_support_interface description" @@ -2515,7 +2335,7 @@ msgstr "지지대의 지붕과 바닥이 인쇄되는 최대 순간 속도 변 #: fdmprinter.def.json msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" -msgstr "" +msgstr "지지대 위 Jerk" #: fdmprinter.def.json msgctxt "jerk_support_roof description" @@ -2525,7 +2345,7 @@ msgstr "지지대의 지붕이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" -msgstr "" +msgstr "지지대 바닥 Jerk" #: fdmprinter.def.json msgctxt "jerk_support_bottom description" @@ -2535,7 +2355,7 @@ msgstr "지지대의 바닥이 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_prime_tower label" msgid "Prime Tower Jerk" -msgstr "" +msgstr "프라임 타워 Jerk" #: fdmprinter.def.json msgctxt "jerk_prime_tower description" @@ -2545,7 +2365,7 @@ msgstr "프라임 타워가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_travel label" msgid "Travel Jerk" -msgstr "" +msgstr "움직임 Jerk" #: fdmprinter.def.json msgctxt "jerk_travel description" @@ -2555,7 +2375,7 @@ msgstr "이동이 이동하는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_layer_0 label" msgid "Initial Layer Jerk" -msgstr "" +msgstr "초기 레이어 Jerk" #: fdmprinter.def.json msgctxt "jerk_layer_0 description" @@ -2565,7 +2385,7 @@ msgstr "초기 레이어의 인쇄 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_print_layer_0 label" msgid "Initial Layer Print Jerk" -msgstr "" +msgstr "초기 레이어 인쇄 Jerk" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" @@ -2575,7 +2395,7 @@ msgstr "초기 층의 인쇄 중 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 label" msgid "Initial Layer Travel Jerk" -msgstr "" +msgstr "초기 레이어 움직임 Jerk" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 description" @@ -2585,7 +2405,7 @@ msgstr "이동 가속도는 초기 레이어에서 이동합니다. " #: fdmprinter.def.json msgctxt "jerk_skirt_brim label" msgid "Skirt/Brim Jerk" -msgstr "" +msgstr "Skirt/Brim Jerk" #: fdmprinter.def.json msgctxt "jerk_skirt_brim description" @@ -2595,7 +2415,7 @@ msgstr "스커트와 고리가 인쇄되는 최대 순간 속도 변화. " #: fdmprinter.def.json msgctxt "travel label" msgid "Travel" -msgstr "" +msgstr "움직임" #: fdmprinter.def.json msgctxt "travel description" @@ -2605,7 +2425,7 @@ msgstr "이동 " #: fdmprinter.def.json msgctxt "retraction_combing label" msgid "Combing Mode" -msgstr "" +msgstr "Combing 모드" #: fdmprinter.def.json msgctxt "retraction_combing description" @@ -2615,22 +2435,22 @@ msgstr "빗질은 여행 할 때 이미 인쇄 된 영역 내에 노즐을 유 #: fdmprinter.def.json msgctxt "retraction_combing option off" msgid "Off" -msgstr "" +msgstr "끄다" #: fdmprinter.def.json msgctxt "retraction_combing option all" msgid "All" -msgstr "" +msgstr "모두" #: fdmprinter.def.json msgctxt "retraction_combing option noskin" msgid "No Skin" -msgstr "" +msgstr "피부가 없다" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall label" msgid "Retract Before Outer Wall" -msgstr "" +msgstr "외벽 전에 철회" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall description" @@ -2640,7 +2460,7 @@ msgstr "외벽을 시작하기 위해 이동할 때 항상 후퇴합니다. " #: fdmprinter.def.json msgctxt "travel_avoid_other_parts label" msgid "Avoid Printed Parts When Traveling" -msgstr "" +msgstr "움직일 때 인쇄 부품 피하십시오" #: fdmprinter.def.json msgctxt "travel_avoid_other_parts description" @@ -2650,7 +2470,7 @@ msgstr "노즐은 여행 할 때 이미 인쇄 된 부품을 피합니다. 이 #: fdmprinter.def.json msgctxt "travel_avoid_distance label" msgid "Travel Avoid Distance" -msgstr "" +msgstr "움직일 때 피하기 거리" #: fdmprinter.def.json msgctxt "travel_avoid_distance description" @@ -2660,7 +2480,7 @@ msgstr "이동 중에 피할 때 노즐과 이미 인쇄 된 부분 사이의 #: fdmprinter.def.json msgctxt "start_layers_at_same_position label" msgid "Start Layers with the Same Part" -msgstr "" +msgstr "같은 부분으로 레이어 시작" #: fdmprinter.def.json msgctxt "start_layers_at_same_position description" @@ -2670,7 +2490,7 @@ msgstr "각 레이어에서 같은 지점 근처에 개체를 인쇄하는 것 #: fdmprinter.def.json msgctxt "layer_start_x label" msgid "Layer Start X" -msgstr "" +msgstr "레이어 시작 X" #: fdmprinter.def.json msgctxt "layer_start_x description" @@ -2680,7 +2500,7 @@ msgstr "각 레이어의 인쇄를 시작할 부분을 찾을 위치 근처의 X #: fdmprinter.def.json msgctxt "layer_start_y label" msgid "Layer Start Y" -msgstr "" +msgstr "레이어 시작 Y" #: fdmprinter.def.json msgctxt "layer_start_y description" @@ -2690,7 +2510,7 @@ msgstr "각 레이어 인쇄를 시작할 부분을 찾을 위치 근처의 위 #: fdmprinter.def.json msgctxt "retraction_hop_enabled label" msgid "Z Hop When Retracted" -msgstr "" +msgstr "철회했을 때의 Z 홉" #: fdmprinter.def.json msgctxt "retraction_hop_enabled description" @@ -2700,7 +2520,7 @@ msgstr "수축이 완료 될 때마다 빌드 플레이트가 내려져 노즐 #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides label" msgid "Z Hop Only Over Printed Parts" -msgstr "" +msgstr "인쇄 된 부분에만 Z 홉" #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides description" @@ -2710,7 +2530,7 @@ msgstr "이동 시, 인쇄물을 피함으로써 수평 이동으로 피할 수 #: fdmprinter.def.json msgctxt "retraction_hop label" msgid "Z Hop Height" -msgstr "" +msgstr "Z 홉 높이" #: fdmprinter.def.json msgctxt "retraction_hop description" @@ -2720,7 +2540,7 @@ msgstr "Z 홉을 수행 할 때의 높이 차이. " #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch label" msgid "Z Hop After Extruder Switch" -msgstr "" +msgstr "압출기 스위치 후 Z 홉" #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch description" @@ -2730,7 +2550,7 @@ msgstr "기계가 하나의 압출기에서 다른 압출기로 전환 된 후, #: fdmprinter.def.json msgctxt "cooling label" msgid "Cooling" -msgstr "" +msgstr "냉각" #: fdmprinter.def.json msgctxt "cooling description" @@ -2740,7 +2560,7 @@ msgstr "냉각 " #: fdmprinter.def.json msgctxt "cool_fan_enabled label" msgid "Enable Print Cooling" -msgstr "" +msgstr "인쇄 냉각 사용" #: fdmprinter.def.json msgctxt "cool_fan_enabled description" @@ -2750,7 +2570,7 @@ msgstr "인쇄 중에 인쇄 냉각 팬을 활성화합니다. 팬은 짧은 레 #: fdmprinter.def.json msgctxt "cool_fan_speed label" msgid "Fan Speed" -msgstr "" +msgstr "팬 속도" #: fdmprinter.def.json msgctxt "cool_fan_speed description" @@ -2760,7 +2580,7 @@ msgstr "인쇄 냉각 팬이 회전하는 속도입니다. " #: fdmprinter.def.json msgctxt "cool_fan_speed_min label" msgid "Regular Fan Speed" -msgstr "" +msgstr "정규 팬 속도" #: fdmprinter.def.json msgctxt "cool_fan_speed_min description" @@ -2770,7 +2590,7 @@ msgstr "팬이 임계 값에 도달하기 전에 회전하는 속도입니다. #: fdmprinter.def.json msgctxt "cool_fan_speed_max label" msgid "Maximum Fan Speed" -msgstr "" +msgstr "최대 팬 속도" #: fdmprinter.def.json msgctxt "cool_fan_speed_max description" @@ -2780,7 +2600,7 @@ msgstr "최소 레이어 시간에 팬이 회전하는 속도입니다. 임계 #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max label" msgid "Regular/Maximum Fan Speed Threshold" -msgstr "" +msgstr "일반 / 최대 팬 속도 임계 값" #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max description" @@ -2790,7 +2610,7 @@ msgstr "정규 팬 속도와 최대 팬 속도 사이의 임계 값을 설정하 #: fdmprinter.def.json msgctxt "cool_fan_speed_0 label" msgid "Initial Fan Speed" -msgstr "" +msgstr "초기 팬 속도" #: fdmprinter.def.json msgctxt "cool_fan_speed_0 description" @@ -2800,7 +2620,7 @@ msgstr "인쇄 시작시 팬이 회전하는 속도입니다. 후속 레이어 #: fdmprinter.def.json msgctxt "cool_fan_full_at_height label" msgid "Regular Fan Speed at Height" -msgstr "" +msgstr "정규 팬 속도 at Height" #: fdmprinter.def.json msgctxt "cool_fan_full_at_height description" @@ -2810,7 +2630,7 @@ msgstr "일반 팬 속도로 팬이 회전하는 높이입니다. 아래의 레 #: fdmprinter.def.json msgctxt "cool_fan_full_layer label" msgid "Regular Fan Speed at Layer" -msgstr "" +msgstr "레이어의 일반 팬 속도" #: fdmprinter.def.json msgctxt "cool_fan_full_layer description" @@ -2820,7 +2640,7 @@ msgstr "팬이 일반 팬 속도로 회전하는 레이어입니다. 높이의 #: fdmprinter.def.json msgctxt "cool_min_layer_time label" msgid "Minimum Layer Time" -msgstr "" +msgstr "최소 레이어 시간" #: fdmprinter.def.json msgctxt "cool_min_layer_time description" @@ -2830,7 +2650,7 @@ msgstr "레이어에 소요 된 최소 시간입니다. 이렇게하면 프린 #: fdmprinter.def.json msgctxt "cool_min_speed label" msgid "Minimum Speed" -msgstr "" +msgstr "최저 속도" #: fdmprinter.def.json msgctxt "cool_min_speed description" @@ -2840,7 +2660,7 @@ msgstr "최소 레이어 시간으로 인해 속도가 느려지 긴하지만 #: fdmprinter.def.json msgctxt "cool_lift_head label" msgid "Lift Head" -msgstr "" +msgstr "리프트 헤드" #: fdmprinter.def.json msgctxt "cool_lift_head description" @@ -2850,7 +2670,7 @@ msgstr "최소한의 레이어 시간으로 인해 최소 속도에 도달하면 #: fdmprinter.def.json msgctxt "support label" msgid "Support" -msgstr "" +msgstr "지지대" #: fdmprinter.def.json msgctxt "support description" @@ -2860,7 +2680,7 @@ msgstr "지지구조 " #: fdmprinter.def.json msgctxt "support_enable label" msgid "Generate Support" -msgstr "" +msgstr "지지대 생성" #: fdmprinter.def.json msgctxt "support_enable description" @@ -2870,7 +2690,7 @@ msgstr "돌출부가있는 모델 부분을 지원하는 구조를 생성합니 #: fdmprinter.def.json msgctxt "support_extruder_nr label" msgid "Support Extruder" -msgstr "" +msgstr "지지대 압출기" #: fdmprinter.def.json msgctxt "support_extruder_nr description" @@ -2880,7 +2700,7 @@ msgstr "지지체 인쇄에 사용할 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "support_infill_extruder_nr label" msgid "Support Infill Extruder" -msgstr "" +msgstr "지지대 충진 압출기" #: fdmprinter.def.json msgctxt "support_infill_extruder_nr description" @@ -2890,7 +2710,7 @@ msgstr "지지대의 충전물을 인쇄하는 데 사용할 압출기 트레인 #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 label" msgid "First Layer Support Extruder" -msgstr "" +msgstr "첫 번째 레이어 지지대 압출기" #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 description" @@ -2900,7 +2720,7 @@ msgstr "제 1 층의 지지체 충전 용 인쇄에 사용되는 압출기 트 #: fdmprinter.def.json msgctxt "support_interface_extruder_nr label" msgid "Support Interface Extruder" -msgstr "" +msgstr "지지대 인터페이스 압출기" #: fdmprinter.def.json msgctxt "support_interface_extruder_nr description" @@ -2910,7 +2730,7 @@ msgstr "지지대의 지붕과 바닥을 인쇄 할 때 사용하는 압출기 #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" msgid "Support Roof Extruder" -msgstr "" +msgstr "지지대 지붕 압출기" #: fdmprinter.def.json msgctxt "support_roof_extruder_nr description" @@ -2920,7 +2740,7 @@ msgstr "지지대의 지붕을 인쇄 할 때 사용하는 압출기 트레인. #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" msgid "Support Floor Extruder" -msgstr "" +msgstr "지지대 바닥 압출기" #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr description" @@ -2930,7 +2750,7 @@ msgstr "지지대의 바닥을 인쇄하는 데 사용할 압출기 트레인. #: fdmprinter.def.json msgctxt "support_type label" msgid "Support Placement" -msgstr "" +msgstr "지지대 배치" #: fdmprinter.def.json msgctxt "support_type description" @@ -2940,17 +2760,17 @@ msgstr "지지 구조의 배치를 조정합니다. 배치는 빌드 플레이 #: fdmprinter.def.json msgctxt "support_type option buildplate" msgid "Touching Buildplate" -msgstr "" +msgstr "빌드 플레이트 만지기" #: fdmprinter.def.json msgctxt "support_type option everywhere" msgid "Everywhere" -msgstr "" +msgstr "어디에나" #: fdmprinter.def.json msgctxt "support_angle label" msgid "Support Overhang Angle" -msgstr "" +msgstr "오버행 각도 지원" #: fdmprinter.def.json msgctxt "support_angle description" @@ -2960,7 +2780,7 @@ msgstr "지원이 추가 된 오버행 각도의 최소값입니다. 0 °의 값 #: fdmprinter.def.json msgctxt "support_pattern label" msgid "Support Pattern" -msgstr "" +msgstr "지지대 패턴" #: fdmprinter.def.json msgctxt "support_pattern description" @@ -2970,1379 +2790,52 @@ msgstr "프린트의지지 구조의 패턴. 사용 가능한 여러 가지 옵 #: fdmprinter.def.json msgctxt "support_pattern option lines" msgid "Lines" -msgstr "" +msgstr "윤곽" #: fdmprinter.def.json msgctxt "support_pattern option grid" msgid "Grid" -msgstr "" +msgstr "격자" #: fdmprinter.def.json msgctxt "support_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "삼각형" #: fdmprinter.def.json msgctxt "support_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "동심원의" #: fdmprinter.def.json msgctxt "support_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "동심원 3D" #: fdmprinter.def.json msgctxt "support_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "지그재그" #: fdmprinter.def.json msgctxt "support_pattern option cross" msgid "Cross" -msgstr "" +msgstr "십자" #: fdmprinter.def.json msgctxt "support_connect_zigzags label" msgid "Connect Support ZigZags" -msgstr "" +msgstr "ZigZags 지지대 연결" #: fdmprinter.def.json msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "지그재그를 연결하십시오. 이것은 지그재그지지 구조의 강도를 증가시킵니다. " -#: fdmprinter.def.json -msgctxt "support_infill_rate label" -msgid "Support Density" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_infill_rate description" -msgid "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "지지 구조의 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " - -#: fdmprinter.def.json -msgctxt "support_line_distance label" -msgid "Support Line Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_line_distance description" -msgid "Distance between the printed support structure lines. This setting is calculated by the support density." -msgstr "인쇄 된지지 구조 선 사이의 거리. 이 설정은 지원 밀도로 계산됩니다. " - -#: fdmprinter.def.json -msgctxt "support_z_distance label" -msgid "Support Z Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_z_distance description" -msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height." -msgstr "지지 구조의 위 / 아래에서 인쇄까지의 거리. 이 틈새는 모형 인쇄 후 지지대를 제거하기위한 공간을 제공합니다. 이 값은 레이어 높이의 배수로 반올림됩니다. " - -#: fdmprinter.def.json -msgctxt "support_top_distance label" -msgid "Support Top Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_top_distance description" -msgid "Distance from the top of the support to the print." -msgstr "지원 상단에서 인쇄까지의 거리. " - -#: fdmprinter.def.json -msgctxt "support_bottom_distance label" -msgid "Support Bottom Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_distance description" -msgid "Distance from the print to the bottom of the support." -msgstr "인쇄물에서 지지대의 바닥까지의 거리. " - -#: fdmprinter.def.json -msgctxt "support_xy_distance label" -msgid "Support X/Y Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_xy_distance description" -msgid "Distance of the support structure from the print in the X/Y directions." -msgstr "X / Y 방향에서 인쇄물로부터지지 구조까지의 거리. " - -#: fdmprinter.def.json -msgctxt "support_xy_overrides_z label" -msgid "Support Distance Priority" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_xy_overrides_z description" -msgid "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs." -msgstr "지원 X / Y 거리가지지 Z 거리를 무시하는지 여부를 나타냅니다. X / Y가 Z를 오버라이드하면 X / Y 거리는 모델에서 지지점을 밀어내어 돌출부까지의 실제 Z 거리에 영향을 줄 수 있습니다. 오버행 주위에 X / Y 거리를 적용하지 않음으로써이 기능을 비활성화 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_xy_overrides_z option xy_overrides_z" -msgid "X/Y overrides Z" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_xy_overrides_z option z_overrides_xy" -msgid "Z overrides X/Y" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_xy_distance_overhang label" -msgid "Minimum Support X/Y Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_xy_distance_overhang description" -msgid "Distance of the support structure from the overhang in the X/Y directions. " -msgstr "X / Y 방향에서 오버행으로부터지지 구조까지의 거리. " - -#: fdmprinter.def.json -msgctxt "support_bottom_stair_step_height label" -msgid "Support Stair Step Height" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_stair_step_height description" -msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour." -msgstr "모델에있는 지지대의 계단 모양 바닥의 계단 높이. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. 계단 모양의 동작을 해제하려면 0으로 설정하십시오. " - -#: fdmprinter.def.json -msgctxt "support_bottom_stair_step_width label" -msgid "Support Stair Step Maximum Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_stair_step_width description" -msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." -msgstr "모델에있는 지지대의 계단 모양 바닥의 최대 폭. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_join_distance label" -msgid "Support Join Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_join_distance description" -msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one." -msgstr "X / Y 방향으로지지 구조물 사이의 최대 거리. 별도의 구조가이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다. " - -#: fdmprinter.def.json -msgctxt "support_offset label" -msgid "Support Horizontal Expansion" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_offset description" -msgid "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support." -msgstr "각 레이어의 모든 지원 다각형에 적용된 오프셋의 양입니다. 양수 값을 사용하면 지원 영역이 원활 해지며보다 견고한 지원을받을 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_infill_sparse_thickness label" -msgid "Support Infill Layer Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_infill_sparse_thickness description" -msgid "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded." -msgstr "충전재 층의 두께. 이 값은 항상 레이어 높이의 배수 여야하며 반올림됩니다. " - -#: fdmprinter.def.json -msgctxt "gradual_support_infill_steps label" -msgid "Gradual Support Infill Steps" -msgstr "" - -#: fdmprinter.def.json -msgctxt "gradual_support_infill_steps description" -msgid "Number of times to reduce the support infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Support Infill Density." -msgstr "상단 표면 아래로 올라갈 때 지원 충전 밀도를 반으로 줄이는 횟수입니다. 상단 표면에 더 가까운 영역은 Support Infill Density까지 더 높은 밀도를 갖습니다. " - -#: fdmprinter.def.json -msgctxt "gradual_support_infill_step_height label" -msgid "Gradual Support Infill Step Height" -msgstr "" - -#: fdmprinter.def.json -msgctxt "gradual_support_infill_step_height description" -msgid "The height of support infill of a given density before switching to half the density." -msgstr "밀도의 절반으로 전환하기 전에 주어진 밀도의 지지체 충전 높이. " - -#: fdmprinter.def.json -msgctxt "support_interface_enable label" -msgid "Enable Support Interface" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_enable description" -msgid "Generate a dense interface between the model and the support. This will create a skin at the top of the support on which the model is printed and at the bottom of the support, where it rests on the model." -msgstr "모델과 지원 사이에 조밀 한 인터페이스를 생성하십시오. 이렇게하면 모델이 인쇄 된 지원 맨 위의 스킨과 모델의 위에있는 지원 맨 아래에 스킨이 만들어집니다. " - -#: fdmprinter.def.json -msgctxt "support_roof_enable label" -msgid "Enable Support Roof" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_enable description" -msgid "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support." -msgstr "지지대 상단과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " - -#: fdmprinter.def.json -msgctxt "support_bottom_enable label" -msgid "Enable Support Floor" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_enable description" -msgid "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support." -msgstr "지지대 바닥과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " - -#: fdmprinter.def.json -msgctxt "support_interface_height label" -msgid "Support Interface Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_height description" -msgid "The thickness of the interface of the support where it touches with the model on the bottom or the top." -msgstr "밑면 또는 상단의 모델과 접촉하는 지지점의 인터페이스 두께입니다. " - -#: fdmprinter.def.json -msgctxt "support_roof_height label" -msgid "Support Roof Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_height description" -msgid "The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests." -msgstr "받침 지붕의 두께. 이것은 모델이 놓이는 받침대 상단의 조밀 한 층의 양을 제어합니다. " - -#: fdmprinter.def.json -msgctxt "support_bottom_height label" -msgid "Support Floor Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_height description" -msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." -msgstr "지지 층의 두께. 이것은 지지대가 놓여있는 모델의 상단에 인쇄되는 조밀 한 층의 수를 제어합니다. " - -#: fdmprinter.def.json -msgctxt "support_interface_skip_height label" -msgid "Support Interface Resolution" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_skip_height description" -msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface." -msgstr "지원 모델의 위와 아래에 모델이 있는지 확인하려면 주어진 높이의 단계를 수행하십시오. 값이 낮을수록 슬라이스가 느려지고, 값이 높을수록 지원 인터페이스가 있어야하는 곳에서는 정상적인 지원이 인쇄 될 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_interface_density label" -msgid "Support Interface Density" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_density description" -msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "지지 구조의 지붕 및 바닥 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " - -#: fdmprinter.def.json -msgctxt "support_roof_density label" -msgid "Support Roof Density" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_density description" -msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." -msgstr "지지 구조의 지붕의 밀도. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " - -#: fdmprinter.def.json -msgctxt "support_roof_line_distance label" -msgid "Support Roof Line Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_line_distance description" -msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." -msgstr "인쇄 된 지붕 루프 사이의 거리. 이 설정은지지 지붕 밀도에 의해 계산되지만 별도로 조정할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_bottom_density label" -msgid "Support Floor Density" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_density description" -msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." -msgstr "지지 구조체의 바닥 밀도. 값이 높을수록 지지대가 모델 위에 더 잘 접착됩니다. " - -#: fdmprinter.def.json -msgctxt "support_bottom_line_distance label" -msgid "Support Floor Line Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_line_distance description" -msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." -msgstr "인쇄 된지지 플로어 사이의 거리. 이 설정은 Support Floor Density로 계산되지만 별도로 조정할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_interface_pattern label" -msgid "Support Interface Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern description" -msgid "The pattern with which the interface of the support with the model is printed." -msgstr "모델과 지원 인터페이스를 인쇄하는 패턴입니다. " - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option lines" -msgid "Lines" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option grid" -msgid "Grid" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option triangles" -msgid "Triangles" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option concentric_3d" -msgid "Concentric 3D" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_interface_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern label" -msgid "Support Roof Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern description" -msgid "The pattern with which the roofs of the support are printed." -msgstr "지지대의 지붕이 인쇄되는 패턴. " - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option lines" -msgid "Lines" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option grid" -msgid "Grid" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option triangles" -msgid "Triangles" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option concentric_3d" -msgid "Concentric 3D" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_roof_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern label" -msgid "Support Floor Pattern" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern description" -msgid "The pattern with which the floors of the support are printed." -msgstr "받침대의 바닥이 인쇄되는 패턴. " - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option lines" -msgid "Lines" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option grid" -msgid "Grid" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option triangles" -msgid "Triangles" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option concentric" -msgid "Concentric" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option concentric_3d" -msgid "Concentric 3D" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_bottom_pattern option zigzag" -msgid "Zig Zag" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_use_towers label" -msgid "Use Towers" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_use_towers description" -msgid "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof." -msgstr "작은 돌출 부분을 지원하기 위해 특수한 탑을 사용하십시오. 이 타워들은 그들이 지원하는 지역보다 더 큰 지름을 가지고 있습니다. 오버행 부근에서 타워의 직경이 감소하여 지붕을 형성합니다. " - -#: fdmprinter.def.json -msgctxt "support_tower_diameter label" -msgid "Tower Diameter" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_tower_diameter description" -msgid "The diameter of a special tower." -msgstr "특수 타워의 지름. " - -#: fdmprinter.def.json -msgctxt "support_minimal_diameter label" -msgid "Minimum Diameter" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_minimal_diameter description" -msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower." -msgstr "특수 지지대에 의해지지 될 작은 영역의 X / Y 방향의 최소 직경. " - -#: fdmprinter.def.json -msgctxt "support_tower_roof_angle label" -msgid "Tower Roof Angle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_tower_roof_angle description" -msgid "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs." -msgstr "타워 옥상의 각도입니다. 높은 값을 지정하면 뾰족한 타워 지붕이되고, 값이 낮을수록 평평한 타워 지붕이됩니다. " - -#: fdmprinter.def.json -msgctxt "platform_adhesion label" -msgid "Build Plate Adhesion" -msgstr "" - -#: fdmprinter.def.json -msgctxt "platform_adhesion description" -msgid "Adhesion" -msgstr "부착 " - -#: fdmprinter.def.json -msgctxt "prime_blob_enable label" -msgid "Enable Prime Blob" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_blob_enable description" -msgid "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time." -msgstr "인쇄하기 전에 얼룩으로 필라멘트를 프라이밍할지 여부. 이 설정을 켜면 인쇄하기 전에 압출기가 노즐에서 재료를 준비 할 수 있습니다. 가장자리 또는 스커트 인쇄는 프라이밍처럼 작동 할 수 있습니다.이 경우이 설정을 해제하면 시간이 절약됩니다. " - -#: fdmprinter.def.json -msgctxt "extruder_prime_pos_x label" -msgid "Extruder Prime X Position" -msgstr "" - -#: fdmprinter.def.json -msgctxt "extruder_prime_pos_x description" -msgid "The X coordinate of the position where the nozzle primes at the start of printing." -msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 X 좌표입니다. " - -#: fdmprinter.def.json -msgctxt "extruder_prime_pos_y label" -msgid "Extruder Prime Y Position" -msgstr "" - -#: fdmprinter.def.json -msgctxt "extruder_prime_pos_y description" -msgid "The Y coordinate of the position where the nozzle primes at the start of printing." -msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " - -#: fdmprinter.def.json -msgctxt "adhesion_type label" -msgid "Build Plate Adhesion Type" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_type description" -msgid "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your model to prevent warping. Raft adds a thick grid with a roof below the model. Skirt is a line printed around the model, but not connected to the model." -msgstr "귀하의 압출 및 빌드 플레이트에 대한 접착력을 향상시키는 데 도움이되는 다양한 옵션. 브림은 뒤틀림을 방지하기 위해 모델 바닥 주위에 단층 평면 영역을 추가합니다. 래프트는 모델 아래에 지붕이있는 두꺼운 격자를 추가합니다. 치마는 모델 주변에 인쇄 된 선이지만 모델에는 연결되어 있지 않습니다. " - -#: fdmprinter.def.json -msgctxt "adhesion_type option skirt" -msgid "Skirt" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_type option brim" -msgid "Brim" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_type option raft" -msgid "Raft" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_type option none" -msgid "None" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_extruder_nr label" -msgid "Build Plate Adhesion Extruder" -msgstr "" - -#: fdmprinter.def.json -msgctxt "adhesion_extruder_nr description" -msgid "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion." -msgstr "스커트 / 가장자리 / 래프트 인쇄에 사용하는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " - -#: fdmprinter.def.json -msgctxt "skirt_line_count label" -msgid "Skirt Line Count" -msgstr "" - -#: fdmprinter.def.json -msgctxt "skirt_line_count description" -msgid "Multiple skirt lines help to prime your extrusion better for small models. Setting this to 0 will disable the skirt." -msgstr "여러 개의 스커트 라인을 사용하여 작은 모델에 더 잘 압출 성형 할 수 있습니다. 이것을 \"0\"으로 설정하면 스커트가 비활성화됩니다. " - -#: fdmprinter.def.json -msgctxt "skirt_gap label" -msgid "Skirt Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "skirt_gap description" -msgid "" -"The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" - -#: fdmprinter.def.json -msgctxt "skirt_brim_minimal_length label" -msgid "Skirt/Brim Minimum Length" -msgstr "" - -#: fdmprinter.def.json -msgctxt "skirt_brim_minimal_length description" -msgid "The minimum length of the skirt or brim. If this length is not reached by all skirt or brim lines together, more skirt or brim lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored." -msgstr "스커트 또는 고리의 최소 길이. 이 길이에 모든 스커트 또는 브림 선이 모두 도달하지 않으면 최소 길이에 도달 할 때까지 더 많은 스커트 또는 브림 선이 추가됩니다. 참고 : 줄 수를 \"0\"으로 설정하면 무시됩니다." - -#: fdmprinter.def.json -msgctxt "brim_width label" -msgid "Brim Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "brim_width description" -msgid "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area." -msgstr "모델에서 가장 바깥 쪽 가장자리까지의 거리입니다. 큰 테두리는 빌드 플레이트에 대한 접착력을 향상 시키지만 효과적인 인쇄 영역도 감소시킵니다. " - -#: fdmprinter.def.json -msgctxt "brim_line_count label" -msgid "Brim Line Count" -msgstr "" - -#: fdmprinter.def.json -msgctxt "brim_line_count description" -msgid "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area." -msgstr "가장자리에 사용되는 선의 수입니다. 더 많은 브림 선이 빌드 플레이트에 대한 접착력을 향상 시키지만 유효 프린트 영역도 감소시킵니다. " - -#: fdmprinter.def.json -msgctxt "brim_outside_only label" -msgid "Brim Only on Outside" -msgstr "" - -#: fdmprinter.def.json -msgctxt "brim_outside_only description" -msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." -msgstr "모델 바깥 쪽 가장자리에만 인쇄하십시오. 이렇게하면 나중에 제거해야하는 가장자리의 양이 줄어들지 만 침대 접착력은 그렇게 많이 줄어들지 않습니다. " - -#: fdmprinter.def.json -msgctxt "raft_margin label" -msgid "Raft Extra Margin" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_margin description" -msgid "If the raft is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print." -msgstr "래프트가 활성화 된 경우 래프트가 주어진 모델 주변의 추가 뗏목 지역입니다. 이 여백을 늘리면 재료를 더 많이 사용하고 인쇄물을 적게 차지하면서 더 강력한 래프트가 만들어집니다. " - -#: fdmprinter.def.json -msgctxt "raft_smoothing label" -msgid "Raft Smoothing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_smoothing description" -msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_airgap label" -msgid "Raft Air Gap" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_airgap description" -msgid "The gap between the final raft layer and the first layer of the model. Only the first layer is raised by this amount to lower the bonding between the raft layer and the model. Makes it easier to peel off the raft." -msgstr "최종 래프트 층과 모델의 첫 번째 층 사이의 틈새. 래프트 층과 모델 사이의 결합을 낮추기 위해이 양만큼 첫 번째 층만 올립니다. 래프트를 쉽게 떼어 낼 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "layer_0_z_overlap label" -msgid "Initial Layer Z Overlap" -msgstr "" - -#: fdmprinter.def.json -msgctxt "layer_0_z_overlap description" -msgid "Make the first and second layer of the model overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount." -msgstr "에어 갭에서 손실 된 필라멘트를 보완하기 위해 Z 방향으로 모델의 첫 번째와 두 번째 레이어가 중첩되도록하십시오. 첫 번째 모델 레이어 위의 모든 모델은이 양만큼 아래로 이동합니다 " - -#: fdmprinter.def.json -msgctxt "raft_surface_layers label" -msgid "Raft Top Layers" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_layers description" -msgid "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1." -msgstr "두 번째 래프트 레이어 맨 위에있는 최상위 레이어의 수입니다. 이것들은 모델이 위치하는 완전히 채워진 레이어입니다. 2 층은 1보다 부드러운 표면을 만듭니다. " - -#: fdmprinter.def.json -msgctxt "raft_surface_thickness label" -msgid "Raft Top Layer Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_thickness description" -msgid "Layer thickness of the top raft layers." -msgstr "상단 래프트 레이어의 레이어 두께. " - -#: fdmprinter.def.json -msgctxt "raft_surface_line_width label" -msgid "Raft Top Line Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_line_width description" -msgid "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth." -msgstr "래프트의 윗면에있는 선의 폭. 래프트의 상단이 매끄럽도록 얇은 선으로 구성 될 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "raft_surface_line_spacing label" -msgid "Raft Top Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_line_spacing description" -msgid "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid." -msgstr "상단 래프트 레이어에 대한 래프트 사이의 거리. 간격은 선 너비와 동일해야 표면이 단색입니다. " - -#: fdmprinter.def.json -msgctxt "raft_interface_thickness label" -msgid "Raft Middle Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_thickness description" -msgid "Layer thickness of the middle raft layer." -msgstr "중간 래프트 층의 층 두께. " - -#: fdmprinter.def.json -msgctxt "raft_interface_line_width label" -msgid "Raft Middle Line Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_line_width description" -msgid "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the build plate." -msgstr "중간 래프트 층의 선폭. 두 번째 레이어를 더 돌출 시키면 선이 빌드 플레이트에 달라 붙습니다. " - -#: fdmprinter.def.json -msgctxt "raft_interface_line_spacing label" -msgid "Raft Middle Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_line_spacing description" -msgid "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers." -msgstr "중간 래프트 층에 대한 래프트 사이의 거리. 중간 틈새는 매우 넓어야하며 래프트 상부 층을지지 할만큼 충분히 촘촘해야합니다. " - -#: fdmprinter.def.json -msgctxt "raft_base_thickness label" -msgid "Raft Base Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_thickness description" -msgid "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate." -msgstr "기본 래프트 레이어의 레이어 두께. 이것은 프린터 빌드 플레이트에 단단히 붙어있는 두꺼운 층이어야합니다. " - -#: fdmprinter.def.json -msgctxt "raft_base_line_width label" -msgid "Raft Base Line Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_line_width description" -msgid "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion." -msgstr "기본 래프트 층에있는 선의 너비. 이것은 빌드 플레이트 접착을 돕기 위해 두꺼운 선이어야합니다. " - -#: fdmprinter.def.json -msgctxt "raft_base_line_spacing label" -msgid "Raft Line Spacing" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_line_spacing description" -msgid "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate." -msgstr "기본 래프트 층에 대한 래프트 사이의 거리. 넓은 간격으로 빌드 플레이트에서 래프트를 쉽게 제거 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "raft_speed label" -msgid "Raft Print Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_speed description" -msgid "The speed at which the raft is printed." -msgstr "래프트가 인쇄되는 속도. " - -#: fdmprinter.def.json -msgctxt "raft_surface_speed label" -msgid "Raft Top Print Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_speed description" -msgid "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines." -msgstr "상단 래프트 레이어가 인쇄되는 속도입니다. 이 노즐은 조금 더 느리게 인쇄해야 노즐이 인접한 표면 선을 천천히 부드럽게 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "raft_interface_speed label" -msgid "Raft Middle Print Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_speed description" -msgid "The speed at which the middle raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." -msgstr "중간 래프트 층이 인쇄되는 속도. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " - -#: fdmprinter.def.json -msgctxt "raft_base_speed label" -msgid "Raft Base Print Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_speed description" -msgid "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." -msgstr "기본 래프트 레이어가 인쇄되는 속도입니다. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " - -#: fdmprinter.def.json -msgctxt "raft_acceleration label" -msgid "Raft Print Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_acceleration description" -msgid "The acceleration with which the raft is printed." -msgstr "래프트가 인쇄되는 가속도. " - -#: fdmprinter.def.json -msgctxt "raft_surface_acceleration label" -msgid "Raft Top Print Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_acceleration description" -msgid "The acceleration with which the top raft layers are printed." -msgstr "상단 래프트 레이어가 인쇄되는 가속도입니다. " - -#: fdmprinter.def.json -msgctxt "raft_interface_acceleration label" -msgid "Raft Middle Print Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_acceleration description" -msgid "The acceleration with which the middle raft layer is printed." -msgstr "중간 래프트 층이 인쇄되는 가속도. " - -#: fdmprinter.def.json -msgctxt "raft_base_acceleration label" -msgid "Raft Base Print Acceleration" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_acceleration description" -msgid "The acceleration with which the base raft layer is printed." -msgstr "기본 래프트 레이어가 인쇄되는 가속도입니다. " - -#: fdmprinter.def.json -msgctxt "raft_jerk label" -msgid "Raft Print Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_jerk description" -msgid "The jerk with which the raft is printed." -msgstr "래프트와 함께 인쇄되는 저크. " - -#: fdmprinter.def.json -msgctxt "raft_surface_jerk label" -msgid "Raft Top Print Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_jerk description" -msgid "The jerk with which the top raft layers are printed." -msgstr "상단 래프트 레이어가 인쇄되는 저크. " - -#: fdmprinter.def.json -msgctxt "raft_interface_jerk label" -msgid "Raft Middle Print Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_jerk description" -msgid "The jerk with which the middle raft layer is printed." -msgstr "중간 래프트 층이 인쇄되는 저크. " - -#: fdmprinter.def.json -msgctxt "raft_base_jerk label" -msgid "Raft Base Print Jerk" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_jerk description" -msgid "The jerk with which the base raft layer is printed." -msgstr "기본 래프트 레이어가 인쇄되는 저크. " - -#: fdmprinter.def.json -msgctxt "raft_fan_speed label" -msgid "Raft Fan Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_fan_speed description" -msgid "The fan speed for the raft." -msgstr "래프트의 팬 속도. " - -#: fdmprinter.def.json -msgctxt "raft_surface_fan_speed label" -msgid "Raft Top Fan Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_surface_fan_speed description" -msgid "The fan speed for the top raft layers." -msgstr "상단 래프트 레이어의 팬 속도입니다. " - -#: fdmprinter.def.json -msgctxt "raft_interface_fan_speed label" -msgid "Raft Middle Fan Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_interface_fan_speed description" -msgid "The fan speed for the middle raft layer." -msgstr "중간 래프트 레이어의 팬 속도입니다. " - -#: fdmprinter.def.json -msgctxt "raft_base_fan_speed label" -msgid "Raft Base Fan Speed" -msgstr "" - -#: fdmprinter.def.json -msgctxt "raft_base_fan_speed description" -msgid "The fan speed for the base raft layer." -msgstr "기본 래프트 레이어의 팬 속도입니다. " - -#: fdmprinter.def.json -msgctxt "dual label" -msgid "Dual Extrusion" -msgstr "" - -#: fdmprinter.def.json -msgctxt "dual description" -msgid "Settings used for printing with multiple extruders." -msgstr "여러 압출기로 인쇄 할 때 사용되는 설정입니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_enable label" -msgid "Enable Prime Tower" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_enable description" -msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." -msgstr "각 노즐을 교체 한 후에 재료를 프라이밍(Priming)하는 인쇄 옆에 타워를 인쇄하십시오. " - -#: fdmprinter.def.json -msgctxt "prime_tower_size label" -msgid "Prime Tower Size" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_size description" -msgid "The width of the prime tower." -msgstr "프라임 타워의 너비." - -#: fdmprinter.def.json -msgctxt "prime_tower_min_volume label" -msgid "Prime Tower Minimum Volume" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_min_volume description" -msgid "The minimum volume for each layer of the prime tower in order to purge enough material." -msgstr "충분한 재료를 퍼지하기 위해 프라임 타워 각 층의 최소 부피. " - -#: fdmprinter.def.json -msgctxt "prime_tower_wall_thickness label" -msgid "Prime Tower Thickness" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_wall_thickness description" -msgid "The thickness of the hollow prime tower. A thickness larger than half the Prime Tower Minimum Volume will result in a dense prime tower." -msgstr "속이 빈 프라임 타워의 두께. 프라임 타워의 최소 볼륨의 절반보다 큰 두께는 조밀 한 소수 타워가됩니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_position_x label" -msgid "Prime Tower X Position" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_position_x description" -msgid "The x coordinate of the position of the prime tower." -msgstr "프라임 타워 위치의 x 좌표입니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_position_y label" -msgid "Prime Tower Y Position" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_position_y description" -msgid "The y coordinate of the position of the prime tower." -msgstr "프라임 타워 위치의 y 좌표입니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_flow label" -msgid "Prime Tower Flow" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_flow description" -msgid "Flow compensation: the amount of material extruded is multiplied by this value." -msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_wipe_enabled label" -msgid "Wipe Inactive Nozzle on Prime Tower" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_wipe_enabled description" -msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower." -msgstr "하나의 노즐로 프라임 타워를 인쇄 한 후, 다른 타워의 흙먼지 물질을 프라임 타워에서 닦아냅니다. " - -#: fdmprinter.def.json -msgctxt "dual_pre_wipe label" -msgid "Wipe Nozzle After Switch" -msgstr "" - -#: fdmprinter.def.json -msgctxt "dual_pre_wipe description" -msgid "After switching extruder, wipe the oozed material off of the nozzle on the first thing printed. This performs a safe slow wipe move at a place where the oozed material causes least harm to the surface quality of your print." -msgstr "압출기를 전환 한 후, 인쇄 된 첫 번째 것을 노즐에서 닦아 낸 물질을 닦아냅니다. 이렇게하면 흘러 나온 물질이 인쇄물의 표면 품질에 가장 해를 입히는 곳에서 안전한 천천히 닦아줍니다. " - -#: fdmprinter.def.json -msgctxt "prime_tower_purge_volume label" -msgid "Prime Tower Purge Volume" -msgstr "" - -#: fdmprinter.def.json -msgctxt "prime_tower_purge_volume description" -msgid "Amount of filament to be purged when wiping on the prime tower. Purging is useful for compensating the filament lost by oozing during inactivity of the nozzle." -msgstr "프라임 타워에서 닦을 때 제거 할 필라멘트의 양. 퍼지는 노즐이 작동하지 않을 때 새어 나와 분실 된 필라멘트를 보정하는 데 유용합니다. " - -#: fdmprinter.def.json -msgctxt "ooze_shield_enabled label" -msgid "Enable Ooze Shield" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ooze_shield_enabled description" -msgid "Enable exterior ooze shield. This will create a shell around the model which is likely to wipe a second nozzle if it's at the same height as the first nozzle." -msgstr "외장 방음 장치를 사용하십시오. 이렇게하면 첫 번째 노즐과 동일한 높이에 두 번째 노즐을 닦을 가능성이있는 모델 주위에 쉘이 생깁니다. " - -#: fdmprinter.def.json -msgctxt "ooze_shield_angle label" -msgid "Ooze Shield Angle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ooze_shield_angle description" -msgid "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material." -msgstr "방패망의 한 부분이 가질 최대 각도입니다. \"0\"도가 수직이고 \"90\"도가 수평입니다. 각도가 작 으면 방풍망이 덜 파손되지만 재료는 더 많습니다. " - -#: fdmprinter.def.json -msgctxt "ooze_shield_dist label" -msgid "Ooze Shield Distance" -msgstr "" - -#: fdmprinter.def.json -msgctxt "ooze_shield_dist description" -msgid "Distance of the ooze shield from the print, in the X/Y directions." -msgstr "X / Y 방향으로 인쇄물에서 방패망까지의 거리. " - -#: fdmprinter.def.json -msgctxt "meshfix label" -msgid "Mesh Fixes" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix description" -msgid "category_fixes" -msgstr "카테고리 수정 " - -#: fdmprinter.def.json -msgctxt "meshfix_union_all label" -msgid "Union Overlapping Volumes" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_union_all description" -msgid "Ignore the internal geometry arising from overlapping volumes within a mesh and print the volumes as one. This may cause unintended internal cavities to disappear." -msgstr "메쉬 내의 겹치는 볼륨으로 인해 발생하는 내부 지오메트리를 무시하고 볼륨을 하나로 인쇄하십시오. 이로 인해 의도하지 않은 내부 공동이 사라질 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "meshfix_union_all_remove_holes label" -msgid "Remove All Holes" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_union_all_remove_holes description" -msgid "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below." -msgstr "각 레이어의 구멍을 제거하고 바깥 쪽 모양 만 유지합니다. 이것은 보이지 않는 내부 지오메트리를 무시합니다. 그러나 위 또는 아래에서 볼 수있는 레이어 구멍도 무시합니다. " - -#: fdmprinter.def.json -msgctxt "meshfix_extensive_stitching label" -msgid "Extensive Stitching" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_extensive_stitching description" -msgid "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time." -msgstr "광범위한 스티칭은 다각형을 만지면서 구멍을 닫음으로써 메쉬의 열린 구멍을 꿰매려합니다. 이 옵션은 많은 처리 시간을 초래할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "meshfix_keep_open_polygons label" -msgid "Keep Disconnected Faces" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_keep_open_polygons description" -msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." -msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution label" -msgid "Maximum Resolution" -msgstr "" - -#: fdmprinter.def.json -msgctxt "meshfix_maximum_resolution description" -msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" - -#: fdmprinter.def.json -msgctxt "multiple_mesh_overlap label" -msgid "Merged Meshes Overlap" -msgstr "" - -#: fdmprinter.def.json -msgctxt "multiple_mesh_overlap description" -msgid "Make meshes which are touching each other overlap a bit. This makes them bond together better." -msgstr "서로 닿는 메쉬가 조금 겹치게 만듭니다. 이것은 그들을 더 잘 묶는 것입니다. " - -#: fdmprinter.def.json -msgctxt "carve_multiple_volumes label" -msgid "Remove Mesh Intersection" -msgstr "" - -#: fdmprinter.def.json -msgctxt "carve_multiple_volumes description" -msgid "Remove areas where multiple meshes are overlapping with each other. This may be used if merged dual material objects overlap with each other." -msgstr "여러 메시가 서로 겹치는 영역을 제거하십시오. 병합 된 이중 물체가 서로 중첩되는 경우이 값이 사용될 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "alternate_carve_order label" -msgid "Alternate Mesh Removal" -msgstr "" - -#: fdmprinter.def.json -msgctxt "alternate_carve_order description" -msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." -msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 메쉬가 서로 얽 히게됩니다. 이 설정을 해제하면 메시 중 하나가 다른 메시에서 제거되는 동안 오버랩의 모든 볼륨을 가져옵니다. " - -#: fdmprinter.def.json -msgctxt "remove_empty_first_layers label" -msgid "Remove Empty First Layers" -msgstr "" - -#: fdmprinter.def.json -msgctxt "remove_empty_first_layers description" -msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" - -#: fdmprinter.def.json -msgctxt "blackmagic label" -msgid "Special Modes" -msgstr "" - -#: fdmprinter.def.json -msgctxt "blackmagic description" -msgid "category_blackmagic" -msgstr "블랙매직 카테고리 " - -#: fdmprinter.def.json -msgctxt "print_sequence label" -msgid "Print Sequence" -msgstr "" - -#: fdmprinter.def.json -msgctxt "print_sequence description" -msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes." -msgstr "한 번에 한 레이어 씩 모든 모델을 인쇄할지 또는 한 모델이 완료 될 때까지 기다렸다가 다음 모델로 넘어갈 지 여부. 한 번에 한 가지 모드는 모든 모델이 분리되어 전체 프린트 헤드가 중간에서 움직일 수 있고 모든 모델이 노즐과 X / Y 축 사이의 거리보다 낮은 경우에만 가능합니다. " - -#: fdmprinter.def.json -msgctxt "print_sequence option all_at_once" -msgid "All at Once" -msgstr "" - -#: fdmprinter.def.json -msgctxt "print_sequence option one_at_a_time" -msgid "One at a Time" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_mesh label" -msgid "Infill Mesh" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_mesh description" -msgid "Use this mesh to modify the infill of other meshes with which it overlaps. Replaces infill regions of other meshes with regions for this mesh. It's suggested to only print one Wall and no Top/Bottom Skin for this mesh." -msgstr "관련 메쉬를 사용하여 겹치는 다른 메쉬의 충진율을 수정하십시오. 다른 메쉬의 충진 영역을 본 메쉬의 영역으로 대체합니다. 본 메쉬에 하나의 벽과 상단 / 밑바닥 스킨만을 인쇄하는 것이 좋습니다. " - -#: fdmprinter.def.json -msgctxt "infill_mesh_order label" -msgid "Infill Mesh Order" -msgstr "" - -#: fdmprinter.def.json -msgctxt "infill_mesh_order description" -msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes." -msgstr "어떤 충진 메쉬가 다른 충진 메쉬의 충진 내부에 있는지 결정합니다. 더 높은 차수의 충진 메쉬는 더 낮은 차수와 일반적인 메쉬로 충진 메쉬의 충진을 수정합니다. " - -#: fdmprinter.def.json -msgctxt "cutting_mesh label" -msgid "Cutting Mesh" -msgstr "" - -#: fdmprinter.def.json -msgctxt "cutting_mesh description" -msgid "Limit the volume of this mesh to within other meshes. You can use this to make certain areas of one mesh print with different settings and with a whole different extruder." -msgstr "이 메쉬의 볼륨을 다른 메쉬 내로 제한하십시오. 이 기능을 사용하면 다른 설정과 전체 압출기로 하나의 메쉬 인쇄 영역을 만들 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "mold_enabled label" -msgid "Mold" -msgstr "" - -#: fdmprinter.def.json -msgctxt "mold_enabled description" -msgid "Print models as a mold, which can be cast in order to get a model which resembles the models on the build plate." -msgstr "모형을 모형으로 인쇄하여 모형에 모형과 유사한 모형을 만들 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "mold_width label" -msgid "Minimal Mold Width" -msgstr "" - -#: fdmprinter.def.json -msgctxt "mold_width description" -msgid "The minimal distance between the ouside of the mold and the outside of the model." -msgstr "몰드의 바깥 쪽과 모델의 바깥 쪽 사이의 최소 거리입니다. " - -#: fdmprinter.def.json -msgctxt "mold_roof_height label" -msgid "Mold Roof Height" -msgstr "" - -#: fdmprinter.def.json -msgctxt "mold_roof_height description" -msgid "The height above horizontal parts in your model which to print mold." -msgstr "모델의 수평 부분 위의 높이로 금형을 인쇄합니다. " - -#: fdmprinter.def.json -msgctxt "mold_angle label" -msgid "Mold Angle" -msgstr "" - -#: fdmprinter.def.json -msgctxt "mold_angle description" -msgid "The angle of overhang of the outer walls created for the mold. 0° will make the outer shell of the mold vertical, while 90° will make the outside of the model follow the contour of the model." -msgstr "몰드에 대해 생성 된 외벽의 돌출 각도입니다. \"0\"도의 각은 금형의 외각을 수직으로 만들고 \"90\"도의 각은 모형의 외형을 모델의 외형으로 만듭니다. " - -#: fdmprinter.def.json -msgctxt "support_mesh label" -msgid "Support Mesh" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_mesh description" -msgid "Use this mesh to specify support areas. This can be used to generate support structure." -msgstr "본 메시를 사용하여 지원 영역을 지정하십시오. 이것은 지원 구조를 생성하는 데 사용할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down label" -msgid "Drop Down Support Mesh" -msgstr "" - -#: fdmprinter.def.json -msgctxt "support_mesh_drop_down description" -msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." -msgstr "지지 메쉬 아래의 모든 부분을 지원하여지지 메쉬에 돌출이 없어야 합니다. " - -#: fdmprinter.def.json -msgctxt "anti_overhang_mesh label" -msgid "Anti Overhang Mesh" -msgstr "" - -#: fdmprinter.def.json -msgctxt "anti_overhang_mesh description" -msgid "Use this mesh to specify where no part of the model should be detected as overhang. This can be used to remove unwanted support structure." -msgstr "본 메쉬를 사용하여 모델에서 돌출부로 감지 할 부분을 지정합니다. 이것은 원하지 않는 지원 구조를 제거하는 데 사용될 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "magic_mesh_surface_mode label" -msgid "Surface Mode" -msgstr "" - -#: fdmprinter.def.json -msgctxt "magic_mesh_surface_mode description" -msgid "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces." -msgstr "모델을 표면 만, 볼륨 또는 느슨한 표면이있는 볼륨으로 취급하십시오. 일반 인쇄 모드는 동봉 된 볼륨 만 인쇄합니다. \"표면\"은 아무런 충전물없이 상단 / 하단 스킨없이 메쉬 표면을 추적하는 단일 벽을 인쇄합니다. \"둘 다\"는 정상 및 나머지 폴리곤과 같은 닫힌 볼륨을 서피스로 인쇄합니다. " - -#: fdmprinter.def.json -msgctxt "magic_mesh_surface_mode option normal" -msgid "Normal" -msgstr "" - -#: fdmprinter.def.json -msgctxt "magic_mesh_surface_mode option surface" -msgid "Surface" -msgstr "" - -#: fdmprinter.def.json -msgctxt "magic_mesh_surface_mode option both" -msgid "Both" -msgstr "" - -#: fdmprinter.def.json -msgctxt "magic_spiralize label" -msgid "Spiralize Outer Contour" -msgstr "" - -#: fdmprinter.def.json -msgctxt "magic_spiralize description" -msgid "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid model into a single walled print with a solid bottom. This feature should only be enabled when each layer only contains a single part." -msgstr "스파이럴 라이즈는 바깥 쪽 가장자리의 Z 이동을 부드럽게합니다. 이렇게하면 인쇄물 전체에 걸쳐 꾸준히 Z가 증가합니다. 이 기능은 솔리드 모델을 단단한 바닥이있는 단일 벽으로 인쇄합니다. 이 기능은 각 레이어에 단일 부품 만 포함되어있을 때만 활성화 해야 합니다. " - -#: fdmprinter.def.json -msgctxt "smooth_spiralized_contours label" -msgid "Smooth Spiralized Contours" -msgstr "" - -#: fdmprinter.def.json -msgctxt "smooth_spiralized_contours description" -msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details." -msgstr "나선형 윤곽선을 부드럽게하여 Z 솔기의 가시성을 줄이십시오 (Z- 솔기는 인쇄물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게하는 경향이 있습니다. " - -#: fdmprinter.def.json -msgctxt "relative_extrusion label" -msgid "Relative Extrusion" -msgstr "" - -#: fdmprinter.def.json -msgctxt "relative_extrusion description" -msgid "Use relative extrusion rather than absolute extrusion. Using relative E-steps makes for easier post-processing of the Gcode. However, it's not supported by all printers and it may produce very slight deviations in the amount of deposited material compared to absolute E-steps. Irrespective of this setting, the extrusion mode will always be set to absolute before any Gcode script is output." -msgstr "절대 돌출보다는 상대적 돌출을 사용하십시오. 상대적인 E-steps을 사용하면 Gcode를보다 쉽게 후 처리 할 수 있습니다. 그러나 모든 프린터에서 지원되는 것은 아니며 절대 E 단계와 비교할 때 증착 된 재료의 양이 매우 약간 다를 수 있습니다. 이 설정과 관계없이 압출 모드는 Gcode 스크립트가 출력되기 전에 항상 절대 값으로 설정됩니다. " - -#: fdmprinter.def.json -msgctxt "experimental label" -msgid "Experimental" -msgstr "" - -#: fdmprinter.def.json -msgctxt "experimental description" -msgid "experimental!" -msgstr "실험적인 " - -#: fdmprinter.def.json -msgctxt "optimize_wall_printing_order label" -msgid "Optimize Wall Printing Order" -msgstr "" - -#: fdmprinter.def.json -msgctxt "optimize_wall_printing_order description" -msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." -msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " - #: fdmprinter.def.json msgctxt "support_skip_some_zags label" msgid "Break Up Support In Chunks" -msgstr "" +msgstr "Chunk에서 지지대 중단" #: fdmprinter.def.json msgctxt "support_skip_some_zags description" @@ -4352,7 +2845,7 @@ msgstr "지원 구조가 쉽게 끊어 지도록 지원 라인 연결을 건너 #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm label" msgid "Support Chunk Size" -msgstr "" +msgstr "지지대 Chunk 크기" #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm description" @@ -4362,17 +2855,1344 @@ msgstr "지지 구조를 쉽게 분리 할 수 있도록 N 밀리미터마다 #: fdmprinter.def.json msgctxt "support_zag_skip_count label" msgid "Support Chunk Line Count" -msgstr "" +msgstr "Chunk 라인 카운트 지지대" #: fdmprinter.def.json msgctxt "support_zag_skip_count description" msgid "Skip one in every N connection lines to make the support structure easier to break away." msgstr "지원 구조를 쉽게 깨뜨릴 수 있도록 모든 N 개의 연결 라인을 건너 뜁니다. " +#: fdmprinter.def.json +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "지지대 밀도" + +#: fdmprinter.def.json +msgctxt "support_infill_rate description" +msgid "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove." +msgstr "지지 구조의 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " + +#: fdmprinter.def.json +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "지지대 선 거리" + +#: fdmprinter.def.json +msgctxt "support_line_distance description" +msgid "Distance between the printed support structure lines. This setting is calculated by the support density." +msgstr "인쇄 된지지 구조 선 사이의 거리. 이 설정은 지원 밀도로 계산됩니다. " + +#: fdmprinter.def.json +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "지지대 Z 거리" + +#: fdmprinter.def.json +msgctxt "support_z_distance description" +msgid "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height." +msgstr "지지 구조의 위 / 아래에서 인쇄까지의 거리. 이 틈새는 모형 인쇄 후 지지대를 제거하기위한 공간을 제공합니다. 이 값은 레이어 높이의 배수로 반올림됩니다. " + +#: fdmprinter.def.json +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "지지대 상단 거리" + +#: fdmprinter.def.json +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "지원 상단에서 인쇄까지의 거리. " + +#: fdmprinter.def.json +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "지지대 최저 거리" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "인쇄물에서 지지대의 바닥까지의 거리. " + +#: fdmprinter.def.json +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "X / Y 지지대 거리" + +#: fdmprinter.def.json +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "X / Y 방향에서 인쇄물로부터지지 구조까지의 거리. " + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "지지대 거리 우선 순위" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z description" +msgid "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs." +msgstr "지원 X / Y 거리가지지 Z 거리를 무시하는지 여부를 나타냅니다. X / Y가 Z를 오버라이드하면 X / Y 거리는 모델에서 지지점을 밀어내어 돌출부까지의 실제 Z 거리에 영향을 줄 수 있습니다. 오버행 주위에 X / Y 거리를 적용하지 않음으로써이 기능을 비활성화 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X / Y가 Z를 무시합니다." + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z가 X / Y를 무시합니다." + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "최소 지지대 X / Y 거리" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang description" +msgid "Distance of the support structure from the overhang in the X/Y directions. " +msgstr "X / Y 방향에서 오버행으로부터지지 구조까지의 거리. " + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "계단 Step Height 지지대" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height description" +msgid "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour." +msgstr "모델에있는 지지대의 계단 모양 바닥의 계단 높이. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. 계단 모양의 동작을 해제하려면 0으로 설정하십시오. " + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width label" +msgid "Support Stair Step Maximum Width" +msgstr "지원 계단 스텝 최대 폭" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width description" +msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures." +msgstr "모델에있는 지지대의 계단 모양 바닥의 최대 폭. 값이 낮 으면 지원을 제거하기가 어려워 지지만 값이 너무 높으면 불안정한 지원 구조가 생길 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "지지대 Join 거리" + +#: fdmprinter.def.json +msgctxt "support_join_distance description" +msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one." +msgstr "X / Y 방향으로지지 구조물 사이의 최대 거리. 별도의 구조가이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다. " + +#: fdmprinter.def.json +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "수평 확장 지지대" + +#: fdmprinter.def.json +msgctxt "support_offset description" +msgid "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support." +msgstr "각 레이어의 모든 지원 다각형에 적용된 오프셋의 양입니다. 양수 값을 사용하면 지원 영역이 원활 해지며보다 견고한 지원을받을 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness label" +msgid "Support Infill Layer Thickness" +msgstr "지지대 충진 레이어 두께" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness description" +msgid "The thickness per layer of support infill material. This value should always be a multiple of the layer height and is otherwise rounded." +msgstr "충전재 층의 두께. 이 값은 항상 레이어 높이의 배수 여야하며 반올림됩니다. " + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps label" +msgid "Gradual Support Infill Steps" +msgstr "점진적 지지대 충진 단계" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps description" +msgid "Number of times to reduce the support infill density by half when getting further below top surfaces. Areas which are closer to top surfaces get a higher density, up to the Support Infill Density." +msgstr "상단 표면 아래로 올라갈 때 지원 충전 밀도를 반으로 줄이는 횟수입니다. 상단 표면에 더 가까운 영역은 Support Infill Density까지 더 높은 밀도를 갖습니다. " + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height label" +msgid "Gradual Support Infill Step Height" +msgstr "점진적 지지대 충진 스텝 높이" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height description" +msgid "The height of support infill of a given density before switching to half the density." +msgstr "밀도의 절반으로 전환하기 전에 주어진 밀도의 지지체 충전 높이. " + +#: fdmprinter.def.json +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "지지대 인터페이스 사용" + +#: fdmprinter.def.json +msgctxt "support_interface_enable description" +msgid "Generate a dense interface between the model and the support. This will create a skin at the top of the support on which the model is printed and at the bottom of the support, where it rests on the model." +msgstr "모델과 지원 사이에 조밀 한 인터페이스를 생성하십시오. 이렇게하면 모델이 인쇄 된 지원 맨 위의 스킨과 모델의 위에있는 지원 맨 아래에 스킨이 만들어집니다. " + +#: fdmprinter.def.json +msgctxt "support_roof_enable label" +msgid "Enable Support Roof" +msgstr "지지대 지붕 활성화" + +#: fdmprinter.def.json +msgctxt "support_roof_enable description" +msgid "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support." +msgstr "지지대 상단과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " + +#: fdmprinter.def.json +msgctxt "support_bottom_enable label" +msgid "Enable Support Floor" +msgstr "지지대 바닥 사용" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable description" +msgid "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support." +msgstr "지지대 바닥과 모델 사이에 조밀 한 슬래브를 생성하십시오. 그러면 모델과 지원 사이에 스킨이 만들어집니다. " + +#: fdmprinter.def.json +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "지지대 인터페이스 두께" + +#: fdmprinter.def.json +msgctxt "support_interface_height description" +msgid "The thickness of the interface of the support where it touches with the model on the bottom or the top." +msgstr "밑면 또는 상단의 모델과 접촉하는 지지점의 인터페이스 두께입니다. " + +#: fdmprinter.def.json +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "지지대 지붕 두께" + +#: fdmprinter.def.json +msgctxt "support_roof_height description" +msgid "The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests." +msgstr "받침 지붕의 두께. 이것은 모델이 놓이는 받침대 상단의 조밀 한 층의 양을 제어합니다. " + +#: fdmprinter.def.json +msgctxt "support_bottom_height label" +msgid "Support Floor Thickness" +msgstr "지지대 바닥 두께" + +#: fdmprinter.def.json +msgctxt "support_bottom_height description" +msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." +msgstr "지지 층의 두께. 이것은 지지대가 놓여있는 모델의 상단에 인쇄되는 조밀 한 층의 수를 제어합니다. " + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "지지대 인터페이스 해상도" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height description" +msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface." +msgstr "지원 모델의 위와 아래에 모델이 있는지 확인하려면 주어진 높이의 단계를 수행하십시오. 값이 낮을수록 슬라이스가 느려지고, 값이 높을수록 지원 인터페이스가 있어야하는 곳에서는 정상적인 지원이 인쇄 될 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "지지대 인터페이스 밀도" + +#: fdmprinter.def.json +msgctxt "support_interface_density description" +msgid "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove." +msgstr "지지 구조의 지붕 및 바닥 밀도를 조정합니다. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " + +#: fdmprinter.def.json +msgctxt "support_roof_density label" +msgid "Support Roof Density" +msgstr "지지대 지붕 밀도" + +#: fdmprinter.def.json +msgctxt "support_roof_density description" +msgid "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove." +msgstr "지지 구조의 지붕의 밀도. 값이 높을수록 오버행이 좋아 지지만 지지체를 제거하기가 더 어렵습니다. " + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance label" +msgid "Support Roof Line Distance" +msgstr "지지대 지붕 선 거리" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance description" +msgid "Distance between the printed support roof lines. This setting is calculated by the Support Roof Density, but can be adjusted separately." +msgstr "인쇄 된 지붕 루프 사이의 거리. 이 설정은지지 지붕 밀도에 의해 계산되지만 별도로 조정할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_bottom_density label" +msgid "Support Floor Density" +msgstr "지지대 바닥 밀도" + +#: fdmprinter.def.json +msgctxt "support_bottom_density description" +msgid "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model." +msgstr "지지 구조체의 바닥 밀도. 값이 높을수록 지지대가 모델 위에 더 잘 접착됩니다. " + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance label" +msgid "Support Floor Line Distance" +msgstr "지지대 바닥 선 거리" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance description" +msgid "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately." +msgstr "인쇄 된지지 플로어 사이의 거리. 이 설정은 Support Floor Density로 계산되지만 별도로 조정할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "지지대 인터페이스 패턴" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern description" +msgid "The pattern with which the interface of the support with the model is printed." +msgstr "모델과 지원 인터페이스를 인쇄하는 패턴입니다. " + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "윤곽" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "그리드" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "삼각형" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "동심원 3D" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern label" +msgid "Support Roof Pattern" +msgstr "지지대 지붕 패턴" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern description" +msgid "The pattern with which the roofs of the support are printed." +msgstr "지지대의 지붕이 인쇄되는 패턴. " + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option lines" +msgid "Lines" +msgstr "윤곽" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option grid" +msgid "Grid" +msgstr "그리드" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option triangles" +msgid "Triangles" +msgstr "삼각형" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "동심원의 3D" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern label" +msgid "Support Floor Pattern" +msgstr "지지대 바닥 패턴" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern description" +msgid "The pattern with which the floors of the support are printed." +msgstr "받침대의 바닥이 인쇄되는 패턴. " + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option lines" +msgid "Lines" +msgstr "윤곽" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option grid" +msgid "Grid" +msgstr "그리드" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option triangles" +msgid "Triangles" +msgstr "삼각형" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "동심원 3D" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "탑 사용" + +#: fdmprinter.def.json +msgctxt "support_use_towers description" +msgid "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof." +msgstr "작은 돌출 부분을 지원하기 위해 특수한 탑을 사용하십시오. 이 타워들은 그들이 지원하는 지역보다 더 큰 지름을 가지고 있습니다. 오버행 부근에서 타워의 직경이 감소하여 지붕을 형성합니다. " + +#: fdmprinter.def.json +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "타워 지름" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "특수 타워의 지름. " + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "최소 지름" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter description" +msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower." +msgstr "특수 지지대에 의해지지 될 작은 영역의 X / Y 방향의 최소 직경. " + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "타워 지붕 각도" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle description" +msgid "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs." +msgstr "타워 옥상의 각도입니다. 높은 값을 지정하면 뾰족한 타워 지붕이되고, 값이 낮을수록 평평한 타워 지붕이됩니다. " + +#: fdmprinter.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "플레이트 접착력 강화" + +#: fdmprinter.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "부착 " + +#: fdmprinter.def.json +msgctxt "prime_blob_enable label" +msgid "Enable Prime Blob" +msgstr "프라임 블롭 활성화" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable description" +msgid "Whether to prime the filament with a blob before printing. Turning this setting on will ensure that the extruder will have material ready at the nozzle before printing. Printing Brim or Skirt can act like priming too, in which case turning this setting off saves some time." +msgstr "인쇄하기 전에 얼룩으로 필라멘트를 프라이밍할지 여부. 이 설정을 켜면 인쇄하기 전에 압출기가 노즐에서 재료를 준비 할 수 있습니다. 가장자리 또는 스커트 인쇄는 프라이밍처럼 작동 할 수 있습니다.이 경우이 설정을 해제하면 시간이 절약됩니다. " + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "압출기 프라임 X 위치" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x description" +msgid "The X coordinate of the position where the nozzle primes at the start of printing." +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 X 좌표입니다. " + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "압출기 프라임 Y 위치" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y description" +msgid "The Y coordinate of the position where the nozzle primes at the start of printing." +msgstr "인쇄가 시작될 때 노즐이 끝내는 위치의 Y 좌표입니다. " + +#: fdmprinter.def.json +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "빌드 플레이트 접착 유형" + +#: fdmprinter.def.json +msgctxt "adhesion_type description" +msgid "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your model to prevent warping. Raft adds a thick grid with a roof below the model. Skirt is a line printed around the model, but not connected to the model." +msgstr "귀하의 압출 및 빌드 플레이트에 대한 접착력을 향상시키는 데 도움이되는 다양한 옵션. 브림은 뒤틀림을 방지하기 위해 모델 바닥 주위에 단층 평면 영역을 추가합니다. 래프트는 모델 아래에 지붕이있는 두꺼운 격자를 추가합니다. 치마는 모델 주변에 인쇄 된 선이지만 모델에는 연결되어 있지 않습니다. " + +#: fdmprinter.def.json +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr " Skirt" + +#: fdmprinter.def.json +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "Brim" + +#: fdmprinter.def.json +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "Raft" + +#: fdmprinter.def.json +msgctxt "adhesion_type option none" +msgid "None" +msgstr "None" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "빌드 플레이트 접착 압출기" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr description" +msgid "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion." +msgstr "스커트 / 가장자리 / 래프트 인쇄에 사용하는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " + +#: fdmprinter.def.json +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "Skirt 선 수" + +#: fdmprinter.def.json +msgctxt "skirt_line_count description" +msgid "Multiple skirt lines help to prime your extrusion better for small models. Setting this to 0 will disable the skirt." +msgstr "여러 개의 스커트 라인을 사용하여 작은 모델에 더 잘 압출 성형 할 수 있습니다. 이것을 \"0\"으로 설정하면 스커트가 비활성화됩니다. " + +#: fdmprinter.def.json +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "Skirt 거리" + +#: fdmprinter.def.json +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance, multiple skirt lines will extend outwards from this distance." +msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "Skirt/Brim 최소 길이" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length description" +msgid "The minimum length of the skirt or brim. If this length is not reached by all skirt or brim lines together, more skirt or brim lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored." +msgstr "스커트 또는 고리의 최소 길이. 이 길이에 모든 스커트 또는 브림 선이 모두 도달하지 않으면 최소 길이에 도달 할 때까지 더 많은 스커트 또는 브림 선이 추가됩니다. 참고 : 줄 수를 \"0\"으로 설정하면 무시됩니다." + +#: fdmprinter.def.json +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "브림 너비" + +#: fdmprinter.def.json +msgctxt "brim_width description" +msgid "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area." +msgstr "모델에서 가장 바깥 쪽 가장자리까지의 거리입니다. 큰 테두리는 빌드 플레이트에 대한 접착력을 향상 시키지만 효과적인 인쇄 영역도 감소시킵니다. " + +#: fdmprinter.def.json +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "Brim 선 수" + +#: fdmprinter.def.json +msgctxt "brim_line_count description" +msgid "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area." +msgstr "가장자리에 사용되는 선의 수입니다. 더 많은 브림 선이 빌드 플레이트에 대한 접착력을 향상 시키지만 유효 프린트 영역도 감소시킵니다. " + +#: fdmprinter.def.json +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "밖에서 만 Brim" + +#: fdmprinter.def.json +msgctxt "brim_outside_only description" +msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." +msgstr "모델 바깥 쪽 가장자리에만 인쇄하십시오. 이렇게하면 나중에 제거해야하는 가장자리의 양이 줄어들지 만 침대 접착력은 그렇게 많이 줄어들지 않습니다. " + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 label" +msgid "Initial Layer Z Offset" +msgstr "초기 레이어 Z 오프셋" + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 description" +msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers label" +msgid "Z Offset Taper Layers" +msgstr "Z 오프셋 테이퍼 레이어" + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers description" +msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " + +#: fdmprinter.def.json +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "Raft 여분 여백" + +#: fdmprinter.def.json +msgctxt "raft_margin description" +msgid "If the raft is enabled, this is the extra raft area around the model which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print." +msgstr "래프트가 활성화 된 경우 래프트가 주어진 모델 주변의 추가 뗏목 지역입니다. 이 여백을 늘리면 재료를 더 많이 사용하고 인쇄물을 적게 차지하면서 더 강력한 래프트가 만들어집니다. " + +#: fdmprinter.def.json +msgctxt "raft_smoothing label" +msgid "Raft Smoothing" +msgstr "Raft 부드럽게하기" + +#: fdmprinter.def.json +msgctxt "raft_smoothing description" +msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " + +#: fdmprinter.def.json +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "Raft 에어 갭" + +#: fdmprinter.def.json +msgctxt "raft_airgap description" +msgid "The gap between the final raft layer and the first layer of the model. Only the first layer is raised by this amount to lower the bonding between the raft layer and the model. Makes it easier to peel off the raft." +msgstr "최종 래프트 층과 모델의 첫 번째 층 사이의 틈새. 래프트 층과 모델 사이의 결합을 낮추기 위해이 양만큼 첫 번째 층만 올립니다. 래프트를 쉽게 떼어 낼 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "초기 레이어 Z 겹침" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap description" +msgid "Make the first and second layer of the model overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount." +msgstr "에어 갭에서 손실 된 필라멘트를 보완하기 위해 Z 방향으로 모델의 첫 번째와 두 번째 레이어가 중첩되도록하십시오. 첫 번째 모델 레이어 위의 모든 모델은이 양만큼 아래로 이동합니다 " + +#: fdmprinter.def.json +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "Raft 탑 레이어" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers description" +msgid "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the model sits on. 2 layers result in a smoother top surface than 1." +msgstr "두 번째 래프트 레이어 맨 위에있는 최상위 레이어의 수입니다. 이것들은 모델이 위치하는 완전히 채워진 레이어입니다. 2 층은 1보다 부드러운 표면을 만듭니다. " + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "Raft 상단 레이어 두께" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "상단 래프트 레이어의 레이어 두께. " + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "raft 상단 선 너비" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width description" +msgid "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth." +msgstr "래프트의 윗면에있는 선의 폭. 래프트의 상단이 매끄럽도록 얇은 선으로 구성 될 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "Raft 상단 간격" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing description" +msgid "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid." +msgstr "상단 래프트 레이어에 대한 래프트 사이의 거리. 간격은 선 너비와 동일해야 표면이 단색입니다. " + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "Raft 중간 두께" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "중간 래프트 층의 층 두께. " + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "Raft 중간 선 너비" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width description" +msgid "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the build plate." +msgstr "중간 래프트 층의 선폭. 두 번째 레이어를 더 돌출 시키면 선이 빌드 플레이트에 달라 붙습니다. " + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "Raft 중간 간격" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing description" +msgid "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers." +msgstr "중간 래프트 층에 대한 래프트 사이의 거리. 중간 틈새는 매우 넓어야하며 래프트 상부 층을지지 할만큼 충분히 촘촘해야합니다. " + +#: fdmprinter.def.json +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "Raft 기준 두께" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness description" +msgid "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer build plate." +msgstr "기본 래프트 레이어의 레이어 두께. 이것은 프린터 빌드 플레이트에 단단히 붙어있는 두꺼운 층이어야합니다. " + +#: fdmprinter.def.json +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "Raft 기준 선 너비" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width description" +msgid "Width of the lines in the base raft layer. These should be thick lines to assist in build plate adhesion." +msgstr "기본 래프트 층에있는 선의 너비. 이것은 빌드 플레이트 접착을 돕기 위해 두꺼운 선이어야합니다. " + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "Raft 선 간격" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing description" +msgid "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate." +msgstr "기본 래프트 층에 대한 래프트 사이의 거리. 넓은 간격으로 빌드 플레이트에서 래프트를 쉽게 제거 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "Raft 인쇄 속도" + +#: fdmprinter.def.json +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "래프트가 인쇄되는 속도. " + +#: fdmprinter.def.json +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "Raft 상단 인쇄 속도" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed description" +msgid "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines." +msgstr "상단 래프트 레이어가 인쇄되는 속도입니다. 이 노즐은 조금 더 느리게 인쇄해야 노즐이 인접한 표면 선을 천천히 부드럽게 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "Raft 중앙 인쇄 속도" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed description" +msgid "The speed at which the middle raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." +msgstr "중간 래프트 층이 인쇄되는 속도. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " + +#: fdmprinter.def.json +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "Raft 기본 인쇄 속도" + +#: fdmprinter.def.json +msgctxt "raft_base_speed description" +msgid "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high." +msgstr "기본 래프트 레이어가 인쇄되는 속도입니다. 이것은 노즐에서 나오는 재료의 양이 상당히 많기 때문에 아주 천천히 인쇄되어야합니다. " + +#: fdmprinter.def.json +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "Raft 인쇄 가속도" + +#: fdmprinter.def.json +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "래프트가 인쇄되는 가속도. " + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "Raft 상단 인쇄 가속도" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "상단 래프트 레이어가 인쇄되는 가속도입니다. " + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "Raft 중앙 인쇄 가속도" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "중간 래프트 층이 인쇄되는 가속도. " + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "Raft 기본 인쇄 가속도" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "기본 래프트 레이어가 인쇄되는 가속도입니다. " + +#: fdmprinter.def.json +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "Raft 인쇄 Jerk" + +#: fdmprinter.def.json +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "래프트와 함께 인쇄되는 저크. " + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "Raft 상단 인쇄 Jerk" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "상단 래프트 레이어가 인쇄되는 저크. " + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "Raft 중앙 인쇄 Jerk" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "중간 래프트 층이 인쇄되는 저크. " + +#: fdmprinter.def.json +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "Raft 기본 인쇄 Jerk" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "기본 래프트 레이어가 인쇄되는 저크. " + +#: fdmprinter.def.json +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "Raft 팬 속도" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "래프트의 팬 속도. " + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "Raft 상단 팬 속도" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "상단 래프트 레이어의 팬 속도입니다. " + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "Raft 중앙 팬 속도" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "중간 래프트 레이어의 팬 속도입니다. " + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "Raft 기본 팬 속도" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "기본 래프트 레이어의 팬 속도입니다. " + +#: fdmprinter.def.json +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "이중 압출" + +#: fdmprinter.def.json +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "여러 압출기로 인쇄 할 때 사용되는 설정입니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "프라임 타워 사용" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable description" +msgid "Print a tower next to the print which serves to prime the material after each nozzle switch." +msgstr "각 노즐을 교체 한 후에 재료를 프라이밍(Priming)하는 인쇄 옆에 타워를 인쇄하십시오. " + +#: fdmprinter.def.json +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "프라임 타워 사이즈" + +#: fdmprinter.def.json +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "프라임 타워의 너비." + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "프라임 타워 최소 볼륨" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume description" +msgid "The minimum volume for each layer of the prime tower in order to purge enough material." +msgstr "충분한 재료를 퍼지하기 위해 프라임 타워 각 층의 최소 부피. " + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "프라임 타워 두께" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness description" +msgid "The thickness of the hollow prime tower. A thickness larger than half the Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "속이 빈 프라임 타워의 두께. 프라임 타워의 최소 볼륨의 절반보다 큰 두께는 조밀 한 소수 타워가됩니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "프라임 타워 X 위치" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "프라임 타워 위치의 x 좌표입니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "프라임 타워 Y 위치" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "프라임 타워 위치의 y 좌표입니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "프라임 타워 공급량" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow description" +msgid "Flow compensation: the amount of material extruded is multiplied by this value." +msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "프라임 타워의 비활성 노즐 닦아 내기" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled description" +msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower." +msgstr "하나의 노즐로 프라임 타워를 인쇄 한 후, 다른 타워의 흙먼지 물질을 프라임 타워에서 닦아냅니다. " + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "스위치 후 노즐 닦기" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe description" +msgid "After switching extruder, wipe the oozed material off of the nozzle on the first thing printed. This performs a safe slow wipe move at a place where the oozed material causes least harm to the surface quality of your print." +msgstr "압출기를 전환 한 후, 인쇄 된 첫 번째 것을 노즐에서 닦아 낸 물질을 닦아냅니다. 이렇게하면 흘러 나온 물질이 인쇄물의 표면 품질에 가장 해를 입히는 곳에서 안전한 천천히 닦아줍니다. " + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume label" +msgid "Prime Tower Purge Volume" +msgstr "프라임 타워 퍼지 볼륨" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume description" +msgid "Amount of filament to be purged when wiping on the prime tower. Purging is useful for compensating the filament lost by oozing during inactivity of the nozzle." +msgstr "프라임 타워에서 닦을 때 제거 할 필라멘트의 양. 퍼지는 노즐이 작동하지 않을 때 새어 나와 분실 된 필라멘트를 보정하는 데 유용합니다. " + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "Ooze Shield 사용" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled description" +msgid "Enable exterior ooze shield. This will create a shell around the model which is likely to wipe a second nozzle if it's at the same height as the first nozzle." +msgstr "외장 방음 장치를 사용하십시오. 이렇게하면 첫 번째 노즐과 동일한 높이에 두 번째 노즐을 닦을 가능성이있는 모델 주위에 쉘이 생깁니다. " + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "Ooze Shield 각" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle description" +msgid "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material." +msgstr "방패망의 한 부분이 가질 최대 각도입니다. \"0\"도가 수직이고 \"90\"도가 수평입니다. 각도가 작 으면 방풍망이 덜 파손되지만 재료는 더 많습니다. " + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr "Ooze Shield 거리" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "X / Y 방향으로 인쇄물에서 방패망까지의 거리. " + +#: fdmprinter.def.json +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "메쉬 수정" + +#: fdmprinter.def.json +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "카테고리 수정 " + +#: fdmprinter.def.json +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "유니언 오버랩 볼륨" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all description" +msgid "Ignore the internal geometry arising from overlapping volumes within a mesh and print the volumes as one. This may cause unintended internal cavities to disappear." +msgstr "메쉬 내의 겹치는 볼륨으로 인해 발생하는 내부 지오메트리를 무시하고 볼륨을 하나로 인쇄하십시오. 이로 인해 의도하지 않은 내부 공동이 사라질 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "모든 구멍을 제거하십시오" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes description" +msgid "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below." +msgstr "각 레이어의 구멍을 제거하고 바깥 쪽 모양 만 유지합니다. 이것은 보이지 않는 내부 지오메트리를 무시합니다. 그러나 위 또는 아래에서 볼 수있는 레이어 구멍도 무시합니다. " + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "광범위한 스티칭" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching description" +msgid "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time." +msgstr "광범위한 스티칭은 다각형을 만지면서 구멍을 닫음으로써 메쉬의 열린 구멍을 꿰매려합니다. 이 옵션은 많은 처리 시간을 초래할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "끊긴 면 유지" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons description" +msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." +msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "Merged Meshes 중복" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap description" +msgid "Make meshes which are touching each other overlap a bit. This makes them bond together better." +msgstr "서로 닿는 메쉬가 조금 겹치게 만듭니다. 이것은 그들을 더 잘 묶는 것입니다. " + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "메쉬 교차 제거" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes description" +msgid "Remove areas where multiple meshes are overlapping with each other. This may be used if merged dual material objects overlap with each other." +msgstr "여러 메시가 서로 겹치는 영역을 제거하십시오. 병합 된 이중 물체가 서로 중첩되는 경우이 값이 사용될 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "대체 메쉬 제거" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order description" +msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." +msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 메쉬가 서로 얽 히게됩니다. 이 설정을 해제하면 메시 중 하나가 다른 메시에서 제거되는 동안 오버랩의 모든 볼륨을 가져옵니다. " + +#: fdmprinter.def.json +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "특수 모드" + +#: fdmprinter.def.json +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "블랙매직 카테고리 " + +#: fdmprinter.def.json +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "인쇄 순서" + +#: fdmprinter.def.json +msgctxt "print_sequence description" +msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes." +msgstr "한 번에 한 레이어 씩 모든 모델을 인쇄할지 또는 한 모델이 완료 될 때까지 기다렸다가 다음 모델로 넘어갈 지 여부. 한 번에 한 가지 모드는 모든 모델이 분리되어 전체 프린트 헤드가 중간에서 움직일 수 있고 모든 모델이 노즐과 X / Y 축 사이의 거리보다 낮은 경우에만 가능합니다. " + +#: fdmprinter.def.json +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "한꺼번에" + +#: fdmprinter.def.json +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "한번에 한" + +#: fdmprinter.def.json +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "충진 메쉬" + +#: fdmprinter.def.json +msgctxt "infill_mesh description" +msgid "Use this mesh to modify the infill of other meshes with which it overlaps. Replaces infill regions of other meshes with regions for this mesh. It's suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "관련 메쉬를 사용하여 겹치는 다른 메쉬의 충진율을 수정하십시오. 다른 메쉬의 충진 영역을 본 메쉬의 영역으로 대체합니다. 본 메쉬에 하나의 벽과 상단 / 밑바닥 스킨만을 인쇄하는 것이 좋습니다. " + +#: fdmprinter.def.json +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "추이니 메쉬 주문" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order description" +msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes." +msgstr "어떤 충진 메쉬가 다른 충진 메쉬의 충진 내부에 있는지 결정합니다. 더 높은 차수의 충진 메쉬는 더 낮은 차수와 일반적인 메쉬로 충진 메쉬의 충진을 수정합니다. " + +#: fdmprinter.def.json +msgctxt "cutting_mesh label" +msgid "Cutting Mesh" +msgstr "커팅 메쉬" + +#: fdmprinter.def.json +msgctxt "cutting_mesh description" +msgid "Limit the volume of this mesh to within other meshes. You can use this to make certain areas of one mesh print with different settings and with a whole different extruder." +msgstr "이 메쉬의 볼륨을 다른 메쉬 내로 제한하십시오. 이 기능을 사용하면 다른 설정과 전체 압출기로 하나의 메쉬 인쇄 영역을 만들 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "mold_enabled label" +msgid "Mold" +msgstr "금형" + +#: fdmprinter.def.json +msgctxt "mold_enabled description" +msgid "Print models as a mold, which can be cast in order to get a model which resembles the models on the build plate." +msgstr "모형을 모형으로 인쇄하여 모형에 모형과 유사한 모형을 만들 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "mold_width label" +msgid "Minimal Mold Width" +msgstr "최소 금형 너비" + +#: fdmprinter.def.json +msgctxt "mold_width description" +msgid "The minimal distance between the ouside of the mold and the outside of the model." +msgstr "몰드의 바깥 쪽과 모델의 바깥 쪽 사이의 최소 거리입니다. " + +#: fdmprinter.def.json +msgctxt "mold_roof_height label" +msgid "Mold Roof Height" +msgstr "금형 지붕 높이" + +#: fdmprinter.def.json +msgctxt "mold_roof_height description" +msgid "The height above horizontal parts in your model which to print mold." +msgstr "모델의 수평 부분 위의 높이로 금형을 인쇄합니다. " + +#: fdmprinter.def.json +msgctxt "mold_angle label" +msgid "Mold Angle" +msgstr "금형 각도" + +#: fdmprinter.def.json +msgctxt "mold_angle description" +msgid "The angle of overhang of the outer walls created for the mold. 0° will make the outer shell of the mold vertical, while 90° will make the outside of the model follow the contour of the model." +msgstr "몰드에 대해 생성 된 외벽의 돌출 각도입니다. \"0\"도의 각은 금형의 외각을 수직으로 만들고 \"90\"도의 각은 모형의 외형을 모델의 외형으로 만듭니다. " + +#: fdmprinter.def.json +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "지지대 메쉬" + +#: fdmprinter.def.json +msgctxt "support_mesh description" +msgid "Use this mesh to specify support areas. This can be used to generate support structure." +msgstr "본 메시를 사용하여 지원 영역을 지정하십시오. 이것은 지원 구조를 생성하는 데 사용할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "드롭 다운 지지대 메쉬" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down description" +msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh." +msgstr "지지 메쉬 아래의 모든 부분을 지원하여지지 메쉬에 돌출이 없어야 합니다. " + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "안티 오버행 메쉬" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh description" +msgid "Use this mesh to specify where no part of the model should be detected as overhang. This can be used to remove unwanted support structure." +msgstr "본 메쉬를 사용하여 모델에서 돌출부로 감지 할 부분을 지정합니다. 이것은 원하지 않는 지원 구조를 제거하는 데 사용될 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "표면 모드" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode description" +msgid "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces." +msgstr "모델을 표면 만, 볼륨 또는 느슨한 표면이있는 볼륨으로 취급하십시오. 일반 인쇄 모드는 동봉 된 볼륨 만 인쇄합니다. \"표면\"은 아무런 충전물없이 상단 / 하단 스킨없이 메쉬 표면을 추적하는 단일 벽을 인쇄합니다. \"둘 다\"는 정상 및 나머지 폴리곤과 같은 닫힌 볼륨을 서피스로 인쇄합니다. " + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "표준" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "표면" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "양자 모두" + +#: fdmprinter.def.json +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "외부 윤곽선을 나선형으로 만듭니다." + +#: fdmprinter.def.json +msgctxt "magic_spiralize description" +msgid "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid model into a single walled print with a solid bottom. This feature should only be enabled when each layer only contains a single part." +msgstr "스파이럴 라이즈는 바깥 쪽 가장자리의 Z 이동을 부드럽게합니다. 이렇게하면 인쇄물 전체에 걸쳐 꾸준히 Z가 증가합니다. 이 기능은 솔리드 모델을 단단한 바닥이있는 단일 벽으로 인쇄합니다. 이 기능은 각 레이어에 단일 부품 만 포함되어있을 때만 활성화 해야 합니다. " + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours label" +msgid "Smooth Spiralized Contours" +msgstr "부드러운 나선형 윤곽" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours description" +msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details." +msgstr "나선형 윤곽선을 부드럽게하여 Z 솔기의 가시성을 줄이십시오 (Z- 솔기는 인쇄물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게하는 경향이 있습니다. " + +#: fdmprinter.def.json +msgctxt "relative_extrusion label" +msgid "Relative Extrusion" +msgstr "상대 압출" + +#: fdmprinter.def.json +msgctxt "relative_extrusion description" +msgid "Use relative extrusion rather than absolute extrusion. Using relative E-steps makes for easier post-processing of the Gcode. However, it's not supported by all printers and it may produce very slight deviations in the amount of deposited material compared to absolute E-steps. Irrespective of this setting, the extrusion mode will always be set to absolute before any Gcode script is output." +msgstr "절대 돌출보다는 상대적 돌출을 사용하십시오. 상대적인 E-steps을 사용하면 Gcode를보다 쉽게 후 처리 할 수 있습니다. 그러나 모든 프린터에서 지원되는 것은 아니며 절대 E 단계와 비교할 때 증착 된 재료의 양이 매우 약간 다를 수 있습니다. 이 설정과 관계없이 압출 모드는 Gcode 스크립트가 출력되기 전에 항상 절대 값으로 설정됩니다. " + +#: fdmprinter.def.json +msgctxt "experimental label" +msgid "Experimental" +msgstr "실험적" + +#: fdmprinter.def.json +msgctxt "experimental description" +msgid "experimental!" +msgstr "실험적인 " + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "벽면 인쇄 명령 최적화" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." +msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" -msgstr "" +msgstr "드래프트 쉴드 사용" #: fdmprinter.def.json msgctxt "draft_shield_enabled description" @@ -4382,7 +4202,7 @@ msgstr "이렇게하면 모델 주위에 벽이 생겨 외부 공기 흐름을 #: fdmprinter.def.json msgctxt "draft_shield_dist label" msgid "Draft Shield X/Y Distance" -msgstr "" +msgstr "드래프트 쉴드 X / Y 거리" #: fdmprinter.def.json msgctxt "draft_shield_dist description" @@ -4392,7 +4212,7 @@ msgstr "X / Y 방향으로 인쇄에서 드래프트 쉴드까지의 거리입 #: fdmprinter.def.json msgctxt "draft_shield_height_limitation label" msgid "Draft Shield Limitation" -msgstr "" +msgstr "드래프트 쉴드 제한" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation description" @@ -4402,17 +4222,17 @@ msgstr "드래프트 쉴드의 높이를 설정하십시오. 모델의 전체 #: fdmprinter.def.json msgctxt "draft_shield_height_limitation option full" msgid "Full" -msgstr "" +msgstr "가득찬" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation option limited" msgid "Limited" -msgstr "" +msgstr "제한된" #: fdmprinter.def.json msgctxt "draft_shield_height label" msgid "Draft Shield Height" -msgstr "" +msgstr "드래프트 쉴드 높이" #: fdmprinter.def.json msgctxt "draft_shield_height description" @@ -4422,7 +4242,7 @@ msgstr "드래프트 쉴드의 높이 제한. 이 높이 이상에서는 드래 #: fdmprinter.def.json msgctxt "conical_overhang_enabled label" msgid "Make Overhang Printable" -msgstr "" +msgstr "오버행 인쇄 가능" #: fdmprinter.def.json msgctxt "conical_overhang_enabled description" @@ -4432,7 +4252,7 @@ msgstr "최소 지원이 필요하도록 인쇄 된 모델의 형상을 변경 #: fdmprinter.def.json msgctxt "conical_overhang_angle label" msgid "Maximum Model Angle" -msgstr "" +msgstr "최대 모델 각도" #: fdmprinter.def.json msgctxt "conical_overhang_angle description" @@ -4442,7 +4262,7 @@ msgstr "오버행 각도가 인쇄 가능하게 된 후 최대 각도. \"0\"도 #: fdmprinter.def.json msgctxt "coasting_enable label" msgid "Enable Coasting" -msgstr "" +msgstr "Coasting 사용하기" #: fdmprinter.def.json msgctxt "coasting_enable description" @@ -4452,7 +4272,7 @@ msgstr "코스팅(Coasting)은 돌출 경로의 마지막 부분을 이동 경 #: fdmprinter.def.json msgctxt "coasting_volume label" msgid "Coasting Volume" -msgstr "" +msgstr "Coasting 양" #: fdmprinter.def.json msgctxt "coasting_volume description" @@ -4462,7 +4282,7 @@ msgstr "그렇지 않으면 볼륨이 흘러 나옵니다. 이 값은 일반적 #: fdmprinter.def.json msgctxt "coasting_min_volume label" msgid "Minimum Volume Before Coasting" -msgstr "" +msgstr "Coasting의 최소 볼륨" #: fdmprinter.def.json msgctxt "coasting_min_volume description" @@ -4472,7 +4292,7 @@ msgstr "코스팅(Coasting)을 허용하기 전에 압출 경로에 있어야하 #: fdmprinter.def.json msgctxt "coasting_speed label" msgid "Coasting Speed" -msgstr "" +msgstr "Coasting 속도" #: fdmprinter.def.json msgctxt "coasting_speed description" @@ -4482,7 +4302,7 @@ msgstr "코스팅(Coasting) 시, 이동 속도. 돌출 경로의 속도에 상 #: fdmprinter.def.json msgctxt "skin_alternate_rotation label" msgid "Alternate Skin Rotation" -msgstr "" +msgstr "대체 피부 회전" #: fdmprinter.def.json msgctxt "skin_alternate_rotation description" @@ -4492,7 +4312,7 @@ msgstr "위쪽 / 아래쪽 레이어가 인쇄되는 방향을 바꿉니다. 보 #: fdmprinter.def.json msgctxt "cross_infill_pocket_size label" msgid "Cross 3D Pocket Size" -msgstr "" +msgstr "크로스 3D 포켓 크기" #: fdmprinter.def.json msgctxt "cross_infill_pocket_size description" @@ -4502,7 +4322,7 @@ msgstr "패턴이 만지는 높이에서 크로스 3D 패턴의 4 방향 교차 #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly label" msgid "Alternate Cross 3D Pockets" -msgstr "" +msgstr "대체 교차 3D 포켓" #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly description" @@ -4512,7 +4332,7 @@ msgstr "십자형 3D 패턴에서 4방향 교차점의 절반에만 포켓을 #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" msgid "Spaghetti Infill" -msgstr "" +msgstr "절연 튜브 충진" #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled description" @@ -4522,7 +4342,7 @@ msgstr "필라멘트가 물체 내부에서 혼란스럽게 뒤 틀릴 수 있 #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped label" msgid "Spaghetti Infill Stepping" -msgstr "" +msgstr "절연 튜브 충진 단계" #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped description" @@ -4532,7 +4352,7 @@ msgstr "스파게티 필링을 단계별로 인쇄할지 또는 인쇄가 끝날 #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" msgid "Spaghetti Maximum Infill Angle" -msgstr "" +msgstr "절연 튜브 최대 충진 각" #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle description" @@ -4542,7 +4362,7 @@ msgstr "최대 각도 w.r.t. 나중에 스파게티가 채워질 영역에 대 #: fdmprinter.def.json msgctxt "spaghetti_max_height label" msgid "Spaghetti Infill Maximum Height" -msgstr "" +msgstr "절연 튜브 충진 최대 높이" #: fdmprinter.def.json msgctxt "spaghetti_max_height description" @@ -4552,7 +4372,7 @@ msgstr "상단에서 결합하여 채울 수있는 내부 공간의 최대 높 #: fdmprinter.def.json msgctxt "spaghetti_inset label" msgid "Spaghetti Inset" -msgstr "" +msgstr "절연 튜브 삽입" #: fdmprinter.def.json msgctxt "spaghetti_inset description" @@ -4562,7 +4382,7 @@ msgstr "스파게티가 채워지는 벽의 오프셋. " #: fdmprinter.def.json msgctxt "spaghetti_flow label" msgid "Spaghetti Flow" -msgstr "" +msgstr "절연 튜브 흐름" #: fdmprinter.def.json msgctxt "spaghetti_flow description" @@ -4572,7 +4392,7 @@ msgstr "스파게티 주입 물의 밀도를 조정합니다. Infill Density는 #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume label" msgid "Spaghetti Infill Extra Volume" -msgstr "" +msgstr "절연 튜브 충진 추가 양" #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume description" @@ -4582,7 +4402,7 @@ msgstr "스파게티를 채울 때마다 압출되는 총 부피를 조정하는 #: fdmprinter.def.json msgctxt "support_conical_enabled label" msgid "Enable Conical Support" -msgstr "" +msgstr "원추형 지지대 가능" #: fdmprinter.def.json msgctxt "support_conical_enabled description" @@ -4592,7 +4412,7 @@ msgstr "실험적 기능 : 오버행보다 하단에서 지원 영역을 작게 #: fdmprinter.def.json msgctxt "support_conical_angle label" msgid "Conical Support Angle" -msgstr "" +msgstr "원추지지대 각" #: fdmprinter.def.json msgctxt "support_conical_angle description" @@ -4602,7 +4422,7 @@ msgstr "원추형 지지점의 기울기 각도입니다. \"0\"도가 수직이 #: fdmprinter.def.json msgctxt "support_conical_min_width label" msgid "Conical Support Minimum Width" -msgstr "" +msgstr "원뿔형 지지대 최소 너비" #: fdmprinter.def.json msgctxt "support_conical_min_width description" @@ -4612,7 +4432,7 @@ msgstr "원추형지지 영역의베이스가 축소되는 최소 너비. 폭이 #: fdmprinter.def.json msgctxt "infill_hollow label" msgid "Hollow Out Objects" -msgstr "" +msgstr "개체가 텅 빈 것" #: fdmprinter.def.json msgctxt "infill_hollow description" @@ -4622,7 +4442,7 @@ msgstr "모든 충진재를 제거하고 물체의 내부를 지탱할 수있게 #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled label" msgid "Fuzzy Skin" -msgstr "" +msgstr "퍼지 피부" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled description" @@ -4632,7 +4452,7 @@ msgstr "외벽을 인쇄하는 동안 무작위로 지터가 발생하여 표면 #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness label" msgid "Fuzzy Skin Thickness" -msgstr "" +msgstr "퍼지 피부 두께" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness description" @@ -4642,7 +4462,7 @@ msgstr "지터가 발생할 너비. 내벽이 변경되지 않으므로이를 #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density label" msgid "Fuzzy Skin Density" -msgstr "" +msgstr "퍼지 피부 밀도" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density description" @@ -4652,37 +4472,17 @@ msgstr "레이어의 각 다각형에 도입 된 점의 평균 밀도입니다. #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist label" msgid "Fuzzy Skin Point Distance" -msgstr "" +msgstr "퍼지 스킨 포인트 거리" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "각 선분에 도입 된 임의의 점 사이의 평균 거리입니다. 다각형의 원래 점은 버려 지므로 높은 부드러움으로 인해 해상도가 감소합니다. 이 값은 퍼지 스킨 두께의 절반보다 커야합니다. " -#: fdmprinter.def.json -msgctxt "flow_rate_max_extrusion_offset label" -msgid "Flow rate compensation max extrusion offset" -msgstr "" - -#: fdmprinter.def.json -msgctxt "flow_rate_max_extrusion_offset description" -msgid "The maximum distance in mm to compensate." -msgstr "" - -#: fdmprinter.def.json -msgctxt "flow_rate_extrusion_offset_factor label" -msgid "Flow rate compensation factor" -msgstr "" - -#: fdmprinter.def.json -msgctxt "flow_rate_extrusion_offset_factor description" -msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" - #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" -msgstr "" +msgstr "와이어 인쇄" #: fdmprinter.def.json msgctxt "wireframe_enabled description" @@ -4692,7 +4492,7 @@ msgstr "얇은 공기 중에서 인쇄하는 스파 스 웨브 구조로 외부 #: fdmprinter.def.json msgctxt "wireframe_height label" msgid "WP Connection Height" -msgstr "" +msgstr "WP 연결 높이" #: fdmprinter.def.json msgctxt "wireframe_height description" @@ -4702,7 +4502,7 @@ msgstr "두 개의 수평 부분 사이의 상향 및 대각선 방향의 높이 #: fdmprinter.def.json msgctxt "wireframe_roof_inset label" msgid "WP Roof Inset Distance" -msgstr "" +msgstr "WP 지붕 인셋 거리" #: fdmprinter.def.json msgctxt "wireframe_roof_inset description" @@ -4712,7 +4512,7 @@ msgstr "지붕에서 연결을 할 때 안쪽까지 윤곽선을 그립니다. #: fdmprinter.def.json msgctxt "wireframe_printspeed label" msgid "WP Speed" -msgstr "" +msgstr "WP 속도" #: fdmprinter.def.json msgctxt "wireframe_printspeed description" @@ -4722,7 +4522,7 @@ msgstr "재료를 압출 할 때 노즐이 움직이는 속도. 와이어 인쇄 #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom label" msgid "WP Bottom Printing Speed" -msgstr "" +msgstr "WP 하단 인쇄 속도" #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom description" @@ -4732,7 +4532,7 @@ msgstr "빌드 플랫폼을 만지는 유일한 레이어 인 첫 번째 레이 #: fdmprinter.def.json msgctxt "wireframe_printspeed_up label" msgid "WP Upward Printing Speed" -msgstr "" +msgstr "WP 상향 인쇄 속도" #: fdmprinter.def.json msgctxt "wireframe_printspeed_up description" @@ -4742,7 +4542,7 @@ msgstr "얇은 공기 속에서 위쪽으로 선을 인쇄하는 속도. 와이 #: fdmprinter.def.json msgctxt "wireframe_printspeed_down label" msgid "WP Downward Printing Speed" -msgstr "" +msgstr "WP 하향 인쇄 속도" #: fdmprinter.def.json msgctxt "wireframe_printspeed_down description" @@ -4752,7 +4552,7 @@ msgstr "대각선 방향으로 선을 인쇄하는 속도. 와이어 인쇄에 #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat label" msgid "WP Horizontal Printing Speed" -msgstr "" +msgstr "WP 가로 인쇄 속도" #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat description" @@ -4762,7 +4562,7 @@ msgstr "모델의 수평 윤곽 인쇄 속도입니다. 와이어 인쇄에만 #: fdmprinter.def.json msgctxt "wireframe_flow label" msgid "WP Flow" -msgstr "" +msgstr "WP 흐름" #: fdmprinter.def.json msgctxt "wireframe_flow description" @@ -4772,7 +4572,7 @@ msgstr "유량 보상 : 압출 된 재료의 양에이 값을 곱합니다. 와 #: fdmprinter.def.json msgctxt "wireframe_flow_connection label" msgid "WP Connection Flow" -msgstr "" +msgstr "WP 연결 흐름" #: fdmprinter.def.json msgctxt "wireframe_flow_connection description" @@ -4782,7 +4582,7 @@ msgstr "위 또는 아래로 이동할 때 유량 보정. 와이어 인쇄에만 #: fdmprinter.def.json msgctxt "wireframe_flow_flat label" msgid "WP Flat Flow" -msgstr "" +msgstr "WP 플랫 플로우" #: fdmprinter.def.json msgctxt "wireframe_flow_flat description" @@ -4792,7 +4592,7 @@ msgstr "평평한 선을 인쇄 할 때 유량 보정. 와이어 인쇄에만 #: fdmprinter.def.json msgctxt "wireframe_top_delay label" msgid "WP Top Delay" -msgstr "" +msgstr "WP 상단 지연" #: fdmprinter.def.json msgctxt "wireframe_top_delay description" @@ -4802,7 +4602,7 @@ msgstr "상향 라인이 강화 될 수 있도록 상향 이동 후 지연 시 #: fdmprinter.def.json msgctxt "wireframe_bottom_delay label" msgid "WP Bottom Delay" -msgstr "" +msgstr "WP 최저 지연" #: fdmprinter.def.json msgctxt "wireframe_bottom_delay description" @@ -4812,7 +4612,7 @@ msgstr "하강 후 지연 시간. 와이어 인쇄에만 적용됩니다. " #: fdmprinter.def.json msgctxt "wireframe_flat_delay label" msgid "WP Flat Delay" -msgstr "" +msgstr "WP 평탄한 지연" #: fdmprinter.def.json msgctxt "wireframe_flat_delay description" @@ -4822,7 +4622,7 @@ msgstr "두 개의 수평 세그먼트 사이의 지연 시간. 이러한 지연 #: fdmprinter.def.json msgctxt "wireframe_up_half_speed label" msgid "WP Ease Upward" -msgstr "" +msgstr "WP는 쉽게 상향 조정" #: fdmprinter.def.json msgctxt "wireframe_up_half_speed description" @@ -4834,7 +4634,7 @@ msgstr "기본 속도의 반으로 돌출 된 상향 이동 거리. 이로 인 #: fdmprinter.def.json msgctxt "wireframe_top_jump label" msgid "WP Knot Size" -msgstr "" +msgstr "WP 매듭 크기" #: fdmprinter.def.json msgctxt "wireframe_top_jump description" @@ -4844,7 +4644,7 @@ msgstr "상향 선의 상단에 작은 매듭을 만들어 연속적인 수평 #: fdmprinter.def.json msgctxt "wireframe_fall_down label" msgid "WP Fall Down" -msgstr "" +msgstr "WP Fall Down" #: fdmprinter.def.json msgctxt "wireframe_fall_down description" @@ -4854,7 +4654,7 @@ msgstr "위쪽으로 밀어 낸 후 재료가 떨어지는 거리. 이 거리는 #: fdmprinter.def.json msgctxt "wireframe_drag_along label" msgid "WP Drag Along" -msgstr "" +msgstr "WP 드래그를 따라" #: fdmprinter.def.json msgctxt "wireframe_drag_along description" @@ -4864,7 +4664,7 @@ msgstr "대각선 방향으로 돌출 된 돌출부의 재료가 위쪽으로 #: fdmprinter.def.json msgctxt "wireframe_strategy label" msgid "WP Strategy" -msgstr "" +msgstr "WP 전략" #: fdmprinter.def.json msgctxt "wireframe_strategy description" @@ -4874,22 +4674,22 @@ msgstr "각 연결 지점에서 두 개의 연속 된 레이어가 연결되도 #: fdmprinter.def.json msgctxt "wireframe_strategy option compensate" msgid "Compensate" -msgstr "" +msgstr "보상하다" #: fdmprinter.def.json msgctxt "wireframe_strategy option knot" msgid "Knot" -msgstr "" +msgstr "매듭" #: fdmprinter.def.json msgctxt "wireframe_strategy option retract" msgid "Retract" -msgstr "" +msgstr "취소하다" #: fdmprinter.def.json msgctxt "wireframe_straight_before_down label" msgid "WP Straighten Downward Lines" -msgstr "" +msgstr "WP 직선화 하향 라인" #: fdmprinter.def.json msgctxt "wireframe_straight_before_down description" @@ -4899,7 +4699,7 @@ msgstr "수평선 조각에 의해 덮여있는 비스듬히 하향 선의 백 #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down label" msgid "WP Roof Fall Down" -msgstr "" +msgstr "WP 지붕 Fall Down" #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down description" @@ -4909,7 +4709,7 @@ msgstr "수평 지붕 라인이 '얇은 공기 안에'인쇄 된 거리는 인 #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" msgid "WP Roof Drag Along" -msgstr "" +msgstr "WP 지붕 끌기" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along description" @@ -4919,7 +4719,7 @@ msgstr "루프의 외곽 윤곽으로 돌아갈 때 끌린 내향 선의 끝 부 #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" msgid "WP Roof Outer Delay" -msgstr "" +msgstr "WP 지붕 외부 지연" #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay description" @@ -4929,17 +4729,117 @@ msgstr "지붕이 될 구멍의 바깥 둘레에서 보낸 시간. 긴 시간은 #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance label" msgid "WP Nozzle Clearance" -msgstr "" +msgstr "WP 노즐 여유" #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 클수록 비스듬한 각도에서 비스듬히 아래쪽으로 선이 그어져 다음 층과의 연결이보다 적어집니다. 와이어 인쇄에만 적용됩니다. " +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "다림질 사용" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "아이언 전용 최상위 레이어" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "다림질 패턴" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "윗면을 다림질 할 때 사용하는 패턴. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "다림질 라인 간격" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "다림질 라인 사이의 거리. " + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "다림질 과정" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "다림질 삽입" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "다림질 속도" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "상단 표면을 통과하는 속도. " + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "다림질 가속" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "다림질이 수행되는 가속도. " + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "다림질 Jerk" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "다림질을하는 동안 최대 순간 속도 변화. " + #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" -msgstr "" +msgstr "명령 줄 설정" #: fdmprinter.def.json msgctxt "command_line_settings description" @@ -4949,7 +4849,7 @@ msgstr "큐라(Cura) 프론트 엔드에서 큐라엔진(CuraEngine)이 호출 #: fdmprinter.def.json msgctxt "center_object label" msgid "Center object" -msgstr "" +msgstr "가운데 객체" #: fdmprinter.def.json msgctxt "center_object description" @@ -4959,7 +4859,7 @@ msgstr "객체가 저장된 좌표계를 사용하는 대신 빌드 플랫폼 #: fdmprinter.def.json msgctxt "mesh_position_x label" msgid "Mesh position x" -msgstr "" +msgstr "메쉬 위치 x" #: fdmprinter.def.json msgctxt "mesh_position_x description" @@ -4969,7 +4869,7 @@ msgstr "x 방향으로 객체에 적용된 오프셋입니다. " #: fdmprinter.def.json msgctxt "mesh_position_y label" msgid "Mesh position y" -msgstr "" +msgstr "메쉬 위치 y" #: fdmprinter.def.json msgctxt "mesh_position_y description" @@ -4979,7 +4879,7 @@ msgstr "y 방향으로 객체에 적용된 오프셋입니다. " #: fdmprinter.def.json msgctxt "mesh_position_z label" msgid "Mesh position z" -msgstr "" +msgstr "메쉬 위치 z" #: fdmprinter.def.json msgctxt "mesh_position_z description" @@ -4989,38 +4889,16 @@ msgstr "z 방향으로 객체에 적용된 오프셋입니다. 이것을 사용 #: fdmprinter.def.json msgctxt "mesh_rotation_matrix label" msgid "Mesh Rotation Matrix" -msgstr "" +msgstr "메쉬 회전 행렬" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다. " -#~ msgctxt "infill_pattern description" -#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -#~ msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " - -#~ msgctxt "zig_zaggify_infill description" -#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -#~ msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " - -#~ msgctxt "skirt_gap description" -#~ msgid "" -#~ "The horizontal distance between the skirt and the first layer of the print.\n" -#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." -#~ msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " - -#~ msgctxt "z_offset_layer_0 description" -#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -#~ msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " - -#~ msgctxt "z_offset_taper_layers description" -#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -#~ msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " - -#~ msgctxt "raft_smoothing description" -#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -#~ msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " +#~ msgctxt "wall_extruder_nr description" +#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +#~ msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." From ffa418660aa52798b3f65ee634e0b3ab1f4784f3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 22 Nov 2017 11:34:55 +0100 Subject: [PATCH 305/764] Update Korean translations for 3.1 This adds empty translations and updates the line numbers and such. The original Korean translations for 3.0 are still retained. Contributes to issue CURA-4601. --- resources/i18n/ko_KR/cura.po | 2118 ++++++++++--------- resources/i18n/ko_KR/fdmprinter.def.json.po | 460 ++-- 2 files changed, 1449 insertions(+), 1129 deletions(-) diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 8c508c1e51..d45dec3bb9 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -9,75 +9,15 @@ msgstr "" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" "PO-Revision-Date: 2017-11-14 22:13+0900\n" +"Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ko_KR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"Last-Translator: Brule\n" "X-Generator: Poedit 2.0.4\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "프린트 정지" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "막힘" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "필요한 조치" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "인쇄를 시작할 수 없습니다" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "이 프린터는 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니다." - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "종료시간 : " - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "이 프린터는 1% Ultimaker 3 프린터 그룹의 호스트입니다." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "프린터가 인쇄를 완료했습니다." - -#: Manually added for plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "프린트가 완료됐습니다" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "플러그인" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "플러그인 찾아보기 ..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "설치된 플러그인 ..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -115,19 +55,17 @@ msgstr "Doodle3D Connect에 연결" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "취소" @@ -154,15 +92,15 @@ msgstr "Doodle3D Connect에 파일 전송" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" -msgid "Open Connect.." -msgstr "열기 연결 .." +msgid "Open Connect..." +msgstr "" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "Doodle3D Connect 웹 인터페이스 열기" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "변경 내역 표시" @@ -197,37 +135,38 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "USB를 통해 연결" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "프린터가 사용 중이거나 연결되어 있지 않아 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" -msgid "Print Details" -msgstr "인쇄 세부 정보" +msgid "Printer Unavailable" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "이 프린터는 UltiGCode flavor를 사용하기 때문에 USB 인쇄를 지원하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 인쇄" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "Unable to start a new job because the printer does not support usb printing." msgstr "프린터가 USB 인쇄를 지원하지 않기 때문에 새 작업을 시작할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "경고" @@ -291,11 +230,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "이동식 드라이브에 저장할 수 없습니다 :" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "에러" @@ -344,371 +283,339 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "이동식 드라이브" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "네트워크를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "네트워크를 통해 인쇄" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "Access to the printer requested. Please approve the request on the printer" msgstr "요청 된 프린터에 대한 액세스. 프린터에서 요청을 승인하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "연결 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "연결 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "재시도" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "접근 요청 다시 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "허용 된 프린터에 대한 접근 허용" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "이 프린터로 인쇄 할 수 없습니다. 인쇄 작업을 보낼 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "접근 요청" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "프린터에 접근 요청 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "Connected over the network. Please approve the access request on the printer." msgstr "네트워크를 통해 연결되었습니다. 프린터에서 접근 요청을 승인하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "네트워크를 통해 연결되었습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "네트워크를 통해 연결되었습니다. 프린터를 제어 할 수있는 권한이 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "접근 요청이 프린터에서 거부되었습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "접근 요청이 시간 초과로 인해 실패했습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "네트워크 연결이 끊어졌습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "The connection with the printer was lost. Check your printer to see if it is connected." msgstr "프린터와의 연결이 끊어졌습니다. 프린터가 연결되어 있는지 확인하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "Unable to start a new print job, printer is busy. Current printer status is %s." msgstr "프린터가 사용중이라 새 인쇄 작업을 시작할 수 없습니다. 현재 프린터 상태는 % s입니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "프린터 상태" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 Printcore가 없습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "새 인쇄 작업을 시작할 수 없습니다. 슬롯 {0}에로드 된 자료 없음" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "스풀 {0}의 재료가 충분하지 않습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "압출기 {2}에 대해 선택된 다른 PrintCore (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "압출기 {2}에 대해 선택된 다른 재료 (Cura : {0}, Printer : {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer." msgstr "PrintCore가 올바르게 조정되지 않았습니다. XY 교정은 프린터에서 수행해야합니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "선택한 구성으로 인쇄 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" -msgid "" -"There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice " -"for the PrintCores and materials that are inserted in your printer." -msgstr "" -"프린터 및 Cura의 구성 또는 교정간에 불일치가 있습니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 " -"슬라이스하십시오." +msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "프린터 및 Cura의 구성 또는 교정간에 불일치가 있습니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 슬라이스하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "일치하지 않는 구성" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "새 작업 전송 (일시적)이 차단되어 이전 인쇄 작업을 계속 보냅니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "프린터로 데이터 보내기" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "데이터 전송 중" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "프린터로 데이터를 보낼 수 없습니다. 다른 작업이 여전히 작동중인가요?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "인쇄 중단 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "인쇄가 중단되었습니다. 프린터를 확인하십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "인쇄 일시 중지 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "인쇄 재개 중 ..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "프린터와 동기화" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "Cura에서 현재 프린터 구성을 사용 하시겠습니까?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" -msgid "" -"The PrintCores and/or materials on your printer differ from those within your current project. For the best result, " -"always slice for the PrintCores and materials that are inserted in your printer." -msgstr "" -"프린터의 PrintCores 및 / 또는 자료는 현재 프로젝트 내의 자료와 다릅니다. 최상의 결과를 얻으려면 프린터에 삽입 된 " -"PrintCores 및 재료를 항상 슬라이스하십시오." +msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer." +msgstr "프린터의 PrintCores 및 / 또는 자료는 현재 프로젝트 내의 자료와 다릅니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료를 항상 슬라이스하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "네트워크를 통해 연결" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "이 프린터는 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되어 있지 않습니다." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "This printer is the host for a group of {count} connected Ultimaker 3 printers." msgstr "이 프린터는 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되어 있지 않습니다." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate." msgstr "인쇄를 완료했습니다. 인쇄물을 수거하고 빌드 플레이트를 지우십시오." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format -msgid "" -"{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to " -"start printing." +msgid "{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing." msgstr "?을 인쇄하기 위해 예약되어 있습니다. 인쇄를 시작하려면 프린터의 구성을 작업에 맞게 변경하십시오." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "새 작업 전송 (일시적)이 차단되어 이전 인쇄 작업을 계속 보냅니다." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers." -msgstr "" -"새로운 인쇄 작업을 보낼 수 없습니다 :이 3D 프린터는 아직 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니" -"다." +msgstr "새로운 인쇄 작업을 보낼 수 없습니다 :이 3D 프린터는 아직 연결된 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니다." -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "{filename} {file_name} 을 {cluster_name} 그룹에 보냄" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "파일이름을 cluster_name 그룹에 보냈습니다." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "인쇄 작업 표시" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "브라우저에서 인쇄 작업 인터페이스를 엽니다." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "{cluster_name} 그룹에 인쇄 작업을 보낼 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "파일이름을 cluster_name 그룹에 보냈습니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "인쇄 작업 표시" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "브라우저에서 인쇄 작업 인터페이스를 엽니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "알 수 없는" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, fuzzy, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "프린터가 인쇄를 완료했습니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "프린트가 완료됐습니다" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "필요한 조치" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "{filename} {file_name} 을 {cluster_name} 그룹에 보냄" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "네트워크를 통해 연결" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" -msgid "" -"To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware " -"regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." msgstr "" -"{machine_name}에 최신 기능이 탑재되어 있는지 확인하려면 정기적으로 펌웨어를 업데이트하는 것이 좋습니다. 이 작업은 " -"{machine_name} (네트워크에 연결된 경우) 또는 USB를 통해 수행 할 수 있습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "새로운 펌웨어를 사용할 수 있습니다." -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "다운로드" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "업데이트 정보에 액세스 할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" -msgid "" -"Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in " -"SolidWorks itself without any problems as well!" +msgid "Errors appeared while opening your SolidWorks file! Please check, whether it is possible to open your file in SolidWorks itself without any problems as well!" msgstr "SolidWorks 파일을 여는 중 오류가 발생했습니다! 문제없이 SolidWorks에서 파일을 열 수 있는지 확인하십시오" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 @@ -731,7 +638,22 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "시작하는 도중 오류가 발생했습니다!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "와이어 인쇄가 활성화되어있을 때 Cura는 레이어를 정확하게 표시하지 않습니다" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "G 코드 수정" @@ -761,21 +683,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-code 파일" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "레이어 보기" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "와이어 인쇄가 활성화되어있을 때 Cura는 레이어를 정확하게 표시하지 않습니다" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "레이어 보기" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -808,8 +715,9 @@ msgstr "선택한 소재 또는 구성과 호환되지 않기 때문에 현재 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "슬라이스 할 수 없습니다" @@ -820,23 +728,29 @@ msgctxt "@info:status" msgid "Unable to slice with the current settings. The following settings have errors: {0}" msgstr "현재 설정으로 슬라이스 할 수 없습니다. 다음 설정에는 오류가 있습니다 : {0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "프라임 탑 또는 주요 위치가 유효하지 않아 슬라이스 할 수 없습니다." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit." msgstr "어떤 모델도 빌드 볼륨에 맞지 않으므로 슬라이스 할 수 없습니다. 크기에 맞게 모형을 회전하거나 회전하십시오." -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "레이어 처리 중" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "정보" @@ -851,46 +765,64 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "모델 별 설정 구성" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "추천" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "관습" -#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 파일" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "노즐" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "플러그인 찾아보기" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "?에서 플러그인 ID를 가져 오는 데 실패했습니다" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "경고" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "플러그인 브라우저" @@ -905,24 +837,21 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G파일" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "G 코드 파싱" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G 코드 세부 정보" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" -msgid "" -"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code " -"representation may not be accurate." -msgstr "" -"파일을 보내기 전에 g 코드가 프린터 및 프린터 구성에 적합한 지 확인하십시오. g 코드 표현이 정확하지 않을 수 있습니다." +msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate." +msgstr "파일을 보내기 전에 g 코드가 프린터 및 프린터 구성에 적합한 지 확인하십시오. g 코드 표현이 정확하지 않을 수 있습니다." #: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 #: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 @@ -961,73 +890,78 @@ msgctxt "@action" msgid "Level build plate" msgstr "레벨 빌드 플레이트" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "외벽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "내벽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "외판" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "빈 공간 채우기" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "빈 공간 채우기 지지" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "지원 인터페이스" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "지지물" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "둘러싸다" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "움직여 가다" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "취소" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "다른" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "미리 잘라낸 파일 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "로드 된 자료 없음" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "알 수없는 자료" @@ -1042,7 +976,8 @@ msgctxt "@info:title" msgid "Finding Location" msgstr "위치 찾기" -#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "모든 개체에 대한 빌드 볼륨 내의 위치를 찾을 수 없습니다" @@ -1053,13 +988,13 @@ msgid "Can't Find Location" msgstr "위치를 찾을 수 없음" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "파일이 이미 있습니다" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "The file {0} already exists. Are you sure you want to overwrite it?" @@ -1075,12 +1010,22 @@ msgctxt "@label" msgid "Custom Material" msgstr "맞춤 소재" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "The selected material is incompatible with the selected machine or configuration." msgstr "선택한 재료가 선택한 기계 또는 구성과 호환되지 않습니다." -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1101,62 +1046,62 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "재료 직경 변경을 취소하십시오." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to export profile to {0}: {1}" msgstr "프로필을 ?로 내보내는데 실패했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to export profile to {0}: Writer plugin reported failure." msgstr "프로필을 ?로 내보내지 못했습니다. Writer 플러그인이 오류를 보고했습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "프로파일을 ?에 내보냅니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "세부 정보 내보내기" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "Failed to import profile from {0}: {1}" msgstr "?에서 프로필을 가져 오지 못했습니다" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "프로필 {0}을 (를) 성공적으로 가져 왔습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "프로파일 {0}에 알 수없는 파일 유형이 있거나 손상되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "사용자 정의 프로필" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "프로필에 품질 유형이 누락되었습니다." -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1164,9 +1109,7 @@ msgstr "현재 구성에 대해 품질 유형 {0}을 (를) 찾을 수 없습니 #: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 msgctxt "@info:status" -msgid "" -"The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from " -"colliding with printed models." +msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models." msgstr "\"인쇄 순서\"설정 값으로 인해 갠트리가 인쇄 된 모델과 충돌하지 않도록 빌드 볼륨 높이가 줄어 들었습니다." #: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 @@ -1179,270 +1122,322 @@ msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "객체 곱하기 및 배치" -#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 msgctxt "@info:title" msgid "Placing Object" msgstr "개체 배치 중" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "오류 보고서" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"복구 할 수없는 치명적인 예외가 발생했습니다!\n" -"http://github.com/Ultimaker/Cura/issues에 버그 보고서를 게시하십시오. " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "웹 페이지 열기" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "기계로드 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "장면 설정 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "인터페이스로드 중 ..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format -msgctxt "" -"@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## " -"mm." +msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "% (너비) .1f x % (깊이) .1f x % (높이) .1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "한 번에 하나의 G 코드 파일만 로드 할 수 있습니다. 가져 오기를 건너 뛰었습니다." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G 코드가 로드되어 있으면 다른 파일을 열 수 없습니다. 가져 오기를 건너 뛰었습니다." +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "기계 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "프린터" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "프린터 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (너비)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (깊이)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (높이)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "판 모양 만들기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "센터 원점" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "가열된 베드" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "Gcode 플레이버" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "프린트 헤드 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X 최소값" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" -msgid "" -"Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"프린트 헤드 왼쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 " -"데 사용됩니다." +msgid "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "프린트 헤드 왼쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y 최소값" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" -msgid "" -"Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"프린트 헤드 전면에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 " -"데 사용됩니다." +msgid "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "프린트 헤드 전면에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X 최대값" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" -msgid "" -"Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"프린트 헤드의 오른쪽에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하" -"는 데 사용됩니다." +msgid "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "프린트 헤드의 오른쪽에서 노즐 중앙까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y 최대가" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" -msgid "" -"Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints " -"and the printhead when printing \"One at a Time\"." -msgstr "" -"프린트 헤드의 뒤쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하" -"는 데 사용됩니다." +msgid "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\"." +msgstr "프린트 헤드의 뒤쪽에서 노즐 중심까지의 거리. \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 인쇄 헤드 사이의 색상을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "갠트리 높이" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" -msgid "" -"The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions " -"between previous prints and the gantry when printing \"One at a Time\"." -msgstr "" -"노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 갠트리 사이의 충돌을 방" -"지하는 데 사용됩니다." +msgid "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\"." +msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 한 장\"을 인쇄 할 때 이전 인쇄물과 갠트리 사이의 충돌을 방지하는 데 사용됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "압출기의 수" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" -msgid "" -"The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or " -"the profile." +msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile." msgstr "프린터가 지원하는 필라멘트의 공칭 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 무시됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "재료 직경" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "노즐 크기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "Gcode 시작" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "시작시 Gcode 명령이 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "Gcode 끝내기" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "Gcode 명령어가 맨 마지막에 실행됩니다." -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "노즐 설정" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "노즐 오프셋 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "노즐 오프셋 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "압출기 시작 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "압출기 종료 Gcode" @@ -1455,12 +1450,12 @@ msgstr "변경 내역" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" msgstr "닫기" @@ -1511,42 +1506,33 @@ msgid "Unknown error code: %1" msgstr "알 수없는 오류 코드 : % 1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "네트워크 프린터에 연결" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" -"To print directly to your printer over the network, please make sure your printer is connected to the network using a " -"network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can " -"still use a USB drive to transfer g-code files to your printer.\n" +"To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" msgstr "" -":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크" -"에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전" -"송할 수 있습니다\n" +":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" "\n" "아래 목록에서 프린터를 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "추가" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "편집" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1555,220 +1541,221 @@ msgid "Remove" msgstr "제거" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "새롭게 하다" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "If your printer is not listed, read the network printing troubleshooting guide" msgstr "프린터가 목록에 없으면 네트워크 인쇄 문제 해결 가이드를 읽어보십시오" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "유형" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "얼티메이커 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "얼티메이커 3 확장판" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "알 수 없는" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "펌웨어 버전" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "주소" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "이 프린터는 Ultimaker 3 프린터 그룹을 호스트하도록 설정되지 않았습니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "이 프린터는 1% Ultimaker 3 프린터 그룹의 호스트입니다." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "이 주소의 프린터가 아직 응답하지 않았습니다." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "연결" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "프린터 주소" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "네트워크에 프린터의 IP 주소 또는 호스트 이름을 입력하십시오." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "승인" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "네트워크를 통해 인쇄" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하도록 설정되지 않았습니다" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "인쇄 작업보기" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "인쇄 준비" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "유효한" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "프린터와의 연결이 끊어졌습니다" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "예약된" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "끝마친" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "프린트 정지" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "인쇄 작업을 수락하지 않음" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "종료시간 : " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "클리어 빌드 플레이트" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "구성 변경 대기" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "인쇄 작업" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "인쇄" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "대기 중" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "프린터" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "프린터보기" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "프린터에 연결" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "Cura에 프린터 구성 로드" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "구성 활성화" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "이 프린터는 Ultimaker 3 프린터에 연결된 그룹을 호스트하도록 설정되지 않았습니다" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "이 프린터는 Ultimaker 3에 연결된 프린터 그룹의 호스트입니다" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "네트워크를 통해 인쇄" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "인쇄" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하도록 설정되지 않았습니다" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "인쇄" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "예약된" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "끝마친" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "준비중인" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "유효한" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "완료일 " - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "클리어 빌드 플레이트" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "인쇄 준비" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "인쇄 작업을 수락하지 않음" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "기본 웹 브라우저로 인쇄 작업 페이지를 엽니다." - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "인쇄 작업보기" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "프린터 그룹" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "인쇄 작업" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "인쇄" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "대기 중" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "구성 변경 대기" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "프린터" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "프린터보기" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1794,13 +1781,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "거친 품질을 항상 사용하십시오" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "승인" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1827,11 +1807,91 @@ msgid "Fine" msgstr "우수한" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "내 선택을 기억하라" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "색 구성표" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "재질 색상" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "라인 유형" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "호환 모드" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "이동 표시" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "도움말 보이기" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "셸 표시" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "충전물 표시" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "상단 레이어 만 표시" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "상단에 5 개의 세부 레이어 표시" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "위 / 아래" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "내벽" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1842,81 +1902,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "사후 처리 스크립트" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "스크립트 추가" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "활성 사후 처리 스크립트 변경" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "색 구성표" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "재질 색상" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "라인 유형" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "호환 모드" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "이동 표시" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "도움말 보이기" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "셸 표시" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "충전물 표시" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "상단 레이어 만 표시" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "상단에 5 개의 세부 레이어 표시" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "위 / 아래" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "내벽" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -1964,13 +1964,8 @@ msgstr "깊이 (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 msgctxt "@info:tooltip" -msgid "" -"By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this " -"option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low " -"points on the mesh." -msgstr "" -"기본적으로 흰색 픽셀은 메쉬에서 높은 점을 나타내고 검정색 픽셀은 메쉬에서 낮은 점을 나타냅니다. 이 옵션을 변경하면 검은 픽" -"셀이 메쉬의 높은 점을 나타내고 흰색 픽셀은 메쉬의 낮은 점을 나타냅니다." +msgid "By default, white pixels represent high points on the mesh and black pixels represent low points on the mesh. Change this option to reverse the behavior such that black pixels represent high points on the mesh and white pixels represent low points on the mesh." +msgstr "기본적으로 흰색 픽셀은 메쉬에서 높은 점을 나타내고 검정색 픽셀은 메쉬에서 낮은 점을 나타냅니다. 이 옵션을 변경하면 검은 픽셀이 메쉬의 높은 점을 나타내고 흰색 픽셀은 메쉬의 낮은 점을 나타냅니다." #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 msgctxt "@item:inlistbox" @@ -2013,129 +2008,129 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "모두 보이기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "프로젝트 열기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "기존 업데이트" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "새로 만들기" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "요약 - Cura 프로젝트" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "프린터 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "기계의 충돌을 어떻게 해결해야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "유형" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "이름" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "프로필 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "프로필의 충돌을 어떻게 해결해야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "프로필에 없음" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "무시하다" msgstr[1] "무시하다" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "파생 상품" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "무시하다" msgstr[1] "무시하다" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "재질 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "자료의 충돌은 어떻게 해결되어야합니까?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "가시성 설정" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "종류" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "표시 설정 :" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" -msgstr "프로젝트를 로드하면 빌드 플레이트의 모든 모델이 지워집니다" +msgid "Loading a project will clear all models on the build plate." +msgstr "" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "열다" @@ -2160,6 +2155,11 @@ msgctxt "@action:button" msgid "Installed" msgstr "설치됨" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "다운로드" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" @@ -2168,13 +2168,10 @@ msgstr "플러그인 라이센스 계약" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -"플러그인에는 라이센스가 포함되어 있습니다.\n" -"이 플러그인을 설치하려면이 라이센스를 수락해야합니다.\n" -"아래 약관에 동의하십니까?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2186,6 +2183,11 @@ msgctxt "@action:button" msgid "Decline" msgstr "거절" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2209,21 +2211,13 @@ msgstr "빌드 플레이트 평준화" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 msgctxt "@label" -msgid "" -"To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' " -"the nozzle will move to the different positions that can be adjusted." -msgstr "" -"지문이 크게 나오지 않도록 빌드 플레이트를 조정할 수 있습니다. '다음 위치로 이동'을 클릭하면 노즐이 조정할 수있는 다른 위치" -"로 이동합니다." +msgid "To make sure your prints will come out great, you can now adjust your buildplate. When you click 'Move to Next Position' the nozzle will move to the different positions that can be adjusted." +msgstr "지문이 크게 나오지 않도록 빌드 플레이트를 조정할 수 있습니다. '다음 위치로 이동'을 클릭하면 노즐이 조정할 수있는 다른 위치로 이동합니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 msgctxt "@label" -msgid "" -"For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build " -"plate height is right when the paper is slightly gripped by the tip of the nozzle." -msgstr "" -"모든 자리를 위해; 노즐 아래에 종이 한 장을 넣고 인쇄 빌드 플레이트 높이를 조정하십시오. 인쇄물 받침판 높이는 용지의 끝 부" -"분이 용지를 살짝 쥐었을 때의 높이입니다." +msgid "For every position; insert a piece of paper under the nozzle and adjust the print build plate height. The print build plate height is right when the paper is slightly gripped by the tip of the nozzle." +msgstr "모든 자리를 위해; 노즐 아래에 종이 한 장을 넣고 인쇄 빌드 플레이트 높이를 조정하십시오. 인쇄물 받침판 높이는 용지의 끝 부분이 용지를 살짝 쥐었을 때의 높이입니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 msgctxt "@action:button" @@ -2242,12 +2236,8 @@ msgstr "펌웨어 업그레이드" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 msgctxt "@label" -msgid "" -"Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates " -"the temperature and ultimately makes your printer work." -msgstr "" -"펌웨어는 3D 프린터에서 직접 실행되는 소프트웨어입니다. 이 펌웨어는 스텝 모터를 제어하고 온도를 조절하며 궁극적으로 프린터" -"를 작동시킵니다." +msgid "Firmware is the piece of software running directly on your 3D printer. This firmware controls the step motors, regulates the temperature and ultimately makes your printer work." +msgstr "펌웨어는 3D 프린터에서 직접 실행되는 소프트웨어입니다. 이 펌웨어는 스텝 모터를 제어하고 온도를 조절하며 궁극적으로 프린터를 작동시킵니다." #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 msgctxt "@label" @@ -2286,9 +2276,7 @@ msgstr "프린터 확인" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 msgctxt "@label" -msgid "" -"It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is " -"functional" +msgid "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional" msgstr "Ultimaker에서 몇 가지 분별 검사를 하는 것이 좋습니다. 기계가 작동하는지 알면 이 단계를 건너 뛸 수 있습니다" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 @@ -2385,30 +2373,25 @@ msgid "Printer does not accept commands" msgstr "프린터가 명령을 받아들이지 않습니다" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "유지 보수 중. 프린터를 확인하십시오" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "프린터와의 연결이 끊어졌습니다" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "인쇄..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "일시 중지됨" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "준비 중 ..." @@ -2626,7 +2609,7 @@ msgid "Unit" msgstr "단위" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "일반" @@ -2768,9 +2751,7 @@ msgstr "대형 모델 확장" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 msgctxt "@info:tooltip" -msgid "" -"An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be " -"scaled up?" +msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?" msgstr "단위가 밀리미터가 아닌 미터 단위 인 경우 모델이 매우 작게 나타날 수 있습니다. 이 모델을 확장해야합니까?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 @@ -2825,12 +2806,8 @@ msgstr "항상 모델 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 msgctxt "@info:tooltip" -msgid "" -"When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want " -"to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." -msgstr "" -"프로필을 변경하고 다른 프로필로 전환하면 수정 사항을 유지할지 여부를 묻는 대화 상자가 표시되거나 기본 행동을 선택하고 해" -"당 대화 상자를 다시 표시 할 수 없습니다." +msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again." +msgstr "프로필을 변경하고 다른 프로필로 전환하면 수정 사항을 유지할지 여부를 묻는 대화 상자가 표시되거나 기본 행동을 선택하고 해당 대화 상자를 다시 표시 할 수 없습니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 msgctxt "@label" @@ -2854,12 +2831,8 @@ msgstr "시작시 업데이트 확인" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 msgctxt "@info:tooltip" -msgid "" -"Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally " -"identifiable information is sent or stored." -msgstr "" -"인쇄물에 대한 익명의 데이터를 Ultimaker로 보내야합니까? 모델, IP 주소 또는 기타 개인 식별 정보는 전송되거나 저장되지 않습" -"니다." +msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored." +msgstr "인쇄물에 대한 익명의 데이터를 Ultimaker로 보내야합니까? 모델, IP 주소 또는 기타 개인 식별 정보는 전송되거나 저장되지 않습니다." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 msgctxt "@option:check" @@ -2867,7 +2840,7 @@ msgid "Send (anonymous) print information" msgstr "인쇄 (익명) 인쇄 정보" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "프린터" @@ -2885,39 +2858,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "이름 바꾸기" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "프린터 유형 :" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "연결:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "프린터가 연결되어 있지 않습니다." -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "상태:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "누군가가 빌드 플레이트를 지울 때까지 기다리는 중입니다" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "인쇄거리를 기다리는 중" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "프로필" @@ -3015,7 +2988,7 @@ msgid "Export Profile" msgstr "프로필 내보내기" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "자재" @@ -3072,7 +3045,8 @@ msgctxt "@info:status Don't translate the XML tag !" msgid "Successfully exported material to %1" msgstr "자재를 성공적으로 내보냈습니다" -#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "프린터 추가" @@ -3092,6 +3066,11 @@ msgctxt "@title:window" msgid "About Cura" msgstr "Cura 소개" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3186,12 +3165,17 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "다각형 클리핑 라이브러리" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "폰트" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG 아이콘" @@ -3201,7 +3185,12 @@ msgctxt "@label" msgid "Profile:" msgstr "윤곽:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the profile.\n" @@ -3212,32 +3201,32 @@ msgstr "" "\n" "프로파일 매니저를 열려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "찾다..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "모든 압출기에 값 복사" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "이 설정 숨기기" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "이 설정을 표시하지 않음" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "이 설정을 계속 표시하십시오" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "설정 표시 설정 ..." @@ -3295,12 +3284,12 @@ msgstr "" "\n" "계산 된 값을 복원하려면 클릭하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "인쇄 설정" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3309,48 +3298,63 @@ msgstr "" "인쇄 설정 사용 안 함\n" "G 코드 파일은 수정할 수 없습니다" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "00시간 00 분" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" -msgid "Time information" -msgstr "시간 정보" +msgid "Time specification
    " +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "인쇄 시간" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" -msgid "" -"Recommended Print Setup

    Print with the recommended settings for the selected printer, material and " -"quality." +msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." msgstr "" "권장 인쇄 설정\n" "선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." msgstr "" "사용자 정의 인쇄 설정\n" "마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "자동" @@ -3360,7 +3364,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "조망" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "자동" @@ -3389,21 +3393,20 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "열기 및 최근" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "연결된 프린터 없음" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "압출기" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 msgctxt "@tooltip" -msgid "" -"The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the " -"hotend heating is turned off." +msgid "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off." msgstr "핫 엔드의 목표 온도입니다. 핫 엔드는 이 온도를 향해 가열되거나 냉각됩니다. 이 값이 0이면 온열 가열이 꺼집니다." #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 @@ -3411,327 +3414,357 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "이 압출기의 현재 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "이 압출기의 재료 색." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "이 압출기의 재료." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "이 압출기에 삽입 된 노즐." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "빌드 플레이트" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" -msgid "" -"The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the " -"bed heating is turned off." +msgid "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off." msgstr "가열 된 베드의 목표 온도. 베드가 이 온도로 가열되거나 식을 것입니다. 이 값이 0이면 베드 가열이 꺼집니다." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "가열 된 베드의 현재 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "베드를 예열하기위한 온도." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "취소" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "예열" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" -msgid "" -"Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to " -"wait for the bed to heat up when you're ready to print." -msgstr "" -"인쇄하기 전에 베드를 미리 가열하십시오. 가열되는 동안 계속해서 인쇄물을 조정할 수 있으며, 인쇄 준비가 되면 베드가 가열 될 " -"때까지 기다릴 필요가 없습니다." +msgid "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print." +msgstr "인쇄하기 전에 베드를 미리 가열하십시오. 가열되는 동안 계속해서 인쇄물을 조정할 수 있으며, 인쇄 준비가 되면 베드가 가열 될 때까지 기다릴 필요가 없습니다." -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "인쇄 활성" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "작업 이름" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "인쇄 시간" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "예상 남은 시간" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "Fu & ll 화면 토글" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "풀어 놓다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "다시하다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "그만두다" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura 구성 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "프린터 추가 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "프린터 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "자료 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "현재 설정 / 재정의로 프로필 업데이트" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "현재 변경 사항 무시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "현재 설정 / 재정의 프로필 작성" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "프로필 관리 ..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "온라인 및 문서 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "버그보고" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "대략..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "선택한 모델 삭제 및 선택" msgstr[1] "선택한 모델들 삭제 및 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "선택한 모델 중심" msgstr[1] "선택한 모델들 중심" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "선택한 모델 곱하기" msgstr[1] "선택한 모델ㄷ 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "모델 삭제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "플랫폼에 대한 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "그룹 모델" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "모델 그룹 해제" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "모델 합치기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "모델 곱하기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "모든 모델 선택" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "빌드 플레이트 지우기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "모든 모델 새로고치" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "모든 모델 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "선택 정렬" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "모든 모델 위치 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "모든 모델 및 변환 재설정" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "새 프로젝트..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "엔진 및 로그 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "구성 폴더 표시" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "설정 표시 설정 ..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "플러그인 찾아보기 ..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "설치된 플러그인 ..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "3D 모델을 로드하십시오" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "슬라이스 준비 완료" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "슬라이싱 ..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "준비 완료" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "슬라이스 할 수 없음" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "슬라이스 사용 불가" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "준비하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "취소하다" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "활성 출력 장치 선택" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "열린 파일" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 msgctxt "@text:window" -msgid "" -"We have found one or more project file(s) within the files you have selected. You can open only one project file at a " -"time. We suggest to only import models from those files. Would you like to proceed?" -msgstr "" -"선택한 파일 내에 하나 이상의 프로젝트 파일이 있습니다. 한 번에 하나의 프로젝트 파일 만 열 수 있습니다. 해당 파일에서 모델 " -"만 가져 오기를 권장합니다. 계속 하시겠습니까?" +msgid "We have found one or more project file(s) within the files you have selected. You can open only one project file at a time. We suggest to only import models from those files. Would you like to proceed?" +msgstr "선택한 파일 내에 하나 이상의 프로젝트 파일이 있습니다. 한 번에 하나의 프로젝트 파일 만 열 수 있습니다. 해당 파일에서 모델 만 가져 오기를 권장합니다. 계속 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 msgctxt "@action:button" @@ -3740,227 +3773,232 @@ msgstr "모델로 모두 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" -msgid "Cura" -msgstr "큐라" +msgid "Ultimaker Cura" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "파일" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "선택 사항을 파일에 저장" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "다른 이름으로 저장..." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "프로젝트 저장" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "편집하다" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "조망" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "프린터" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "윤곽" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "활성 압출기로 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "확장 프로그램" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "플러그인" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "환경 설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "도움" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "설정" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "새 프로젝트" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings." msgstr "새 프로젝트를 시작 하시겠습니까? 빌드 플레이트 및 저장하지 않은 설정이 지워집니다." -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "플러그인 설치" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" -msgid "" -"We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. " -"If you want to open a G-Code file, please just select only one." -msgstr "" -"선택한 파일 내에 하나 이상의 G 코드 파일이 있습니다. 한 번에 하나의 G 코드 파일 만 열 수 있습니다. G 코드 파일을 열려면 하" -"나만 선택하십시오." +msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one." +msgstr "선택한 파일 내에 하나 이상의 G 코드 파일이 있습니다. 한 번에 하나의 G 코드 파일 만 열 수 있습니다. G 코드 파일을 열려면 하나만 선택하십시오." #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 msgctxt "@title:window" msgid "Save Project" msgstr "프로젝트 저장" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "압출기" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "프로젝트 요약을 다시 저장하지 마십시오" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "저장하다" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "준비하다" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "감시 장치" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "층 높이" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "인쇄 속도" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "천천히" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "빨리" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "You have modified some profile settings. If you want to change these go to custom mode." +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "빈 공간 채우기" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "Gradual infill will gradually increase the amount of infill towards the top." msgstr "점차적인 빈 공간 채우기는 점차적으로 빈 공간 채우기의 양을 증가시킵니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "점진적으로 사용" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "지지물 생성" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" -msgid "" -"Generate structures to support parts of the model which have overhangs. Without these structures, such parts would " -"collapse during printing." +msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing." msgstr "돌출부가있는 모델의 부분을 지원하는 구조를 생성합니다. 이러한 구조가 없으면 이러한 부분이 인쇄 중에 붕괴됩니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "압출기 지지물" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" -msgid "" -"Select which extruder to use for support. This will build up supporting structures below the model to prevent the model " -"from sagging or printing in mid air." -msgstr "" -"지원할 압출기를 선택하십시오. 이렇게하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 인쇄되는 것을 방지" -"합니다." +msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air." +msgstr "지원할 압출기를 선택하십시오. 이렇게하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 인쇄되는 것을 방지합니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "플레이트 접착력 강화" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" -msgid "" -"Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." -msgstr "" -"테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 주변이나 아래에 평평한 영역이 추가되어 나중에 쉽게자를 수 있습니다." +msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards." +msgstr "테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 주변이나 아래에 평평한 영역이 추가되어 나중에 쉽게자를 수 있습니다." -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" msgstr "" @@ -3979,17 +4017,17 @@ msgctxt "@title:window" msgid "Open project file" msgstr "프로젝트 파일 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "This is a Cura project file. Would you like to open it as a project or import the models from it?" msgstr "이 파일은 Cura 프로젝트 파일입니다. 프로젝트로 열거나 모델을 가져 오시겠습니까?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "프로젝트로 열기" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "모델 가져 오기" @@ -3999,17 +4037,17 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "엔진 로그" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "자재" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" -msgid "Check material compatibility" -msgstr "재질 호환성 확인" +msgid "Check compatibility" +msgstr "" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "Ultimaker.com의 재질 호환성을 확인하려면 클릭하십시오." @@ -4124,11 +4162,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 네트워크 연결" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 네트워크 연결 (클러스터)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4149,6 +4182,16 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks 통합" +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "" + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4209,16 +4252,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "GCode 프로필 리더" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "레이어 보기를 제공합니다." - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "레이어보기" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4239,6 +4272,16 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "버전 업그레이드 2.7에서 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4299,6 +4342,16 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "모델 별 설정 도구" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4359,6 +4412,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF 기록기" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc)" @@ -4378,3 +4441,126 @@ msgstr "Cura 프로파일 가져 오기 지원을 제공합니다." msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 프로필 판독기" + +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "막힘" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "인쇄를 시작할 수 없습니다" + +#~ msgctxt "@action:button" +#~ msgid "Open Connect.." +#~ msgstr "열기 연결 .." + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "인쇄 세부 정보" + +#~ msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" +#~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." +#~ msgstr "{machine_name}에 최신 기능이 탑재되어 있는지 확인하려면 정기적으로 펌웨어를 업데이트하는 것이 좋습니다. 이 작업은 {machine_name} (네트워크에 연결된 경우) 또는 USB를 통해 수행 할 수 있습니다." + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "레이어 보기" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "레이어 보기" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "플러그인 찾아보기" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "세부 정보 내보내기" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "복구 할 수없는 치명적인 예외가 발생했습니다!\n" +#~ "http://github.com/Ultimaker/Cura/issues에 버그 보고서를 게시하십시오. " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "웹 페이지 열기" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "승인" + +#~ msgctxt "@label" +#~ msgid "This printer is not set up to host a group of connected Ultimaker 3 printers" +#~ msgstr "이 프린터는 Ultimaker 3 프린터에 연결된 그룹을 호스트하도록 설정되지 않았습니다" + +#~ msgctxt "@label" +#~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "이 프린터는 Ultimaker 3에 연결된 프린터 그룹의 호스트입니다" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "준비중인" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "완료일 " + +#~ msgctxt "@info:tooltip" +#~ msgid "Opens the print jobs page with your default web browser." +#~ msgstr "기본 웹 브라우저로 인쇄 작업 페이지를 엽니다." + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "프린터 그룹" + +#~ msgctxt "@action:warning" +#~ msgid "Loading a project will clear all models on the buildplate" +#~ msgstr "프로젝트를 로드하면 빌드 플레이트의 모든 모델이 지워집니다" + +#~ msgctxt "@label" +#~ msgid "" +#~ " plugin contains a license.\n" +#~ "You need to accept this license to install this plugin.\n" +#~ "Do you agree with the terms below?" +#~ msgstr "" +#~ "플러그인에는 라이센스가 포함되어 있습니다.\n" +#~ "이 플러그인을 설치하려면이 라이센스를 수락해야합니다.\n" +#~ "아래 약관에 동의하십니까?" + +#~ msgctxt "@label" +#~ msgid "00h 00min" +#~ msgstr "00시간 00 분" + +#~ msgctxt "@tooltip" +#~ msgid "Time information" +#~ msgstr "시간 정보" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "인쇄 시간" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "큐라" + +#~ msgctxt "@label" +#~ msgid "Check material compatibility" +#~ msgstr "재질 호환성 확인" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 네트워크 연결 (클러스터)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "레이어 보기를 제공합니다." + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "레이어보기" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index fa9570f57f..949b0fee5c 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -607,6 +607,31 @@ msgctxt "layer_height_0 description" msgid "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier." msgstr "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 빌드 플레이트에 쉽게 접착합니다. " +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -757,6 +782,16 @@ msgctxt "shell description" msgid "Shell" msgstr "내관" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "The extruder train used for printing the walls. This is used in multi-extrusion." +msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -769,8 +804,8 @@ msgstr "외벽 인쇄에 사용되는 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" -msgstr "내벽 압출기" +msgid "Inner Wall Extruder" +msgstr "" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1202,6 +1237,106 @@ msgctxt "skin_outline_count description" msgid "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material." msgstr "위쪽 / 아래쪽 패턴의 가장 바깥 쪽 부분을 여러 동심 선으로 바꿉니다. 하나 또는 두 개의 선을 사용하면 충진재로 시작하는 지붕이 향상됩니다. " +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "다림질 사용" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." +msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "아이언 전용 최상위 레이어" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." +msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "다림질 패턴" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "윗면을 다림질 할 때 사용하는 패턴. " + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "동심원의" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "지그재그" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "다림질 라인 간격" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "다림질 라인 사이의 거리. " + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "다림질 과정" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." +msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "다림질 삽입" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." +msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "다림질 속도" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "상단 표면을 통과하는 속도. " + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "다림질 가속" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "다림질이 수행되는 가속도. " + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "다림질 Jerk" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "다림질을하는 동안 최대 순간 속도 변화. " + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1249,8 +1384,8 @@ msgstr "충진 패턴" #: fdmprinter.def.json msgctxt "infill_pattern description" -msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " +msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +msgstr "" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1267,6 +1402,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "삼각형" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1319,8 +1459,8 @@ msgstr "충진 선 연결" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" -msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " +msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +msgstr "" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1332,6 +1472,26 @@ msgctxt "infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the traditional default angles (45 and 135 degrees for the lines and zig zag patterns and 45 degrees for all other patterns)." msgstr "사용할 정수선 방향 목록. 목록의 요소는 레이어가 진행됨에 따라 순차적으로 사용되며 목록의 끝에 도달하면 처음부터 다시 시작됩니다. 목록 항목은 쉼표로 구분되며 전체 목록은 대괄호 안에 들어 있습니다. 기본값은 전통적인 기본 각도 (선 및 지그재그 패턴의 경우 45 및 135도, 다른 모든 패턴의 경우 45도)를 사용한다는 의미의 빈 목록입니다. " +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1642,6 +1802,26 @@ msgctxt "material_diameter description" msgid "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament." msgstr "사용 된 필라멘트의 직경을 조정합니다. 이 값을 사용 필라멘트의 직경과 일치시킵니다. " +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -2832,36 +3012,6 @@ msgctxt "support_connect_zigzags description" msgid "Connect the ZigZags. This will increase the strength of the zig zag support structure." msgstr "지그재그를 연결하십시오. 이것은 지그재그지지 구조의 강도를 증가시킵니다. " -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "Chunk에서 지지대 중단" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "지원 구조가 쉽게 끊어 지도록 지원 라인 연결을 건너 뛰십시오. 이 설정은 지그재그 지원 충전 패턴에 적용됩니다. " - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "지지대 Chunk 크기" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." -msgstr "지지 구조를 쉽게 분리 할 수 있도록 N 밀리미터마다 지지선 사이를 연결하십시오. " - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "Chunk 라인 카운트 지지대" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "Skip one in every N connection lines to make the support structure easier to break away." -msgstr "지원 구조를 쉽게 깨뜨릴 수 있도록 모든 N 개의 연결 라인을 건너 뜁니다. " - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -3401,8 +3551,8 @@ msgstr "Skirt 거리" msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from this distance." -msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " +"This is the minimum distance. Multiple skirt lines will extend outwards from this distance." +msgstr "" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3444,26 +3594,6 @@ msgctxt "brim_outside_only description" msgid "Only print the brim on the outside of the model. This reduces the amount of brim you need to remove afterwards, while it doesn't reduce the bed adhesion that much." msgstr "모델 바깥 쪽 가장자리에만 인쇄하십시오. 이렇게하면 나중에 제거해야하는 가장자리의 양이 줄어들지 만 침대 접착력은 그렇게 많이 줄어들지 않습니다. " -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "초기 레이어 Z 오프셋" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." -msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z 오프셋 테이퍼 레이어" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." -msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -3481,8 +3611,8 @@ msgstr "Raft 부드럽게하기" #: fdmprinter.def.json msgctxt "raft_smoothing description" -msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " +msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +msgstr "" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -3954,6 +4084,16 @@ msgctxt "meshfix_keep_open_polygons description" msgid "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode." msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이고 큰 구멍이있는 레이어의 부분을 제거하려고합니다. 이 옵션을 활성화하면 스티칭 할 수없는 파트가 유지됩니다. 이 옵션은 다른 모든 것이 올바른 GCode를 생성하지 못할 때 최후의 수단으로 사용해야합니다. " +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -3984,6 +4124,16 @@ msgctxt "alternate_carve_order description" msgid "Switch to which mesh intersecting volumes will belong with every layer, so that the overlapping meshes become interwoven. Turning this setting off will cause one of the meshes to obtain all of the volume in the overlap, while it is removed from the other meshes." msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 메쉬가 서로 얽 히게됩니다. 이 설정을 해제하면 메시 중 하나가 다른 메시에서 제거되는 동안 오버랩의 모든 볼륨을 가져옵니다. " +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -4189,6 +4339,36 @@ msgctxt "optimize_wall_printing_order description" msgid "Optimize the order in which walls are printed so as to reduce the number of retractions and the distance travelled. Most parts will benefit from this being enabled but some may actually take longer so please compare the print time estimates with and without optimization." msgstr "수축 및 이동 거리를 줄이도록 벽이 인쇄되는 순서를 최적화하십시오. 대부분의 부품은이 기능을 사용하면 도움이되지만, 실제로는 시간이 오래 걸릴 수 있으므로, 최적화 여부에 관계없이 인쇄 시간을 비교하십시오. " +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Chunk에서 지지대 중단" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "지원 구조가 쉽게 끊어 지도록 지원 라인 연결을 건너 뛰십시오. 이 설정은 지그재그 지원 충전 패턴에 적용됩니다. " + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "지지대 Chunk 크기" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "Leave out a connection between support lines once every N millimeter to make the support structure easier to break away." +msgstr "지지 구조를 쉽게 분리 할 수 있도록 N 밀리미터마다 지지선 사이를 연결하십시오. " + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Chunk 라인 카운트 지지대" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "Skip one in every N connection lines to make the support structure easier to break away." +msgstr "지원 구조를 쉽게 깨뜨릴 수 있도록 모든 N 개의 연결 라인을 건너 뜁니다. " + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -4479,6 +4659,26 @@ msgctxt "magic_fuzzy_skin_point_dist description" msgid "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness." msgstr "각 선분에 도입 된 임의의 점 사이의 평균 거리입니다. 다각형의 원래 점은 버려 지므로 높은 부드러움으로 인해 해상도가 감소합니다. 이 값은 퍼지 스킨 두께의 절반보다 커야합니다. " +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -4736,106 +4936,6 @@ msgctxt "wireframe_nozzle_clearance description" msgid "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing." msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 클리어런스가 클수록 비스듬한 각도에서 비스듬히 아래쪽으로 선이 그어져 다음 층과의 연결이보다 적어집니다. 와이어 인쇄에만 적용됩니다. " -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "다림질 사용" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface." -msgstr "상단 표면을 한 번 더 이동 시키되 재료를 돌출시키지 마십시오. 이것은 플라스틱을 맨 위에 더 녹여 부드러운 표면을 만듭니다. " - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "아이언 전용 최상위 레이어" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "Only perform ironing on the very last layer of the mesh. This saves time if the lower layers don't need a smooth surface finish." -msgstr "메쉬의 마지막 레이어에서만 다림질을 수행하십시오. 낮은 레이어에서 매끄러운 표면 처리가 필요하지 않은 경우 시간을 절약 할 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "다림질 패턴" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "윗면을 다림질 할 때 사용하는 패턴. " - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "동심원의" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "지그재그" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "다림질 라인 간격" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "다림질 라인 사이의 거리. " - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "다림질 과정" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 보통의 피부 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워지지만 표면의 과도한 돌출과 틈이 너무 많이 생깁니다. " - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "다림질 삽입" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "A distance to keep from the edges of the model. Ironing all the way to the edge of the mesh may result in a jagged edge on your print." -msgstr "모델 가장자리에서 떨어지지 않는 거리. 메쉬 가장자리까지 다림질하면 인쇄물의 가장자리가 고르지 않을 수 있습니다. " - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "다림질 속도" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "상단 표면을 통과하는 속도. " - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "다림질 가속" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "다림질이 수행되는 가속도. " - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "다림질 Jerk" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "다림질을하는 동안 최대 순간 속도 변화. " - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -4896,9 +4996,43 @@ msgctxt "mesh_rotation_matrix description" msgid "Transformation matrix to be applied to the model when loading it from file." msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다. " -#~ msgctxt "wall_extruder_nr description" -#~ msgid "The extruder train used for printing the walls. This is used in multi-extrusion." -#~ msgstr "벽을 인쇄하는 데 사용되는 압출기 트레인. 이것은 다중 압출에 사용됩니다. " +#~ msgctxt "wall_x_extruder_nr label" +#~ msgid "Inner Walls Extruder" +#~ msgstr "내벽 압출기" + +#~ msgctxt "infill_pattern description" +#~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, octet, quarter cubic and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." +#~ msgstr "인쇄물의 충진재 패턴. 라인과 지그재그는 대체 층의 스필 방향을 바꾸어 재료비를 줄입니다. 그리드, 삼각형, 큐빅, 옥텟, 쿼터 큐빅 및 동심원 패턴이 모든 레이어에 완전히 인쇄됩니다. 큐빅, 쿼터 큐빅 및 옥 테트 필은 각 레이어에 따라 변경되어 각 방향에 대해보다 균등 한 강도 분포를 제공합니다. " + +#~ msgctxt "zig_zaggify_infill description" +#~ msgid "Connect the ends where the infill pattern meets the inner wall using a lines which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduces the effects on infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." +#~ msgstr "내부 벽의 모양을 따르는 선을 사용하여 충전 패턴이 내부 벽과 만나는 끝을 연결하십시오. 이 설정을 사용하면 벽에 충전재가 잘 밀착되고 수직 표면의 품질에 영향을 줄 수 있습니다. 이 설정을 사용하지 않으면 사용되는 재료의 양이 줄어 듭니다. " + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards from this distance." +#~ msgstr "스커트와 인쇄물의 첫 번째 레이어 사이의 수평 거리입니다. 이것은 최소 거리이며, 여러 스커트 라인이이 거리에서 바깥쪽으로 확장됩니다. " + +#~ msgctxt "z_offset_layer_0 label" +#~ msgid "Initial Layer Z Offset" +#~ msgstr "초기 레이어 Z 오프셋" + +#~ msgctxt "z_offset_layer_0 description" +#~ msgid "The extruder is offset from the normal height of the first layer by this amount. It can be positive (raised) or negative (lowered). Some filament types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "압출기는이 양만큼 제 1 층의 정상 높이로부터 오프셋된다. 양수 (양수) 또는 음수 (양수) 일 수 있습니다. 압출기를 약간 올리면 일부 필라멘트 유형이 빌드 플레이트에 잘 밀착됩니다. " + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z 오프셋 테이퍼 레이어" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "When non-zero, the Z offset is reduced to 0 over that many layers. A value of 0 means that the Z offset remains constant for all the layers in the print." +#~ msgstr "0이 아니면 Z 오프셋은 많은 레이어에서 0으로 줄어 듭니다. 값 0은 인쇄물의 모든 레이어에 대해 Z 오프셋이 일정하게 유지됨을 의미합니다. " + +#~ msgctxt "raft_smoothing description" +#~ msgid "This setting control how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." +#~ msgstr "이 설정은 뗏목 윤곽의 내부 모서리가 둥근 정도를 제어합니다. 안쪽 모서리는 여기에 주어진 값과 같은 반경을 가진 반원으로 반올림됩니다. 이 설정은 또한 뗏목 외곽선에서 그러한 원보다 작은 구멍을 제거합니다. " #~ msgctxt "infill_pattern description" #~ msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, cubic, tetrahedral and concentric patterns are fully printed every layer. Cubic and tetrahedral infill change with every layer to provide a more equal distribution of strength over each direction." From 3823cca93679d6c3e26d4b28ca4f20863c832ed2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 22 Nov 2017 12:45:21 +0100 Subject: [PATCH 306/764] Disable Russian translation since it's incomplete The maintainer of this translation didn't want to continue spending time to keep his translation up-to-date. Contributes to issue CURA-4601. --- resources/qml/Preferences/GeneralPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index ad6c2ce050..dc5853ebb2 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -159,7 +159,7 @@ UM.PreferencesPage append({ text: "Nederlands", code: "nl_NL" }) append({ text: "Polski", code: "pl_PL" }) append({ text: "Português do Brasil", code: "pt_BR" }) - append({ text: "Русский", code: "ru_RU" }) + //Russian is disabled for being incomplete: append({ text: "Русский", code: "ru_RU" }) append({ text: "Türkçe", code: "tr_TR" }) append({ text: "简体中文", code: "zh_CN" }) From a7a3ba950075cf1d8d4977aa1ea5a649a10045ba Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 22 Nov 2017 13:09:24 +0100 Subject: [PATCH 307/764] Always update the job name when a project file is loaded CURA-4553 --- cura/PrintInformation.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 3cced2f85c..f0c29f5b81 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -70,6 +70,7 @@ class PrintInformation(QObject): Application.getInstance().globalContainerStackChanged.connect(self._updateJobName) Application.getInstance().fileLoaded.connect(self.setBaseName) + Application.getInstance().workspaceLoaded.connect(self.setProjectName) Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) self._active_material_container = None @@ -283,7 +284,11 @@ class PrintInformation(QObject): return self._base_name @pyqtSlot(str) - def setBaseName(self, base_name): + def setProjectName(self, name): + self.setBaseName(name, is_project_file = True) + + @pyqtSlot(str) + def setBaseName(self, base_name, is_project_file = False): # Ensure that we don't use entire path but only filename name = os.path.basename(base_name) @@ -291,15 +296,17 @@ class PrintInformation(QObject): # extension. This cuts the extension off if necessary. name = os.path.splitext(name)[0] + # if this is a profile file, always update the job name # name is "" when I first had some meshes and afterwards I deleted them so the naming should start again is_empty = name == "" - if is_empty or (self._base_name == "" and self._base_name != name): + if is_project_file or (is_empty or (self._base_name == "" and self._base_name != name)): # remove ".curaproject" suffix from (imported) the file name if name.endswith(".curaproject"): name = name[:name.rfind(".curaproject")] self._base_name = name self._updateJobName() + ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched def _setAbbreviatedMachineName(self): From 3b5ed701139b96e37afbe2068eaf543804d0e855 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 22 Nov 2017 16:15:06 +0100 Subject: [PATCH 308/764] CURA-4602 Fixed active custom profile selected check --- cura/Settings/MachineManager.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 002c84fb67..ca929b46fc 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -621,9 +621,16 @@ class MachineManager(QObject): def activeQualityId(self) -> str: if self._active_container_stack: quality = self._active_container_stack.quality + if isinstance(quality, type(self._empty_quality_container)): + return "" quality_changes = self._active_container_stack.qualityChanges - if quality and quality_changes and isinstance(quality_changes, type(self._empty_quality_changes_container)) and not isinstance(quality, type(self._empty_quality_container)): - return quality.getId() + if quality and quality_changes: + if isinstance(quality_changes, type(self._empty_quality_changes_container)): + # It's a built-in profile + return quality.getId() + else: + # Custom profile + return quality_changes.getId() return "" @pyqtProperty(str, notify=activeQualityChanged) From dc105c86a000692f8c88d7c049791d018b210b94 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 22 Nov 2017 16:16:35 +0100 Subject: [PATCH 309/764] Ignore live scripting plug-ins --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ac1e8eba92..f67add62cf 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,7 @@ plugins/cura-god-mode-plugin plugins/cura-big-flame-graph plugins/cura-siemensnx-plugin plugins/CuraVariSlicePlugin +plugins/CuraLiveScriptingPlugin #Build stuff CMakeCache.txt From 6c3eaca0fd1a545bc7dc59ffc18b32550b99dc07 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 22 Nov 2017 16:22:23 +0100 Subject: [PATCH 310/764] fix loading user changes container for single extruder machine --- cura/Settings/CuraContainerRegistry.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7abe5b35f5..2c9e15b8c9 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -449,12 +449,11 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setVariantById(variant_id) extruder_stack.setMaterialById("default") extruder_stack.setQualityById("default") - quality_changes_id = "default" if machine.qualityChanges.getId() != "empty_quality_changes": extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) if extruder_quality_changes_container: quality_changes_id = extruder_quality_changes_container[0].getId() - extruder_stack.setQualityChangesById(quality_changes_id) + extruder_stack.setQualityChangesById(quality_changes_id) self.addContainer(extruder_stack) From 187e4babdcf13d057a84171add56fadb1ccb1550 Mon Sep 17 00:00:00 2001 From: Dinow Date: Wed, 22 Nov 2017 23:34:46 +0800 Subject: [PATCH 311/764] import from 3.0 --- resources/i18n/zh_TW/cura.po | 4624 +++++++++++++ resources/i18n/zh_TW/fdmextruder.def.json.po | 210 + resources/i18n/zh_TW/fdmprinter.def.json.po | 6094 ++++++++++++++++++ 3 files changed, 10928 insertions(+) create mode 100644 resources/i18n/zh_TW/cura.po create mode 100644 resources/i18n/zh_TW/fdmextruder.def.json.po create mode 100644 resources/i18n/zh_TW/fdmprinter.def.json.po diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po new file mode 100644 index 0000000000..5cf77c1bbe --- /dev/null +++ b/resources/i18n/zh_TW/cura.po @@ -0,0 +1,4624 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-25 08:53+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.0.4\n" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Print aborted" +msgstr "列印已取消" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Blocked" +msgstr "暫停" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Action required" +msgstr "需要採取的動作" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Can't start print" +msgstr "無法開始列印" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label" +msgid "Finishes at: " +msgstr "完成時間:" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" + +#: Manually added for +#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" + +#: Manually added for +#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Print finished" +msgstr "列印已完成" + +#: Manually added for resources/Cura/Cura.qml +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "外掛(&l)" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "瀏覽外掛..." + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "安裝外掛..." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "透視檢視" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "X3D 檔案" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "GCode 檔案" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "使用 Doodle3D 無線網路盒列印" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "使用 Doodle3D 無線網路盒列印" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "正在連接 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +msgctxt "@action:button" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "正在向 Doodle3D Connect 發送資料" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "無法向 Doodle3D Connect 發送資料。請確認是否有另一項列印作業正在進行?" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "正在儲存資料到 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "檔案已被傳送到 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect.." +msgstr "開啟連線..." + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "開啟 Doodle3D Connect 的網路介面" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "顯示更新日誌" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "合併有效設定" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "列印參數已被合併並啟用。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "透過 USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "透過 USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "透過 USB 連接" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:title" +msgid "Print Details" +msgstr "列印細項設定" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "" +"This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "" +"此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +msgctxt "@info:status" +msgid "" +"Unable to start a new job because the printer does not support usb printing." +msgstr "無法啟動新作業,因為該印表機不支援 USB 連線列印。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +msgctxt "@info:title" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "無法更新韌體,因為沒有連接印表機。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "在 %s 無法找到印表機所需的韌體。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "印表機韌體" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "儲存至行動裝置" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "儲存到行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "正在儲存到行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "儲存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "無法儲存到 {0}{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "嘗試寫入到 {device} 時無法找到檔名。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "無法儲存到行動裝置 {0}:{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +msgctxt "@info:title" +msgid "Error" +msgstr "錯誤" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "儲存到行動裝置 {0}:{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "檔案已儲存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "卸載" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "卸載行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "已卸載 {0}。現在你可以安全地移除行動裝置。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "安全移除硬體" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "無法卸載 {0},可能有其它程式正在使用行動裝置。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "行動裝置" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "" +"Access to the printer requested. Please approve the request on the printer" +msgstr "已發送印表機存取請求,請在印表機上批准該請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:title" +msgid "Connection status" +msgstr "連線狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "連線狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@action:button" +msgid "Retry" +msgstr "重試" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "重新發送存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "印表機接受了存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "無法使用本印表機進行列印,無法發送列印作業。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "請求存取" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "向印表機發送存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +msgctxt "@info:status" +msgid "" +"Connected over the network. Please approve the access request on the printer." +msgstr "已透過網路連接。請在印表機上接受存取請求。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "已透過網路連接。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "已透過網路連接,但沒有印表機的控制權限。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "存取請求被印表機上拒絕。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "存取請求超時失敗。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "網路連接中斷。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +msgctxt "@info:status" +msgid "" +"The connection with the printer was lost. Check your printer to see if it is " +"connected." +msgstr "與印表機的連接中斷,請檢查印表機是否已連接。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#, python-format +msgctxt "@info:status" +msgid "" +"Unable to start a new print job, printer is busy. Current printer status is " +"%s." +msgstr "印表機無法啟動新的列印作業,目前的印表機狀態為 %s。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "印表機狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "無法啟動新的列印作業。插槽 {0} 中未載入列印頭。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "無法啟動新的列印作業。插槽 {0} 中未載入耗材。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "線軸 {0} 上沒有足夠的耗材。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "不同的列印頭(Cura:{0},印表機: 為擠出機 {2} 選擇了 {1})" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "你為擠出機 {2} 選擇了不同的耗材(Cura:{0},印表機:{1})" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#, python-brace-format +msgctxt "@label" +msgid "" +"PrintCore {0} is not properly calibrated. XY calibration needs to be " +"performed on the printer." +msgstr "列印頭 {0} 未正確校準。需要在印表機上執行 XY 校正。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "你確定要使用所選設定進行列印嗎?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer " +"and Cura. For the best result, always slice for the PrintCores and materials " +"that are inserted in your printer." +msgstr "" +"印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列" +"印頭和耗材設定進行切片。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "設定不匹配" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "正在向印表機發送資料" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "發送資料中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "無法向印表機發送資料。請確認是否有另一項列印作業正在進行?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "中斷列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "列印已中斷。請檢查印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "暫停列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "繼續列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "與你的印表機同步" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "你想在 Cura 中使用目前的印表機設定嗎?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +msgctxt "@label" +msgid "" +"The PrintCores and/or materials on your printer differ from those within " +"your current project. For the best result, always slice for the PrintCores " +"and materials that are inserted in your printer." +msgstr "" +"印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印" +"表機的列印頭和耗材設定進行切片。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "透過網路連接" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +msgid "" +"This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "" +"This printer is the host for a group of {count} connected Ultimaker 3 " +"printers." +msgstr "這台印表機是 {count} 台連線的 Ultimaker 3 印表機群組的主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#, python-brace-format +msgid "" +"{printer_name} has finished printing '{job_name}'. Please collect the print " +"and confirm clearing the build plate." +msgstr "" +"{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#, python-brace-format +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the " +"printer's configuration to match the job, for it to start printing." +msgstr "" +"{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業," +"以便開始列印。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "前一列印作業傳送中,暫停傳送新列印作業。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +msgctxt "@info:status" +msgid "" +"Unable to send new print job: this 3D printer is not (yet) set up to host a " +"group of connected Ultimaker 3 printers." +msgstr "" +"無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的" +"主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "傳送 {file_name} 到群組 {cluster_name} 中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} 已傳送到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "顯示列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "使用瀏覽器開啟列印作業介面。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "無法傳送列印作業到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#, python-brace-format +msgctxt "" +"@info Don't translate {machine_name}, since it gets replaced by a printer " +"name!" +msgid "" +"To ensure that your {machine_name} is equipped with the latest features it " +"is recommended to update the firmware regularly. This can be done on the " +"{machine_name} (when connected to the network) or via USB." +msgstr "" +"為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " +"{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "有新 %s 韌體可用" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "下載" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +msgctxt "@info" +msgid "Could not access update information." +msgstr "無法存取升級資訊。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "" +"Errors appeared while opening your SolidWorks file! Please " +"check, whether it is possible to open your file in SolidWorks itself without " +"any problems as well!" +msgstr "" +"開啟 SolidWorks 檔案時發生錯誤! 請檢查能否在 SolidWorks 中正常開" +"啟檔案而不出現任何問題!" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "SolidWorks 零件檔案" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "SolidWorks 組件檔案" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr "啟動 %s 時發生錯誤!" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "修改 G-Code 檔案" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "" +"Cura collects anonymised slicing statistics. You can disable this in the " +"preferences." +msgstr "Cura 收集匿名切片統計資料。你可以在偏好設定中關閉此選項。" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "收集資料中" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "關閉此通知" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Cura 15.04 列印參數" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "G-code 檔案" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" +"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" +"(Layers)" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 +msgctxt "@info:title" +msgid "Layer View" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "JPG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "JPEG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "PNG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "BMP 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "GIF 圖片" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "" +"Unable to slice with the current material as it is incompatible with the " +"selected machine or configuration." +msgstr "無法使用目前耗材切片,因為它與所選機器或設定不相容。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "無法切片" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice with the current settings. The following settings have " +"errors: {0}" +msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +msgctxt "@info:status" +msgid "" +"Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "無法切片(原因:換料塔或主位置無效)。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +msgctxt "@info:status" +msgid "" +"Nothing to slice because none of the models fit the build volume. Please " +"scale or rotate models to fit." +msgstr "" +"沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列" +"印範圍。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "正在處理層" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:title" +msgid "Information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "單一模型設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "設定對每個模型的單獨設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "推薦" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +msgctxt "@title:tab" +msgid "Custom" +msgstr "自訂選項" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +msgctxt "@label" +msgid "Nozzle" +msgstr "噴頭" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 +msgctxt "@menuitem" +msgid "Browse plugins" +msgstr "瀏覽外掛" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "無法從 {0} 取得外掛 ID" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +msgctxt "@info:tile" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "外掛瀏覽器" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "G 檔案" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "正在解析 G-code" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "G-code 細項設定" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +msgctxt "@info:generic" +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration " +"before sending the file to it. The g-code representation may not be accurate." +msgstr "" +"發送檔案之前,請確保 G-code 適用於目前印表機和印表機設定。目前 G-code 檔案可" +"能不準確。" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Cura 列印參數" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Cura 專案 3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "選擇升級" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "調平列印平台" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "外壁" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Skin" +msgstr "表層" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Infill" +msgstr "填充" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "支撐填充" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "支撐介面" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support" +msgstr "支撐" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "外圍" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Travel" +msgstr "移動" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "回抽" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Other" +msgstr "其它" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "預切片檔案 {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "未載入耗材" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "未知耗材" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "正在為物件尋找新位置" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "尋找位置中" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "無法在列印範圍內放下全部物件" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "無法找到位置" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "檔案已經存在" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "" +"The file {0} already exists. Are you sure you want to " +"overwrite it?" +msgstr "檔案 {0} 已存在。你確定要覆蓋掉它嗎?" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "自訂" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "自訂耗材" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +msgctxt "@info:status" +msgid "" +"The selected material is incompatible with the selected machine or " +"configuration." +msgstr "所選耗材與所選機器或設定不相容。" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "不相容的耗材" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "" +"The selected material diameter causes the material to become incompatible " +"with the current printer." +msgstr "所選耗材直徑導致耗材與目前印表機不相容。" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "復原" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "復原更改耗材直徑。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to export profile to {0}: {1}" +msgstr "無法將列印參數匯出至 {0}{1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "" +"Failed to export profile to {0}: Writer plugin reported " +"failure." +msgstr "無法將列印參數匯出至 {0}:寫入器外掛報告故障。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "列印參數已匯出至:{0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +msgctxt "@info:title" +msgid "Export Details" +msgstr "匯出細項設定" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to import profile from {0}: {1}" +msgstr "無法從 {0} 匯入列印參數:{1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "已成功匯入列印參數 {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "列印參數 {0} 檔案類型未知或已損壞。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +msgctxt "@label" +msgid "Custom profile" +msgstr "自訂列印參數" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "列印參數缺少列印品質類型定義。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "無法為目前設定找到品質類型 {0}。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print " +"Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "" +"由於「列印序列」設定的值,成形列印範圍高度已被減少,以防止龍門與列印模型相衝" +"突。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "列印範圍" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "正在複製並放置模型" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "擺放物件中" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "錯誤報告" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" +msgid "" +"

    A fatal exception has occurred that we could not recover from!

    \n" +"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" +"issues

    \n" +" " +msgstr "" +"

    發生了致命錯誤,我們無法繼續!

    \n" +"

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "開啟網頁" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "正在載入印表機..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "正在設定場景..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "正在載入介面…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#, python-format +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be " +"translated; just translate the format of ##x##x## mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +msgctxt "@title:tab" +msgid "Printer" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +msgctxt "@label" +msgid "Printer Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +msgctxt "@label" +msgid "X (Width)" +msgstr "X (寬度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (深度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (高度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +msgctxt "@label" +msgid "Build plate shape" +msgstr "列印平台形狀" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "原點位於中心" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "熱床" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "GCode 類型" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "列印頭設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +msgctxt "@label" +msgid "X min" +msgstr "X 最小值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "" +"列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +msgctxt "@label" +msgid "Y min" +msgstr "Y 最小值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "" +"列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +msgctxt "@label" +msgid "X max" +msgstr "X 最大值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "" +"列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +msgctxt "@label" +msgid "Y max" +msgstr "Y 最大值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "" +"列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +msgctxt "@label" +msgid "Gantry height" +msgstr "龍門高度" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes). Used to prevent collisions between previous prints and the " +"gantry when printing \"One at a Time\"." +msgstr "" +"噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列" +"印品與龍門發生碰撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "擠出機數目" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact " +"diameter will be overridden by the material and/or the profile." +msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +msgctxt "@label" +msgid "Material diameter" +msgstr "耗材直徑" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +msgctxt "@label" +msgid "Nozzle size" +msgstr "噴頭孔徑" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +msgctxt "@label" +msgid "Start Gcode" +msgstr "起始 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "將在開始時執行的 Gcode 命令。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +msgctxt "@label" +msgid "End Gcode" +msgstr "結束 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "將在結束時執行的 Gcode 命令。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "噴頭設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "噴頭偏移 X" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "噴頭偏移 Y" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "擠出機起始 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "擠出機結束 Gcode" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "更新日誌" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "關閉" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "韌體更新" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "韌體更新已完成。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "正在開始韌體更新。可能需要花費一些時間,請耐心等待。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "更新韌體中..." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "由於未知錯誤,韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "由於通訊錯誤,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "由於輸入/輸出錯誤,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "由於韌體遺失,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "未知錯誤代碼: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "連接到網路印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your " +"printer is connected to the network using a network cable or by connecting " +"your printer to your WIFI network. If you don't connect Cura with your " +"printer, you can still use a USB drive to transfer g-code files to your " +"printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"要透過網路列印,請確認你的印表機已透過網路線或 WIFI 連接到網路。若你無法讓 " +"Cura 與印表機連線,你仍然可以使用 USB 裝置將 G-code 檔案傳輸到印表機。\n" +"\n" +"從以下列表中選擇你的印表機:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "增加" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "編輯" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "移除" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "刷新" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +msgctxt "@label" +msgid "" +"If your printer is not listed, read the network printing " +"troubleshooting guide" +msgstr "如果你的印表機未被列出,請閱讀網路列印故障排除指南" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +msgctxt "@label" +msgid "Type" +msgstr "類型" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Extended" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +msgctxt "@label" +msgid "Firmware version" +msgstr "韌體版本" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +msgctxt "@label" +msgid "Address" +msgstr "位址" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "該網路位址的印表機尚無回應。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "連接" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "印表機網路位址" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "輸入印表機在網路上的 IP 位址或主機名。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +msgctxt "@action:button" +msgid "Ok" +msgstr "確定" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "連接到印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "將印表機設定載入 Cura" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "啟用設定" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 +msgctxt "@label" +msgid "" +"This printer is not set up to host a group of connected Ultimaker 3 printers" +msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 +msgctxt "@label" +msgid "" +"This printer is the host for a group of %1 connected Ultimaker 3 printers" +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 +msgctxt "@label:status" +msgid "Printing" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 +msgctxt "@label:status" +msgid "Reserved" +msgstr "保留" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 +msgctxt "@label:status" +msgid "Finished" +msgstr "已完成" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 +msgctxt "@label:status" +msgid "Preparing" +msgstr "正在準備" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 +msgctxt "@label:status" +msgid "Available" +msgstr "可用" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 +msgctxt "@label" +msgid "Completed on: " +msgstr "完成時間:" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 +msgctxt "@label" +msgid "Clear build plate" +msgstr "清空列印平台" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 +msgctxt "@label" +msgid "Preparing to print" +msgstr "準備列印中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "不接受列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "使用你的預設瀏覽器開啟列印作業頁面。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "檢視列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 +msgctxt "@label" +msgid "PRINTER GROUP" +msgstr "印表機群組" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 +msgctxt "@title" +msgid "Print jobs" +msgstr "列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 +msgctxt "@label" +msgid "Printing" +msgstr "列印中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 +msgctxt "@label" +msgid "Queued" +msgstr "已排入佇列" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "等待設定更動" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 +msgctxt "@label:title" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 +msgctxt "@action:button" +msgid "View printers" +msgstr "檢視印表機" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Cura SolidWorks 外掛設定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "預設的匯出 STL 品質:" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "總是使用精細品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "總是使用粗糙品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "確定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "匯入 SolidWorks 檔案為 STL..." + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "匯出 STL 的品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "粗糙" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "精細" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "記住我的選擇" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "後處理外掛" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "後處理腳本" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "添加一個腳本" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "更改目前啟用的後處理腳本" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 +msgctxt "@label" +msgid "Color scheme" +msgstr "顏色方案" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "耗材顏色" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "線條類型" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "相容模式" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 +msgctxt "@label" +msgid "Show Travels" +msgstr "顯示移動軌跡" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 +msgctxt "@label" +msgid "Show Helpers" +msgstr "顯示輔助結構" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 +msgctxt "@label" +msgid "Show Shell" +msgstr "顯示外殼" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 +msgctxt "@label" +msgid "Show Infill" +msgstr "顯示填充" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "只顯示頂層" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "顯示頂端 5 層列印細節" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "頂 / 底層" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 +msgctxt "@label" +msgid "Inner Wall" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "轉換圖片..." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "每個像素與底板的最大距離。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "高度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "距離列印平台的底板高度,以毫米為單位。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "底板 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "列印平台寬度,以毫米為單位。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "寬度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "列印平台深度,以毫米為單位" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "深度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels " +"represent low points on the mesh. Change this option to reverse the behavior " +"such that black pixels represent high points on the mesh and white pixels " +"represent low points on the mesh." +msgstr "" +"預設情況下,白色像素表示網格上的高點,黑色像素表示網格上的低點。更改此選項將" +"以相反方式呈現,黑色像素表示網格上的高點,白色像素表示網格上的低點。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "顏色越淺高度越高" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "顏色越深高度越高" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "影像平滑程度。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "平滑" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "選擇設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "選擇對此模型的自訂設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "篩選…" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "顯示全部" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "開啟專案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "更新已有設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "新建" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "摘要 - Cura 專案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "如何解決機器的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +msgctxt "@action:label" +msgid "Type" +msgstr "類型" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +msgctxt "@action:label" +msgid "Name" +msgstr "名稱" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "列印參數設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "如何解决列印參數中的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "不在列印參數中" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "%1 覆寫" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "衍生自" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "%1, %2 覆寫" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +msgctxt "@action:label" +msgid "Material settings" +msgstr "耗材設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "如何解决耗材的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "參數顯示設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +msgctxt "@action:label" +msgid "Mode" +msgstr "模式" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "可見設定:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%1 / %2" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "載入專案時將清除列印平台上的所有模型" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +msgctxt "@action:button" +msgid "Open" +msgstr "開啟" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "查找與更新外掛" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "你可以在這裡找到第三方外掛列表。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "升級" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "已安裝" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "外掛授權協議" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +" plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "" +" 外掛內含一份授權\n" +"你必需同意此份授權協議才能安裝此外掛。\n" +"是否同意下列條款?" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "接受" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "拒絕" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "選擇印表機更新檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "請選擇適用於 Ultimaker 2 的更新檔案。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Olsson Block" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "列印平台調平" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your " +"buildplate. When you click 'Move to Next Position' the nozzle will move to " +"the different positions that can be adjusted." +msgstr "" +"為了確保列印品質出色,你現在可以開始調整你的列印平台。當你點擊「移動到下一個" +"位置」時,噴頭將移動到不同的可調節位置。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the " +"print build plate height. The print build plate height is right when the " +"paper is slightly gripped by the tip of the nozzle." +msgstr "" +"在噴頭停止的每一個位置下方插入一張紙,並調整平台高度。當紙張恰好被噴頭的尖端" +"輕微壓住時,表示列印平台已被校準在正確的高度。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "開始進行列印平台調平" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "移動到下一個位置" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This " +"firmware controls the step motors, regulates the temperature and ultimately " +"makes your printer work." +msgstr "" +"韌體是直接在 3D 印表機上運行的一個軟體。此韌體控制步進馬達,調節溫度讓印表機" +"正常運作。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "" +"The firmware shipping with new printers works, but new versions tend to have " +"more features and improvements." +msgstr "" +"新印表機出廠配備的韌體完全可以正常使用,但新版本往往具有更多的新功能和改進。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "自動升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "上傳自訂韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "選擇自訂韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "請選擇適用於 Ultimaker Original 的更新檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "熱床(官方版本或自製版本)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "檢查印表機" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip " +"this step if you know your machine is functional" +msgstr "" +"對 Ultimaker 進行幾項正確性檢查是很好的做法。如果你知道你的機器功能正常,則可" +"跳過此步驟" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "開始印表機檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "連接:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "已連接" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "未連接" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "X Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "正常" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "未檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "Y Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "Z Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "檢查噴頭溫度:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "停止加熱" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "開始加熱" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "熱床溫度檢查:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "已檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "一切正常!你已經完成檢查。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "未連接至印表機" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "印表機不接受命令" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "維護中。請檢查印表機" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "與印表機的連接中斷" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "列印中..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "已暫停" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "準備中..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "請取出列印件" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "繼續" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "暫停" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "中斷列印" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "中斷列印" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "你確定要中斷列印嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "捨棄或保留更改" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "" +"你已自訂部份列印參數設定。\n" +"你想保留或捨棄這些設定嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "列印參數設定" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "預設" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "自訂" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "捨棄更改,並不再詢問此問題" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "保留更改,並不再詢問此問題" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "捨棄" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "保留" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "創建新的列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "顯示名稱" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "品牌" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "耗材類型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "顏色" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "屬性" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "密度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "直徑" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "耗材成本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "耗材重量" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "耗材長度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "每公尺成本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "此耗材與 %1 相關聯,並共享其部份屬性。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "解除聯結耗材" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "描述" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "附著資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "列印設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "參數顯示設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "全選" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "已計算" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "目前" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "單位" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +msgctxt "@title:tab" +msgid "General" +msgstr "基本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "介面" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "語言:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "貨幣:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "主題:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "" +"You will need to restart the application for these changes to have effect." +msgstr "需重新啟動 Cura,新的設定才能生效。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "當設定變更時自動進行切片。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "自動切片" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "顯示區設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "" +"Highlight unsupported areas of the model in red. Without support these areas " +"will not print properly." +msgstr "以紅色凸顯模型缺少支撐的區域。如果沒有支撐這些區域將無法正常列印。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "顯示懸垂(Overhang)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "" +"Moves the camera so the model is in the center of the view when a model is " +"selected" +msgstr "當模型被選中時,視角將自動調整到最合適的觀察位置(模型處於正中央)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "當專案被選中時,自動置中視角" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "需要讓 Cura 的預設縮放操作反轉嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "反轉視角縮放方向。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "是否跟隨滑鼠方向進行縮放?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "跟隨滑鼠方向縮放" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "" +"Should models on the platform be moved so that they no longer intersect?" +msgstr "需要移動平台上的模型,使它們不再交錯嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "確保每個模型都保持分離" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "要將模型下降到碰觸列印平台嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "自動下降模型到列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "在 G-code 讀取器中顯示警告資訊。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "G-code 讀取器中的警告資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "分層檢視要強制進入相容模式嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "強制分層檢視相容模式(需要重新啟動)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "開啟並儲存檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "當模型的尺寸過大時,是否將模型自動縮小至列印範圍嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "縮小過大模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters " +"rather than millimeters. Should these models be scaled up?" +msgstr "" +"部份模型採用較大的單位(例如:公尺),導致模型變得非常小,要將這些模型放大嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "放大過小模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "" +"Should a prefix based on the printer name be added to the print job name " +"automatically?" +msgstr "是否自動將印表機名稱作為列印作業名稱的前綴?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "將印表機名稱前綴添加到列印作業名稱中" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "儲存專案檔案時是否顯示摘要?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "儲存專案時顯示摘要對話框" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "開啟專案檔案時的預設行為" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "開啟專案檔案時的預設行為:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "總是作為一個專案開啟" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "總是匯入模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "" +"When you have made changes to a profile and switched to a different one, a " +"dialog will be shown asking whether you want to keep your modifications or " +"not, or you can choose a default behaviour and never show that dialog again." +msgstr "" +"當你對列印參數進行更改然後切換到其他列印參數時,將顯示一個對話框詢問你是否要" +"保留修改。你也可以選擇預設不顯示該對話框。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "覆寫列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "隱私權" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "當 Cura 啟動時,是否自動檢查更新?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "啟動時檢查更新" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no " +"models, IP addresses or other personally identifiable information is sent or " +"stored." +msgstr "" +"你願意將關於你的列印資料以匿名形式發送到 Ultimaker 嗎?注意:我們不會記錄或發" +"送任何模型、IP 地址或其他私人資料。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "(匿名)發送列印資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +msgctxt "@title:tab" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "啟用" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "重命名" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +msgctxt "@label" +msgid "Printer type:" +msgstr "印表機類型:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +msgctxt "@label" +msgid "Connection:" +msgstr "連接:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "尚未連接到印表機。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +msgctxt "@label" +msgid "State:" +msgstr "狀態:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "等待清空列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "等待列印作業" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "受保護的列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "自訂列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "創建" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "匯入" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "匯出" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "印表機:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "使用目前設定 / 覆寫值更新列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "捨棄目前更改" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "" +"This profile uses the defaults specified by the printer, so it has no " +"settings/overrides in the list below." +msgstr "此列印參數使用印表機指定的預設值,因此在下面的列表中沒有此設定項。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "你目前的設定與選定的列印參數相匹配。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "全局設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "重命名列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "創建列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "複製列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "匯入列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "匯入列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "匯出列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +msgctxt "@title:tab" +msgid "Materials" +msgstr "耗材" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "" +"@action:label %1 is printer name, %2 is how this printer names variants, %3 " +"is variant name" +msgid "Printer: %1, %2: %3" +msgstr "印表機:%1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "印表機:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "創建" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "匯入耗材設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Could not import material %1: %2" +msgstr "無法匯入耗材 %1%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "成功匯入耗材 %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "匯出耗材設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "" +"Failed to export material to %1: %2" +msgstr "無法匯出耗材至 %1%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "成功匯出耗材至:%1" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "新增印表機" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "印表機名稱:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "新增印表機" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "關於 Cura" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "熔絲 3D 列印技術的的端對端解決方案。" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "" +"Cura 由 Ultimaker B.V. 與社區合作開發。\n" +"Cura 使用以下開源專案:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "圖形用戶介面" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "應用框架" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "GCode 產生器" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "進程間通訊交互使用庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "編程語言" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "GUI 框架" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "GUI 框架綁定" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C / C++ 綁定庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "資料交換格式" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "科學計算函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "高速運算函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "用於處理 STL 檔案的函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "用於處理 3MF 檔案的函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "串口通訊函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "ZeroConf 發現函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "多邊形剪輯函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "字體" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "SVG icons" +msgstr "SVG 圖標" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "列印參數:" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the " +"profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"部份設定/覆寫值與儲存在列印參數中的值不同。\n" +"\n" +"點擊開啟列印參數管理器。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "搜尋..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "將設定值複製到所有擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "隱藏此設定" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "不再顯示此設定" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "保持此設定可見" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "設定設定可見性..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated " +"value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"部份隱藏設定使用的值與一般計算所得的值不同。\n" +"\n" +"點擊以顯這些設定。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "影響" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "影響因素" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "" +"This setting is always shared between all extruders. Changing it here will " +"change the value for all extruders" +msgstr "這個設定由全部的擠出機共享,變更這個設定將改變全部擠出機的設定值" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "這個數值是由每個擠出機的設定值解析出來的" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"此設定的值與列印參數不同。\n" +"\n" +"單擊以復原列印參數的值。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value " +"set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"這個設定通常由計算得出,可是它目前被設定為一個數值。\n" +"\n" +"點擊以恢復計算得出的數值。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "列印設定" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" +"列印設定已禁用\n" +"G-code 檔案無法被修改" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 +msgctxt "@label" +msgid "00h 00min" +msgstr "00 小時 00 分" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +msgctxt "@tooltip" +msgid "Time information" +msgstr "時間資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 +msgctxt "@description" +msgid "Print time" +msgstr "列印時間" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +msgctxt "@label" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "%1m / ~ %2g / ~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 +msgctxt "@label" +msgid "%1m / ~ %2g" +msgstr "%1m / ~ %2g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

    Print with the recommended settings " +"for the selected printer, material and quality." +msgstr "" +"推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行" +"列印。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +msgctxt "@tooltip" +msgid "" +"Custom Print Setup

    Print with finegrained control over every " +"last bit of the slicing process." +msgstr "自訂列印設定
    對切片過程中的每一個細節進行精細控制。" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "自動:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "檢視(&V)" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "自動: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "列印所選模型:" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "複製所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "複製個數" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "最近開啟的檔案(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "沒有連接印表機" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +msgctxt "@label" +msgid "Extruder" +msgstr "擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down " +"towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "" +"加熱端的目標溫度。加熱端將加熱或冷卻至此溫度。若設定為 0,則關閉加熱端的加" +"熱。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "該擠出機的目前溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "該擠出機中耗材的顏色。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "該擠出機中的耗材。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "該擠出機所使用的噴頭。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +msgctxt "@label" +msgid "Build plate" +msgstr "列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +msgctxt "@tooltip" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down " +"towards this temperature. If this is 0, the bed heating is turned off." +msgstr "熱床的目標溫度。熱床將加熱或冷卻至此溫度。若設定為 0,則不使用熱床。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "熱床目前溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "熱床的預熱溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button" +msgid "Pre-heat" +msgstr "預熱" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +msgctxt "@tooltip of pre-heat" +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your " +"print while it is heating, and you won't have to wait for the bed to heat up " +"when you're ready to print." +msgstr "" +"列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等" +"待熱床加熱完畢。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +msgctxt "@label" +msgid "Active print" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +msgctxt "@label" +msgid "Job Name" +msgstr "作業名稱" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +msgctxt "@label" +msgid "Printing Time" +msgstr "列印時間" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +msgctxt "@label" +msgid "Estimated time left" +msgstr "預計剩餘時間" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "切換全螢幕(&F)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "復原(&U)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "取消復原(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "退出(&Q)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "設定 Cura…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "新增印表機(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "管理印表機(&I)..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "管理耗材…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "使用目前設定 / 覆寫更新列印參數(&U)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "捨棄目前更改(&D)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "從目前設定 / 覆寫值創建列印參數(&C)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "管理列印參數.." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "顯示線上說明文件(&D)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "BUG 回報(&B)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "關於(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "刪除所選模型(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "置中所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "複製所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "刪除模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "將模型置中(&N)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "群組模型(&G)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "取消模型群組" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "結合模型(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "複製模型…(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "選擇所有模型(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "清空列印平台(&C)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "重新載入所有模型(&L)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "編位所有的模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "為所選模型編位" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "重置所有模型位置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "重置所有模型旋轉(&T)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "開啟檔案(&O)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "新建專案(&N)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "顯示切片引擎日誌(&L)..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "顯示設定資料夾" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "參數顯示設定..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "請載入一個 3D 模型" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "切片已準備就緒" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "正在切片..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "%1 已準備就緒" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "無法切片" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "切片不可用" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "準備" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "選擇作用中的輸出裝置" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "" +"We have found one or more project file(s) within the files you have " +"selected. You can open only one project file at a time. We suggest to only " +"import models from those files. Would you like to proceed?" +msgstr "" +"我們已經在你所選擇的檔案中找到一個或多個專案檔案,但一次只能開啟一個專案檔" +"案。我們建議只從那些檔案中匯入模型而不開啟專案。你要繼續操作嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "匯入所有模型" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "檔案(&F)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "儲存到檔案(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "另存為(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "儲存專案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "編輯(&E)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +msgctxt "@title:menu" +msgid "&View" +msgstr "檢視(&V)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "設定(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "印表機(&P)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +msgctxt "@title:menu" +msgid "&Material" +msgstr "耗材(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "列印參數(&P)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "設為主要擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "擴充功能(&X)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "偏好設定(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "幫助(&H)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +msgctxt "@action:button" +msgid "Open File" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +msgctxt "@title:window" +msgid "New project" +msgstr "新建專案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +msgctxt "@info:question" +msgid "" +"Are you sure you want to start a new project? This will clear the build " +"plate and any unsaved settings." +msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何未儲存的設定。" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "安裝外掛" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +msgctxt "@text:window" +msgid "" +"We have found one or more G-Code files within the files you have selected. " +"You can only open one G-Code file at a time. If you want to open a G-Code " +"file, please just select only one." +msgstr "" +"我們已經在你選擇的檔案中找到一個或多個 G-Code 檔案。你一次只能開啟一個 G-" +"Code 檔案。若需開啟 G-Code 檔案,請僅選擇一個。" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "儲存專案" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "擠出機 %1" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "%1 & 耗材" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "儲存時不再顯示專案摘要" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +msgctxt "@action:button" +msgid "Save" +msgstr "儲存" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "準備" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "監控" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +msgctxt "@label" +msgid "Layer Height" +msgstr "層高" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +msgctxt "@label" +msgid "Print Speed" +msgstr "列印速度" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +msgctxt "@label" +msgid "Slower" +msgstr "更慢" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +msgctxt "@label" +msgid "Faster" +msgstr "更快" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +msgctxt "@label" +msgid "Infill" +msgstr "填充" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +msgctxt "@label" +msgid "" +"Gradual infill will gradually increase the amount of infill towards the top." +msgstr "漸層填充(Gradual infill)將隨著列印高度的提升而逐漸加大填充密度。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +msgctxt "@label" +msgid "Enable gradual" +msgstr "啟用漸層" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +msgctxt "@label" +msgid "Generate Support" +msgstr "產生支撐" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +msgctxt "@label" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "" +"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" +"塌。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +msgctxt "@label" +msgid "Support Extruder" +msgstr "支撐用擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting " +"structures below the model to prevent the model from sagging or printing in " +"mid air." +msgstr "" +"選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空" +"中列印。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under " +"your object which is easy to cut off afterwards." +msgstr "" +"允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +msgctxt "@label" +msgid "" +"Need help improving your prints?
    Read the Ultimaker " +"Troubleshooting Guides" +msgstr "需要幫助改善你的列印?閱讀 Ultimaker 故障排除指南" + +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "用 %1 列印所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "開啟專案檔案" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +msgctxt "@text:window" +msgid "" +"This is a Cura project file. Would you like to open it as a project or " +"import the models from it?" +msgstr "這是一個 Cura 專案檔案。你想將其作為一個專案開啟還是從中匯入模型?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +msgctxt "@action:button" +msgid "Open as project" +msgstr "作為專案開啟" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +msgctxt "@action:button" +msgid "Import models" +msgstr "匯入模型" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "引擎日誌" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +msgctxt "@label" +msgid "Material" +msgstr "耗材" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +msgctxt "@label" +msgid "Check material compatibility" +msgstr "檢查耗材相容性" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "點擊查看 Ultimaker.com 上的耗材相容性。" + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "" +"Provides a way to change machine settings (such as build volume, nozzle " +"size, etc)" +msgstr "提供更改印表機設定(如成形空間體積、噴頭口徑等)的方法" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "印表機設定操作" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "提供透視檢視。" + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "透視檢視" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "提供讀取 X3D 檔案的支援。" + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "X3D 讀取器" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "將 GCode 寫入至檔案。" + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "GCode 寫入器" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "將所有設定內容轉儲至 HTML 檔案。" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "上帝模式" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "接受 G-Code 並透過 WiFi 將其發送到 Doodle3D 無線網路盒。" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "Doodle3D 無線網路盒" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "顯示最新版本更動。" + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "更新日誌" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "創建一份合併品質變化列印參數。" + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "列印參數合併器" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "" +"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "接受 G-Code 並且傳送到印表機。此外掛也可以更新韌體。" + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "USB 連線列印" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "提供行動裝置熱插拔和寫入檔案的支援。" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "行動裝置輸出設備外掛" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "管理與 Ultimaker 3 印表機的網路連接" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "UM3 網路連接" + +#: CuraPrintClusterUpload/plugin.json +msgctxt "name" +msgid "UM3 Network Connection (Cluster)" +msgstr "UM3 網路連接(叢集)" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "檢查是否有韌體更新。" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "韌體更新檢查" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "" +"Gives you the possibility to open certain files via SolidWorks itself. These " +"are then converted and loaded into Cura" +msgstr "" +"讓你可以透過 SolidWorks 自身開啟特定檔案。隨後會將這些檔案進行轉換並載入 Cura" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "SolidWorks 集成" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "擴充程式(允許用戶建立腳本進行後處理)" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "後處理" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "偏好設定、機器設定和列印參數修改後自動儲存。" + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "自動儲存" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "提交匿名切片資訊。這項功能可以在偏好設定中關閉。" + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "切片資訊" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "提供讀寫 XML 格式耗材參數的功能。" + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "耗材參數" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "提供匯入 Cura 舊版本列印參數的支援。" + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "舊版 Cura 列印參數讀取器" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "提供匯入 G-code 檔案中列印參數的支援。" + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "G-code 列印參數讀取器" + +#: LayerView/plugin.json +msgctxt "description" +msgid "Provides the Layer view." +msgstr "提供分層檢視。" + +#: LayerView/plugin.json +msgctxt "name" +msgid "Layer View" +msgstr "分層檢視" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "將設定從 Cura 2.5 版本升級至 2.6 版本。" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "升級版本 2.5 到 2.6" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "升級版本 2.7 到 3.0" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "將設定從 Cura 2.6 版本升級至 2.7 版本。" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "升級版本 2.6 到 2.7" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "將設定從 Cura 2.1 版本升級至 2.2 版本。" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "升級版本 2.1 到 2.2" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "將設定從 Cura 2.2 版本升級至 2.4 版本。" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "升級版本 2.2 到 2.4" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "支援從 2D 圖片檔案產生可列印 3D 模型的能力。" + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "圖片讀取器" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "提供連結到 Cura 切片引擎後台。" + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "Cura 引擎後台" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "提供對每個模型的單獨設定。" + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "單一模型設定工具" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "提供讀取 3MF 格式檔案的支援。" + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "3MF 讀取器" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "尋找、管理和安裝新外掛。" + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "外掛瀏覽器" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "提供一個基本的實體網格檢視。" + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "實體檢視" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "允許載入和顯示 G-code 檔案。" + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "G-code 讀取器" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "提供匯出 Cura 列印參數的支援。" + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "Cura 列印參數寫入器" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "提供寫入 3MF 檔案的支援。" + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "3MF 寫入器" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "" +"Provides machine actions for Ultimaker machines (such as bed leveling " +"wizard, selecting upgrades, etc)" +msgstr "提供 Ultimaker 印表機專屬功能(如平台調平精靈、選擇升級等)" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "Ultimaker 印表機操作" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "提供匯入 Cura 列印參數的支援。" + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "Cura 列印參數讀取器" + +#~ msgctxt "@item:inlistbox" +#~ msgid "X-Ray" +#~ msgstr "透視" + +#~ msgctxt "@label" +#~ msgid "Doodle3D" +#~ msgstr "Doodle3D" + +#~ msgctxt "@info:tooltip" +#~ msgid "Print with " +#~ msgstr "使用 " + +#~ msgctxt "@title:menu" +#~ msgid "Doodle3D" +#~ msgstr "Doodle3D 列印" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Enable Scan devices..." +#~ msgstr "啟用掃描設備..." + +#~ msgctxt "X3G Writer File Description" +#~ msgid "X3G File" +#~ msgstr "X3G 檔案" + +#~ msgctxt "@info:status" +#~ msgid "" +#~ "Please keep in mind, that you have to reopen your SolidWorks file " +#~ "manually! Reloading the model won't work!" +#~ msgstr "" +#~ "請注意,重新載入模型功能無法運作!你必須手動重新開啟 SolidWorks 檔案!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layers" +#~ msgstr "層" + +#~ msgctxt "@item:inmenu" +#~ msgid "Solid" +#~ msgstr "實體" + +#~ msgctxt "@title:window" +#~ msgid "Doodle3D Settings" +#~ msgstr "Doodle3D 設定" + +#~ msgctxt "@title:window" +#~ msgid "Print to: %1" +#~ msgstr "列印至:%1" + +#~ msgctxt "@label" +#~ msgid "Extruder Temperature: %1/%2°C" +#~ msgstr "列印頭溫度:%1/%2 °C" + +#~ msgctxt "@label" +#~ msgid "Bed Temperature: %1/%2°C" +#~ msgstr "熱床溫度:%1/%2°C" + +#~ msgctxt "@label" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "@label" +#~ msgid "View Mode: Layers" +#~ msgstr "檢視模式:分層" + +#~ msgctxt "@label" +#~ msgid "Hotend" +#~ msgstr "熱端" + +#~ msgctxt "@action:button" +#~ msgid "View Mode" +#~ msgstr "檢視模式" + +#~ msgctxt "@title:tab" +#~ msgid "Print" +#~ msgstr "列印" + +#~ msgctxt "@label" +#~ msgid "0%" +#~ msgstr "0%" + +#~ msgctxt "@label" +#~ msgid "Empty infill will leave your model hollow with low strength." +#~ msgstr "無填充將使模型處於低強度且保持空心狀態。" + +#~ msgctxt "@label" +#~ msgid "20%" +#~ msgstr "20%" + +#~ msgctxt "@label" +#~ msgid "Light (20%) infill will give your model an average strength." +#~ msgstr "輕度(20%)填充將使列印模型處於中等強度。" + +#~ msgctxt "@label" +#~ msgid "50%" +#~ msgstr "50%" + +#~ msgctxt "@label" +#~ msgid "Dense (50%) infill will give your model an above average strength." +#~ msgstr "密集(50%)填充將使列印模型高於平均的強度。" + +#~ msgctxt "@label" +#~ msgid "100%" +#~ msgstr "100%" + +#~ msgctxt "@label" +#~ msgid "Solid (100%) infill will make your model completely solid." +#~ msgstr "完全(100%)填充將使你的模型處於完全實心狀態。" + +#~ msgctxt "@label" +#~ msgid "Gradual" +#~ msgstr "漸層填充" + +#~ msgctxt "description" +#~ msgid "Provides support for writing X3G files" +#~ msgstr "提供寫入 X3G 檔案的支援" + +#~ msgctxt "name" +#~ msgid "X3G Writer" +#~ msgstr "X3G 寫入器" diff --git a/resources/i18n/zh_TW/fdmextruder.def.json.po b/resources/i18n/zh_TW/fdmextruder.def.json.po new file mode 100644 index 0000000000..527342aafb --- /dev/null +++ b/resources/i18n/zh_TW/fdmextruder.def.json.po @@ -0,0 +1,210 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-17 22:13+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" + +#: fdmextruder.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "機型" + +#: fdmextruder.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "機器詳細設定" + +#: fdmextruder.def.json +msgctxt "extruder_nr label" +msgid "Extruder" +msgstr "擠出機" + +#: fdmextruder.def.json +msgctxt "extruder_nr description" +msgid "The extruder train used for printing. This is used in multi-extrusion." +msgstr "用於列印的擠出機,在多擠出機情況下適用。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "噴頭 ID" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "擠出機組的噴頭 ID,比如 \"AA 0.4\" 和 \"BB 0.8\"。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "噴頭直徑" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x label" +msgid "Nozzle X Offset" +msgstr "噴頭 X 軸偏移量" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x description" +msgid "The x-coordinate of the offset of the nozzle." +msgstr "噴頭 X 軸座標偏移。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y label" +msgid "Nozzle Y Offset" +msgstr "噴頭 Y 軸偏移量" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y description" +msgid "The y-coordinate of the offset of the nozzle." +msgstr "噴頭 Y 軸座標偏移。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code label" +msgid "Extruder Start G-Code" +msgstr "擠出機起始 G-code" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code description" +msgid "Start g-code to execute whenever turning the extruder on." +msgstr "打開擠出機將執行此段 G-code。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs label" +msgid "Extruder Start Position Absolute" +msgstr "擠出機起點絕對位置" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs description" +msgid "" +"Make the extruder starting position absolute rather than relative to the " +"last-known location of the head." +msgstr "讓擠出機以絕對位置做為起點,而不是與前一次位置的相對位置。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x label" +msgid "Extruder Start Position X" +msgstr "擠出機起始位置 X 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x description" +msgid "The x-coordinate of the starting position when turning the extruder on." +msgstr "打開擠出機時起始位置的 X 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y label" +msgid "Extruder Start Position Y" +msgstr "擠出機起始位置 Y 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y description" +msgid "The y-coordinate of the starting position when turning the extruder on." +msgstr "打開擠壓機時的起始位置 Y 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code label" +msgid "Extruder End G-Code" +msgstr "擠出機結束 Gcode" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code description" +msgid "End g-code to execute whenever turning the extruder off." +msgstr "在關閉擠出機時,執行結束 G-code。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs label" +msgid "Extruder End Position Absolute" +msgstr "擠出機終點絕對位置" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs description" +msgid "" +"Make the extruder ending position absolute rather than relative to the last-" +"known location of the head." +msgstr "讓擠出機以絕對位置為終點,而不是與前一次位置的相對位置。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x label" +msgid "Extruder End Position X" +msgstr "擠出機結束位置 X 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x description" +msgid "The x-coordinate of the ending position when turning the extruder off." +msgstr "關閉擠出機時的終止位置的 X 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y label" +msgid "Extruder End Position Y" +msgstr "擠出機終點位置 Y 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y description" +msgid "The y-coordinate of the ending position when turning the extruder off." +msgstr "關閉擠出機時的終止位置的 Y 座標。" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "擠出機初始 Z 軸位置" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." + +#: fdmextruder.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: fdmextruder.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "附著" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "擠出機 X 軸座標" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 X 軸上初始位置。" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "擠出機 Y 軸起始位置" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po new file mode 100644 index 0000000000..5fa7bf1ce8 --- /dev/null +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -0,0 +1,6094 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-31 23:30+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" + +#: fdmprinter.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "機器" + +#: fdmprinter.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "機器詳細設定" + +#: fdmprinter.def.json +msgctxt "machine_name label" +msgid "Machine Type" +msgstr "機器類型" + +#: fdmprinter.def.json +msgctxt "machine_name description" +msgid "The name of your 3D printer model." +msgstr "你的 3D 印表機型號的名稱。" + +#: fdmprinter.def.json +msgctxt "machine_show_variants label" +msgid "Show Machine Variants" +msgstr "顯示印表機型號" + +#: fdmprinter.def.json +msgctxt "machine_show_variants description" +msgid "" +"Whether to show the different variants of this machine, which are described " +"in separate json files." +msgstr "是否顯示這台印表機在不同的 JSON 檔案中所描述的型號。" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode label" +msgid "Start GCode" +msgstr "起始 G-code" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode description" +msgid "" +"Gcode commands to be executed at the very start - separated by \n" +"." +msgstr "" +"在開始後執行的 G-code 命令 - 以 \n" +" 分行。" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode label" +msgid "End GCode" +msgstr "結束 G-code" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode description" +msgid "" +"Gcode commands to be executed at the very end - separated by \n" +"." +msgstr "" +"在結束前執行的 G-code 命令 - 以 \n" +" 分行。" + +#: fdmprinter.def.json +msgctxt "material_guid label" +msgid "Material GUID" +msgstr "耗材 GUID" + +#: fdmprinter.def.json +msgctxt "material_guid description" +msgid "GUID of the material. This is set automatically. " +msgstr "耗材 GUID,此項為自動設定。" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait label" +msgid "Wait for Build Plate Heatup" +msgstr "等待列印平台加熱" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait description" +msgid "" +"Whether to insert a command to wait until the build plate temperature is " +"reached at the start." +msgstr "是否插入一條命令,在開始時等待列印平台達到設定溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait label" +msgid "Wait for Nozzle Heatup" +msgstr "等待噴頭加熱" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait description" +msgid "Whether to wait until the nozzle temperature is reached at the start." +msgstr "是否在開始時等待噴頭達到設定溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend label" +msgid "Include Material Temperatures" +msgstr "插入耗材溫度" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend description" +msgid "" +"Whether to include nozzle temperature commands at the start of the gcode. " +"When the start_gcode already contains nozzle temperature commands Cura " +"frontend will automatically disable this setting." +msgstr "" +"是否在 G-code 開始部分插入噴頭溫度命令。當起始 G-code 已包含噴頭溫度命令時," +"Cura 前端將自動關閉此設定。" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend label" +msgid "Include Build Plate Temperature" +msgstr "插入熱床溫度" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend description" +msgid "" +"Whether to include build plate temperature commands at the start of the " +"gcode. When the start_gcode already contains build plate temperature " +"commands Cura frontend will automatically disable this setting." +msgstr "" +"是否需要在 G-code 開始部分插入熱床溫度的命令。當起始 G-code 包含熱床溫度命令" +"時,Cura 前端將自動關閉此設定。" + +#: fdmprinter.def.json +msgctxt "machine_width label" +msgid "Machine Width" +msgstr "機器寬度" + +#: fdmprinter.def.json +msgctxt "machine_width description" +msgid "The width (X-direction) of the printable area." +msgstr "機器可列印區域寬度(X 座標)" + +#: fdmprinter.def.json +msgctxt "machine_depth label" +msgid "Machine Depth" +msgstr "機器深度" + +#: fdmprinter.def.json +msgctxt "machine_depth description" +msgid "The depth (Y-direction) of the printable area." +msgstr "機器可列印區域深度(Y 座標)" + +#: fdmprinter.def.json +msgctxt "machine_shape label" +msgid "Build Plate Shape" +msgstr "列印平台形狀" + +#: fdmprinter.def.json +msgctxt "machine_shape description" +msgid "" +"The shape of the build plate without taking unprintable areas into account." +msgstr "列印平台形狀(不計算不可列印區域)。" + +#: fdmprinter.def.json +msgctxt "machine_shape option rectangular" +msgid "Rectangular" +msgstr "矩形" + +#: fdmprinter.def.json +msgctxt "machine_shape option elliptic" +msgid "Elliptic" +msgstr "類圓形" + +#: fdmprinter.def.json +msgctxt "machine_height label" +msgid "Machine Height" +msgstr "機器高度" + +#: fdmprinter.def.json +msgctxt "machine_height description" +msgid "The height (Z-direction) of the printable area." +msgstr "機器可列印區域高度(Z 座標)" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed label" +msgid "Has Heated Build Plate" +msgstr "有熱床" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed description" +msgid "Whether the machine has a heated build plate present." +msgstr "機器是否有熱床。" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero label" +msgid "Is Center Origin" +msgstr "原點是否位於中心" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero description" +msgid "" +"Whether the X/Y coordinates of the zero position of the printer is at the " +"center of the printable area." +msgstr "印表機的 X/Y 座標原點是否位於可列印區域的中心。" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count label" +msgid "Number of Extruders" +msgstr "擠出機數目" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count description" +msgid "" +"Number of extruder trains. An extruder train is the combination of a feeder, " +"bowden tube, and nozzle." +msgstr "擠出機組數目。擠出機組是指進料裝置、喉管和噴頭的組合。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter label" +msgid "Outer nozzle diameter" +msgstr "噴頭外徑" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter description" +msgid "The outer diameter of the tip of the nozzle." +msgstr "噴頭尖端的外徑。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance label" +msgid "Nozzle length" +msgstr "噴頭長度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance description" +msgid "" +"The height difference between the tip of the nozzle and the lowest part of " +"the print head." +msgstr "噴頭尖端與列印頭最低部分之間的高度差。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle label" +msgid "Nozzle angle" +msgstr "噴頭角度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle description" +msgid "" +"The angle between the horizontal plane and the conical part right above the " +"tip of the nozzle." +msgstr "水平面與噴頭尖端上部圓錐形之間的角度。" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length label" +msgid "Heat zone length" +msgstr "加熱區長度" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length description" +msgid "" +"The distance from the tip of the nozzle in which heat from the nozzle is " +"transferred to the filament." +msgstr "與噴頭尖端的距離,噴頭產生的熱量在這段距離內傳遞到耗材中。" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance label" +msgid "Filament Park Distance" +msgstr "耗材停放距離" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance description" +msgid "" +"The distance from the tip of the nozzle where to park the filament when an " +"extruder is no longer used." +msgstr "與噴頭尖端的距離,當不再使用擠出機時會將耗材停放在此區域。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled label" +msgid "Enable Nozzle Temperature Control" +msgstr "啟用噴頭溫度控制" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled description" +msgid "" +"Whether to control temperature from Cura. Turn this off to control nozzle " +"temperature from outside of Cura." +msgstr "是否從 Cura 控制溫度。若要從 Cura 外部控制噴頭溫度,關閉此選項。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed label" +msgid "Heat up speed" +msgstr "加熱速度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed description" +msgid "" +"The speed (°C/s) by which the nozzle heats up averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "噴頭從待機溫度加熱到列印溫度的平均速度(℃/ s)。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed label" +msgid "Cool down speed" +msgstr "冷卻速度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed description" +msgid "" +"The speed (°C/s) by which the nozzle cools down averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "噴頭從列印溫度冷卻到待機溫度的平均速度(℃/ s)。" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window label" +msgid "Minimal Time Standby Temperature" +msgstr "待機溫度最短時間" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window description" +msgid "" +"The minimal time an extruder has to be inactive before the nozzle is cooled. " +"Only when an extruder is not used for longer than this time will it be " +"allowed to cool down to the standby temperature." +msgstr "" +"擠出機必須保持不活動以便噴頭冷卻的最短時間。擠出機必須停用超過此時間,才可以" +"冷卻到待機溫度。" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor label" +msgid "Gcode flavour" +msgstr "G-code 類型" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor description" +msgid "The type of gcode to be generated." +msgstr "需要產生的 G-code 類型。" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" +msgid "Marlin" +msgstr "Marlin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Volumetric)" +msgid "Marlin (Volumetric)" +msgstr "Marlin(容積)" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (RepRap)" +msgid "RepRap" +msgstr "RepRap" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option UltiGCode" +msgid "Ultimaker 2" +msgstr "Ultimaker 2" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Griffin" +msgid "Griffin" +msgstr "Griffin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Makerbot" +msgid "Makerbot" +msgstr "Makerbot" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option BFB" +msgid "Bits from Bytes" +msgstr "Bits from Bytes" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option MACH3" +msgid "Mach3" +msgstr "Mach3" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Repetier" +msgid "Repetier" +msgstr "Repetier" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas label" +msgid "Disallowed areas" +msgstr "不允許區域" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas description" +msgid "A list of polygons with areas the print head is not allowed to enter." +msgstr "不允許列印頭進入區域的多邊形列表。" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas label" +msgid "Nozzle Disallowed Areas" +msgstr "噴頭不允許區域" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas description" +msgid "A list of polygons with areas the nozzle is not allowed to enter." +msgstr "不允許噴頭進入區域的多邊形列表。" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon label" +msgid "Machine head polygon" +msgstr "機器頭多邊形" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon description" +msgid "A 2D silhouette of the print head (fan caps excluded)." +msgstr "列印頭 2D 輪廓圖(不包含風扇蓋)。" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon label" +msgid "Machine head & Fan polygon" +msgstr "機器頭和風扇多邊形" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon description" +msgid "A 2D silhouette of the print head (fan caps included)." +msgstr "列印頭 2D 輪廓圖(包含風扇蓋)。" + +#: fdmprinter.def.json +msgctxt "gantry_height label" +msgid "Gantry height" +msgstr "吊車高度" + +#: fdmprinter.def.json +msgctxt "gantry_height description" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes)." +msgstr "噴頭尖端與吊車之間的高度差。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "噴頭 ID" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "擠出機組的噴頭 ID,比如\"AA 0.4\"和\"BB 0.8\"。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "噴頭直徑" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords label" +msgid "Offset With Extruder" +msgstr "擠出機偏移量" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords description" +msgid "Apply the extruder offset to the coordinate system." +msgstr "將擠出機偏移量套用到座標軸系統。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "擠出機初始 Z 軸位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs label" +msgid "Absolute Extruder Prime Position" +msgstr "擠出機使用絕對位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs description" +msgid "" +"Make the extruder prime position absolute rather than relative to the last-" +"known location of the head." +msgstr "擠出機的控制參數使用絕對位置,而不是與前次位置的相對位移。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x label" +msgid "Maximum Speed X" +msgstr "X 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x description" +msgid "The maximum speed for the motor of the X-direction." +msgstr "X 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y label" +msgid "Maximum Speed Y" +msgstr "Y 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y description" +msgid "The maximum speed for the motor of the Y-direction." +msgstr "Y 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z label" +msgid "Maximum Speed Z" +msgstr "Z 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z description" +msgid "The maximum speed for the motor of the Z-direction." +msgstr "Z 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e label" +msgid "Maximum Feedrate" +msgstr "最大進料速率" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e description" +msgid "The maximum speed of the filament." +msgstr "耗材的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x label" +msgid "Maximum Acceleration X" +msgstr "X 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x description" +msgid "Maximum acceleration for the motor of the X-direction" +msgstr "X 軸方向馬達的最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y label" +msgid "Maximum Acceleration Y" +msgstr "Y 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y description" +msgid "Maximum acceleration for the motor of the Y-direction." +msgstr "Y 軸方向馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z label" +msgid "Maximum Acceleration Z" +msgstr "Z 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z description" +msgid "Maximum acceleration for the motor of the Z-direction." +msgstr "Z 軸方向馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e label" +msgid "Maximum Filament Acceleration" +msgstr "擠出馬達最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e description" +msgid "Maximum acceleration for the motor of the filament." +msgstr "擠出馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_acceleration label" +msgid "Default Acceleration" +msgstr "預設加速度" + +#: fdmprinter.def.json +msgctxt "machine_acceleration description" +msgid "The default acceleration of print head movement." +msgstr "列印頭移動的預設加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy label" +msgid "Default X-Y Jerk" +msgstr "預設 X-Y 平面加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy description" +msgid "Default jerk for movement in the horizontal plane." +msgstr "水平面移動的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z label" +msgid "Default Z Jerk" +msgstr "預設 Z 軸加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z description" +msgid "Default jerk for the motor of the Z-direction." +msgstr "Z 軸方向馬達的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e label" +msgid "Default Filament Jerk" +msgstr "預設擠出馬達加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e description" +msgid "Default jerk for the motor of the filament." +msgstr "擠出馬達的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate label" +msgid "Minimum Feedrate" +msgstr "最小進料速率" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate description" +msgid "The minimal movement speed of the print head." +msgstr "列印頭的最低移動速度。" + +#: fdmprinter.def.json +msgctxt "resolution label" +msgid "Quality" +msgstr "品質" + +#: fdmprinter.def.json +msgctxt "resolution description" +msgid "" +"All settings that influence the resolution of the print. These settings have " +"a large impact on the quality (and print time)" +msgstr "影響列印解析度的所有設定。這些設定會對品質(和列印時間)產生顯著影響" + +#: fdmprinter.def.json +msgctxt "layer_height label" +msgid "Layer Height" +msgstr "層高" + +#: fdmprinter.def.json +msgctxt "layer_height description" +msgid "" +"The height of each layer in mm. Higher values produce faster prints in lower " +"resolution, lower values produce slower prints in higher resolution." +msgstr "" +"每層的高度(以毫米為單位)。值越高,則列印速度越快,解析度越低;值越低,則列" +"印速度越慢,解析度越高。" + +#: fdmprinter.def.json +msgctxt "layer_height_0 label" +msgid "Initial Layer Height" +msgstr "起始層高" + +#: fdmprinter.def.json +msgctxt "layer_height_0 description" +msgid "" +"The height of the initial layer in mm. A thicker initial layer makes " +"adhesion to the build plate easier." +msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台的附著越輕鬆。" + +#: fdmprinter.def.json +msgctxt "line_width label" +msgid "Line Width" +msgstr "線寬" + +#: fdmprinter.def.json +msgctxt "line_width description" +msgid "" +"Width of a single line. Generally, the width of each line should correspond " +"to the width of the nozzle. However, slightly reducing this value could " +"produce better prints." +msgstr "" +"單一線寬。一般而言,每條線條的寬度應與噴頭的寬度對應。但是,稍微降低此值可以" +"產生更好的列印成果。" + +#: fdmprinter.def.json +msgctxt "wall_line_width label" +msgid "Wall Line Width" +msgstr "牆壁線寬" + +#: fdmprinter.def.json +msgctxt "wall_line_width description" +msgid "Width of a single wall line." +msgstr "單層牆壁線寬。" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 label" +msgid "Outer Wall Line Width" +msgstr "線寬(外壁)" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 description" +msgid "" +"Width of the outermost wall line. By lowering this value, higher levels of " +"detail can be printed." +msgstr "最外側牆壁的線寬。降低此值,可列印出更高水準的細節。" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x label" +msgid "Inner Wall(s) Line Width" +msgstr "內壁線寬" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x description" +msgid "" +"Width of a single wall line for all wall lines except the outermost one." +msgstr "除了外壁以外牆壁的線寬。" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "頂部表層線寬" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "列印頂部區域單一線寬。" + +#: fdmprinter.def.json +msgctxt "skin_line_width label" +msgid "Top/Bottom Line Width" +msgstr "頂部/底部線寬" + +#: fdmprinter.def.json +msgctxt "skin_line_width description" +msgid "Width of a single top/bottom line." +msgstr "單一頂部/底部線寬。" + +#: fdmprinter.def.json +msgctxt "infill_line_width label" +msgid "Infill Line Width" +msgstr "填充線寬" + +#: fdmprinter.def.json +msgctxt "infill_line_width description" +msgid "Width of a single infill line." +msgstr "單一填充線寬。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width label" +msgid "Skirt/Brim Line Width" +msgstr "外圍/邊緣線寬" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width description" +msgid "Width of a single skirt or brim line." +msgstr "單一外圍或邊緣的線寬。" + +#: fdmprinter.def.json +msgctxt "support_line_width label" +msgid "Support Line Width" +msgstr "支撐線寬" + +#: fdmprinter.def.json +msgctxt "support_line_width description" +msgid "Width of a single support structure line." +msgstr "單一支撐線寬。" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width label" +msgid "Support Interface Line Width" +msgstr "支撐介面線寬" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width description" +msgid "Width of a single line of support roof or floor." +msgstr "支撐頂板或底板單一線寬。" + +#: fdmprinter.def.json +msgctxt "support_roof_line_width label" +msgid "Support Roof Line Width" +msgstr "支撐頂板線寬" + +#: fdmprinter.def.json +msgctxt "support_roof_line_width description" +msgid "Width of a single support roof line." +msgstr "單一支撐頂板線寬。" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width label" +msgid "Support Floor Line Width" +msgstr "支撐底板線寬" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width description" +msgid "Width of a single support floor line." +msgstr "單一支撐底板線寬。" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width label" +msgid "Prime Tower Line Width" +msgstr "換料塔線寬" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width description" +msgid "Width of a single prime tower line." +msgstr "單一換料塔線寬。" + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor label" +msgid "Initial Layer Line Width" +msgstr "起始層線寬" + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor description" +msgid "" +"Multiplier of the line width on the first layer. Increasing this could " +"improve bed adhesion." +msgstr "第一層線寬倍數。增大此倍數可改善熱床附著。" + +#: fdmprinter.def.json +msgctxt "shell label" +msgid "Shell" +msgstr "外殼" + +#: fdmprinter.def.json +msgctxt "shell description" +msgid "Shell" +msgstr "外殼" + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr label" +msgid "Outer Wall Extruder" +msgstr "外壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr description" +msgid "" +"The extruder train used for printing the outer wall. This is used in multi-" +"extrusion." +msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr label" +msgid "Inner Walls Extruder" +msgstr "內壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr description" +msgid "" +"The extruder train used for printing the inner walls. This is used in multi-" +"extrusion." +msgstr "用於列印內壁的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "wall_thickness label" +msgid "Wall Thickness" +msgstr "壁厚" + +#: fdmprinter.def.json +msgctxt "wall_thickness description" +msgid "" +"The thickness of the walls in the horizontal direction. This value divided " +"by the wall line width defines the number of walls." +msgstr "水平方向的牆壁厚度。此值除以壁線寬度決定牆壁數量。" + +#: fdmprinter.def.json +msgctxt "wall_line_count label" +msgid "Wall Line Count" +msgstr "牆壁線條圈數" + +#: fdmprinter.def.json +msgctxt "wall_line_count description" +msgid "" +"The number of walls. When calculated by the wall thickness, this value is " +"rounded to a whole number." +msgstr "牆壁的線條圈數,如果由壁厚計算,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist label" +msgid "Outer Wall Wipe Distance" +msgstr "外壁擦拭噴頭長度" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist description" +msgid "" +"Distance of a travel move inserted after the outer wall, to hide the Z seam " +"better." +msgstr "在列印外壁後插入的空跑距離,以便消除隱藏 Z 縫的銜接痕跡。" + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr label" +msgid "Top Surface Skin Extruder" +msgstr "頂部表層擠出機" + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr description" +msgid "" +"The extruder train used for printing the top most skin. This is used in " +"multi-extrusion." +msgstr "用於列印最頂部表層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "roofing_layer_count label" +msgid "Top Surface Skin Layers" +msgstr "頂部表層" + +#: fdmprinter.def.json +msgctxt "roofing_layer_count description" +msgid "" +"The number of top most skin layers. Usually only one top most layer is " +"sufficient to generate higher quality top surfaces." +msgstr "最頂部表層層數。通常只需一層最頂部就足以產生較高品質的頂部表面。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "頂部表層列印樣式" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "最頂部列印樣式。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "頂部表層線條方向" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "" +"A list of integer line directions to use when the top surface skin layers " +"use the lines or zig zag pattern. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees)." +msgstr "" +"當頂部表層採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" +"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表項以逗號分隔,整個列" +"表包含在方括號中。預設使用傳統的預設角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr label" +msgid "Top/Bottom Extruder" +msgstr "頂部/底部擠出機" + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr description" +msgid "" +"The extruder train used for printing the top and bottom skin. This is used " +"in multi-extrusion." +msgstr "用於列印頂部和底部表層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness label" +msgid "Top/Bottom Thickness" +msgstr "頂部 / 底部厚度" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness description" +msgid "" +"The thickness of the top/bottom layers in the print. This value divided by " +"the layer height defines the number of top/bottom layers." +msgstr "列印模型中頂部/底部的厚度。該值除以層高決定頂部/底部的層數。" + +#: fdmprinter.def.json +msgctxt "top_thickness label" +msgid "Top Thickness" +msgstr "頂部厚度" + +#: fdmprinter.def.json +msgctxt "top_thickness description" +msgid "" +"The thickness of the top layers in the print. This value divided by the " +"layer height defines the number of top layers." +msgstr "列印模型中頂部的厚度。該值除以層高決定頂部的層數。" + +#: fdmprinter.def.json +msgctxt "top_layers label" +msgid "Top Layers" +msgstr "頂部層數" + +#: fdmprinter.def.json +msgctxt "top_layers description" +msgid "" +"The number of top layers. When calculated by the top thickness, this value " +"is rounded to a whole number." +msgstr "頂部列印層數,當由頂部厚度來計算時層數時,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "bottom_thickness label" +msgid "Bottom Thickness" +msgstr "底部厚度" + +#: fdmprinter.def.json +msgctxt "bottom_thickness description" +msgid "" +"The thickness of the bottom layers in the print. This value divided by the " +"layer height defines the number of bottom layers." +msgstr "列印模型中底部的厚度。此值除以層高決定底部的層數。" + +#: fdmprinter.def.json +msgctxt "bottom_layers label" +msgid "Bottom Layers" +msgstr "底部層數" + +#: fdmprinter.def.json +msgctxt "bottom_layers description" +msgid "" +"The number of bottom layers. When calculated by the bottom thickness, this " +"value is rounded to a whole number." +msgstr "底部列印層數,當由底部厚度來計算時層數時,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern label" +msgid "Top/Bottom Pattern" +msgstr "頂部/底部填充樣式" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern description" +msgid "The pattern of the top/bottom layers." +msgstr "頂部/底部的列印樣式。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 label" +msgid "Bottom Pattern Initial Layer" +msgstr "初始層列印樣式" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 description" +msgid "The pattern on the bottom of the print on the first layer." +msgstr "列印件底部第一層的列印樣式。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "skin_angles label" +msgid "Top/Bottom Line Directions" +msgstr "頂部/底部線條方向" + +#: fdmprinter.def.json +msgctxt "skin_angles description" +msgid "" +"A list of integer line directions to use when the top/bottom layers use the " +"lines or zig zag pattern. Elements from the list are used sequentially as " +"the layers progress and when the end of the list is reached, it starts at " +"the beginning again. The list items are separated by commas and the whole " +"list is contained in square brackets. Default is an empty list which means " +"use the traditional default angles (45 and 135 degrees)." +msgstr "" +"當頂部/底部採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" +"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表元素以逗號分隔,整個" +"列表包含在方括號中。空的列表代表使用傳統的預設角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "wall_0_inset label" +msgid "Outer Wall Inset" +msgstr "外壁內嵌" + +#: fdmprinter.def.json +msgctxt "wall_0_inset description" +msgid "" +"Inset applied to the path of the outer wall. If the outer wall is smaller " +"than the nozzle, and printed after the inner walls, use this offset to get " +"the hole in the nozzle to overlap with the inner walls instead of the " +"outside of the model." +msgstr "" +"內嵌是套用在外壁路徑上的功能。如果外壁小於噴頭,並且在內壁之後列印,則此偏移" +"量將使噴頭孔內移與內壁重疊而不是行走在模型外部。" + +#: fdmprinter.def.json +msgctxt "outer_inset_first label" +msgid "Outer Before Inner Walls" +msgstr "先印外壁後印內壁" + +#: fdmprinter.def.json +msgctxt "outer_inset_first description" +msgid "" +"Prints walls in order of outside to inside when enabled. This can help " +"improve dimensional accuracy in X and Y when using a high viscosity plastic " +"like ABS; however it can decrease outer surface print quality, especially on " +"overhangs." +msgstr "" +"啟用時以從外向內的順序列印壁。當使用高黏度塑料如 ABS 時,這有助於提高 X 和 Y " +"的尺寸精度;但是,它可能會降低外表面列印品質,特别是在懸垂部分。" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter label" +msgid "Alternate Extra Wall" +msgstr "交錯額外牆壁" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter description" +msgid "" +"Prints an extra wall at every other layer. This way infill gets caught " +"between these extra walls, resulting in stronger prints." +msgstr "" +"每兩層建立一個額外牆壁,這些額外的牆壁能更緊密地抓填充部分,產生較強壯的模" +"型。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled label" +msgid "Compensate Wall Overlaps" +msgstr "補償牆壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled description" +msgid "" +"Compensate the flow for parts of a wall being printed where there is already " +"a wall in place." +msgstr "彌補牆壁重疊部分的流量。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled label" +msgid "Compensate Outer Wall Overlaps" +msgstr "補償外壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled description" +msgid "" +"Compensate the flow for parts of an outer wall being printed where there is " +"already a wall in place." +msgstr "列印外壁時如果該位置已經有牆壁存在,所進行的的流量補償。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled label" +msgid "Compensate Inner Wall Overlaps" +msgstr "補償內壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled description" +msgid "" +"Compensate the flow for parts of an inner wall being printed where there is " +"already a wall in place." +msgstr "列印內壁時如果該位置已經有牆壁存在,所進行的的流量補償。" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps label" +msgid "Fill Gaps Between Walls" +msgstr "填充牆壁之間空隙" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps description" +msgid "Fills the gaps between walls where no walls fit." +msgstr "填充牆壁之間空隙。" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option nowhere" +msgid "Nowhere" +msgstr "都不填充" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option everywhere" +msgid "Everywhere" +msgstr "全部填充" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps label" +msgid "Print Thin Walls" +msgstr "列印薄壁" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps description" +msgid "" +"Print pieces of the model which are horizontally thinner than the nozzle " +"size." +msgstr "列印在水平面上比噴頭尺寸更薄的模型部件。" + +#: fdmprinter.def.json +msgctxt "xy_offset label" +msgid "Horizontal Expansion" +msgstr "水平擴展" + +#: fdmprinter.def.json +msgctxt "xy_offset description" +msgid "" +"Amount of offset applied to all polygons in each layer. Positive values can " +"compensate for too big holes; negative values can compensate for too small " +"holes." +msgstr "" +"如果模型有挖孔,以便用來組合、鑲嵌時,這個偏移量可以用來微調孔的大小,當設為" +"正值時,模型外擴,孔會變小;若設為負值,模型內縮,孔會變大。" + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 label" +msgid "Initial Layer Horizontal Expansion" +msgstr "起始層水平擴展" + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 description" +msgid "" +"Amount of offset applied to all polygons in the first layer. A negative " +"value can compensate for squishing of the first layer known as \"elephant's " +"foot\"." +msgstr "" +"套用到第一層所有多邊形的偏移量。負數值可以補償第一層的壓扁量(被稱為“象" +"脚”)。" + +#: fdmprinter.def.json +msgctxt "z_seam_type label" +msgid "Z Seam Alignment" +msgstr "Z 接縫對齊" + +#: fdmprinter.def.json +msgctxt "z_seam_type description" +msgid "" +"Starting point of each path in a layer. When paths in consecutive layers " +"start at the same point a vertical seam may show on the print. When aligning " +"these near a user specified location, the seam is easiest to remove. When " +"placed randomly the inaccuracies at the paths' start will be less " +"noticeable. When taking the shortest path the print will be quicker." +msgstr "" +"一層中每條路徑的起點。當連續多層的路徑從相同點開始時,則列印物上會顯示一條垂" +"直縫隙。如果將這些路徑靠近一個使用者指定的位置對齊,則縫隙最容易移除。如果隨" +"機放置,則路徑起點的不精準度將較不明顯。採用最短的路徑時,列印將更為快速。" + +#: fdmprinter.def.json +msgctxt "z_seam_type option back" +msgid "User Specified" +msgstr "使用者指定" + +#: fdmprinter.def.json +msgctxt "z_seam_type option shortest" +msgid "Shortest" +msgstr "最短" + +#: fdmprinter.def.json +msgctxt "z_seam_type option random" +msgid "Random" +msgstr "隨機" + +#: fdmprinter.def.json +msgctxt "z_seam_type option sharpest_corner" +msgid "Sharpest Corner" +msgstr "最尖銳的轉角" + +#: fdmprinter.def.json +msgctxt "z_seam_x label" +msgid "Z Seam X" +msgstr "Z 接縫 X 座標" + +#: fdmprinter.def.json +msgctxt "z_seam_x description" +msgid "" +"The X coordinate of the position near where to start printing each part in a " +"layer." +msgstr "位置的 X 軸座標,在該位置附近開始列印層中各個部分。" + +#: fdmprinter.def.json +msgctxt "z_seam_y label" +msgid "Z Seam Y" +msgstr "Z 接縫 Y 座標" + +#: fdmprinter.def.json +msgctxt "z_seam_y description" +msgid "" +"The Y coordinate of the position near where to start printing each part in a " +"layer." +msgstr "位置的 Y 軸座標,在該位置附近開始列印層中各個部分。" + +#: fdmprinter.def.json +msgctxt "z_seam_corner label" +msgid "Seam Corner Preference" +msgstr "接縫偏好設定" + +#: fdmprinter.def.json +msgctxt "z_seam_corner description" +msgid "" +"Control whether corners on the model outline influence the position of the " +"seam. None means that corners have no influence on the seam position. Hide " +"Seam makes the seam more likely to occur on an inside corner. Expose Seam " +"makes the seam more likely to occur on an outside corner. Hide or Expose " +"Seam makes the seam more likely to occur at an inside or outside corner." +msgstr "" +"控制接縫是否受模型輪廓上的角影響。'無'表示轉角不影響接縫位置。'隱藏接縫'表示" +"使用盡可能使用凹角做為接縫位置。'暴露接縫'表示盡可能使用凸角做為接縫位置。'隱" +"藏或暴露接縫'則同時使用凹角和凸角做為接縫位置。" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_none" +msgid "None" +msgstr "無" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_inner" +msgid "Hide Seam" +msgstr "隱藏接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_outer" +msgid "Expose Seam" +msgstr "暴露接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_any" +msgid "Hide or Expose Seam" +msgstr "隱藏或暴露接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_relative label" +msgid "Z Seam Relative" +msgstr "Z 接縫相對" + +#: fdmprinter.def.json +msgctxt "z_seam_relative description" +msgid "" +"When enabled, the z seam coordinates are relative to each part's centre. " +"When disabled, the coordinates define an absolute position on the build " +"plate." +msgstr "" +"啟用時,Z 接縫座標為相對於各個部分中心的值。關閉時,座標固定在列印平台上的一" +"個絕對位置。" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic label" +msgid "Ignore Small Z Gaps" +msgstr "忽略 Z 方向的小間隙" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic description" +msgid "" +"When the model has small vertical gaps, about 5% extra computation time can " +"be spent on generating top and bottom skin in these narrow spaces. In such " +"case, disable the setting." +msgstr "" +"當模型具有微小的垂直間隙時,為了在這些間隙上產生頂部、底部等表面,會花費大約" +"5%的額外的計算時間。勾選這個項目可以節省時間,但是間隙會消失,若要保留這些間" +"隙,不要勾選這個項目。" + +#: fdmprinter.def.json +msgctxt "skin_outline_count label" +msgid "Extra Skin Wall Count" +msgstr "額外表層牆壁計數" + +#: fdmprinter.def.json +msgctxt "skin_outline_count description" +msgid "" +"Replaces the outermost part of the top/bottom pattern with a number of " +"concentric lines. Using one or two lines improves roofs that start on infill " +"material." +msgstr "" +"用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在" +"填充上的頂板。" + +#: fdmprinter.def.json +msgctxt "infill label" +msgid "Infill" +msgstr "填充" + +#: fdmprinter.def.json +msgctxt "infill description" +msgid "Infill" +msgstr "填充" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr label" +msgid "Infill Extruder" +msgstr "填充擠出機" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr description" +msgid "" +"The extruder train used for printing infill. This is used in multi-extrusion." +msgstr "用於列印填充的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density label" +msgid "Infill Density" +msgstr "填充密度" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density description" +msgid "Adjusts the density of infill of the print." +msgstr "調整列印填充的密度。" + +#: fdmprinter.def.json +msgctxt "infill_line_distance label" +msgid "Infill Line Distance" +msgstr "填充線條距離" + +#: fdmprinter.def.json +msgctxt "infill_line_distance description" +msgid "" +"Distance between the printed infill lines. This setting is calculated by the " +"infill density and the infill line width." +msgstr "列印填充線條之間的距離。該設定是通過填充密度和填充線寬度計算。" + +#: fdmprinter.def.json +msgctxt "infill_pattern label" +msgid "Infill Pattern" +msgstr "填充列印樣式" + +#: fdmprinter.def.json +msgctxt "infill_pattern description" +msgid "" +"The pattern of the infill material of the print. The line and zig zag infill " +"swap direction on alternate layers, reducing material cost. The grid, " +"triangle, cubic, octet, quarter cubic and concentric patterns are fully " +"printed every layer. Cubic, quarter cubic and octet infill change with every " +"layer to provide a more equal distribution of strength over each direction." +msgstr "" +"填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" +"三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" +"分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强度分布。" + +#: fdmprinter.def.json +msgctxt "infill_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "infill_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "infill_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubic" +msgid "Cubic" +msgstr "立方體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubicsubdiv" +msgid "Cubic Subdivision" +msgstr "立方體細分" + +#: fdmprinter.def.json +msgctxt "infill_pattern option tetrahedral" +msgid "Octet" +msgstr "八面體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option quarter_cubic" +msgid "Quarter Cubic" +msgstr "四分立方體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "立體同心圓" + +#: fdmprinter.def.json +msgctxt "infill_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross" +msgid "Cross" +msgstr "十字形" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross_3d" +msgid "Cross 3D" +msgstr "立體十字形" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill label" +msgid "Connect Infill Lines" +msgstr "連接填充線條" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill description" +msgid "" +"Connect the ends where the infill pattern meets the inner wall using a lines " +"which follows the shape of the inner wall. Enabling this setting can make " +"the infill adhere to the walls better and reduces the effects on infill on " +"the quality of vertical surfaces. Disabling this setting reduces the amount " +"of material used." +msgstr "" +"使用一條線沿著內牆的形狀,連接填充線條與內牆交會的末端。啟用此設定可以使填充" +"更好地附著在內牆上,並減少對垂直表面品質的影響。關閉此設定可降低材料的使用" +"量。" + +#: fdmprinter.def.json +msgctxt "infill_angles label" +msgid "Infill Line Directions" +msgstr "填充線條方向" + +#: fdmprinter.def.json +msgctxt "infill_angles description" +msgid "" +"A list of integer line directions to use. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees for the " +"lines and zig zag patterns and 45 degrees for all other patterns)." +msgstr "" +"要使用的整數線條方向列表。列表中的元素隨層的進度依次使用,當達到列表末尾時," +"它將從頭開始。列表元素以逗號分隔,整個列表包含在方括號中。空的列表代表使用傳" +"統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 " +"度)。" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add label" +msgid "Cubic Subdivision Shell" +msgstr "立方體細分外殼" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add description" +msgid "" +"An addition to the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to a thicker shell of small cubes near the boundary of " +"the model." +msgstr "" +"每個立方體半徑的增加量,用來檢查模型的邊界,決定是否應該細分該立方體。值越" +"大,靠近模型邊界附近的小立方體的殼越厚。" + +#: fdmprinter.def.json +msgctxt "infill_overlap label" +msgid "Infill Overlap Percentage" +msgstr "填充重疊百分比" + +#: fdmprinter.def.json +msgctxt "infill_overlap description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "填充和牆壁之間的重疊量。稍微重疊可讓各個牆壁與填充牢固連接。" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm label" +msgid "Infill Overlap" +msgstr "填充重疊" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "填充和牆壁之間的重疊量。稍微重疊可讓各個壁與填充牢固連接。" + +#: fdmprinter.def.json +msgctxt "skin_overlap label" +msgid "Skin Overlap Percentage" +msgstr "表層重疊百分比" + +#: fdmprinter.def.json +msgctxt "skin_overlap description" +msgid "" +"The amount of overlap between the skin and the walls as a percentage of the " +"line width. A slight overlap allows the walls to connect firmly to the skin. " +"This is a percentage of the average line widths of the skin lines and the " +"innermost wall." +msgstr "" +"表層和牆壁之間的重疊量,以線寬百分比表示。稍微重疊可讓各個牆壁與表層牢固連" +"接。這是表層平均線寬和最內壁的百分比。" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm label" +msgid "Skin Overlap" +msgstr "表層重疊" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "表層和牆壁之間的重疊量。稍微重疊可讓各個牆壁與表層牢固連接。" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist label" +msgid "Infill Wipe Distance" +msgstr "填充擦拭距離" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist description" +msgid "" +"Distance of a travel move inserted after every infill line, to make the " +"infill stick to the walls better. This option is similar to infill overlap, " +"but without extrusion and only on one end of the infill line." +msgstr "" +"每條填充線條後插入的空跑距離,讓填充更好地附著到壁上。此選項與填充重疊類似," +"但没有擠出,且僅位於填充線條的一端。" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness label" +msgid "Infill Layer Thickness" +msgstr "填充層厚度" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness description" +msgid "" +"The thickness per layer of infill material. This value should always be a " +"multiple of the layer height and is otherwise rounded." +msgstr "每層填充的厚度。此值應該是層高度的倍數,並且否則會四捨五入。" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps label" +msgid "Gradual Infill Steps" +msgstr "漸進填充步階數" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps description" +msgid "" +"Number of times to reduce the infill density by half when getting further " +"below top surfaces. Areas which are closer to top surfaces get a higher " +"density, up to the Infill Density." +msgstr "" +"由模型頂部往下,填充密度減半的次數。愈接近頂部的填充密度愈高,直到所設定的填" +"充密度。" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height label" +msgid "Gradual Infill Step Height" +msgstr "漸進填充步階高度" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height description" +msgid "" +"The height of infill of a given density before switching to half the density." +msgstr "減半填充密度的高度。" + +#: fdmprinter.def.json +msgctxt "infill_before_walls label" +msgid "Infill Before Walls" +msgstr "先印填充再印牆壁" + +#: fdmprinter.def.json +msgctxt "infill_before_walls description" +msgid "" +"Print the infill before printing the walls. Printing the walls first may " +"lead to more accurate walls, but overhangs print worse. Printing the infill " +"first leads to sturdier walls, but the infill pattern might sometimes show " +"through the surface." +msgstr "" +"列印牆壁前先列印填充。先列印牆壁可以產生更精確的牆壁,但懸垂列印品質會較差。" +"先列印填充會產生更牢固的牆壁,但有時候填充的列印樣式會透過表面顯現出來。" + +#: fdmprinter.def.json +msgctxt "min_infill_area label" +msgid "Minimum Infill Area" +msgstr "最小填充區域" + +#: fdmprinter.def.json +msgctxt "min_infill_area description" +msgid "Don't generate areas of infill smaller than this (use skin instead)." +msgstr "不要產生小於此面積的填充區域(使用表層取代)。" + +#: fdmprinter.def.json +msgctxt "skin_preshrink label" +msgid "Skin Removal Width" +msgstr "表層移除寬度" + +#: fdmprinter.def.json +msgctxt "skin_preshrink description" +msgid "" +"The largest width of skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top/bottom skin at slanted surfaces " +"in the model." +msgstr "" +"要移除表層區域的最大寬度。寬度小於此值的表層區域將會消失。這有助於減少在列印" +"模型傾斜的頂部表層和底部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink label" +msgid "Top Skin Removal Width" +msgstr "頂部表層移除寬度" + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink description" +msgid "" +"The largest width of top skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top skin at slanted surfaces in the " +"model." +msgstr "" +"要移除頂部表層區域的最大寬度。寬度小於此值的頂部表層區域將會消失。這有助於減" +"少在列印模型傾斜的頂部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink label" +msgid "Bottom Skin Removal Width" +msgstr "底部表層移除寬度" + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink description" +msgid "" +"The largest width of bottom skin areas which are to be removed. Every skin " +"area smaller than this value will disappear. This can help in limiting the " +"amount of time and material spent on printing bottom skin at slanted " +"surfaces in the model." +msgstr "" +"要移除底部表層區域的最大寬度。寬度小於此值的底部表層區域將會消失。這有助於減" +"少在列印模型傾斜的底部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance label" +msgid "Skin Expand Distance" +msgstr "表層延伸距離" + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance description" +msgid "" +"The distance the skins are expanded into the infill. Higher values makes the " +"skin attach better to the infill pattern and makes the walls on neighboring " +"layers adhere better to the skin. Lower values save amount of material used." +msgstr "" +"表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使相鄰層的牆壁與表" +"層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance label" +msgid "Top Skin Expand Distance" +msgstr "頂部表層延伸距離" + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance description" +msgid "" +"The distance the top skins are expanded into the infill. Higher values makes " +"the skin attach better to the infill pattern and makes the walls on the " +"layer above adhere better to the skin. Lower values save amount of material " +"used." +msgstr "" +"頂部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使上方的牆壁與" +"表層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance label" +msgid "Bottom Skin Expand Distance" +msgstr "底部表層延伸距離" + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance description" +msgid "" +"The distance the bottom skins are expanded into the infill. Higher values " +"makes the skin attach better to the infill pattern and makes the skin adhere " +"better to the walls on the layer below. Lower values save amount of material " +"used." +msgstr "" +"底部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使下方的牆壁與" +"表層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion label" +msgid "Maximum Skin Angle for Expansion" +msgstr "最大延伸表層角度" + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion description" +msgid "" +"Top and/or bottom surfaces of your object with an angle larger than this " +"setting, won't have their top/bottom skin expanded. This avoids expanding " +"the narrow skin areas that are created when the model surface has a near " +"vertical slope. An angle of 0° is horizontal, while an angle of 90° is " +"vertical." +msgstr "" +"如果模型的頂部和/或底部表面的角度大於此設定,則不要延伸其頂部/底部表層。這會" +"避免延伸作用在模型表面有接近垂直的斜面時所形成的狹窄表層區域。0° 的角為水平," +"90° 的角為垂直。" + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion label" +msgid "Minimum Skin Width for Expansion" +msgstr "最小延伸表層寬度" + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion description" +msgid "" +"Skin areas narrower than this are not expanded. This avoids expanding the " +"narrow skin areas that are created when the model surface has a slope close " +"to the vertical." +msgstr "" +"如果表層區域寬度小於此值,則不會延伸。這會避免延伸在模型表面的斜度接近垂直時" +"所形成的狹窄表層區域。" + +#: fdmprinter.def.json +msgctxt "material label" +msgid "Material" +msgstr "耗材" + +#: fdmprinter.def.json +msgctxt "material description" +msgid "Material" +msgstr "耗材" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "自動溫度" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature description" +msgid "" +"Change the temperature for each layer automatically with the average flow " +"speed of that layer." +msgstr "根據每一層的平均流速自動更改每層的溫度。" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature label" +msgid "Default Printing Temperature" +msgstr "預設列印溫度" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature description" +msgid "" +"The default temperature used for printing. This should be the \"base\" " +"temperature of a material. All other print temperatures should use offsets " +"based on this value" +msgstr "" +"用於列印的預設溫度。應為耗材的\"基本\"溫度。所有其他列印溫度均應使用基於此值" +"的偏移量" + +#: fdmprinter.def.json +msgctxt "material_print_temperature label" +msgid "Printing Temperature" +msgstr "列印溫度" + +#: fdmprinter.def.json +msgctxt "material_print_temperature description" +msgid "The temperature used for printing." +msgstr "用於列印的溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 label" +msgid "Printing Temperature Initial Layer" +msgstr "列印溫度起始層" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 description" +msgid "" +"The temperature used for printing the first layer. Set at 0 to disable " +"special handling of the initial layer." +msgstr "用於列印第一層的溫度。設為 0 即關閉對起始層的特别處理。" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature label" +msgid "Initial Printing Temperature" +msgstr "起始列印溫度" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature description" +msgid "" +"The minimal temperature while heating up to the Printing Temperature at " +"which printing can already start." +msgstr "加熱到可以開始列印的列印溫度時的最低溫度。" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature label" +msgid "Final Printing Temperature" +msgstr "最終列印溫度" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature description" +msgid "" +"The temperature to which to already start cooling down just before the end " +"of printing." +msgstr "列印結束前開始冷卻的溫度。" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "流量溫度圖" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "數據連接耗材流量(mm3/s)到溫度(攝氏)。" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed label" +msgid "Extrusion Cool Down Speed Modifier" +msgstr "擠出降溫速度修正" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed description" +msgid "" +"The extra speed by which the nozzle cools while extruding. The same value is " +"used to signify the heat up speed lost when heating up while extruding." +msgstr "" +"解決在擠料的同時因為噴頭冷卻所造成的影響的額外速度修正。相同的值被用於表示在" +"擠壓時所失去的升溫速度。" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature label" +msgid "Build Plate Temperature" +msgstr "列印平台溫度" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature description" +msgid "" +"The temperature used for the heated build plate. If this is 0, the bed will " +"not heat up for this print." +msgstr "" +"用於加熱列印平台的溫度。如果列印平台溫度為 0,則熱床將不會為此次列印加熱。" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 label" +msgid "Build Plate Temperature Initial Layer" +msgstr "列印平台溫度起始層" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 description" +msgid "The temperature used for the heated build plate at the first layer." +msgstr "用於第一層加熱列印平台的溫度。" + +#: fdmprinter.def.json +msgctxt "material_diameter label" +msgid "Diameter" +msgstr "直徑" + +#: fdmprinter.def.json +msgctxt "material_diameter description" +msgid "" +"Adjusts the diameter of the filament used. Match this value with the " +"diameter of the used filament." +msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" + +#: fdmprinter.def.json +msgctxt "material_flow label" +msgid "Flow" +msgstr "流量" + +#: fdmprinter.def.json +msgctxt "material_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "流量補償:擠出的耗材量乘以此值。" + +#: fdmprinter.def.json +msgctxt "retraction_enable label" +msgid "Enable Retraction" +msgstr "啟用回抽" + +#: fdmprinter.def.json +msgctxt "retraction_enable description" +msgid "" +"Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "當噴頭移動到非列印區域上方時回抽耗材。" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change label" +msgid "Retract at Layer Change" +msgstr "列印下一層時回抽" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change description" +msgid "Retract the filament when the nozzle is moving to the next layer." +msgstr "當噴頭移動到下一層時回抽耗材。" + +#: fdmprinter.def.json +msgctxt "retraction_amount label" +msgid "Retraction Distance" +msgstr "回抽距離" + +#: fdmprinter.def.json +msgctxt "retraction_amount description" +msgid "The length of material retracted during a retraction move." +msgstr "回抽移動期間回抽的耗材長度。" + +#: fdmprinter.def.json +msgctxt "retraction_speed label" +msgid "Retraction Speed" +msgstr "回抽速度" + +#: fdmprinter.def.json +msgctxt "retraction_speed description" +msgid "" +"The speed at which the filament is retracted and primed during a retraction " +"move." +msgstr "回抽移動期間耗材回抽和裝填的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed label" +msgid "Retraction Retract Speed" +msgstr "回抽速度" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed description" +msgid "The speed at which the filament is retracted during a retraction move." +msgstr "回抽移動期間耗材回抽的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed label" +msgid "Retraction Prime Speed" +msgstr "回抽裝填速度" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed description" +msgid "The speed at which the filament is primed during a retraction move." +msgstr "回抽移動期間耗材裝填的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount label" +msgid "Retraction Extra Prime Amount" +msgstr "回抽額外裝填量" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount description" +msgid "" +"Some material can ooze away during a travel move, which can be compensated " +"for here." +msgstr "有些耗材可能會在空跑過程中滲出,可以在這裡對其進行補償。" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel label" +msgid "Retraction Minimum Travel" +msgstr "回抽最小空跑距離" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel description" +msgid "" +"The minimum distance of travel needed for a retraction to happen at all. " +"This helps to get fewer retractions in a small area." +msgstr "觸發回抽所需的最小空跑距離。這有助於減少小區域內的回抽次數。" + +#: fdmprinter.def.json +msgctxt "retraction_count_max label" +msgid "Maximum Retraction Count" +msgstr "最大回抽次數" + +#: fdmprinter.def.json +msgctxt "retraction_count_max description" +msgid "" +"This setting limits the number of retractions occurring within the minimum " +"extrusion distance window. Further retractions within this window will be " +"ignored. This avoids retracting repeatedly on the same piece of filament, as " +"that can flatten the filament and cause grinding issues." +msgstr "" +"此設定限制在最小擠出距離範圍內發生的回抽數。此範圍內的額外回抽將會忽略。這避" +"免了在同一件耗材上重複回抽,從而導致耗材變扁並引起磨損問題。" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window label" +msgid "Minimum Extrusion Distance Window" +msgstr "最小擠出距離範圍" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window description" +msgid "" +"The window in which the maximum retraction count is enforced. This value " +"should be approximately the same as the retraction distance, so that " +"effectively the number of times a retraction passes the same patch of " +"material is limited." +msgstr "" +"最大回抽次數範圍。此值應大致與回抽距離相等,從而有效地限制在同一段耗材上的回" +"抽次數。" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature label" +msgid "Standby Temperature" +msgstr "待機溫度" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature description" +msgid "" +"The temperature of the nozzle when another nozzle is currently used for " +"printing." +msgstr "當另一個噴頭進行列印時,這個噴頭要保持的溫度。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount label" +msgid "Nozzle Switch Retraction Distance" +msgstr "噴頭切換回抽距離" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount description" +msgid "" +"The amount of retraction: Set at 0 for no retraction at all. This should " +"generally be the same as the length of the heat zone." +msgstr "回抽量:設為 0,不進行任何回抽。該值通常應與加熱區的長度相同。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds label" +msgid "Nozzle Switch Retraction Speed" +msgstr "噴頭切換回抽速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds description" +msgid "" +"The speed at which the filament is retracted. A higher retraction speed " +"works better, but a very high retraction speed can lead to filament grinding." +msgstr "" +"回抽耗材的速度。較高的回抽速度效果較好,但回抽速度過高可能導致耗材磨損。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed label" +msgid "Nozzle Switch Retract Speed" +msgstr "噴頭切換回抽速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed description" +msgid "" +"The speed at which the filament is retracted during a nozzle switch retract." +msgstr "噴頭切換回抽期間耗材回抽的速度。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed label" +msgid "Nozzle Switch Prime Speed" +msgstr "噴頭切換裝填速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed description" +msgid "" +"The speed at which the filament is pushed back after a nozzle switch " +"retraction." +msgstr "噴頭切換回抽後耗材被推回的速度。" + +#: fdmprinter.def.json +msgctxt "speed label" +msgid "Speed" +msgstr "速度" + +#: fdmprinter.def.json +msgctxt "speed description" +msgid "Speed" +msgstr "速度" + +#: fdmprinter.def.json +msgctxt "speed_print label" +msgid "Print Speed" +msgstr "列印速度" + +#: fdmprinter.def.json +msgctxt "speed_print description" +msgid "The speed at which printing happens." +msgstr "開始列印的速度。" + +#: fdmprinter.def.json +msgctxt "speed_infill label" +msgid "Infill Speed" +msgstr "填充速度" + +#: fdmprinter.def.json +msgctxt "speed_infill description" +msgid "The speed at which infill is printed." +msgstr "列印填充的速度。" + +#: fdmprinter.def.json +msgctxt "speed_wall label" +msgid "Wall Speed" +msgstr "牆壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall description" +msgid "The speed at which the walls are printed." +msgstr "列印牆壁的速度。" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 label" +msgid "Outer Wall Speed" +msgstr "外壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 description" +msgid "" +"The speed at which the outermost walls are printed. Printing the outer wall " +"at a lower speed improves the final skin quality. However, having a large " +"difference between the inner wall speed and the outer wall speed will affect " +"quality in a negative way." +msgstr "" +"列印最外壁的速度。以較低速度列印外壁可改善最終表層品質。但是,如果內壁速度和" +"外壁速度差距過大,則將對品質產生負面影響。" + +#: fdmprinter.def.json +msgctxt "speed_wall_x label" +msgid "Inner Wall Speed" +msgstr "內壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall_x description" +msgid "" +"The speed at which all inner walls are printed. Printing the inner wall " +"faster than the outer wall will reduce printing time. It works well to set " +"this in between the outer wall speed and the infill speed." +msgstr "" +"列印所有內壁的速度。以比外壁更快的速度列印內壁將減少列印時間。將該值設為外壁" +"速度和填充速度之間也可行。" + +#: fdmprinter.def.json +msgctxt "speed_roofing label" +msgid "Top Surface Skin Speed" +msgstr "頂部表層速度" + +#: fdmprinter.def.json +msgctxt "speed_roofing description" +msgid "The speed at which top surface skin layers are printed." +msgstr "列印頂部表層的速度。" + +#: fdmprinter.def.json +msgctxt "speed_topbottom label" +msgid "Top/Bottom Speed" +msgstr "頂部/底部速度" + +#: fdmprinter.def.json +msgctxt "speed_topbottom description" +msgid "The speed at which top/bottom layers are printed." +msgstr "列印頂部/底部層的速度。" + +#: fdmprinter.def.json +msgctxt "speed_support label" +msgid "Support Speed" +msgstr "支撐速度" + +#: fdmprinter.def.json +msgctxt "speed_support description" +msgid "" +"The speed at which the support structure is printed. Printing support at " +"higher speeds can greatly reduce printing time. The surface quality of the " +"support structure is not important since it is removed after printing." +msgstr "" +"在列印支撐結構時的速度。以更高的速度列印支撐可以大大減少列印時間。因為支撐在" +"列印後會被清除,所以表面品質並不重要。" + +#: fdmprinter.def.json +msgctxt "speed_support_infill label" +msgid "Support Infill Speed" +msgstr "支撐填充速度" + +#: fdmprinter.def.json +msgctxt "speed_support_infill description" +msgid "" +"The speed at which the infill of support is printed. Printing the infill at " +"lower speeds improves stability." +msgstr "列印支撐填充的速度。以較低的速度列印填充可改善穩定性。" + +#: fdmprinter.def.json +msgctxt "speed_support_interface label" +msgid "Support Interface Speed" +msgstr "支撐介面速度" + +#: fdmprinter.def.json +msgctxt "speed_support_interface description" +msgid "" +"The speed at which the roofs and floors of support are printed. Printing " +"them at lower speeds can improve overhang quality." +msgstr "列印支撐頂板和底板的速度。以較低的速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "speed_support_roof label" +msgid "Support Roof Speed" +msgstr "支撐頂板速度" + +#: fdmprinter.def.json +msgctxt "speed_support_roof description" +msgid "" +"The speed at which the roofs of support are printed. Printing them at lower " +"speeds can improve overhang quality." +msgstr "列印支撐頂板的速度。以較低的速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "speed_support_bottom label" +msgid "Support Floor Speed" +msgstr "支撐底板速度" + +#: fdmprinter.def.json +msgctxt "speed_support_bottom description" +msgid "" +"The speed at which the floor of support is printed. Printing it at lower " +"speed can improve adhesion of support on top of your model." +msgstr "列印支撐底板的速度。以較低的速度列印可以改善支撐在模型頂部的附著。" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower label" +msgid "Prime Tower Speed" +msgstr "換料塔速度" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower description" +msgid "" +"The speed at which the prime tower is printed. Printing the prime tower " +"slower can make it more stable when the adhesion between the different " +"filaments is suboptimal." +msgstr "" +"列印換料塔的速度。當不同耗材之間的黏合力不佳時,較慢地列印速度可以讓它更穩" +"定。" + +#: fdmprinter.def.json +msgctxt "speed_travel label" +msgid "Travel Speed" +msgstr "空跑速度" + +#: fdmprinter.def.json +msgctxt "speed_travel description" +msgid "The speed at which travel moves are made." +msgstr "噴頭在非列印時的移動速度。" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 label" +msgid "Initial Layer Speed" +msgstr "起始層速度" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 description" +msgid "" +"The speed for the initial layer. A lower value is advised to improve " +"adhesion to the build plate." +msgstr "起始層的速度。建議採用較低的值以便改善與列印平台的附著。" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 label" +msgid "Initial Layer Print Speed" +msgstr "起始層列印速度" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 description" +msgid "" +"The speed of printing for the initial layer. A lower value is advised to " +"improve adhesion to the build plate." +msgstr "列印起始層的速度。建議採用較低的值以便改善與列印平台的附著。" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 label" +msgid "Initial Layer Travel Speed" +msgstr "起始層空跑速度" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 description" +msgid "" +"The speed of travel moves in the initial layer. A lower value is advised to " +"prevent pulling previously printed parts away from the build plate. The " +"value of this setting can automatically be calculated from the ratio between " +"the Travel Speed and the Print Speed." +msgstr "" +"起始層中的空跑速度。建議採用較低的值,以防止將之前列印的部分從列印平台上拉" +"離。該設定的值可以根據空跑速度和列印速度的比率自動計算得出。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed label" +msgid "Skirt/Brim Speed" +msgstr "外圍/邊緣速度" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed description" +msgid "" +"The speed at which the skirt and brim are printed. Normally this is done at " +"the initial layer speed, but sometimes you might want to print the skirt or " +"brim at a different speed." +msgstr "" +"列印外圍和邊緣的速度。一般情况是以起始層速度列印這些部分,但有時候你可能想要" +"以不同速度來列印外圍或邊緣。" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override label" +msgid "Maximum Z Speed" +msgstr "最大 Z 軸速度" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override description" +msgid "" +"The maximum speed with which the build plate is moved. Setting this to zero " +"causes the print to use the firmware defaults for the maximum z speed." +msgstr "" +"列印平台移動的最大速度。將該值設為零會使列印為最大 Z 速度採用韌體預設值。" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers label" +msgid "Number of Slower Layers" +msgstr "慢速列印層數" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers description" +msgid "" +"The first few layers are printed slower than the rest of the model, to get " +"better adhesion to the build plate and improve the overall success rate of " +"prints. The speed is gradually increased over these layers." +msgstr "" +"前幾層的列印速度比模型的其他層慢,以便實現與列印平台的更好附著,並改善整體的" +"列印成功率。該速度在這些層中會逐漸增加。" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled label" +msgid "Equalize Filament Flow" +msgstr "均衡耗材流量" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled description" +msgid "" +"Print thinner than normal lines faster so that the amount of material " +"extruded per second remains the same. Thin pieces in your model might " +"require lines printed with smaller line width than provided in the settings. " +"This setting controls the speed changes for such lines." +msgstr "" +"以較快的速度列印比正常線條更細的線條,使每秒擠出的耗材量保持相同。模型中較薄" +"的部分可能需要以低於設定中所提供寬度的線寬來列印線條。該設定控制這些線條的速" +"度變化。" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max label" +msgid "Maximum Speed for Flow Equalization" +msgstr "流量均衡的最大速度" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max description" +msgid "" +"Maximum print speed when adjusting the print speed in order to equalize flow." +msgstr "調整列印速度以便均衡流量時的最大列印速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled label" +msgid "Enable Acceleration Control" +msgstr "啟用加速度控制" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled description" +msgid "" +"Enables adjusting the print head acceleration. Increasing the accelerations " +"can reduce printing time at the cost of print quality." +msgstr "啟用調整噴頭的加速度。增加加速度可以減少列印時間卻會犧牲列印品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_print label" +msgid "Print Acceleration" +msgstr "列印加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_print description" +msgid "The acceleration with which printing happens." +msgstr "列印發生的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_infill label" +msgid "Infill Acceleration" +msgstr "填充加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_infill description" +msgid "The acceleration with which infill is printed." +msgstr "列印填充的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall label" +msgid "Wall Acceleration" +msgstr "牆壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall description" +msgid "The acceleration with which the walls are printed." +msgstr "列印牆壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 label" +msgid "Outer Wall Acceleration" +msgstr "外壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 description" +msgid "The acceleration with which the outermost walls are printed." +msgstr "列印最外壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x label" +msgid "Inner Wall Acceleration" +msgstr "內壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x description" +msgid "The acceleration with which all inner walls are printed." +msgstr "列印所有內壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_roofing label" +msgid "Top Surface Skin Acceleration" +msgstr "頂部表層加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_roofing description" +msgid "The acceleration with which top surface skin layers are printed." +msgstr "列印頂部表層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom label" +msgid "Top/Bottom Acceleration" +msgstr "頂部/底部加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom description" +msgid "The acceleration with which top/bottom layers are printed." +msgstr "列印頂部/底部層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support label" +msgid "Support Acceleration" +msgstr "支撐加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support description" +msgid "The acceleration with which the support structure is printed." +msgstr "列印支撐的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill label" +msgid "Support Infill Acceleration" +msgstr "支撐填充加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill description" +msgid "The acceleration with which the infill of support is printed." +msgstr "列印支撐填充的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface label" +msgid "Support Interface Acceleration" +msgstr "支撐介面加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface description" +msgid "" +"The acceleration with which the roofs and floors of support are printed. " +"Printing them at lower acceleration can improve overhang quality." +msgstr "列印支撐頂板和底板的加速度。以較低的加速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof label" +msgid "Support Roof Acceleration" +msgstr "支撐頂板加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof description" +msgid "" +"The acceleration with which the roofs of support are printed. Printing them " +"at lower acceleration can improve overhang quality." +msgstr "列印支撐頂板的加速度。以較低的加速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom label" +msgid "Support Floor Acceleration" +msgstr "支撐底板加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom description" +msgid "" +"The acceleration with which the floors of support are printed. Printing them " +"at lower acceleration can improve adhesion of support on top of your model." +msgstr "列印支撐底板的加速度。以較低的加速度列印可以改善支撐在模型頂部的附著。" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower label" +msgid "Prime Tower Acceleration" +msgstr "換料塔加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower description" +msgid "The acceleration with which the prime tower is printed." +msgstr "列印換料塔的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_travel label" +msgid "Travel Acceleration" +msgstr "空跑加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_travel description" +msgid "The acceleration with which travel moves are made." +msgstr "進行空跑的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 label" +msgid "Initial Layer Acceleration" +msgstr "起始層加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 description" +msgid "The acceleration for the initial layer." +msgstr "起始層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 label" +msgid "Initial Layer Print Acceleration" +msgstr "起始層列印加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 description" +msgid "The acceleration during the printing of the initial layer." +msgstr "列印起始層時的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 label" +msgid "Initial Layer Travel Acceleration" +msgstr "起始層空跑加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "起始層中的空跑加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim label" +msgid "Skirt/Brim Acceleration" +msgstr "外圍/邊緣加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim description" +msgid "" +"The acceleration with which the skirt and brim are printed. Normally this is " +"done with the initial layer acceleration, but sometimes you might want to " +"print the skirt or brim at a different acceleration." +msgstr "" +"列印外圍和邊緣的加速度。一般情况是以起始層加速度列印這些部分,但有時候你可能" +"想要以不同加速度來列印外圍或邊緣。" + +#: fdmprinter.def.json +msgctxt "jerk_enabled label" +msgid "Enable Jerk Control" +msgstr "啟用加加速度控制" + +#: fdmprinter.def.json +msgctxt "jerk_enabled description" +msgid "" +"Enables adjusting the jerk of print head when the velocity in the X or Y " +"axis changes. Increasing the jerk can reduce printing time at the cost of " +"print quality." +msgstr "" +"啟用當 X 或 Y 軸的速度變化時調整列印頭的加加速度。提高加加速度可以通過以列印" +"品質為代價來縮短列印時間。" + +#: fdmprinter.def.json +msgctxt "jerk_print label" +msgid "Print Jerk" +msgstr "列印加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_print description" +msgid "The maximum instantaneous velocity change of the print head." +msgstr "列印頭的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_infill label" +msgid "Infill Jerk" +msgstr "填充加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_infill description" +msgid "The maximum instantaneous velocity change with which infill is printed." +msgstr "列印填充時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall label" +msgid "Wall Jerk" +msgstr "牆壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall description" +msgid "" +"The maximum instantaneous velocity change with which the walls are printed." +msgstr "列印牆壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 label" +msgid "Outer Wall Jerk" +msgstr "外壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 description" +msgid "" +"The maximum instantaneous velocity change with which the outermost walls are " +"printed." +msgstr "列印最外壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x label" +msgid "Inner Wall Jerk" +msgstr "內壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x description" +msgid "" +"The maximum instantaneous velocity change with which all inner walls are " +"printed." +msgstr "列印所有內壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_roofing label" +msgid "Top Surface Skin Jerk" +msgstr "頂部表層加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_roofing description" +msgid "" +"The maximum instantaneous velocity change with which top surface skin layers " +"are printed." +msgstr "列印頂部表層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom label" +msgid "Top/Bottom Jerk" +msgstr "頂部/底部加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom description" +msgid "" +"The maximum instantaneous velocity change with which top/bottom layers are " +"printed." +msgstr "列印頂部/底部層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support label" +msgid "Support Jerk" +msgstr "支撐加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support description" +msgid "" +"The maximum instantaneous velocity change with which the support structure " +"is printed." +msgstr "列印支撐結構時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill label" +msgid "Support Infill Jerk" +msgstr "支撐填充加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill description" +msgid "" +"The maximum instantaneous velocity change with which the infill of support " +"is printed." +msgstr "列印支撐填充時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface label" +msgid "Support Interface Jerk" +msgstr "支撐介面加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface description" +msgid "" +"The maximum instantaneous velocity change with which the roofs and floors of " +"support are printed." +msgstr "列印支撐頂板和底板的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_roof label" +msgid "Support Roof Jerk" +msgstr "支撐頂板加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_roof description" +msgid "" +"The maximum instantaneous velocity change with which the roofs of support " +"are printed." +msgstr "列印支撐頂板的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom label" +msgid "Support Floor Jerk" +msgstr "支撐底板加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom description" +msgid "" +"The maximum instantaneous velocity change with which the floors of support " +"are printed." +msgstr "列印支撐底板時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower label" +msgid "Prime Tower Jerk" +msgstr "換料塔加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower description" +msgid "" +"The maximum instantaneous velocity change with which the prime tower is " +"printed." +msgstr "列印換料塔時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_travel label" +msgid "Travel Jerk" +msgstr "空跑加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_travel description" +msgid "" +"The maximum instantaneous velocity change with which travel moves are made." +msgstr "進行空跑時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 label" +msgid "Initial Layer Jerk" +msgstr "起始層加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 description" +msgid "The print maximum instantaneous velocity change for the initial layer." +msgstr "起始層的列印最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 label" +msgid "Initial Layer Print Jerk" +msgstr "起始層列印加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 description" +msgid "" +"The maximum instantaneous velocity change during the printing of the initial " +"layer." +msgstr "列印起始層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 label" +msgid "Initial Layer Travel Jerk" +msgstr "起始層空跑加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "起始層中的空跑加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim label" +msgid "Skirt/Brim Jerk" +msgstr "外圍/邊緣加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim description" +msgid "" +"The maximum instantaneous velocity change with which the skirt and brim are " +"printed." +msgstr "列印外圍和邊緣時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "travel label" +msgid "Travel" +msgstr "空跑" + +#: fdmprinter.def.json +msgctxt "travel description" +msgid "travel" +msgstr "空跑" + +#: fdmprinter.def.json +msgctxt "retraction_combing label" +msgid "Combing Mode" +msgstr "梳理模式" + +#: fdmprinter.def.json +msgctxt "retraction_combing description" +msgid "" +"Combing keeps the nozzle within already printed areas when traveling. This " +"results in slightly longer travel moves but reduces the need for " +"retractions. If combing is off, the material will retract and the nozzle " +"moves in a straight line to the next point. It is also possible to avoid " +"combing over top/bottom skin areas by combing within the infill only." +msgstr "" +"梳理可在空跑時讓噴頭保持在已列印區域內。這會使空跑距離稍微延長,但可減少回抽" +"需求。如果關閉梳理,則耗材將回抽,且噴頭沿著直線移動到下一個點。也可以通過僅" +"在填充內進行梳理避免梳理頂部/底部表層區域。" + +#: fdmprinter.def.json +msgctxt "retraction_combing option off" +msgid "Off" +msgstr "關" + +#: fdmprinter.def.json +msgctxt "retraction_combing option all" +msgid "All" +msgstr "所有" + +#: fdmprinter.def.json +msgctxt "retraction_combing option noskin" +msgid "No Skin" +msgstr "表層除外" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall label" +msgid "Retract Before Outer Wall" +msgstr "列印外壁前先進行回抽" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall description" +msgid "Always retract when moving to start an outer wall." +msgstr "當移動到外牆起始點時總是進行回抽。" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts label" +msgid "Avoid Printed Parts When Traveling" +msgstr "空跑時避開已列印部分" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts description" +msgid "" +"The nozzle avoids already printed parts when traveling. This option is only " +"available when combing is enabled." +msgstr "噴頭會在空跑時避開已列印的部分。此選項僅在啟用梳理功能時可用。" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance label" +msgid "Travel Avoid Distance" +msgstr "空跑避開距離" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance description" +msgid "" +"The distance between the nozzle and already printed parts when avoiding " +"during travel moves." +msgstr "噴頭和已列印部分之間在空跑時避開的距離。" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position label" +msgid "Start Layers with the Same Part" +msgstr "在相同的位置列印新層" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position description" +msgid "" +"In each layer start with printing the object near the same point, so that we " +"don't start a new layer with printing the piece which the previous layer " +"ended with. This makes for better overhangs and small parts, but increases " +"printing time." +msgstr "" +"每一層都在相同點附近開始列印,這樣在列印新的一層時,就不需要列印前一層結束時" +"的那一小段區域。在懸垂部分和小零件有良好的效果,但會增加列印時間。" + +#: fdmprinter.def.json +msgctxt "layer_start_x label" +msgid "Layer Start X" +msgstr "每層列印起始點的 X 座標" + +#: fdmprinter.def.json +msgctxt "layer_start_x description" +msgid "" +"The X coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "每一層列印起始點附近位置的 X 坐標。" + +#: fdmprinter.def.json +msgctxt "layer_start_y label" +msgid "Layer Start Y" +msgstr "每層列印起始點的 Y 座標" + +#: fdmprinter.def.json +msgctxt "layer_start_y description" +msgid "" +"The Y coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "每一層列印起始點附近位置的 Y 坐標。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled label" +msgid "Z Hop When Retracted" +msgstr "回抽時 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled description" +msgid "" +"Whenever a retraction is done, the build plate is lowered to create " +"clearance between the nozzle and the print. It prevents the nozzle from " +"hitting the print during travel moves, reducing the chance to knock the " +"print from the build plate." +msgstr "" +"每當回抽完成時,列印平台會降低以便在噴頭和列印品之間形成空隙。它可以防止噴頭" +"在空跑過程中撞到列印品,降低將列印品從列印平台撞掉的幾率。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides label" +msgid "Z Hop Only Over Printed Parts" +msgstr "僅在已列印部分上 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides description" +msgid "" +"Only perform a Z Hop when moving over printed parts which cannot be avoided " +"by horizontal motion by Avoid Printed Parts when Traveling." +msgstr "" +"僅在移動到無法通過“空跑時避開已列印部分”選項的水平操作避開的已列印部分上方時" +"執行 Z 抬升。" + +#: fdmprinter.def.json +msgctxt "retraction_hop label" +msgid "Z Hop Height" +msgstr "Z 抬升高度" + +#: fdmprinter.def.json +msgctxt "retraction_hop description" +msgid "The height difference when performing a Z Hop." +msgstr "執行 Z 抬升的高度差。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch label" +msgid "Z Hop After Extruder Switch" +msgstr "擠出機切換後的 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch description" +msgid "" +"After the machine switched from one extruder to the other, the build plate " +"is lowered to create clearance between the nozzle and the print. This " +"prevents the nozzle from leaving oozed material on the outside of a print." +msgstr "" +"當機器從一個擠出機切換到另一個時,列印平台會降低以便在噴頭和列印品之間形成空" +"隙。這將防止噴頭在列印品外部留下滲出物。" + +#: fdmprinter.def.json +msgctxt "cooling label" +msgid "Cooling" +msgstr "冷卻" + +#: fdmprinter.def.json +msgctxt "cooling description" +msgid "Cooling" +msgstr "冷卻" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled label" +msgid "Enable Print Cooling" +msgstr "開啟列印冷卻" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled description" +msgid "" +"Enables the print cooling fans while printing. The fans improve print " +"quality on layers with short layer times and bridging / overhangs." +msgstr "" +"列印時啟用列印冷卻風扇。風扇可以在列印時間較短的層和橋接/懸垂結構提高列印品" +"質。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed label" +msgid "Fan Speed" +msgstr "風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed description" +msgid "The speed at which the print cooling fans spin." +msgstr "列印冷卻風扇旋轉的速度。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min label" +msgid "Regular Fan Speed" +msgstr "標準風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min description" +msgid "" +"The speed at which the fans spin before hitting the threshold. When a layer " +"prints faster than the threshold, the fan speed gradually inclines towards " +"the maximum fan speed." +msgstr "" +"在單層列印時間大於門檻值時,風扇運轉的速度。當單層列印時間小於門檻值時,系統" +"會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但" +"不會超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max label" +msgid "Maximum Fan Speed" +msgstr "最大風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max description" +msgid "" +"The speed at which the fans spin on the minimum layer time. The fan speed " +"gradually increases between the regular fan speed and maximum fan speed when " +"the threshold is hit." +msgstr "" +"在“最短單層列印時間”時,風扇運轉的速度。當單層列印時間小於門檻值時,系統會根" +"據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會" +"超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max label" +msgid "Regular/Maximum Fan Speed Threshold" +msgstr "標準風扇轉速門檻值" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max description" +msgid "" +"The layer time which sets the threshold between regular fan speed and " +"maximum fan speed. Layers that print slower than this time use regular fan " +"speed. For faster layers the fan speed gradually increases towards the " +"maximum fan speed." +msgstr "" +"使用標準風扇轉速的單層列印時間門檻值。如果單層列印時間大於這個門檻值,就使用" +"標準風扇轉速。如果單層列印時間比這個門檻值短,系統會根據單層列印時間決定使用" +"的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 label" +msgid "Initial Fan Speed" +msgstr "起始層風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 description" +msgid "" +"The speed at which the fans spin at the start of the print. In subsequent " +"layers the fan speed is gradually increased up to the layer corresponding to " +"Regular Fan Speed at Height." +msgstr "" +"列印起始層時的風扇轉速。在隨後的層中,風扇轉速會逐漸增加到對應層所設定的速" +"度。" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height label" +msgid "Regular Fan Speed at Height" +msgstr "標準風扇轉速(高度)" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height description" +msgid "" +"The height at which the fans spin on regular fan speed. At the layers below " +"the fan speed gradually increases from Initial Fan Speed to Regular Fan " +"Speed." +msgstr "" +"使用標準風扇轉速的高度。風扇轉速會從起始轉速逐漸增加,在此高度達到標準風扇轉" +"速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer label" +msgid "Regular Fan Speed at Layer" +msgstr "標準風扇轉速(層)" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer description" +msgid "" +"The layer at which the fans spin on regular fan speed. If regular fan speed " +"at height is set, this value is calculated and rounded to a whole number." +msgstr "" +"要使用標準風扇轉速的層。如果標準風扇轉速高度已被設定,這個值將使用計算出來後" +"取四捨五入的整數值。" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time label" +msgid "Minimum Layer Time" +msgstr "最短單層列印時間" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time description" +msgid "" +"The minimum time spent in a layer. This forces the printer to slow down, to " +"at least spend the time set here in one layer. This allows the printed " +"material to cool down properly before printing the next layer. Layers may " +"still take shorter than the minimal layer time if Lift Head is disabled and " +"if the Minimum Speed would otherwise be violated." +msgstr "" +"單層列印時間的下限。這會迫使印表機減速,以便在單層列印中消耗此處所規定的時" +"間。這會讓模型充分冷卻後再列印下一層。如果“噴頭抬升”功能被關閉,為了不違反“最" +"低列印速度”,單層列印時間仍有可能低於此設定值。" + +#: fdmprinter.def.json +msgctxt "cool_min_speed label" +msgid "Minimum Speed" +msgstr "最低列印速度" + +#: fdmprinter.def.json +msgctxt "cool_min_speed description" +msgid "" +"The minimum print speed, despite slowing down due to the minimum layer time. " +"When the printer would slow down too much, the pressure in the nozzle would " +"be too low and result in bad print quality." +msgstr "" +"列印速度的下限,限制因“最短單層列印時間”的減速。當印表機減速過多時,噴頭中的" +"壓力將過低並導致較差的列印品質。" + +#: fdmprinter.def.json +msgctxt "cool_lift_head label" +msgid "Lift Head" +msgstr "噴頭抬升" + +#: fdmprinter.def.json +msgctxt "cool_lift_head description" +msgid "" +"When the minimum speed is hit because of minimum layer time, lift the head " +"away from the print and wait the extra time until the minimum layer time is " +"reached." +msgstr "" +"當“最短單層列印時間”受到“最低列印速度”限制時,將噴頭從模型上抬高,並等候達到" +"最短單層列印時間。" + +#: fdmprinter.def.json +msgctxt "support label" +msgid "Support" +msgstr "支撐" + +#: fdmprinter.def.json +msgctxt "support description" +msgid "Support" +msgstr "支撐" + +#: fdmprinter.def.json +msgctxt "support_enable label" +msgid "Generate Support" +msgstr "產生支撐" + +#: fdmprinter.def.json +msgctxt "support_enable description" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "" +"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" +"塌。" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr label" +msgid "Support Extruder" +msgstr "支撐用擠出機" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr description" +msgid "" +"The extruder train to use for printing the support. This is used in multi-" +"extrusion." +msgstr "用於列印支撐的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr label" +msgid "Support Infill Extruder" +msgstr "支撐填充擠出機" + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr description" +msgid "" +"The extruder train to use for printing the infill of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐填充的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 label" +msgid "First Layer Support Extruder" +msgstr "第一層支撐擠出機" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 description" +msgid "" +"The extruder train to use for printing the first layer of support infill. " +"This is used in multi-extrusion." +msgstr "用於列印支撐填充第一層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr label" +msgid "Support Interface Extruder" +msgstr "支撐介面擠出機" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs and floors of the support. " +"This is used in multi-extrusion." +msgstr "用於列印支撐頂板和底板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr label" +msgid "Support Roof Extruder" +msgstr "支撐頂板擠出機" + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐頂板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr label" +msgid "Support Floor Extruder" +msgstr "支撐底板擠出機" + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr description" +msgid "" +"The extruder train to use for printing the floors of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐底板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_type label" +msgid "Support Placement" +msgstr "支撐位置" + +#: fdmprinter.def.json +msgctxt "support_type description" +msgid "" +"Adjusts the placement of the support structures. The placement can be set to " +"touching build plate or everywhere. When set to everywhere the support " +"structures will also be printed on the model." +msgstr "" +"調整支撐結構的位置。位置可以設定為“接觸列印平台”或“每個地方”。當設定為“每個地" +"方”時,在模型上也會列印支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_type option buildplate" +msgid "Touching Buildplate" +msgstr "接觸列印平台" + +#: fdmprinter.def.json +msgctxt "support_type option everywhere" +msgid "Everywhere" +msgstr "每個地方" + +#: fdmprinter.def.json +msgctxt "support_angle label" +msgid "Support Overhang Angle" +msgstr "支撐懸垂角度" + +#: fdmprinter.def.json +msgctxt "support_angle description" +msgid "" +"The minimum angle of overhangs for which support is added. At a value of 0° " +"all overhangs are supported, 90° will not provide any support." +msgstr "" +"添加支撐的最小懸垂角度。當角度為 0° 時,將支撐所有懸垂,當角度為 90° 時,不提" +"供任何支撐。" + +#: fdmprinter.def.json +msgctxt "support_pattern label" +msgid "Support Pattern" +msgstr "支撐列印樣式" + +#: fdmprinter.def.json +msgctxt "support_pattern description" +msgid "" +"The pattern of the support structures of the print. The different options " +"available result in sturdy or easy to remove support." +msgstr "支撐結構的列印樣式。有不同的選項可產生堅固的或容易清除的支撐。" + +#: fdmprinter.def.json +msgctxt "support_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_pattern option cross" +msgid "Cross" +msgstr "十字形" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags label" +msgid "Connect Support ZigZags" +msgstr "連接支撐鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags description" +msgid "" +"Connect the ZigZags. This will increase the strength of the zig zag support " +"structure." +msgstr "連接鋸齒狀。這將增加鋸齒狀支撐結構的强度。" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "將支撐拆成塊狀" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "" +"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "支撐塊大小" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "支撐塊線條數" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "支撐密度" + +#: fdmprinter.def.json +msgctxt "support_infill_rate description" +msgid "" +"Adjusts the density of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "調整支撐結構的密度。較高的值會實現更好的懸垂,但支撐將更加難以移除。" + +#: fdmprinter.def.json +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "支撐線條間距" + +#: fdmprinter.def.json +msgctxt "support_line_distance description" +msgid "" +"Distance between the printed support structure lines. This setting is " +"calculated by the support density." +msgstr "已列印支撐結構線條之間的距離。該設定通過支撐密度計算。" + +#: fdmprinter.def.json +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "支撐 Z 間距" + +#: fdmprinter.def.json +msgctxt "support_z_distance description" +msgid "" +"Distance from the top/bottom of the support structure to the print. This gap " +"provides clearance to remove the supports after the model is printed. This " +"value is rounded up to a multiple of the layer height." +msgstr "" +"支撐結構距離模型頂部/底部的距離。這一個小的差距使得它更容易被去除,這個數值會" +"被無條件進位到層高的倍數。" + +#: fdmprinter.def.json +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "支撐頂部間距" + +#: fdmprinter.def.json +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "從支撐頂部到列印品的距離。" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "支撐底部間距" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "從列印品到支撐底部的距離。" + +#: fdmprinter.def.json +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "支撐 X/Y 間距" + +#: fdmprinter.def.json +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "支撐結構在 X/Y 方向距列印品的距離。" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "支撐間距優先權" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z description" +msgid "" +"Whether the Support X/Y Distance overrides the Support Z Distance or vice " +"versa. When X/Y overrides Z the X/Y distance can push away the support from " +"the model, influencing the actual Z distance to the overhang. We can disable " +"this by not applying the X/Y distance around overhangs." +msgstr "" +"支撐 X/Y 間距是否優先於支撐 Z 間距的設定。當 X/Y 間距優先於 Z 時,X/Y 間距可" +"將支撐從模型上推離,同時影響與懸垂之間的實際 Z 間距。我們可以通過不在懸垂周圍" +"套用 X/Y 間距來關閉此選項。" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X/Y 優先 Z" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z 優先 X/Y" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "最小支撐 X/Y 間距" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang description" +msgid "" +"Distance of the support structure from the overhang in the X/Y directions. " +msgstr "支撐結構在 X/Y 方向與懸垂的間距。" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "支撐階梯高度" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height description" +msgid "" +"The height of the steps of the stair-like bottom of support resting on the " +"model. A low value makes the support harder to remove, but too high values " +"can lead to unstable support structures. Set to zero to turn off the stair-" +"like behaviour." +msgstr "" +"模型上的支撐階梯狀底部的階梯高度。較低的值會使支撐更難於移除,但過高的值可能" +"導致不穩定的支撐結構。設為零可以關閉階梯狀行為。" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width label" +msgid "Support Stair Step Maximum Width" +msgstr "支撐階梯最大寬度" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width description" +msgid "" +"The maximum width of the steps of the stair-like bottom of support resting " +"on the model. A low value makes the support harder to remove, but too high " +"values can lead to unstable support structures." +msgstr "" +"停留在模型上的支撐階梯狀底部的最大階梯寬度。較低的值會使支撐更難於移除,但過" +"高的值可能導致不穩定的支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "支撐結合距離" + +#: fdmprinter.def.json +msgctxt "support_join_distance description" +msgid "" +"The maximum distance between support structures in the X/Y directions. When " +"seperate structures are closer together than this value, the structures " +"merge into one." +msgstr "" +"支撐結構間在 X/Y 方向的最大距離。當分離結構之間的距離小於此值時,這些結構將合" +"併為一個。" + +#: fdmprinter.def.json +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "支撐水平擴展" + +#: fdmprinter.def.json +msgctxt "support_offset description" +msgid "" +"Amount of offset applied to all support polygons in each layer. Positive " +"values can smooth out the support areas and result in more sturdy support." +msgstr "" +"套用到每一層所有支撐多邊形的偏移量。正值可以讓支撐區域更平滑,並產生更為牢固" +"的支撐。" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness label" +msgid "Support Infill Layer Thickness" +msgstr "支撐填充層厚度" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness description" +msgid "" +"The thickness per layer of support infill material. This value should always " +"be a multiple of the layer height and is otherwise rounded." +msgstr "" +"支撐填充耗材每層的厚度。該值應為層高的倍數,否則數值會被四捨五入到層高的倍" +"數。" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps label" +msgid "Gradual Support Infill Steps" +msgstr "漸進支撐填充步階" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps description" +msgid "" +"Number of times to reduce the support infill density by half when getting " +"further below top surfaces. Areas which are closer to top surfaces get a " +"higher density, up to the Support Infill Density." +msgstr "" +"從支撐頂層往下,填充密度減半的次數。越靠近頂層的填充密度越高,最高密度為支撐" +"填充密度。" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height label" +msgid "Gradual Support Infill Step Height" +msgstr "漸進支撐填充步階高度" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height description" +msgid "" +"The height of support infill of a given density before switching to half the " +"density." +msgstr "支撐層密度減半的厚度。" + +#: fdmprinter.def.json +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "啟用支撐介面" + +#: fdmprinter.def.json +msgctxt "support_interface_enable description" +msgid "" +"Generate a dense interface between the model and the support. This will " +"create a skin at the top of the support on which the model is printed and at " +"the bottom of the support, where it rests on the model." +msgstr "" +"在模型和支撐之間產生一個密度較高的介面。這會在承載模型的支撐頂部和座落在模型" +"上的支撐底部創造出一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_roof_enable label" +msgid "Enable Support Roof" +msgstr "啟用支撐頂板" + +#: fdmprinter.def.json +msgctxt "support_roof_enable description" +msgid "" +"Generate a dense slab of material between the top of support and the model. " +"This will create a skin between the model and support." +msgstr "" +"在支撐頂部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable label" +msgid "Enable Support Floor" +msgstr "啟用支撐底板" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable description" +msgid "" +"Generate a dense slab of material between the bottom of the support and the " +"model. This will create a skin between the model and support." +msgstr "" +"在支撐底部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "支撐介面厚度" + +#: fdmprinter.def.json +msgctxt "support_interface_height description" +msgid "" +"The thickness of the interface of the support where it touches with the " +"model on the bottom or the top." +msgstr "支撐與模型在底部或頂部接觸的介面厚度。" + +#: fdmprinter.def.json +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "支撐頂板厚度" + +#: fdmprinter.def.json +msgctxt "support_roof_height description" +msgid "" +"The thickness of the support roofs. This controls the amount of dense layers " +"at the top of the support on which the model rests." +msgstr "支撐頂板的厚度。這會控制承載模型的支撐頂部密集層的數量。" + +#: fdmprinter.def.json +msgctxt "support_bottom_height label" +msgid "Support Floor Thickness" +msgstr "支撐底板厚度" + +#: fdmprinter.def.json +msgctxt "support_bottom_height description" +msgid "" +"The thickness of the support floors. This controls the number of dense " +"layers that are printed on top of places of a model on which support rests." +msgstr "支撐底板的厚度。這會控制座落在模型上的支撐底部密集層的數量。" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "支撐介面解析度" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height description" +msgid "" +"When checking where there's model above and below the support, take steps of " +"the given height. Lower values will slice slower, while higher values may " +"cause normal support to be printed in some places where there should have " +"been support interface." +msgstr "" +"在檢查支撐上方或下方是否有模型時,所採用步階的高度。值越低切片速度越慢,而較" +"高的值會導致在部分應有支撐介面的位置列印一般的支撐。" + +#: fdmprinter.def.json +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "支撐介面密度" + +#: fdmprinter.def.json +msgctxt "support_interface_density description" +msgid "" +"Adjusts the density of the roofs and floors of the support structure. A " +"higher value results in better overhangs, but the supports are harder to " +"remove." +msgstr "" +"調整支撐結構頂板和底板的密度。較高的值會實現更好的懸垂,但支撐將更加難以移" +"除。" + +#: fdmprinter.def.json +msgctxt "support_roof_density label" +msgid "Support Roof Density" +msgstr "支撐頂板密度" + +#: fdmprinter.def.json +msgctxt "support_roof_density description" +msgid "" +"The density of the roofs of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "支撐結構頂板的密度。較高的值會讓懸垂印得更好,但支撐將更加難以移除。" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance label" +msgid "Support Roof Line Distance" +msgstr "支撐頂板線條距離" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance description" +msgid "" +"Distance between the printed support roof lines. This setting is calculated " +"by the Support Roof Density, but can be adjusted separately." +msgstr "支撐頂板線條之間的距離。該設定是通過支撐頂板密度計算,但可以單獨調整。" + +#: fdmprinter.def.json +msgctxt "support_bottom_density label" +msgid "Support Floor Density" +msgstr "支撐底板密度" + +#: fdmprinter.def.json +msgctxt "support_bottom_density description" +msgid "" +"The density of the floors of the support structure. A higher value results " +"in better adhesion of the support on top of the model." +msgstr "支撐結構底板的密度。較高的值會讓支撐更容易附著在模型上。" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance label" +msgid "Support Floor Line Distance" +msgstr "支撐底板線條距離" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance description" +msgid "" +"Distance between the printed support floor lines. This setting is calculated " +"by the Support Floor Density, but can be adjusted separately." +msgstr "支撐底板線條之間的距離。該設定是通過支撐底板密度計算,但可以單獨調整。" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "支撐介面列印樣式" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern description" +msgid "" +"The pattern with which the interface of the support with the model is " +"printed." +msgstr "支撐與模型之間介面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern label" +msgid "Support Roof Pattern" +msgstr "支撐頂板列印樣式" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern description" +msgid "The pattern with which the roofs of the support are printed." +msgstr "列印支撐頂板的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "立體同心圓" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern label" +msgid "Support Floor Pattern" +msgstr "支撐底板列印樣式" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern description" +msgid "The pattern with which the floors of the support are printed." +msgstr "列印支撐底板的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "使用塔型支撐" + +#: fdmprinter.def.json +msgctxt "support_use_towers description" +msgid "" +"Use specialized towers to support tiny overhang areas. These towers have a " +"larger diameter than the region they support. Near the overhang the towers' " +"diameter decreases, forming a roof." +msgstr "" +"使用專門的塔來支撐較小的懸垂區域。這些塔的直徑比它們所支撐的區域要大。在靠近" +"懸垂物時,塔的直徑減小,形成頂板。" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "塔直徑" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "特殊塔的直徑。" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "最小直徑" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter description" +msgid "" +"Minimum diameter in the X/Y directions of a small area which is to be " +"supported by a specialized support tower." +msgstr "小區域中支撐塔的 X/Y 軸方向最小直徑。" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "塔頂板角度" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle description" +msgid "" +"The angle of a rooftop of a tower. A higher value results in pointed tower " +"roofs, a lower value results in flattened tower roofs." +msgstr "塔頂角度。該值越高,塔頂越尖,值越低,塔頂越平。" + +#: fdmprinter.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: fdmprinter.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "附著" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable label" +msgid "Enable Prime Blob" +msgstr "啟用少量裝填" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable description" +msgid "" +"Whether to prime the filament with a blob before printing. Turning this " +"setting on will ensure that the extruder will have material ready at the " +"nozzle before printing. Printing Brim or Skirt can act like priming too, in " +"which case turning this setting off saves some time." +msgstr "" +"列印前是否裝填少量的耗材。開啟此設定將確保列印前擠出機的噴頭處已準備好耗材。" +"列印邊緣或外圍也可作為裝填用途,這種情况下關閉此設定可以節省時間。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "擠出機 X 軸起始位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 X 軸上初始位置。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "擠出機 Y 軸起始位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" + +#: fdmprinter.def.json +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "列印平台附著類型" + +#: fdmprinter.def.json +msgctxt "adhesion_type description" +msgid "" +"Different options that help to improve both priming your extrusion and " +"adhesion to the build plate. Brim adds a single layer flat area around the " +"base of your model to prevent warping. Raft adds a thick grid with a roof " +"below the model. Skirt is a line printed around the model, but not connected " +"to the model." +msgstr "" +"幫助改善擠出裝填以及與列印平台附著的不同選項。邊緣會在模型基座周圍添加單層平" +"面區域,以防止翹曲。木筏會在模型底下添加一個有頂板的厚網格。外圍是在模型四周" +"列印的一條線,但並不與模型連接。" + +#: fdmprinter.def.json +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr "外圍" + +#: fdmprinter.def.json +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "邊緣" + +#: fdmprinter.def.json +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "木筏" + +#: fdmprinter.def.json +msgctxt "adhesion_type option none" +msgid "None" +msgstr "無" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "列印平台附著擠出機" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr description" +msgid "" +"The extruder train to use for printing the skirt/brim/raft. This is used in " +"multi-extrusion." +msgstr "用於列印外圍/邊緣/木筏的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "外圍線條數量" + +#: fdmprinter.def.json +msgctxt "skirt_line_count description" +msgid "" +"Multiple skirt lines help to prime your extrusion better for small models. " +"Setting this to 0 will disable the skirt." +msgstr "" +"多條外圍線條有助你在列印小型模型時,更好地裝填的擠出機組。將其設為 0 將關閉外" +"圍。" + +#: fdmprinter.def.json +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "外圍間距" + +#: fdmprinter.def.json +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance, multiple skirt lines will extend outwards from " +"this distance." +msgstr "" +"外圍和列印第一層之間的水平距離。\n" +"這是最小距離,多個外圍線條將從此距離向外延伸。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "外圍/邊緣最小長度" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length description" +msgid "" +"The minimum length of the skirt or brim. If this length is not reached by " +"all skirt or brim lines together, more skirt or brim lines will be added " +"until the minimum length is reached. Note: If the line count is set to 0 " +"this is ignored." +msgstr "" +"外圍或邊緣的最小長度。如果所有外圍或邊緣線條之和都没有達到此長度,則將添加更" +"多外圍或邊緣線條直至達到最小長度。注意:如果線條計數設為 0,則將忽略此選項。" + +#: fdmprinter.def.json +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "邊緣寬度" + +#: fdmprinter.def.json +msgctxt "brim_width description" +msgid "" +"The distance from the model to the outermost brim line. A larger brim " +"enhances adhesion to the build plate, but also reduces the effective print " +"area." +msgstr "" +"模型到最外側邊緣線的距離。較大的邊緣可增强與列印平台的附著,但也會減少有效列" +"印區域。" + +#: fdmprinter.def.json +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "邊緣線條數量" + +#: fdmprinter.def.json +msgctxt "brim_line_count description" +msgid "" +"The number of lines used for a brim. More brim lines enhance adhesion to the " +"build plate, but also reduces the effective print area." +msgstr "" +"邊緣所用線條數量。更多邊緣線條可增强與列印平台的附著,但也會減少有效列印區" +"域。" + +#: fdmprinter.def.json +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "僅在外部列印邊緣" + +#: fdmprinter.def.json +msgctxt "brim_outside_only description" +msgid "" +"Only print the brim on the outside of the model. This reduces the amount of " +"brim you need to remove afterwards, while it doesn't reduce the bed adhesion " +"that much." +msgstr "" +"僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台" +"附著。" + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 label" +msgid "Initial Layer Z Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 description" +msgid "" +"The extruder is offset from the normal height of the first layer by this " +"amount. It can be positive (raised) or negative (lowered). Some filament " +"types adhere to the build plate better if the extruder is raised slightly." +msgstr "" +"擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下降)。" +"某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers label" +msgid "Z Offset Taper Layers" +msgstr "Z 軸偏移漸減層數" + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers description" +msgid "" +"When non-zero, the Z offset is reduced to 0 over that many layers. A value " +"of 0 means that the Z offset remains constant for all the layers in the " +"print." +msgstr "" +"當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列印" +"層的 Z 軸偏移量保持為固定值。" + +#: fdmprinter.def.json +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "木筏額外邊緣" + +#: fdmprinter.def.json +msgctxt "raft_margin description" +msgid "" +"If the raft is enabled, this is the extra raft area around the model which " +"is also given a raft. Increasing this margin will create a stronger raft " +"while using more material and leaving less area for your print." +msgstr "" +"如果啟用了木筏,在模型周圍也會增加額外邊緣。增大這個邊緣將產生更強的木筏,不" +"過也會使用更多的耗材,並減少印表機的可列印面積。" + +#: fdmprinter.def.json +msgctxt "raft_smoothing label" +msgid "Raft Smoothing" +msgstr "木筏平滑處理" + +#: fdmprinter.def.json +msgctxt "raft_smoothing description" +msgid "" +"This setting control how much inner corners in the raft outline are rounded. " +"Inward corners are rounded to a semi circle with a radius equal to the value " +"given here. This setting also removes holes in the raft outline which are " +"smaller than such a circle." +msgstr "" +"此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定" +"值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" + +#: fdmprinter.def.json +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "木筏間隙" + +#: fdmprinter.def.json +msgctxt "raft_airgap description" +msgid "" +"The gap between the final raft layer and the first layer of the model. Only " +"the first layer is raised by this amount to lower the bonding between the " +"raft layer and the model. Makes it easier to peel off the raft." +msgstr "" +"木筏最後一層與模型第一層之間的間隙。只有第一層被提高了這個距離,以便降低木筏" +"和模型之間的附著。讓木筏更容易剝離。" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "起始層 Z 重疊" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the model overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "" +"使模型的第一層和第二層在 Z 方向上重疊以補償在空隙中損失的耗材。第一個模型層上" +"方的所有模型將向下移動此重疊量。" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "木筏頂部層數" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers description" +msgid "" +"The number of top layers on top of the 2nd raft layer. These are fully " +"filled layers that the model sits on. 2 layers result in a smoother top " +"surface than 1." +msgstr "" +"位於木筏中層上方的頂部層數。這是承載模型的完全填充層。兩層會產生比一層更平滑" +"的頂部表面。" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "木筏頂部層厚" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "木筏頂部單層的厚度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "木筏頂部線寬" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width description" +msgid "" +"Width of the lines in the top surface of the raft. These can be thin lines " +"so that the top of the raft becomes smooth." +msgstr "木筏頂部表面的線寬。這些線條可以是細線,以便讓木筏頂部變得平滑。" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "木筏頂部間距" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing description" +msgid "" +"The distance between the raft lines for the top raft layers. The spacing " +"should be equal to the line width, so that the surface is solid." +msgstr "木筏頂部線條之間的距離。間距應等於線寬,以便打造堅固表面。" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "木筏中層厚度" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "木筏中層的層厚。" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "木筏中層線寬" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width description" +msgid "" +"Width of the lines in the middle raft layer. Making the second layer extrude " +"more causes the lines to stick to the build plate." +msgstr "木筏中層的線寬。第二層擠出多一些會讓線條附著在列印平台上。" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "木筏中層間距" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing description" +msgid "" +"The distance between the raft lines for the middle raft layer. The spacing " +"of the middle should be quite wide, while being dense enough to support the " +"top raft layers." +msgstr "" +"木筏中層線條之間的距離。中層的間距應足夠寬,同時也要足夠密集,以便支撐木筏頂" +"部。" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "木筏底部厚度" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness description" +msgid "" +"Layer thickness of the base raft layer. This should be a thick layer which " +"sticks firmly to the printer build plate." +msgstr "木筏底部的層厚。本層應為與印表機列印平台穩固附著厚實的一層。" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "木筏底部線寬" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width description" +msgid "" +"Width of the lines in the base raft layer. These should be thick lines to " +"assist in build plate adhesion." +msgstr "木筏底部的線寬。這些線條應該是粗線,以便協助列印平台附著。" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "木筏底部間距" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing description" +msgid "" +"The distance between the raft lines for the base raft layer. Wide spacing " +"makes for easy removal of the raft from the build plate." +msgstr "木筏底部線條之間的距離。寬間距方便讓木筏從列印平台移除。" + +#: fdmprinter.def.json +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "木筏列印速度" + +#: fdmprinter.def.json +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "列印木筏的速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "木筏頂部列印速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed description" +msgid "" +"The speed at which the top raft layers are printed. These should be printed " +"a bit slower, so that the nozzle can slowly smooth out adjacent surface " +"lines." +msgstr "" +"列印木筏頂部的速度。這些層應以稍慢的速度列印,以便噴頭緩慢地整平臨近的表面線" +"條。" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "木筏中層列印速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed description" +msgid "" +"The speed at which the middle raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"列印木筏中層的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" + +#: fdmprinter.def.json +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "木筏底部列印速度" + +#: fdmprinter.def.json +msgctxt "raft_base_speed description" +msgid "" +"The speed at which the base raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"列印木筏底部的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" + +#: fdmprinter.def.json +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "木筏列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "列印木筏的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "木筏頂部列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "列印木筏頂部的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "木筏中層列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "列印木筏中層的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "木筏底部列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "列印木筏底部的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "木筏列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "列印木筏的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "木筏頂部列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "列印木筏頂部的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "木筏中層列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "列印木筏中層的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "木筏底部列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "列印木筏底部的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "木筏風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "木筏的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "木筏頂部風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "木筏頂部的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "木筏中層風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "木筏中層的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "木筏底部風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "木筏底部的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "雙重擠出機" + +#: fdmprinter.def.json +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "用於多擠出機情況下的設定。" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "啟用換料塔" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable description" +msgid "" +"Print a tower next to the print which serves to prime the material after " +"each nozzle switch." +msgstr "在列印件旁邊印一個塔,用在每次切換噴頭後填充耗材。" + +#: fdmprinter.def.json +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "換料塔尺寸" + +#: fdmprinter.def.json +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "換料塔的寬度。" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "換料塔最小體積" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume description" +msgid "" +"The minimum volume for each layer of the prime tower in order to purge " +"enough material." +msgstr "為了清除足夠的耗材,換料塔每層的最小體積。" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "換料塔厚度" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness description" +msgid "" +"The thickness of the hollow prime tower. A thickness larger than half the " +"Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "" +"空心換料塔的厚度。如果厚度大於換料塔最小體積的一半,則將形成一個密集的換料" +"塔。" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "換料塔 X 位置" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "換料塔位置的 X 座標。" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "換料塔 Y 位置" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "換料塔位置的 Y 座標。" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "換料塔流量" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "流量補償:擠出的耗材量乘以此值。" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "在換料塔上擦拭非作用中的噴頭" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled description" +msgid "" +"After printing the prime tower with one nozzle, wipe the oozed material from " +"the other nozzle off on the prime tower." +msgstr "在一個噴頭列印換料塔後,在換料塔上擦拭另一個噴頭滲出的耗材。" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "切換後擦拭噴頭" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe description" +msgid "" +"After switching extruder, wipe the oozed material off of the nozzle on the " +"first thing printed. This performs a safe slow wipe move at a place where " +"the oozed material causes least harm to the surface quality of your print." +msgstr "" +"切換擠出機後,在列印的第一個物件上擦拭噴頭上的滲出耗材。這會在滲出耗材對列印" +"品表面品質造成最小損害的位置進行緩慢安全的擦拭動作。" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume label" +msgid "Prime Tower Purge Volume" +msgstr "換料塔清洗量" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume description" +msgid "" +"Amount of filament to be purged when wiping on the prime tower. Purging is " +"useful for compensating the filament lost by oozing during inactivity of the " +"nozzle." +msgstr "" +"在換料塔上進行擦拭時要清洗的耗材量。清洗可用於補償在噴頭不活動期間由於滲出而" +"損失的耗材。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "啟用擦拭牆" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled description" +msgid "" +"Enable exterior ooze shield. This will create a shell around the model which " +"is likely to wipe a second nozzle if it's at the same height as the first " +"nozzle." +msgstr "" +"啟用外部擦拭牆。這將在模型周圍創建一個外殼,如果與第一個噴頭處於相同的高度," +"則可能會擦拭第二個噴頭。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "擦拭牆角度" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle description" +msgid "" +"The maximum angle a part in the ooze shield will have. With 0 degrees being " +"vertical, and 90 degrees being horizontal. A smaller angle leads to less " +"failed ooze shields, but more material." +msgstr "" +"擦拭牆中的一部分的最大角度。0度為垂直,90度為水平。較小的角度擦拭效果較好,但" +"是要用更多的耗材。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr "擦拭牆距離" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "擦拭牆與模型間的水平 ( X/Y 方向 ) 距離。" + +#: fdmprinter.def.json +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "網格修復" + +#: fdmprinter.def.json +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "修復" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "合併重疊體積" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all description" +msgid "" +"Ignore the internal geometry arising from overlapping volumes within a mesh " +"and print the volumes as one. This may cause unintended internal cavities to " +"disappear." +msgstr "" +"忽略由網格內的重疊體積產生的內部幾何,並將多個部分作為一個列印。這可能會導致" +"意外的內部孔洞消失。" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "移除所有孔洞" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes description" +msgid "" +"Remove the holes in each layer and keep only the outside shape. This will " +"ignore any invisible internal geometry. However, it also ignores layer holes " +"which can be viewed from above or below." +msgstr "" +"移除每層的孔洞,僅保留外部形狀。這會忽略任何不可見的內部幾何。但是,也會忽略" +"可從上方或下方看到的層孔洞。" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "廣泛縫合" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching description" +msgid "" +"Extensive stitching tries to stitch up open holes in the mesh by closing the " +"hole with touching polygons. This option can introduce a lot of processing " +"time." +msgstr "" +"廣泛縫合嘗試通過接觸多邊形來閉合孔洞,以此縫合網格中的開孔。此選項可能會產生" +"大量的處理時間。" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "保持斷開表面" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons description" +msgid "" +"Normally Cura tries to stitch up small holes in the mesh and remove parts of " +"a layer with big holes. Enabling this option keeps those parts which cannot " +"be stitched. This option should be used as a last resort option when " +"everything else fails to produce proper GCode." +msgstr "" +"一般情况下,Cura 會嘗試縫合網格中的小孔,並移除有大孔的部分層。啟用此選項將保" +"留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用" +"作最後手段。" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "合併網格重疊" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap description" +msgid "" +"Make meshes which are touching each other overlap a bit. This makes them " +"bond together better." +msgstr "使彼此接觸的網格稍微重疊。使他們能更緊密地結合在一起。" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "刪除網格交集部分" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes description" +msgid "" +"Remove areas where multiple meshes are overlapping with each other. This may " +"be used if merged dual material objects overlap with each other." +msgstr "" +"刪除多個網格彼此重疊的區域。如果合併的雙重耗材對象彼此重疊,則可以使用此選" +"項。" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "交互移除網格重疊部分" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order description" +msgid "" +"Switch to which mesh intersecting volumes will belong with every layer, so " +"that the overlapping meshes become interwoven. Turning this setting off will " +"cause one of the meshes to obtain all of the volume in the overlap, while it " +"is removed from the other meshes." +msgstr "" +"將網格重疊的部分,交互的在每一層中歸屬到不同的網格,以便重疊的網格交織在一" +"起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移" +"除。" + +#: fdmprinter.def.json +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "特殊模式" + +#: fdmprinter.def.json +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "黑魔法" + +#: fdmprinter.def.json +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "列印順序" + +#: fdmprinter.def.json +msgctxt "print_sequence description" +msgid "" +"Whether to print all models one layer at a time or to wait for one model to " +"finish, before moving on to the next. One at a time mode is only possible if " +"all models are separated in such a way that the whole print head can move in " +"between and all models are lower than the distance between the nozzle and " +"the X/Y axes." +msgstr "" +"選擇一次列印一層中的所有模型或等待一個模型完成後再轉到下一個模型。排隊模式只" +"有在所有模型以一種整個列印頭可以在各個模型之間移動的方式分隔開,且所有模型都" +"低於噴頭和 X / Y 軸之間距離的情况下可用。" + +#: fdmprinter.def.json +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "同時列印" + +#: fdmprinter.def.json +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "排隊列印" + +#: fdmprinter.def.json +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "填充網格" + +#: fdmprinter.def.json +msgctxt "infill_mesh description" +msgid "" +"Use this mesh to modify the infill of other meshes with which it overlaps. " +"Replaces infill regions of other meshes with regions for this mesh. It's " +"suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "" +"使用此網格修改與其重疊的其他網格的填充。利用此網格的區域替換其他網格的填充區" +"域。建議僅為此網格列印一個壁,而不列印頂部/底部表層。" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "填充網格順序" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order description" +msgid "" +"Determines which infill mesh is inside the infill of another infill mesh. An " +"infill mesh with a higher order will modify the infill of infill meshes with " +"lower order and normal meshes." +msgstr "" +"確定哪個填充網格在另一個填充網格的填充內。順序較高的填充網格將修改順序較低的" +"填充網格以及普通網格的填充。" + +#: fdmprinter.def.json +msgctxt "cutting_mesh label" +msgid "Cutting Mesh" +msgstr "切割網格" + +#: fdmprinter.def.json +msgctxt "cutting_mesh description" +msgid "" +"Limit the volume of this mesh to within other meshes. You can use this to " +"make certain areas of one mesh print with different settings and with a " +"whole different extruder." +msgstr "" +"將此網格的體積限制在其他網格內。你可以使用它來制作採用不同的設定以及完全不同" +"的擠出機的網格列印的特定區域。" + +#: fdmprinter.def.json +msgctxt "mold_enabled label" +msgid "Mold" +msgstr "模具" + +#: fdmprinter.def.json +msgctxt "mold_enabled description" +msgid "" +"Print models as a mold, which can be cast in order to get a model which " +"resembles the models on the build plate." +msgstr "將模型作為模具列印,可進行鑄造,以便獲取與列印平台上的模型類似的模型。" + +#: fdmprinter.def.json +msgctxt "mold_width label" +msgid "Minimal Mold Width" +msgstr "最小模具寬度" + +#: fdmprinter.def.json +msgctxt "mold_width description" +msgid "" +"The minimal distance between the ouside of the mold and the outside of the " +"model." +msgstr "模具外側和模型外側之間的最小距離。" + +#: fdmprinter.def.json +msgctxt "mold_roof_height label" +msgid "Mold Roof Height" +msgstr "模具頂板高度" + +#: fdmprinter.def.json +msgctxt "mold_roof_height description" +msgid "The height above horizontal parts in your model which to print mold." +msgstr "用於列印模具的模型水平部分上方的高度。" + +#: fdmprinter.def.json +msgctxt "mold_angle label" +msgid "Mold Angle" +msgstr "模具角度" + +#: fdmprinter.def.json +msgctxt "mold_angle description" +msgid "" +"The angle of overhang of the outer walls created for the mold. 0° will make " +"the outer shell of the mold vertical, while 90° will make the outside of the " +"model follow the contour of the model." +msgstr "" +"為模具創建的外壁的懸垂角度。0° 將使模具的外殼垂直,而 90° 將使模型的外部遵循" +"模型的輪廓。" + +#: fdmprinter.def.json +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "支撐網格" + +#: fdmprinter.def.json +msgctxt "support_mesh description" +msgid "" +"Use this mesh to specify support areas. This can be used to generate support " +"structure." +msgstr "使用此網格指定支撐區域。可用於產生支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "下拉式支撐網格" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down description" +msgid "" +"Make support everywhere below the support mesh, so that there's no overhang " +"in the support mesh." +msgstr "在支撐網格下方的所有位置進行支撐,讓支撐網格中没有懸垂。" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "防懸網格" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh description" +msgid "" +"Use this mesh to specify where no part of the model should be detected as " +"overhang. This can be used to remove unwanted support structure." +msgstr "" +"使用此網格指定模型的任何部分不應被檢測為懸垂的區域。可用於移除不需要的支撐結" +"構。" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "表面模式" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode description" +msgid "" +"Treat the model as a surface only, a volume, or volumes with loose surfaces. " +"The normal print mode only prints enclosed volumes. \"Surface\" prints a " +"single wall tracing the mesh surface with no infill and no top/bottom skin. " +"\"Both\" prints enclosed volumes like normal and any remaining polygons as " +"surfaces." +msgstr "" +"將模型作為僅表面、一個空間或多個具有鬆散表面的空間處理。“正常”僅列印封閉的空" +"間。“表面”列印模型表面的單壁,没有填充,也没有頂部/底部表層。“兩者”將封閉空間" +"正常列印,並將任何剩餘多邊形作為表面列印。" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "正常" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "表面" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "兩者" + +#: fdmprinter.def.json +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "螺旋列印外輪廓" + +#: fdmprinter.def.json +msgctxt "magic_spiralize description" +msgid "" +"Spiralize smooths out the Z move of the outer edge. This will create a " +"steady Z increase over the whole print. This feature turns a solid model " +"into a single walled print with a solid bottom. This feature should only be " +"enabled when each layer only contains a single part." +msgstr "" +"螺旋列印實現外部邊緣的平滑 Z 移動。這會在整個列印上改成 Z 軸穩定增動。該功能" +"會將一個實心模型轉變為具有實體底部的單壁列印。只有在當每一層只包含一個封閉面" +"時才應啟用此功能。" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours label" +msgid "Smooth Spiralized Contours" +msgstr "平滑螺旋輪廓" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours description" +msgid "" +"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-" +"seam should be barely visible on the print but will still be visible in the " +"layer view). Note that smoothing will tend to blur fine surface details." +msgstr "" +"平滑螺旋輪廓可以減少 Z 縫的出現(Z 縫應在列印品上幾乎看不到,但在分層檢視中仍" +"然可見)。請注意,平滑操作將傾向於模糊精細的表面細節。" + +#: fdmprinter.def.json +msgctxt "relative_extrusion label" +msgid "Relative Extrusion" +msgstr "相對模式擠出" + +#: fdmprinter.def.json +msgctxt "relative_extrusion description" +msgid "" +"Use relative extrusion rather than absolute extrusion. Using relative E-" +"steps makes for easier post-processing of the Gcode. However, it's not " +"supported by all printers and it may produce very slight deviations in the " +"amount of deposited material compared to absolute E-steps. Irrespective of " +"this setting, the extrusion mode will always be set to absolute before any " +"Gcode script is output." +msgstr "" +"擠出控制使用相對模式而非絕對模式。使用相對的 E 步數使 G-code 在後處理上更為簡" +"便。然而並非所有印表機都支援此模式,而且和絕對的 E 步數相比,它可能在沉積耗材" +"的使用量上產生輕微的偏差。無論此設定為何,在輸出任何 G-code 腳本之前,擠出模" +"式將始終設定為絕對模式。" + +#: fdmprinter.def.json +msgctxt "experimental label" +msgid "Experimental" +msgstr "實驗性" + +#: fdmprinter.def.json +msgctxt "experimental description" +msgid "experimental!" +msgstr "實驗性!" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "最佳化牆壁列印順序" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "" +"Optimize the order in which walls are printed so as to reduce the number of " +"retractions and the distance travelled. Most parts will benefit from this " +"being enabled but some may actually take longer so please compare the print " +"time estimates with and without optimization." +msgstr "" +"最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的," +"但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled label" +msgid "Enable Draft Shield" +msgstr "啟用防風罩" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled description" +msgid "" +"This will create a wall around the model, which traps (hot) air and shields " +"against exterior airflow. Especially useful for materials which warp easily." +msgstr "" +"這將在模型周圍建立一個牆壁留住(熱)空氣並遮住外部氣流。對於容易翹曲的耗材非" +"常有用。" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist label" +msgid "Draft Shield X/Y Distance" +msgstr "防風罩 X/Y 距離" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist description" +msgid "Distance of the draft shield from the print, in the X/Y directions." +msgstr "防風罩與模型在 X/Y 軸方向的距離。" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation label" +msgid "Draft Shield Limitation" +msgstr "防風罩限高" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation description" +msgid "" +"Set the height of the draft shield. Choose to print the draft shield at the " +"full height of the model or at a limited height." +msgstr "設定防風罩的高度。選擇防風罩與模型同高或只列印到限制的高度。" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option full" +msgid "Full" +msgstr "完整" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option limited" +msgid "Limited" +msgstr "限制" + +#: fdmprinter.def.json +msgctxt "draft_shield_height label" +msgid "Draft Shield Height" +msgstr "防風罩高度" + +#: fdmprinter.def.json +msgctxt "draft_shield_height description" +msgid "" +"Height limitation of the draft shield. Above this height no draft shield " +"will be printed." +msgstr "防風罩的高度限制。超過這個高度就不再列印防風罩。" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled label" +msgid "Make Overhang Printable" +msgstr "使懸垂可列印" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled description" +msgid "" +"Change the geometry of the printed model such that minimal support is " +"required. Steep overhangs will become shallow overhangs. Overhanging areas " +"will drop down to become more vertical." +msgstr "" +"更改列印模型的幾何形狀,以最大程度減少需要的支撐。陡峭的懸垂物將變淺。懸垂區" +"域將下降變得更垂直。" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle label" +msgid "Maximum Model Angle" +msgstr "最大模型角度" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle description" +msgid "" +"The maximum angle of overhangs after the they have been made printable. At a " +"value of 0° all overhangs are replaced by a piece of model connected to the " +"build plate, 90° will not change the model in any way." +msgstr "" +"在懸垂變得可列印後懸垂的最大角度。當該值為 0° 時,所有懸垂將被與列印平台連接" +"的模型的一個部分替代,如果為 90° 時,不會以任何方式更改模型。" + +#: fdmprinter.def.json +msgctxt "coasting_enable label" +msgid "Enable Coasting" +msgstr "啟用滑行" + +#: fdmprinter.def.json +msgctxt "coasting_enable description" +msgid "" +"Coasting replaces the last part of an extrusion path with a travel path. The " +"oozed material is used to print the last piece of the extrusion path in " +"order to reduce stringing." +msgstr "" +"滑行會用一個空跑路徑替代擠出路徑的最後部分。滲出耗材用於列印擠出路徑的最後部" +"分,以便減少牽絲。" + +#: fdmprinter.def.json +msgctxt "coasting_volume label" +msgid "Coasting Volume" +msgstr "滑行體積" + +#: fdmprinter.def.json +msgctxt "coasting_volume description" +msgid "" +"The volume otherwise oozed. This value should generally be close to the " +"nozzle diameter cubed." +msgstr "不進行滑行時,會滲出的體積。該值一般應接近噴頭直徑的立方。" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume label" +msgid "Minimum Volume Before Coasting" +msgstr "滑行前最小體積" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume description" +msgid "" +"The smallest volume an extrusion path should have before allowing coasting. " +"For smaller extrusion paths, less pressure has been built up in the bowden " +"tube and so the coasted volume is scaled linearly. This value should always " +"be larger than the Coasting Volume." +msgstr "" +"可以進行滑行前,擠出路徑應有的最小體積。對於較小的擠出路徑,喉管內累積的壓力" +"較少,因此滑行體積採用線性比率縮小。該值應大於滑行體積。" + +#: fdmprinter.def.json +msgctxt "coasting_speed label" +msgid "Coasting Speed" +msgstr "滑行速度" + +#: fdmprinter.def.json +msgctxt "coasting_speed description" +msgid "" +"The speed by which to move during coasting, relative to the speed of the " +"extrusion path. A value slightly under 100% is advised, since during the " +"coasting move the pressure in the bowden tube drops." +msgstr "" +"滑行期間相對於擠出路徑的移動速度。建議採用略低於 100% 的值,因為在滑行移動期" +"間喉管中的壓力會下降。" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation label" +msgid "Alternate Skin Rotation" +msgstr "交替表層旋轉" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation description" +msgid "" +"Alternate the direction in which the top/bottom layers are printed. Normally " +"they are printed diagonally only. This setting adds the X-only and Y-only " +"directions." +msgstr "" +"交替列印頂部/底部層的方向。通常它們只進行對角線列印。此設定添加純 X 和純 Y 方" +"向。" + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size label" +msgid "Cross 3D Pocket Size" +msgstr "立體十字形氣囊大小" + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size description" +msgid "" +"The size of pockets at four-way crossings in the cross 3D pattern at heights " +"where the pattern is touching itself." +msgstr "立體十字形在樣式閉合的高度處,中央十字交叉的氣囊大小。" + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly label" +msgid "Alternate Cross 3D Pockets" +msgstr "交錯立體十字形氣囊" + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly description" +msgid "" +"Only apply pockets at half of the four-way crossings in the cross 3D pattern " +"and alternate the location of the pockets between heights where the pattern " +"is touching itself." +msgstr "" +"在立體十字形樣式中,只在半數樣式閉合的中央十字交叉處使用氣囊,並在高度上交錯" +"排列。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled label" +msgid "Spaghetti Infill" +msgstr "義大利麵式填充" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled description" +msgid "" +"Print the infill every so often, so that the filament will curl up " +"chaotically inside the object. This reduces print time, but the behaviour is " +"rather unpredictable." +msgstr "" +"經常列印填充,使得耗材在模型內部混亂地捲曲。這會縮短列印時間,但行為會難以預" +"測。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped label" +msgid "Spaghetti Infill Stepping" +msgstr "義大利麵式逐步填充" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped description" +msgid "" +"Whether to print spaghetti infill in steps or extrude all the infill " +"filament at the end of the print." +msgstr "是否逐步列印義大利麵式填充或在列印結束時一次擠出所有填充耗材。" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle label" +msgid "Spaghetti Maximum Infill Angle" +msgstr "義大利麵式填充 - 最大填充角度" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle description" +msgid "" +"The maximum angle w.r.t. the Z axis of the inside of the print for areas " +"which are to be filled with spaghetti infill afterwards. Lowering this value " +"causes more angled parts in your model to be filled on each layer." +msgstr "" +"允許延後填充義大利麵式填充的最大角度,取列印物內側與 Z 軸的夾角。降低此值會導" +"致模型中的更多有角度部位在各層填充。" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height label" +msgid "Spaghetti Infill Maximum Height" +msgstr "義大利麵式填充 - 最大填充高度" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height description" +msgid "" +"The maximum height of inside space which can be combined and filled from the " +"top." +msgstr "可以從頂部組合和填充的內部空間的最大高度。" + +#: fdmprinter.def.json +msgctxt "spaghetti_inset label" +msgid "Spaghetti Inset" +msgstr "義大利麵式填充內嵌" + +#: fdmprinter.def.json +msgctxt "spaghetti_inset description" +msgid "" +"The offset from the walls from where the spaghetti infill will be printed." +msgstr "列印義大利麵式填充開始位置與牆壁的偏移量。" + +#: fdmprinter.def.json +msgctxt "spaghetti_flow label" +msgid "Spaghetti Flow" +msgstr "義大利麵式填充流量" + +#: fdmprinter.def.json +msgctxt "spaghetti_flow description" +msgid "" +"Adjusts the density of the spaghetti infill. Note that the Infill Density " +"only controls the line spacing of the filling pattern, not the amount of " +"extrusion for spaghetti infill." +msgstr "" +"調整義大利麵式填充的密度。注意,填充密度僅控制填充列印樣式的線條間距,而不是" +"義大利麵式填充的擠出量。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume label" +msgid "Spaghetti Infill Extra Volume" +msgstr "義大利麵式填充額外體積" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume description" +msgid "" +"A correction term to adjust the total volume being extruded each time when " +"filling spaghetti." +msgstr "一個用於調整每次進行義大利麵式填充時擠出總量的修正項。" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled label" +msgid "Enable Conical Support" +msgstr "啟用錐形支撐" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled description" +msgid "" +"Experimental feature: Make support areas smaller at the bottom than at the " +"overhang." +msgstr "實驗性功能: 讓底部的支撐區域小於懸垂處的支撐區域。" + +#: fdmprinter.def.json +msgctxt "support_conical_angle label" +msgid "Conical Support Angle" +msgstr "錐形支撐角度" + +#: fdmprinter.def.json +msgctxt "support_conical_angle description" +msgid "" +"The angle of the tilt of conical support. With 0 degrees being vertical, and " +"90 degrees being horizontal. Smaller angles cause the support to be more " +"sturdy, but consist of more material. Negative angles cause the base of the " +"support to be wider than the top." +msgstr "" +"錐形支撐的傾斜角度。角度 0 度時為垂直,角度 90 度時為水平。較小的角度會讓支撐" +"更為牢固,但需要更多耗材。負值會讓支撐底座比頂部寬。" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width label" +msgid "Conical Support Minimum Width" +msgstr "錐形支撐最小寬度" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width description" +msgid "" +"Minimum width to which the base of the conical support area is reduced. " +"Small widths can lead to unstable support structures." +msgstr "錐形支撐區域底部的最小寬度。寬度較小可能導致不穩定的支撐結構。" + +#: fdmprinter.def.json +msgctxt "infill_hollow label" +msgid "Hollow Out Objects" +msgstr "挖空模型" + +#: fdmprinter.def.json +msgctxt "infill_hollow description" +msgid "" +"Remove all infill and make the inside of the object eligible for support." +msgstr "移除所有填充並讓模型內部可以進行支撐。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled label" +msgid "Fuzzy Skin" +msgstr "絨毛皮膚" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled description" +msgid "" +"Randomly jitter while printing the outer wall, so that the surface has a " +"rough and fuzzy look." +msgstr "在列印外牆時隨機抖動,使表面具有粗糙和模糊的外觀。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness label" +msgid "Fuzzy Skin Thickness" +msgstr "絨毛皮膚厚度" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness description" +msgid "" +"The width within which to jitter. It's advised to keep this below the outer " +"wall width, since the inner walls are unaltered." +msgstr "進行抖動的寬度。建議讓此值低於外壁寬度,因為內壁不會更改。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density label" +msgid "Fuzzy Skin Density" +msgstr "絨毛皮膚密度" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density description" +msgid "" +"The average density of points introduced on each polygon in a layer. Note " +"that the original points of the polygon are discarded, so a low density " +"results in a reduction of the resolution." +msgstr "" +"在每一層中,每個多邊形上改變的點的平均密度。注意,多邊形的原始點會被捨棄,因" +"此低密度導致解析度降低。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist label" +msgid "Fuzzy Skin Point Distance" +msgstr "絨毛皮膚距離" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist description" +msgid "" +"The average distance between the random points introduced on each line " +"segment. Note that the original points of the polygon are discarded, so a " +"high smoothness results in a reduction of the resolution. This value must be " +"higher than half the Fuzzy Skin Thickness." +msgstr "" +"在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此" +"高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled label" +msgid "Wire Printing" +msgstr "鐵絲網列印(以下簡稱 WP)" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled description" +msgid "" +"Print only the outside surface with a sparse webbed structure, printing 'in " +"thin air'. This is realized by horizontally printing the contours of the " +"model at given Z intervals which are connected via upward and diagonally " +"downward lines." +msgstr "" +"只列印一個具有稀疏網狀結構的外表面,在“稀疏的空中”列印。這是在给定的 Z 軸間隔" +"內,通過上行線和下行斜線連接,橫向列印模型的輪廓來實現的。" + +#: fdmprinter.def.json +msgctxt "wireframe_height label" +msgid "WP Connection Height" +msgstr "WP 連接高度" + +#: fdmprinter.def.json +msgctxt "wireframe_height description" +msgid "" +"The height of the upward and diagonally downward lines between two " +"horizontal parts. This determines the overall density of the net structure. " +"Only applies to Wire Printing." +msgstr "" +"兩個水平部分之間上行線和下行斜線的高度。這决定網狀結構的整體密度。僅套用於鐵" +"絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset label" +msgid "WP Roof Inset Distance" +msgstr "WP 頂板嵌入距離" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset description" +msgid "" +"The distance covered when making a connection from a roof outline inward. " +"Only applies to Wire Printing." +msgstr "在從頂板輪廓向內進行連接時所覆蓋的距離。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed label" +msgid "WP Speed" +msgstr "WP 速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed description" +msgid "" +"Speed at which the nozzle moves when extruding material. Only applies to " +"Wire Printing." +msgstr "擠出耗材時噴頭移動的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom label" +msgid "WP Bottom Printing Speed" +msgstr "WP 底部列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom description" +msgid "" +"Speed of printing the first layer, which is the only layer touching the " +"build platform. Only applies to Wire Printing." +msgstr "列印第一層的速度,該層是唯一接觸列印平台的層。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up label" +msgid "WP Upward Printing Speed" +msgstr "WP 上升列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up description" +msgid "" +"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgstr "在“稀疏的空中”向上列印線條的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down label" +msgid "WP Downward Printing Speed" +msgstr "WP 下降列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down description" +msgid "" +"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgstr "列印下行斜線的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat label" +msgid "WP Horizontal Printing Speed" +msgstr "WP 水平列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat description" +msgid "" +"Speed of printing the horizontal contours of the model. Only applies to Wire " +"Printing." +msgstr "列印模型水平輪廓的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow label" +msgid "WP Flow" +msgstr "WP 列印流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value. Only applies to Wire Printing." +msgstr "流量補償:擠出的耗材量乘以此值。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection label" +msgid "WP Connection Flow" +msgstr "WP 連接流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection description" +msgid "Flow compensation when going up or down. Only applies to Wire Printing." +msgstr "向上或向下時的流量補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat label" +msgid "WP Flat Flow" +msgstr "WP 平面流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat description" +msgid "" +"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgstr "列印平面線條時的流量補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay label" +msgid "WP Top Delay" +msgstr "WP 頂部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay description" +msgid "" +"Delay time after an upward move, so that the upward line can harden. Only " +"applies to Wire Printing." +msgstr "向上移動後的延遲時間,以便上行線條硬化。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay label" +msgid "WP Bottom Delay" +msgstr "WP 底部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay description" +msgid "Delay time after a downward move. Only applies to Wire Printing." +msgstr "向下移動後的延遲時間。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay label" +msgid "WP Flat Delay" +msgstr "WP 平面延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay description" +msgid "" +"Delay time between two horizontal segments. Introducing such a delay can " +"cause better adhesion to previous layers at the connection points, while too " +"long delays cause sagging. Only applies to Wire Printing." +msgstr "" +"兩個水平部分之間的延遲時間。引入這樣的延遲可以在連接點處與先前的層產生更好的" +"附著,而太長的延遲會引起下垂。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed label" +msgid "WP Ease Upward" +msgstr "WP 輕鬆上行" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed description" +msgid "" +"Distance of an upward move which is extruded with half speed.\n" +"This can cause better adhesion to previous layers, while not heating the " +"material in those layers too much. Only applies to Wire Printing." +msgstr "" +"以半速擠出的上行移動的距離。\n" +"這會與之前的層產生更好的附著,而不會將這些層中的耗材過度加熱。僅套用於鐵絲網" +"列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump label" +msgid "WP Knot Size" +msgstr "WP 紐結大小" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump description" +msgid "" +"Creates a small knot at the top of an upward line, so that the consecutive " +"horizontal layer has a better chance to connect to it. Only applies to Wire " +"Printing." +msgstr "" +"在上行線條的頂部創建一個小紐結,使連續的水平層有更好的機會與其連接。僅套用於" +"鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down label" +msgid "WP Fall Down" +msgstr "WP 倒塌" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down description" +msgid "" +"Distance with which the material falls down after an upward extrusion. This " +"distance is compensated for. Only applies to Wire Printing." +msgstr "耗材在向上擠出後倒塌的距離。將對此距離進行補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along label" +msgid "WP Drag Along" +msgstr "WP 拖行" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along description" +msgid "" +"Distance with which the material of an upward extrusion is dragged along " +"with the diagonally downward extrusion. This distance is compensated for. " +"Only applies to Wire Printing." +msgstr "" +"向上擠出耗材與斜向下擠出一起拖動的距離。將對此距離進行補償。僅套用於鐵絲網列" +"印。" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy label" +msgid "WP Strategy" +msgstr "WP 使用策略" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy description" +msgid "" +"Strategy for making sure two consecutive layers connect at each connection " +"point. Retraction lets the upward lines harden in the right position, but " +"may cause filament grinding. A knot can be made at the end of an upward line " +"to heighten the chance of connecting to it and to let the line cool; " +"however, it may require slow printing speeds. Another strategy is to " +"compensate for the sagging of the top of an upward line; however, the lines " +"won't always fall down as predicted." +msgstr "" +"用於確定兩個連續層在每個連接點連接的策略。回抽可讓上行線條在正確的位置硬化," +"但可能導致耗材磨損。紐結可以在上行線條的尾端進行打結以便提高與其連接的幾率," +"並讓線條冷卻;但這會需要較慢的列印速度。另一種策略是補償上行線條頂部的下垂;" +"然而,線條不會總是如預期的那樣下降。" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option compensate" +msgid "Compensate" +msgstr "補償" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option knot" +msgid "Knot" +msgstr "紐結" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option retract" +msgid "Retract" +msgstr "回抽" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down label" +msgid "WP Straighten Downward Lines" +msgstr "WP 拉直下行線條" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down description" +msgid "" +"Percentage of a diagonally downward line which is covered by a horizontal " +"line piece. This can prevent sagging of the top most point of upward lines. " +"Only applies to Wire Printing." +msgstr "" +"水平線條部分所覆蓋的斜下行線條的百分比。這可以防止上行線最頂端點下垂。僅套用" +"於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down label" +msgid "WP Roof Fall Down" +msgstr "WP 頂板倒塌" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down description" +msgid "" +"The distance which horizontal roof lines printed 'in thin air' fall down " +"when being printed. This distance is compensated for. Only applies to Wire " +"Printing." +msgstr "" +"列印時,在“稀疏的空中”列印的水平頂板線條倒塌的距離。將對此距離進行補償。僅套" +"用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along label" +msgid "WP Roof Drag Along" +msgstr "WP 頂板拖行" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along description" +msgid "" +"The distance of the end piece of an inward line which gets dragged along " +"when going back to the outer outline of the roof. This distance is " +"compensated for. Only applies to Wire Printing." +msgstr "" +"向內線的末端在返回至頂板外部輪廓時被拖行的距離。將對此距離進行補償。僅套用於" +"鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay label" +msgid "WP Roof Outer Delay" +msgstr "WP 頂板外部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay description" +msgid "" +"Time spent at the outer perimeters of hole which is to become a roof. Longer " +"times can ensure a better connection. Only applies to Wire Printing." +msgstr "" +"在成為頂板的孔的外圍花費的時間。較長的時間可確保更好的連接。僅套用於鐵絲網列" +"印。" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance label" +msgid "WP Nozzle Clearance" +msgstr "WP 噴頭間隙" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance description" +msgid "" +"Distance between the nozzle and horizontally downward lines. Larger " +"clearance results in diagonally downward lines with a less steep angle, " +"which in turn results in less upward connections with the next layer. Only " +"applies to Wire Printing." +msgstr "" +"噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的" +"上行連接較少。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "啟用燙平" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "" +"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" +"表面。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "只燙平最高層" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "" +"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" +"時間。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "燙平列印樣式" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "用於燙平頂部表面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "燙平線條間距" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "燙平線條之間的距離。" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "燙平流量" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "" +"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" +"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "燙平內嵌" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "" +"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "燙平速度" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "通過頂部表面的速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "燙平加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "執行燙平的加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "燙平加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "執行燙平時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "command_line_settings label" +msgid "Command Line Settings" +msgstr "命令行設定" + +#: fdmprinter.def.json +msgctxt "command_line_settings description" +msgid "" +"Settings which are only used if CuraEngine isn't called from the Cura " +"frontend." +msgstr "未從 Cura 前端調用 CuraEngine 時使用的設定。" + +#: fdmprinter.def.json +msgctxt "center_object label" +msgid "Center object" +msgstr "模型置中" + +#: fdmprinter.def.json +msgctxt "center_object description" +msgid "" +"Whether to center the object on the middle of the build platform (0,0), " +"instead of using the coordinate system in which the object was saved." +msgstr "是否將模型放置在列印平台中心 (0,0),而不是使用模型內儲存的座標系統。" + +#: fdmprinter.def.json +msgctxt "mesh_position_x label" +msgid "Mesh position x" +msgstr "網格位置 x" + +#: fdmprinter.def.json +msgctxt "mesh_position_x description" +msgid "Offset applied to the object in the x direction." +msgstr "套用在模型 x 方向上的偏移量。" + +#: fdmprinter.def.json +msgctxt "mesh_position_y label" +msgid "Mesh position y" +msgstr "網格位置 y" + +#: fdmprinter.def.json +msgctxt "mesh_position_y description" +msgid "Offset applied to the object in the y direction." +msgstr "套用在模型 y 方向上的偏移量。" + +#: fdmprinter.def.json +msgctxt "mesh_position_z label" +msgid "Mesh position z" +msgstr "網格位置 z" + +#: fdmprinter.def.json +msgctxt "mesh_position_z description" +msgid "" +"Offset applied to the object in the z direction. With this you can perform " +"what was used to be called 'Object Sink'." +msgstr "" +"套用在模型 z 方向上的偏移量。利用此選項,你可以執行過去被稱為“模型沉降”的操" +"作。" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix label" +msgid "Mesh Rotation Matrix" +msgstr "網格旋轉矩陣" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix description" +msgid "" +"Transformation matrix to be applied to the model when loading it from file." +msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" + +#~ msgctxt "wall_extruder_nr label" +#~ msgid "Wall Extruder" +#~ msgstr "牆壁擠出機" + +#~ msgctxt "wall_extruder_nr description" +#~ msgid "" +#~ "The extruder train used for printing the walls. This is used in multi-" +#~ "extrusion." +#~ msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" + +#~ msgctxt "infill_pattern option tetrahedral" +#~ msgid "Tetrahedral" +#~ msgstr "正四面體" + +#~ msgctxt "expand_skins_into_infill label" +#~ msgid "Expand Skins Into Infill" +#~ msgstr "將表層延伸到填充中" + +#~ msgctxt "expand_skins_into_infill description" +#~ msgid "" +#~ "Expand skin areas of top and/or bottom skin of flat surfaces. By default, " +#~ "skins stop under the wall lines that surround infill but this can lead to " +#~ "holes appearing when the infill density is low. This setting extends the " +#~ "skins beyond the wall lines so that the infill on the next layer rests on " +#~ "skin." +#~ msgstr "" +#~ "延伸平面頂部和/或底部表層的區域。預設情况下,表層會在環繞填充的壁線下方停" +#~ "止,但如果填充密度較低,則可能導致出現孔洞。該設定將表層延展到壁線以外,因" +#~ "此下一層的填充會座落在表層上。" + +#~ msgctxt "expand_upper_skins label" +#~ msgid "Expand Top Skins Into Infill" +#~ msgstr "將頂部表層延伸到填充中" + +#~ msgctxt "expand_upper_skins description" +#~ msgid "" +#~ "Expand the top skin areas (areas with air above) so that they support " +#~ "infill above." +#~ msgstr "延伸頂部表層區域(上方有空氣的區域),讓它們支撐上方的填充。" + +#~ msgctxt "expand_lower_skins label" +#~ msgid "Expand Bottom Skins Into Infill" +#~ msgstr "將底部表層延伸到填充中" + +#~ msgctxt "expand_lower_skins description" +#~ msgid "" +#~ "Expand the bottom skin areas (areas with air below) so that they are " +#~ "anchored by the infill layers above and below." +#~ msgstr "延伸底部表層區域(下方有空氣的區域),讓它們由上下的填充層錨定。" + +#~ msgctxt "support_skip_some_zags label" +#~ msgid "Skip Some ZigZags Connections" +#~ msgstr "跳過部分鋸齒狀連接" + +#~ msgctxt "support_zag_skip_count label" +#~ msgid "ZigZag Connection Skip Count" +#~ msgstr "鋸齒狀連接跳過計數" From 474e146c46b7c2b3bd0b1396fc63cc95a2665db2 Mon Sep 17 00:00:00 2001 From: anraf1001 Date: Wed, 22 Nov 2017 16:34:57 +0100 Subject: [PATCH 312/764] Polish translation - updated version --- resources/i18n/pl_PL/cura.po | 148 ++++++++++--------- resources/i18n/pl_PL/fdmextruder.def.json.po | 4 +- 2 files changed, 79 insertions(+), 73 deletions(-) diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index 9416935018..e162ba0e65 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-10-05 17:27+0200\n" +"PO-Revision-Date: 2017-11-22 16:19+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" @@ -93,7 +93,7 @@ msgstr "Plik wysłany do Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Otwórz Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -143,7 +143,7 @@ msgstr "Nie można uruchomić nowego zadania, ponieważ drukarka jest zajęta lu #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Drukarka Niedostępna" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -595,7 +595,7 @@ msgstr "Połącz przez sieć" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Nowe funkcje są dostępne dla twojej {machine_name}! Rekomendowane jest zaktualizowanie oprogramowania drukarki." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -606,7 +606,7 @@ msgstr "Nowe oprogramowanie %s jest dostępne" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Jak zaktualizować" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -641,7 +641,7 @@ msgstr "Błąd podczas rozpoczynania %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Widok symulacji" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -651,7 +651,7 @@ msgstr "Cura nie wyświetla dokładnie warstw kiedy drukowanie przewodowe jest w #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Widok symulacji" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -732,7 +732,7 @@ msgstr "Nie można pociąć z bieżącymi ustawieniami. Następujące ustawienia #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Nie można pokroić przez ustawienia osobne dla modelu. Następujące ustawienia mają błędy w jednym lub więcej modeli: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -767,25 +767,25 @@ msgstr "Konfiguruj ustawienia każdego modelu z osobna" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Zainstaluj" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Nie udało się skopiować plików pluginu Siemens NX. Proszę sprawdź twój UGII_USER_DIR. Nie jest ustawiony do folderu." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Udało się zainstalować plugin Cura Siemens NX." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Nie udało się skopiować plików pluginu Siemens NX. Proszę sprawdź twój UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Nie udało się zainstalować pluginu Siemens NX. Nie można ustawić zmiennej środowiskowej UGII_USER_DIR dla Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -948,7 +948,7 @@ msgstr "Inny" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Nieznany" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1013,12 +1013,12 @@ msgstr "Niestandardowy materiał" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Globalny" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Nie zastąpione" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1067,7 +1067,7 @@ msgstr "Wyeksportowano profil do {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Eksport udany" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1140,84 +1140,87 @@ msgid "" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" +"

    Wystąpił fatalny błąd. Proszę wyślij do nas ten Raport Błędu, abyśmy mogli naprawić błąd

    \n" +"

    Proszę użyj przycisku \"Wyślij raport\", aby wysłać raport błędu automatycznie na nasze serwery.

    \n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Informacje o systemie" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Nieznany" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Wersja Cura: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Platforma: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Wersja Qt: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Wersja PyQt: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Wersja OpenGL: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Wydawca OpenGL: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL Renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Śledzenie błędów" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Logi" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Opis użytkownika" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Wyślij raport" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1255,7 +1258,7 @@ msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się G-code. #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Wybrany model był zbyta mały do załadowania." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1633,7 +1636,7 @@ msgstr "%1 nie została ustawiona do hostowania grupy podłączonych drukarek Ul #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Otwiera stronę zadań drukowania w twojej domyślnej przeglądarce sieciowej." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1668,7 +1671,7 @@ msgstr "Utracone połączenie z drukarką" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Wyłączona" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1683,12 +1686,12 @@ msgstr "Zakończono" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Wstrzymana" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Wznawianie" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1830,12 +1833,12 @@ msgstr "Rodzaj linii" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Szybkość Posuwu" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Grubość warstwy" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1885,12 +1888,12 @@ msgstr "Wewnętrzna ściana" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "max" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2128,7 +2131,7 @@ msgstr "%1 poza %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Ładowanie projektu usunie wszystkie modele z platformy roboczej." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2172,6 +2175,9 @@ msgid "" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" +"Ten plugin zawiera licencje.\n" +"Musisz zaakceptować tę licencję, aby zainstalować ten plugin.\n" +"Akceptujesz poniższe postanowienia?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2186,7 +2192,7 @@ msgstr "Odrzuć" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Zgoda Użytkownika" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -3069,7 +3075,7 @@ msgstr "O Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "version: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3168,7 +3174,7 @@ msgstr "Biblioteka edytująca pola" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Biblioteka Python HTTP" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3188,7 +3194,7 @@ msgstr "Profil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Brak Dostępnego Profilu" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3301,44 +3307,44 @@ msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00godz. 00min." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Szacowany czas
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Szacowanie kosztów" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Razem:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3463,27 +3469,27 @@ msgstr "Przed drukowaniem podgrzej stół. W dalszym ciągu można dostosowywać #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Kontrola drukarką" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Pozycja Swobodnego Ruchu" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Dystans Swobodnego Ruchu" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3528,7 +3534,7 @@ msgstr "&Zamknij" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Zresetuj pozycję kamery" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3770,7 +3776,7 @@ msgstr "Importuj wszystkie jako modele" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Cura Ultimaker" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3927,7 +3933,7 @@ msgstr "Wysokość warstwy" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Niestandardowy profil jest obecnie aktywny. Aby włączyć pasek jakości, wybierz domyślny profil w zakładce Niestandardowe" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3947,7 +3953,7 @@ msgstr "Szybciej" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Zmodyfikowałeś ustawienia profilu. Jeżeli chcesz je zmienić, przejdź do trybu niestandardowego." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4039,7 +4045,7 @@ msgstr "Materiał" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Sprawdź kompatybilność" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4179,12 +4185,12 @@ msgstr "Integracja z SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Zapewnia widok Symulacji" #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Widok Symulacji" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4269,12 +4275,12 @@ msgstr "Ulepszenie Wersji 2.7 do 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Ulepsza konfigurację z Cura 3.0 do Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Ulepszenie Wersji 3.0 do 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4339,12 +4345,12 @@ msgstr "Narzędzie Ustawień dla Każdego Modelu" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Pomaga zainstalować przycisk 'eksportuj do Cura' w Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Integracja z Siemens NX" #: 3MFReader/plugin.json msgctxt "description" @@ -4409,12 +4415,12 @@ msgstr "3MF Writer" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Pyta użytkownika czy zgadza się z naszą licencją" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "ZgodaUżytkownika" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/pl_PL/fdmextruder.def.json.po b/resources/i18n/pl_PL/fdmextruder.def.json.po index beb84335cc..8e7a8c2084 100644 --- a/resources/i18n/pl_PL/fdmextruder.def.json.po +++ b/resources/i18n/pl_PL/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-04 12:25+0200\n" +"PO-Revision-Date: 2017-11-22 15:00+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Poedit 2.0.3\n" +"X-Generator: Poedit 2.0.4\n" #: fdmextruder.def.json msgctxt "machine_settings label" From b0e61c6e597210fff761bad615557cecbd5a9f93 Mon Sep 17 00:00:00 2001 From: Dinow Date: Wed, 22 Nov 2017 23:46:19 +0800 Subject: [PATCH 313/764] update from pot files --- resources/i18n/zh_TW/cura.po | 2029 +++++++++++------- resources/i18n/zh_TW/fdmextruder.def.json.po | 4 +- resources/i18n/zh_TW/fdmprinter.def.json.po | 586 +++-- 3 files changed, 1593 insertions(+), 1026 deletions(-) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 5cf77c1bbe..03be837a5b 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-25 08:53+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -18,68 +18,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.4\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "列印已取消" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "暫停" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "需要採取的動作" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "無法開始列印" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "完成時間:" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" - -#: Manually added for -#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" - -#: Manually added for -#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "列印已完成" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "外掛(&l)" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "瀏覽外掛..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "安裝外掛..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -117,19 +55,17 @@ msgstr "正在連接 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "取消" @@ -155,8 +91,11 @@ msgid "File sent to Doodle3D Connect" msgstr "檔案已被傳送到 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Open Connect.." msgctxt "@action:button" -msgid "Open Connect.." +msgid "Open Connect..." msgstr "開啟連線..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 @@ -164,7 +103,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "開啟 Doodle3D Connect 的網路介面" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "顯示更新日誌" @@ -199,40 +138,44 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "透過 USB 連接" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#, fuzzy +#| msgctxt "@label:PrintjobStatus" +#| msgid "Slicing unavailable" msgctxt "@info:title" -msgid "Print Details" -msgstr "列印細項設定" +msgid "Printer Unavailable" +msgstr "切片不可用" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "" "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "" "此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "" "Unable to start a new job because the printer does not support usb printing." msgstr "無法啟動新作業,因為該印表機不支援 USB 連線列印。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "警告" @@ -296,11 +239,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "無法儲存到行動裝置 {0}:{1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "錯誤" @@ -349,137 +292,115 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "行動裝置" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "網路連線列印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "網路連線列印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "" "Access to the printer requested. Please approve the request on the printer" msgstr "已發送印表機存取請求,請在印表機上批准該請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "連線狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "連線狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "重試" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "重新發送存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "印表機接受了存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "無法使用本印表機進行列印,無法發送列印作業。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "請求存取" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "向印表機發送存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "" "Connected over the network. Please approve the access request on the printer." msgstr "已透過網路連接。請在印表機上接受存取請求。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "已透過網路連接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "已透過網路連接,但沒有印表機的控制權限。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "存取請求被印表機上拒絕。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "存取請求超時失敗。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "網路連接中斷。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "" "The connection with the printer was lost. Check your printer to see if it is " "connected." msgstr "與印表機的連接中斷,請檢查印表機是否已連接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "" @@ -487,48 +408,42 @@ msgid "" "%s." msgstr "印表機無法啟動新的列印作業,目前的印表機狀態為 %s。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "印表機狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入列印頭。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "線軸 {0} 上沒有足夠的耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "不同的列印頭(Cura:{0},印表機: 為擠出機 {2} 選擇了 {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "你為擠出機 {2} 選擇了不同的耗材(Cura:{0},印表機:{1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "" @@ -536,14 +451,12 @@ msgid "" "performed on the printer." msgstr "列印頭 {0} 未正確校準。需要在印表機上執行 XY 校正。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "你確定要使用所選設定進行列印嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "" "There is a mismatch between the configuration or calibration of the printer " @@ -553,68 +466,65 @@ msgstr "" "印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列" "印頭和耗材設定進行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "設定不匹配" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "前一列印作業傳送中,暫停傳送新列印作業。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "正在向印表機發送資料" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "發送資料中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "無法向印表機發送資料。請確認是否有另一項列印作業正在進行?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "中斷列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "列印已中斷。請檢查印表機" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "暫停列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "繼續列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "與你的印表機同步" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "你想在 Cura 中使用目前的印表機設定嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "" "The PrintCores and/or materials on your printer differ from those within " @@ -624,18 +534,12 @@ msgstr "" "印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印" "表機的列印頭和耗材設定進行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "透過網路連接" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "" "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "" @@ -643,7 +547,7 @@ msgid "" "printers." msgstr "這台印表機是 {count} 台連線的 Ultimaker 3 印表機群組的主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "" "{printer_name} has finished printing '{job_name}'. Please collect the print " @@ -651,7 +555,8 @@ msgid "" msgstr "" "{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "" "{printer_name} is reserved to print '{job_name}'. Please change the " @@ -660,13 +565,7 @@ msgstr "" "{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業," "以便開始列印。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "" -"Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "前一列印作業傳送中,暫停傳送新列印作業。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "" "Unable to send new print job: this 3D printer is not (yet) set up to host a " @@ -675,60 +574,87 @@ msgstr "" "無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的" "主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "傳送 {file_name} 到群組 {cluster_name} 中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} 已傳送到群組 {cluster_name}。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "顯示列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "使用瀏覽器開啟列印作業介面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "無法傳送列印作業到群組 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} 已傳送到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "顯示列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "使用瀏覽器開啟列印作業介面。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "列印已完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "需要採取的動作" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "傳送 {file_name} 到群組 {cluster_name} 中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "透過網路連接" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "" "@info Don't translate {machine_name}, since it gets replaced by a printer " "name!" msgid "" -"To ensure that your {machine_name} is equipped with the latest features it " -"is recommended to update the firmware regularly. This can be done on the " -"{machine_name} (when connected to the network) or via USB." +"New features are available for your {machine_name}! It is recommended to " +"update the firmware on your printer." msgstr "" -"為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " -"{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "有新 %s 韌體可用" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "下載" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "無法存取升級資訊。" @@ -763,7 +689,30 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "啟動 %s 時發生錯誤!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +#, fuzzy +#| msgctxt "@item:inmenu" +#| msgid "Solid view" +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" +"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" +"(Layers)" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#, fuzzy +#| msgctxt "name" +#| msgid "Solid View" +msgctxt "@info:title" +msgid "Simulation View" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "修改 G-Code 檔案" @@ -795,23 +744,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-code 檔案" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "分層檢視" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "" -"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" -"(Layers)" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "分層檢視" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -846,8 +778,9 @@ msgstr "無法使用目前耗材切片,因為它與所選機器或設定不相 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "無法切片" @@ -860,13 +793,25 @@ msgid "" "errors: {0}" msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, fuzzy, python-brace-format +#| msgctxt "@info:status" +#| msgid "" +#| "Unable to slice with the current settings. The following settings have " +#| "errors: {0}" +msgctxt "@info:status" +msgid "" +"Unable to slice due to some per-model settings. The following settings have " +"errors on one or more models: {error_labels}" +msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "" "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "無法切片(原因:換料塔或主位置無效)。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "" "Nothing to slice because none of the models fit the build volume. Please " @@ -875,13 +820,13 @@ msgstr "" "沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列" "印範圍。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "正在處理層" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "資訊" @@ -896,14 +841,44 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "設定對每個模型的單獨設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Installed" +msgid "Install" +msgstr "已安裝" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " +"is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "" +"Failed to install Siemens NX plugin. Could not set environment variable " +"UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "推薦" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "自訂選項" @@ -914,29 +889,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 檔案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "噴頭" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "瀏覽外掛" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "無法從 {0} 取得外掛 ID" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "外掛瀏覽器" @@ -951,18 +921,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G 檔案" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "正在解析 G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code 細項設定" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "" "Make sure the g-code is suitable for your printer and printer configuration " @@ -1008,73 +978,81 @@ msgctxt "@action" msgid "Level build plate" msgstr "調平列印平台" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "外壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "內壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "表層" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "支撐填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "支撐介面" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "支撐" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "外圍" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "移動" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "回抽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "其它" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#, fuzzy +#| msgctxt "@label" +#| msgid "Unknown" +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "預切片檔案 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "未載入耗材" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "未知耗材" @@ -1101,13 +1079,13 @@ msgid "Can't Find Location" msgstr "無法找到位置" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "檔案已經存在" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "" @@ -1125,14 +1103,28 @@ msgctxt "@label" msgid "Custom Material" msgstr "自訂耗材" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#, fuzzy +#| msgctxt "@action:label" +#| msgid "%1 override" +#| msgid_plural "%1 overrides" +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "%1 覆寫" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "" "The selected material is incompatible with the selected machine or " "configuration." msgstr "所選耗材與所選機器或設定不相容。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1155,14 +1147,14 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "復原更改耗材直徑。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" "Failed to export profile to {0}: {1}" msgstr "無法將列印參數匯出至 {0}{1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "" @@ -1170,21 +1162,21 @@ msgid "" "failure." msgstr "無法將列印參數匯出至 {0}:寫入器外掛報告故障。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "列印參數已匯出至:{0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "匯出細項設定" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" @@ -1192,30 +1184,30 @@ msgid "" "message>" msgstr "無法從 {0} 匯入列印參數:{1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "已成功匯入列印參數 {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "列印參數 {0} 檔案類型未知或已損壞。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "自訂列印參數" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "列印參數缺少列印品質類型定義。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1246,46 +1238,124 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "擺放物件中" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "錯誤報告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" -"issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to " +"fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report " +"automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#, fuzzy +#| msgctxt "@info:title" +#| msgid "Information" +msgctxt "@title:groupbox" +msgid "System information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#, fuzzy +#| msgctxt "@label" +#| msgid "Unknown" +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    發生了致命錯誤,我們無法繼續!

    \n" -"

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" -" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "開啟網頁" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#, fuzzy +#| msgctxt "@label" +#| msgid "Description" +msgctxt "@title:groupbox" +msgid "User description" +msgstr "描述" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "正在載入印表機..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "正在設定場景..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "正在載入介面…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be " @@ -1293,93 +1363,98 @@ msgctxt "" msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "印表機" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (寬度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (深度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (高度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "列印平台形狀" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "原點位於中心" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "熱床" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "GCode 類型" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "列印頭設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "" "Distance from the left of the printhead to the center of the nozzle. Used to " @@ -1389,12 +1464,12 @@ msgstr "" "列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "" "Distance from the front of the printhead to the center of the nozzle. Used " @@ -1404,12 +1479,12 @@ msgstr "" "列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "" "Distance from the right of the printhead to the center of the nozzle. Used " @@ -1419,12 +1494,12 @@ msgstr "" "列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "" "Distance from the rear of the printhead to the center of the nozzle. Used to " @@ -1434,12 +1509,12 @@ msgstr "" "列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "龍門高度" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "" "The height difference between the tip of the nozzle and the gantry system (X " @@ -1449,70 +1524,70 @@ msgstr "" "噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列" "印品與龍門發生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "擠出機數目" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "" "The nominal diameter of filament supported by the printer. The exact " "diameter will be overridden by the material and/or the profile." msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "耗材直徑" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "噴頭孔徑" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "將在開始時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "結束 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "將在結束時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "噴頭設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "噴頭偏移 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "噴頭偏移 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "擠出機起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "擠出機結束 Gcode" @@ -1525,12 +1600,11 @@ msgstr "更新日誌" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1582,13 +1656,11 @@ msgid "Unknown error code: %1" msgstr "未知錯誤代碼: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "連接到網路印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your " @@ -1605,20 +1677,17 @@ msgstr "" "從以下列表中選擇你的印表機:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "增加" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "編輯" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1627,224 +1696,232 @@ msgid "Remove" msgstr "移除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "刷新" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "" "If your printer is not listed, read the network printing " "troubleshooting guide" msgstr "如果你的印表機未被列出,請閱讀網路列印故障排除指南" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "類型" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "未知" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "韌體版本" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "位址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "該網路位址的印表機尚無回應。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "連接" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "印表機網路位址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "輸入印表機在網路上的 IP 位址或主機名。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "確定" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +#, fuzzy +#| msgctxt "@info:tooltip" +#| msgid "Opens the print jobs page with your default web browser." +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "使用你的預設瀏覽器開啟列印作業頁面。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "檢視列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "準備列印中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "可用" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "與印表機的連接中斷" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "保留" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "已完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +#, fuzzy +#| msgctxt "@label:MonitorStatus" +#| msgid "Paused" +msgctxt "@label:status" +msgid "Paused" +msgstr "已暫停" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +#, fuzzy +#| msgctxt "@label:" +#| msgid "Resume" +msgctxt "@label:status" +msgid "Resuming" +msgstr "繼續" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "列印已取消" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "不接受列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "完成時間:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "清空列印平台" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "等待設定更動" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "列印中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "已排入佇列" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "檢視印表機" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "連接到印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "將印表機設定載入 Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "啟用設定" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "" -"This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "" -"This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "網路連線列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "正在列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "保留" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "已完成" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "正在準備" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "可用" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "完成時間:" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "清空列印平台" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "準備列印中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "不接受列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "使用你的預設瀏覽器開啟列印作業頁面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "檢視列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "印表機群組" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "列印中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "已排入佇列" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "等待設定更動" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "印表機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "檢視印表機" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1870,13 +1947,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "總是使用粗糙品質" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "確定" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1903,11 +1973,100 @@ msgid "Fine" msgstr "精細" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "記住我的選擇" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "顏色方案" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "耗材顏色" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "線條類型" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#, fuzzy +#| msgctxt "@item:inlistbox" +#| msgid "Layer view" +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "相容模式" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "顯示移動軌跡" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "顯示輔助結構" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "顯示外殼" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "顯示填充" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "只顯示頂層" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "顯示頂端 5 層列印細節" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "頂 / 底層" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#, fuzzy +#| msgctxt "@label" +#| msgid "X min" +msgctxt "@label" +msgid "min" +msgstr "X 最小值" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#, fuzzy +#| msgctxt "@label" +#| msgid "X max" +msgctxt "@label" +msgid "max" +msgstr "X 最大值" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1918,81 +2077,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "後處理腳本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "添加一個腳本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "更改目前啟用的後處理腳本" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "顏色方案" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "耗材顏色" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "線條類型" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "相容模式" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "顯示移動軌跡" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "顯示輔助結構" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "顯示外殼" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "顯示填充" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "只顯示頂層" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "顯示頂端 5 層列印細節" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "頂 / 底層" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "內壁" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -2090,127 +2189,130 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "顯示全部" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "開啟專案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "更新已有設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "新建" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "摘要 - Cura 專案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "如何解決機器的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "類型" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "名稱" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "列印參數設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "如何解决列印參數中的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "不在列印參數中" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 覆寫" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "衍生自" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 覆寫" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "耗材設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "如何解决耗材的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "參數顯示設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "模式" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "可見設定:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 / %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 +#, fuzzy +#| msgctxt "@action:warning" +#| msgid "Loading a project will clear all models on the buildplate" msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" +msgid "Loading a project will clear all models on the build plate." msgstr "載入專案時將清除列印平台上的所有模型" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "開啟" @@ -2235,15 +2337,26 @@ msgctxt "@action:button" msgid "Installed" msgstr "已安裝" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "下載" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" msgstr "外掛授權協議" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +#, fuzzy +#| msgctxt "@label" +#| msgid "" +#| " plugin contains a license.\n" +#| "You need to accept this license to install this plugin.\n" +#| "Do you agree with the terms below?" msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" @@ -2261,6 +2374,14 @@ msgctxt "@action:button" msgid "Decline" msgstr "拒絕" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +#, fuzzy +#| msgctxt "@title:window" +#| msgid "Plugin License Agreement" +msgctxt "@title:window" +msgid "User Agreement" +msgstr "外掛授權協議" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2468,30 +2589,25 @@ msgid "Printer does not accept commands" msgstr "印表機不接受命令" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "維護中。請檢查印表機" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "與印表機的連接中斷" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "列印中..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "已暫停" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "準備中..." @@ -2709,7 +2825,7 @@ msgid "Unit" msgstr "單位" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "基本" @@ -2961,7 +3077,7 @@ msgid "Send (anonymous) print information" msgstr "(匿名)發送列印資訊" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "印表機" @@ -2979,39 +3095,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "重命名" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "印表機類型:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "連接:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "尚未連接到印表機。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "狀態:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "等待清空列印平台" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "等待列印作業" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "列印參數" @@ -3111,7 +3227,7 @@ msgid "Export Profile" msgstr "匯出列印參數" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "耗材" @@ -3173,7 +3289,7 @@ msgid "Successfully exported material to %1" msgstr "成功匯出耗材至:%1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "新增印表機" @@ -3193,6 +3309,14 @@ msgctxt "@title:window" msgid "About Cura" msgstr "關於 Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +#, fuzzy +#| msgctxt "@label %1 is printer name" +#| msgid "Printer: %1" +msgctxt "@label" +msgid "version: %1" +msgstr "印表機:%1" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3287,12 +3411,20 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "多邊形剪輯函式庫" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +#, fuzzy +#| msgctxt "@label" +#| msgid "Polygon clipping library" +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "多邊形剪輯函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "字體" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG 圖標" @@ -3302,7 +3434,15 @@ msgctxt "@label" msgid "Profile:" msgstr "列印參數:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +#, fuzzy +#| msgctxt "@info:title The %s gets replaced with the printer name." +#| msgid "New %s firmware available" +msgctxt "@" +msgid "No Profile Available" +msgstr "有新 %s 韌體可用" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the " @@ -3314,32 +3454,32 @@ msgstr "" "\n" "點擊開啟列印參數管理器。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "搜尋..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "將設定值複製到所有擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "隱藏此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "不再顯示此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "保持此設定可見" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "設定設定可見性..." @@ -3401,12 +3541,12 @@ msgstr "" "\n" "點擊以恢復計算得出的數值。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "列印設定" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3415,32 +3555,69 @@ msgstr "" "列印設定已禁用\n" "G-code 檔案無法被修改" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#, fuzzy +#| msgctxt "@label" +#| msgid "00h 00min" +msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小時 00 分" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#, fuzzy +#| msgctxt "@tooltip" +#| msgid "Time information" msgctxt "@tooltip" -msgid "Time information" +msgid "Time specification
    " msgstr "時間資訊" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "列印時間" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1" +msgctxt "@label m for meter" +msgid "%1m" +msgstr "%1" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1" +msgctxt "@label g for grams" +msgid "%1g" +msgstr "%1" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1m / ~ %2g / ~ %4 %3" +msgctxt "" +"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " +"print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1m / ~ %2g" +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "" "Recommended Print Setup

    Print with the recommended settings " @@ -3449,14 +3626,14 @@ msgstr "" "推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行" "列印。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "" "Custom Print Setup

    Print with finegrained control over every " "last bit of the slicing process." msgstr "自訂列印設定
    對切片過程中的每一個細節進行精細控制。" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自動:%1" @@ -3466,7 +3643,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "檢視(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "自動: %1" @@ -3493,13 +3670,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "最近開啟的檔案(&R)" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "沒有連接印表機" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "擠出機" @@ -3518,54 +3695,54 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "該擠出機的目前溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "該擠出機中耗材的顏色。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "該擠出機中的耗材。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "該擠出機所使用的噴頭。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "列印平台" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "" "The target temperature of the heated bed. The bed will heat up or cool down " "towards this temperature. If this is 0, the bed heating is turned off." msgstr "熱床的目標溫度。熱床將加熱或冷卻至此溫度。若設定為 0,則不使用熱床。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "熱床目前溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "熱床的預熱溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "預熱" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "" "Heat the bed in advance before printing. You can continue adjusting your " @@ -3575,256 +3752,305 @@ msgstr "" "列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等" "待熱床加熱完畢。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +#, fuzzy +#| msgctxt "@action:button Preceded by 'Ready to'." +#| msgid "Print over network" +msgctxt "@label" +msgid "Printer control" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Move to Next Position" +msgctxt "@label" +msgid "Jog Position" +msgstr "移動到下一個位置" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "正在列印" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "作業名稱" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "列印時間" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "預計剩餘時間" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "切換全螢幕(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "復原(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "取消復原(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +#, fuzzy +#| msgctxt "@action:inmenu menubar:edit" +#| msgid "Reset All Model Positions" +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "重置所有模型位置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "設定 Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增印表機(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理印表機(&I)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理耗材…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用目前設定 / 覆寫更新列印參數(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "捨棄目前更改(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "從目前設定 / 覆寫值創建列印參數(&C)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理列印參數.." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "顯示線上說明文件(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 回報(&B)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "關於(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "刪除所選模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "置中所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "複製所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "刪除模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "將模型置中(&N)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "群組模型(&G)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "取消模型群組" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "結合模型(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "複製模型…(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "選擇所有模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "清空列印平台(&C)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "重新載入所有模型(&L)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "編位所有的模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "為所選模型編位" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "重置所有模型位置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "重置所有模型旋轉(&T)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "開啟檔案(&O)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建專案(&N)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "顯示切片引擎日誌(&L)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "顯示設定資料夾" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "參數顯示設定..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "瀏覽外掛..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "安裝外掛..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "請載入一個 3D 模型" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "切片已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "正在切片..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "無法切片" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "切片不可用" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "準備" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "選擇作用中的輸出裝置" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "開啟檔案" @@ -3845,115 +4071,123 @@ msgid "Import all as models" msgstr "匯入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +#, fuzzy +#| msgctxt "@label" +#| msgid "Ultimaker 3" msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "檔案(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "儲存到檔案(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "另存為(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "儲存專案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "編輯(&E)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "檢視(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "設定(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "印表機(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "耗材(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "列印參數(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "設為主要擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "擴充功能(&X)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "外掛(&l)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "偏好設定(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "幫助(&H)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "新建專案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "" "Are you sure you want to start a new project? This will clear the build " "plate and any unsaved settings." msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何未儲存的設定。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "安裝外掛" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "" "We have found one or more G-Code files within the files you have selected. " @@ -3968,78 +4202,99 @@ msgctxt "@title:window" msgid "Save Project" msgstr "儲存專案" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "擠出機 %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & 耗材" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "儲存時不再顯示專案摘要" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "儲存" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "準備" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "監控" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "層高" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "" +"A custom profile is currently active. To enable the quality slider, choose a " +"default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "列印速度" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "更慢" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "更快" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#, fuzzy +#| msgctxt "@text:window" +#| msgid "" +#| "You have customized some profile settings.\n" +#| "Would you like to keep or discard those settings?" +msgctxt "@tooltip" +msgid "" +"You have modified some profile settings. If you want to change these go to " +"custom mode." +msgstr "" +"你已自訂部份列印參數設定。\n" +"你想保留或捨棄這些設定嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "" "Gradual infill will gradually increase the amount of infill towards the top." msgstr "漸層填充(Gradual infill)將隨著列印高度的提升而逐漸加大填充密度。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "啟用漸層" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "產生支撐" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "" "Generate structures to support parts of the model which have overhangs. " @@ -4048,12 +4303,12 @@ msgstr "" "在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" "塌。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "支撐用擠出機" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "" "Select which extruder to use for support. This will build up supporting " @@ -4063,12 +4318,12 @@ msgstr "" "選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空" "中列印。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "列印平台附著" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "" "Enable printing a brim or raft. This will add a flat area around or under " @@ -4076,7 +4331,7 @@ msgid "" msgstr "" "允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "" "Need help improving your prints?
    Read the Ultimaker " @@ -4094,19 +4349,19 @@ msgctxt "@title:window" msgid "Open project file" msgstr "開啟專案檔案" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "" "This is a Cura project file. Would you like to open it as a project or " "import the models from it?" msgstr "這是一個 Cura 專案檔案。你想將其作為一個專案開啟還是從中匯入模型?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "作為專案開啟" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "匯入模型" @@ -4116,17 +4371,20 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "引擎日誌" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "耗材" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#, fuzzy +#| msgctxt "@label" +#| msgid "Check material compatibility" msgctxt "@label" -msgid "Check material compatibility" +msgid "Check compatibility" msgstr "檢查耗材相容性" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "點擊查看 Ultimaker.com 上的耗材相容性。" @@ -4244,11 +4502,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 網路連接" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 網路連接(叢集)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4272,6 +4525,22 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks 集成" +#: SimulationView/plugin.json +#, fuzzy +#| msgctxt "description" +#| msgid "Provides the X-Ray view." +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "提供透視檢視。" + +#: SimulationView/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "Solid View" +msgctxt "name" +msgid "Simulation View" +msgstr "實體檢視" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4332,16 +4601,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "G-code 列印參數讀取器" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "提供分層檢視。" - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "分層檢視" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4362,6 +4621,22 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "升級版本 2.7 到 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +#, fuzzy +#| msgctxt "description" +#| msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "Version Upgrade 2.7 to 3.0" +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "升級版本 2.7 到 3.0" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4422,6 +4697,19 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "單一模型設定工具" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "SolidWorks Integration" +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "SolidWorks 集成" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4482,6 +4770,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF 寫入器" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "" @@ -4504,6 +4802,105 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 列印參數讀取器" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "暫停" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "無法開始列印" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "列印細項設定" + +#~ msgctxt "" +#~ "@info Don't translate {machine_name}, since it gets replaced by a printer " +#~ "name!" +#~ msgid "" +#~ "To ensure that your {machine_name} is equipped with the latest features " +#~ "it is recommended to update the firmware regularly. This can be done on " +#~ "the {machine_name} (when connected to the network) or via USB." +#~ msgstr "" +#~ "為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " +#~ "{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "分層檢視" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "瀏覽外掛" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "匯出細項設定" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/" +#~ "Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    發生了致命錯誤,我們無法繼續!

    \n" +#~ "

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "開啟網頁" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "確定" + +#~ msgctxt "@label" +#~ msgid "" +#~ "This printer is not set up to host a group of connected Ultimaker 3 " +#~ "printers" +#~ msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#~ msgctxt "@label" +#~ msgid "" +#~ "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "正在準備" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "完成時間:" + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "印表機群組" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "列印時間" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 網路連接(叢集)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "提供分層檢視。" + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "分層檢視" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "透視" @@ -4559,10 +4956,6 @@ msgstr "Cura 列印參數讀取器" #~ msgid "Bed Temperature: %1/%2°C" #~ msgstr "熱床溫度:%1/%2°C" -#~ msgctxt "@label" -#~ msgid "%1" -#~ msgstr "%1" - #~ msgctxt "@label" #~ msgid "View Mode: Layers" #~ msgstr "檢視模式:分層" diff --git a/resources/i18n/zh_TW/fdmextruder.def.json.po b/resources/i18n/zh_TW/fdmextruder.def.json.po index 527342aafb..1b5f351cf9 100644 --- a/resources/i18n/zh_TW/fdmextruder.def.json.po +++ b/resources/i18n/zh_TW/fdmextruder.def.json.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-17 22:13+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index 5fa7bf1ce8..bcac969aa3 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-31 23:30+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -664,6 +664,38 @@ msgid "" "adhesion to the build plate easier." msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台的附著越輕鬆。" +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "" +"How to slice layers with diagonal surfaces. The areas of a layer can be " +"generated based on where the middle of the layer intersects the surface " +"(Middle). Alternatively each layer can have the areas which fall inside of " +"the volume throughout the height of the layer (Exclusive) or a layer has the " +"areas which fall inside anywhere within the layer (Inclusive). Exclusive " +"retains the most details, Inclusive makes for the best fit and Middle takes " +"the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -824,6 +856,18 @@ msgctxt "shell description" msgid "Shell" msgstr "外殼" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "牆壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "" +"The extruder train used for printing the walls. This is used in multi-" +"extrusion." +msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -837,8 +881,11 @@ msgid "" msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "wall_x_extruder_nr label" +#| msgid "Inner Walls Extruder" msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" +msgid "Inner Wall Extruder" msgstr "內壁擠出機" #: fdmprinter.def.json @@ -1383,6 +1430,124 @@ msgstr "" "用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在" "填充上的頂板。" +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "啟用燙平" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "" +"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" +"表面。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "只燙平最高層" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "" +"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" +"時間。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "燙平列印樣式" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "用於燙平頂部表面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "燙平線條間距" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "燙平線條之間的距離。" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "燙平流量" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "" +"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" +"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "燙平內嵌" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "" +"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "燙平速度" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "通過頂部表面的速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "燙平加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "執行燙平的加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "燙平加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "執行燙平時的最大瞬時速度變化。" + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1432,13 +1597,23 @@ msgid "Infill Pattern" msgstr "填充列印樣式" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "infill_pattern description" +#| msgid "" +#| "The pattern of the infill material of the print. The line and zig zag " +#| "infill swap direction on alternate layers, reducing material cost. The " +#| "grid, triangle, cubic, octet, quarter cubic and concentric patterns are " +#| "fully printed every layer. Cubic, quarter cubic and octet infill change " +#| "with every layer to provide a more equal distribution of strength over " +#| "each direction." msgctxt "infill_pattern description" msgid "" "The pattern of the infill material of the print. The line and zig zag infill " "swap direction on alternate layers, reducing material cost. The grid, " -"triangle, cubic, octet, quarter cubic and concentric patterns are fully " -"printed every layer. Cubic, quarter cubic and octet infill change with every " -"layer to provide a more equal distribution of strength over each direction." +"triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " +"patterns are fully printed every layer. Cubic, quarter cubic and octet " +"infill change with every layer to provide a more equal distribution of " +"strength over each direction." msgstr "" "填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" "三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" @@ -1459,6 +1634,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "三角形" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1510,11 +1690,19 @@ msgid "Connect Infill Lines" msgstr "連接填充線條" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "zig_zaggify_infill description" +#| msgid "" +#| "Connect the ends where the infill pattern meets the inner wall using a " +#| "lines which follows the shape of the inner wall. Enabling this setting " +#| "can make the infill adhere to the walls better and reduces the effects on " +#| "infill on the quality of vertical surfaces. Disabling this setting " +#| "reduces the amount of material used." msgctxt "zig_zaggify_infill description" msgid "" -"Connect the ends where the infill pattern meets the inner wall using a lines " +"Connect the ends where the infill pattern meets the inner wall using a line " "which follows the shape of the inner wall. Enabling this setting can make " -"the infill adhere to the walls better and reduces the effects on infill on " +"the infill adhere to the walls better and reduce the effects of infill on " "the quality of vertical surfaces. Disabling this setting reduces the amount " "of material used." msgstr "" @@ -1542,6 +1730,32 @@ msgstr "" "統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 " "度)。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "z_offset_layer_0 label" +#| msgid "Initial Layer Z Offset" +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "z_offset_layer_0 label" +#| msgid "Initial Layer Z Offset" +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1961,6 +2175,35 @@ msgid "" "diameter of the used filament." msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "platform_adhesion description" +#| msgid "Adhesion" +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "附著" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "magic_mesh_surface_mode label" +#| msgid "Surface Mode" +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "表面模式" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "magic_mesh_surface_mode label" +#| msgid "Surface Mode" +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "表面模式" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -3407,43 +3650,6 @@ msgid "" "structure." msgstr "連接鋸齒狀。這將增加鋸齒狀支撐結構的强度。" -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "將支撐拆成塊狀" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "" -"Skip some support line connections to make the support structure easier to " -"break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "" -"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "支撐塊大小" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "" -"Leave out a connection between support lines once every N millimeter to make " -"the support structure easier to break away." -msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "支撐塊線條數" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "" -"Skip one in every N connection lines to make the support structure easier to " -"break away." -msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -4099,10 +4305,17 @@ msgid "Skirt Distance" msgstr "外圍間距" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "skirt_gap description" +#| msgid "" +#| "The horizontal distance between the skirt and the first layer of the " +#| "print.\n" +#| "This is the minimum distance, multiple skirt lines will extend outwards " +#| "from this distance." msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from " +"This is the minimum distance. Multiple skirt lines will extend outwards from " "this distance." msgstr "" "外圍和列印第一層之間的水平距離。\n" @@ -4168,36 +4381,6 @@ msgstr "" "僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台" "附著。" -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "起始層 Z 軸偏移" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "" -"The extruder is offset from the normal height of the first layer by this " -"amount. It can be positive (raised) or negative (lowered). Some filament " -"types adhere to the build plate better if the extruder is raised slightly." -msgstr "" -"擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下降)。" -"某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z 軸偏移漸減層數" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "" -"When non-zero, the Z offset is reduced to 0 over that many layers. A value " -"of 0 means that the Z offset remains constant for all the layers in the " -"print." -msgstr "" -"當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列印" -"層的 Z 軸偏移量保持為固定值。" - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -4219,12 +4402,19 @@ msgid "Raft Smoothing" msgstr "木筏平滑處理" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "raft_smoothing description" +#| msgid "" +#| "This setting control how much inner corners in the raft outline are " +#| "rounded. Inward corners are rounded to a semi circle with a radius equal " +#| "to the value given here. This setting also removes holes in the raft " +#| "outline which are smaller than such a circle." msgctxt "raft_smoothing description" msgid "" -"This setting control how much inner corners in the raft outline are rounded. " -"Inward corners are rounded to a semi circle with a radius equal to the value " -"given here. This setting also removes holes in the raft outline which are " -"smaller than such a circle." +"This setting controls how much inner corners in the raft outline are " +"rounded. Inward corners are rounded to a semi circle with a radius equal to " +"the value given here. This setting also removes holes in the raft outline " +"which are smaller than such a circle." msgstr "" "此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定" "值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" @@ -4798,6 +4988,23 @@ msgstr "" "留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用" "作最後手段。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "machine_max_acceleration_x label" +#| msgid "Maximum Acceleration X" +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "X 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "" +"The minimum size of a line segment after slicing. If you increase this, the " +"mesh will have a lower resolution. This may allow the printer to keep up " +"with the speed it has to process g-code and will increase slice speed by " +"removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4841,6 +5048,19 @@ msgstr "" "起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移" "除。" +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "" +"Remove empty layers beneath the first printed layer if they are present. " +"Disabling this setting can cause empty first layers if the Slicing Tolerance " +"setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -5122,6 +5342,43 @@ msgstr "" "最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的," "但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "將支撐拆成塊狀" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "" +"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "支撐塊大小" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "支撐塊線條數" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -5508,6 +5765,29 @@ msgstr "" "在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此" "高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "machine_max_feedrate_e description" +#| msgid "The maximum speed of the filament." +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "耗材的最大速度。" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -5848,124 +6128,6 @@ msgstr "" "噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的" "上行連接較少。僅套用於鐵絲網列印。" -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "啟用燙平" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "" -"Go over the top surface one additional time, but without extruding material. " -"This is meant to melt the plastic on top further, creating a smoother " -"surface." -msgstr "" -"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" -"表面。" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "只燙平最高層" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "" -"Only perform ironing on the very last layer of the mesh. This saves time if " -"the lower layers don't need a smooth surface finish." -msgstr "" -"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" -"時間。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "燙平列印樣式" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "用於燙平頂部表面的列印樣式。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "同心" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "鋸齒狀" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "燙平線條間距" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "燙平線條之間的距離。" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "燙平流量" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "" -"The amount of material, relative to a normal skin line, to extrude during " -"ironing. Keeping the nozzle filled helps filling some of the crevices of the " -"top surface, but too much results in overextrusion and blips on the side of " -"the surface." -msgstr "" -"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" -"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "燙平內嵌" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "" -"A distance to keep from the edges of the model. Ironing all the way to the " -"edge of the mesh may result in a jagged edge on your print." -msgstr "" -"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "燙平速度" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "通過頂部表面的速度。" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "燙平加速度" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "執行燙平的加速度。" - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "燙平加加速度" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "執行燙平時的最大瞬時速度變化。" - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -6035,15 +6197,27 @@ msgid "" "Transformation matrix to be applied to the model when loading it from file." msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "牆壁擠出機" - -#~ msgctxt "wall_extruder_nr description" +#~ msgctxt "z_offset_layer_0 description" #~ msgid "" -#~ "The extruder train used for printing the walls. This is used in multi-" -#~ "extrusion." -#~ msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" +#~ "The extruder is offset from the normal height of the first layer by this " +#~ "amount. It can be positive (raised) or negative (lowered). Some filament " +#~ "types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "" +#~ "擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下" +#~ "降)。某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z 軸偏移漸減層數" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "" +#~ "When non-zero, the Z offset is reduced to 0 over that many layers. A " +#~ "value of 0 means that the Z offset remains constant for all the layers in " +#~ "the print." +#~ msgstr "" +#~ "當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列" +#~ "印層的 Z 軸偏移量保持為固定值。" #~ msgctxt "infill_pattern option tetrahedral" #~ msgid "Tetrahedral" From 105d7a56154ed8c5323df3b8fc2c61941958da1e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 22 Nov 2017 17:12:53 +0100 Subject: [PATCH 314/764] Return newly added single extruder The workspace reader needs to use it to get the correct material. Contributes to issue CURA-4604. --- cura/Settings/CuraContainerRegistry.py | 4 +++- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 2c9e15b8c9..1674405824 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -409,7 +409,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack = None # if extruders are defined in the machine definition use those instead - if machine.extruders and len(machine.extruders) > 0: + if machine.extruders and "0" in machine.extruders: new_extruder_id = machine.extruders["0"].getId() extruder_stack = machine.extruders["0"] @@ -457,6 +457,8 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(extruder_stack) + return extruder_stack + # Fix the extruders that were upgraded to ExtruderStack instances during addContainer. # The stacks are now responsible for setting the next stack on deserialize. However, # due to problems with loading order, some stacks may not have the proper next stack diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index a237460bab..aa81399b56 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -746,7 +746,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # If not extruder stacks were saved in the project file (pre 3.1) create one manually # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this if not extruder_stacks: - self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + extruder_stacks.append(self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder")) except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") From a0222eebb5cb0a76510f08f37b7382c78de5592c Mon Sep 17 00:00:00 2001 From: anraf1001 Date: Wed, 22 Nov 2017 19:41:49 +0100 Subject: [PATCH 315/764] Polish translation - continued --- resources/i18n/pl_PL/fdmprinter.def.json.po | 56 +++++++++++---------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index 29929315e0..4803933a28 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-29 16:14+0200\n" +"PO-Revision-Date: 2017-11-22 19:41+0100\n" "Last-Translator: 'Jaguś' Paweł Jagusiak and Andrzej 'anraf1001' Rafalski\n" "Language-Team: reprapy.pl\n" "Language: pl_PL\n" @@ -613,27 +613,27 @@ msgstr "Wysokość początkowej warstwy w mm. Grubsza początkowa warstwa powodu #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Tolerancja Cięcia" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Jak ciąć warstwy z ukośnymi powierzchniami. Obszary warstwy mogą być generowane na podstawie miejsca gdzie środek warstwy przecina się z powierzchnią (Środek). Alternatywnie każda warstwa może mieć obszary, które wpadają do środka objętości poprzez wysokość warstwy (Wyłączne) lub warstwa ma obszary, które wpadają do środka w każdym miejscu na warstwie (Włącznie). Wyłącznie zatrzymuje najwięcej detali, Włącznie powoduje najlepsze dopasowanie, a Środek wymaga najmniej czasu do przetworzenia." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Środek" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Wyłącznie" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Włącznie" #: fdmprinter.def.json msgctxt "line_width label" @@ -808,7 +808,7 @@ msgstr "Esktruder używany do drukowania zewn. ściany. Używane w multi-ekstruz #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Ekstruder Wewn. Linii" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1388,7 +1388,7 @@ msgstr "Wzór Wypełn." #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Wzór materiału wypełniającego wydruk. Linie i zygzaki zmieniają kierunek na przemiennych warstwach, redukując koszty materiału. Kratka, trójkąty, tri-sześciokąt, sześcienne, ośmiościenne, ćwierć sześcienny i koncentryczny wzór są drukowane w pełni na każdej warstwie. Sześcienne, ćwierć sześcienne i czworościenne wypełnienie zmienia się co każdą warstwę, aby zapewnić równy rozkład siły w każdym kierunku." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1408,7 +1408,7 @@ msgstr "Trójkąty" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Tri-Sześciokąt" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1463,7 +1463,7 @@ msgstr "Połącz Linie Wypełnienia" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Łączy końce gdzie wzór wypełnienia spotyka się z wewn. ścianą używając linii, która podąża za kształtem wewn. ściany. Włączenie tego ustawienia może spowodować lepszą przyczepność wypełnienia do ścian i zredukować efekty wypełnienia w jakości powierzchni. Wyłączenie tego ustawienia redukuje ilość potrzebnego materiału." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1478,22 +1478,22 @@ msgstr "Lista całkowitych kierunków linii do użycia. Elementy z listy są uż #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Przesunięcie Wypełn. w Osi X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Przesunięcie Wypełn. w Osi Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Wypełnienie jest przesunięte o taką odległość wzdłuż osi Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1808,22 +1808,22 @@ msgstr "Dostosowuje średnicę stosowanego filamentu. Dopasuj tę wartość do #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Tendencja Przyczepności" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Tendencja przyczepności powierzchni." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Energia Powierzchni" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Energia powierzchni." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3556,6 +3556,8 @@ msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" +"Pozioma odległość między obwódką a pierwszą warstwą nadruku.\n" +"Jest to o minimalnej odległości. Z tej odległości linie będą nakładane w kierunku zewnętrznym." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3615,7 +3617,7 @@ msgstr "Wygładzanie Tratwy" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "To ustawienie kontroluje jak bardzo wewn. narożniki w zewn. krawędzi tratwy mają być zaokrąglone. Wewn. narożniki są zaokrąglane do półokręgów o promieniu równym wartości podanej tutaj. To ustawienie usuwa także otwory w zewn. krawędzi tratwy, które są mniejsze niż taki okrąg." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4090,12 +4092,12 @@ msgstr "Zwykle Cura próbuje zszywać małe dziury w siatce i usunąć części #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Maksymalna Rozdzielczość" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Minimalny rozmiar linii segmentu po pocięciu. Jeżeli to zwiększysz, siatka będzie miała mniejszą rozdzielczość. Może to spowodować przyspieszenie prędkości przetwarzania g-code i przyspieszenie prędkości cięcia poprzez usunięcie detali siatki, których tak czy tak nie można przetworzyć." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4130,12 +4132,12 @@ msgstr "Przełącz się, to której przecinającej się siatki będą należały #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Usuń Pustą Pierwsz. Warstwę" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Usuń puste warstwy poniżej pierwszej drukowanej warstwy jeżeli takie występują. Wyłączenie tego ustawienia może powodować puste pierwsze warstwy jeżeli Tolerancja Cięcia jest ustawiona na Włącznie lub Środek." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4665,22 +4667,22 @@ msgstr "Średnia odległość między losowymi punktami wprowadzonymi w każdym #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Maks. offset ekstruzji do kompensowania przepływu" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Maksymalna odległość w mm do skompensowania." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Współczynnik kompensacji przepływu" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Współczynnik mnożący przepływu -> tłumaczenie odległości." #: fdmprinter.def.json msgctxt "wireframe_enabled label" From b776afaf3ddfb00c5b4a6521e20d2a4d34bfa755 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 22 Nov 2017 20:09:39 +0100 Subject: [PATCH 316/764] CURA-4509 Changing layout of the print time information tooltip, now in two lines per feature. This is for avoid trimming the labels because they depend on the language. --- resources/qml/Sidebar.qml | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 383c599da8..31bda45b56 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -343,7 +343,6 @@ Rectangle onEntered: { - if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) { // All the time information for the different features is achieved @@ -356,20 +355,10 @@ Rectangle { if(!print_time[feature].isTotalDurationZero) { - var feature_name = ""; - - if (feature.length <= 11) - { - feature_name = feature - } - else{ - feature_name = feature.substring(0, 8) + "..." - } - - - content += "" + + "" + + "" + + ""; } } From b97ed4c211235513257302fb2bc77ae756b4cb9b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 23 Nov 2017 09:59:34 +0100 Subject: [PATCH 317/764] CURA-4609 Minor improvements in Simulation View: Increase simulation speed. Hide Layer Thickness option in color scheme. Hide nozzle when switching layers. Set the handles in front of the view. Name changed back to "Layer View" --- plugins/SimulationView/SimulationPass.py | 10 +++++++--- plugins/SimulationView/SimulationView.qml | 11 ++++++----- plugins/SimulationView/__init__.py | 2 +- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 2b9063e27a..46fa7f1240 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -34,6 +34,7 @@ class SimulationPass(RenderPass): self._nozzle_shader = None self._old_current_layer = 0 self._old_current_path = 0 + self._switching_layers = True # It tracks when the user is moving the layers' slider self._gl = OpenGL.getInstance().getBindingsObject() self._scene = Application.getInstance().getController().getScene() self._extruder_manager = ExtruderManager.getInstance() @@ -91,7 +92,7 @@ class SimulationPass(RenderPass): self.bind() - tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Solid) + tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -143,8 +144,10 @@ class SimulationPass(RenderPass): # All the layers but the current selected layer are rendered first if self._old_current_path != self._layer_view._current_path_num: self._current_shader = self._layer_shadow_shader + self._switching_layers = False if not self._layer_view.isSimulationRunning() and self._old_current_layer != self._layer_view._current_layer_num: self._current_shader = self._layer_shader + self._switching_layers = True layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) layers_batch.addItem(node.getWorldTransformation(), layer_data) @@ -170,8 +173,9 @@ class SimulationPass(RenderPass): if len(batch.items) > 0: batch.render(self._scene.getActiveCamera()) - # The nozzle is drawn once we know the correct position - if not self._compatibility_mode and self._layer_view.getActivity() and nozzle_node is not None: + # The nozzle is drawn when once we know the correct position of the head, + # but the user is not using the layer slider, and the compatibility mode is not enabled + if not self._switching_layers and not self._compatibility_mode and self._layer_view.getActivity() and nozzle_node is not None: if head_position is not None: nozzle_node.setVisible(True) nozzle_node.setPosition(head_position) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 67ca39d992..17c71d2733 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -104,10 +104,11 @@ Item text: catalog.i18nc("@label:listbox", "Feedrate"), type_id: 2 }) - layerViewTypes.append({ - text: catalog.i18nc("@label:listbox", "Layer thickness"), - type_id: 3 // these ids match the switching in the shader - }) + // TODO DON'T DELETE!!!! This part must be enabled when adaptive layer height feature is available +// layerViewTypes.append({ +// text: catalog.i18nc("@label:listbox", "Layer thickness"), +// type_id: 3 // these ids match the switching in the shader +// }) } ComboBox @@ -591,7 +592,7 @@ Item Timer { id: simulationTimer - interval: 250 + interval: 100 running: false repeat: true onTriggered: { diff --git a/plugins/SimulationView/__init__.py b/plugins/SimulationView/__init__.py index f7ccf41acc..15e113bd8e 100644 --- a/plugins/SimulationView/__init__.py +++ b/plugins/SimulationView/__init__.py @@ -11,7 +11,7 @@ catalog = i18nCatalog("cura") def getMetaData(): return { "view": { - "name": catalog.i18nc("@item:inlistbox", "Simulation view"), + "name": catalog.i18nc("@item:inlistbox", "Layer view"), "view_panel": "SimulationView.qml", "weight": 2 } From 18c7a5acf37cc8e5a7371ef69c304075f019fdfb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 11:26:53 +0100 Subject: [PATCH 318/764] Pass optional file_name for deserialization CURA-4613 Some upgrades depend on the file_name, so the file_name is needed in this case. --- cura/Settings/CuraContainerStack.py | 4 +- cura/Settings/ExtruderStack.py | 4 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 40 ++++++++++++------- .../XmlMaterialProfile/XmlMaterialProfile.py | 4 +- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 2a804def4d..9bbea044cf 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -348,8 +348,8 @@ class CuraContainerStack(ContainerStack): # # \throws InvalidContainerStackError Raised when no definition can be found for the stack. @override(ContainerStack) - def deserialize(self, contents: str) -> None: - super().deserialize(contents) + def deserialize(self, contents: str, file_name: Optional[str] = None) -> None: + super().deserialize(contents, file_name) new_containers = self._containers.copy() while len(new_containers) < len(_ContainerIndexes.IndexTypeMap): diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index fe7068b7ea..42a2733879 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -92,8 +92,8 @@ class ExtruderStack(CuraContainerStack): return self.getNextStack()._getMachineDefinition() @override(CuraContainerStack) - def deserialize(self, contents: str) -> None: - super().deserialize(contents) + def deserialize(self, contents: str, file_name: Optional[str] = None) -> None: + super().deserialize(contents, file_name) stacks = ContainerRegistry.getInstance().findContainerStacks(id=self.getMetaDataEntry("machine", "")) if stacks: self.setNextStack(stacks[0]) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index aa81399b56..8e087611ef 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -152,7 +152,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if not definitions: definition_container = DefinitionContainer(container_id) - definition_container.deserialize(archive.open(each_definition_container_file).read().decode("utf-8")) + definition_container.deserialize(archive.open(each_definition_container_file).read().decode("utf-8"), + file_name = each_definition_container_file) else: definition_container = definitions[0] @@ -208,7 +209,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container = InstanceContainer(container_id) # Deserialize InstanceContainer by converting read data from bytes to string - instance_container.deserialize(archive.open(each_instance_container_file).read().decode("utf-8")) + instance_container.deserialize(archive.open(each_instance_container_file).read().decode("utf-8"), + file_name = each_instance_container_file) instance_container_list.append(instance_container) container_type = instance_container.getMetaDataEntry("type") @@ -378,7 +380,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return WorkspaceReader.PreReadResult.accepted ## Overrides an ExtruderStack in the given GlobalStack and returns the new ExtruderStack. - def _overrideExtruderStack(self, global_stack, extruder_file_content): + def _overrideExtruderStack(self, global_stack, extruder_file_content, extruder_stack_file): # Get extruder position first extruder_config = configparser.ConfigParser() extruder_config.read_string(extruder_file_content) @@ -394,7 +396,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return None # Override the given extruder stack - extruder_stack.deserialize(extruder_file_content) + extruder_stack.deserialize(extruder_file_content, file_name = extruder_stack_file) # return the new ExtruderStack return extruder_stack @@ -484,7 +486,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definitions = self._container_registry.findDefinitionContainers(id = container_id) if not definitions: definition_container = DefinitionContainer(container_id) - definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8")) + definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"), + file_name = definition_container_file) self._container_registry.addContainer(definition_container) Job.yieldThread() @@ -502,18 +505,21 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if not materials: material_container = xml_material_profile(container_id) - material_container.deserialize(archive.open(material_container_file).read().decode("utf-8")) + material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), + file_name = material_container_file) containers_to_add.append(material_container) else: material_container = materials[0] if not material_container.isReadOnly(): # Only create new materials if they are not read only. if self._resolve_strategies["material"] == "override": - material_container.deserialize(archive.open(material_container_file).read().decode("utf-8")) + material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), + file_name = material_container_file) elif self._resolve_strategies["material"] == "new": # Note that we *must* deserialize it with a new ID, as multiple containers will be # auto created & added. material_container = xml_material_profile(self.getNewId(container_id)) - material_container.deserialize(archive.open(material_container_file).read().decode("utf-8")) + material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), + file_name = material_container_file) containers_to_add.append(material_container) material_containers.append(material_container) @@ -540,7 +546,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container = InstanceContainer(container_id) # Deserialize InstanceContainer by converting read data from bytes to string - instance_container.deserialize(serialized) + instance_container.deserialize(serialized, file_name = instance_container_file) container_type = instance_container.getMetaDataEntry("type") Job.yieldThread() @@ -562,7 +568,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): else: if self._resolve_strategies["machine"] == "override" or self._resolve_strategies["machine"] is None: instance_container = user_containers[0] - instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8")) + instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8"), + file_name = instance_container_file) instance_container.setDirty(True) elif self._resolve_strategies["machine"] == "new": # The machine is going to get a spiffy new name, so ensure that the id's of user settings match. @@ -595,7 +602,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # selected strategy. if self._resolve_strategies[container_type] == "override": instance_container = changes_containers[0] - instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8")) + instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8"), + file_name = instance_container_file) instance_container.setDirty(True) elif self._resolve_strategies[container_type] == "new": @@ -656,7 +664,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # There is a machine, check if it has authentication data. If so, keep that data. network_authentication_id = container_stacks[0].getMetaDataEntry("network_authentication_id") network_authentication_key = container_stacks[0].getMetaDataEntry("network_authentication_key") - container_stacks[0].deserialize(archive.open(global_stack_file).read().decode("utf-8")) + container_stacks[0].deserialize(archive.open(global_stack_file).read().decode("utf-8"), + file_name = global_stack_file) if network_authentication_id: container_stacks[0].addMetaDataEntry("network_authentication_id", network_authentication_id) if network_authentication_key: @@ -666,7 +675,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # create a new global stack stack = GlobalStack(global_stack_id_new) # Deserialize stack by converting read data from bytes to string - stack.deserialize(archive.open(global_stack_file).read().decode("utf-8")) + stack.deserialize(archive.open(global_stack_file).read().decode("utf-8"), + file_name = global_stack_file) # Ensure a unique ID and name stack._id = global_stack_id_new @@ -706,7 +716,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if self._resolve_strategies["machine"] == "override": if global_stack.getProperty("machine_extruder_count", "value") > 1: # deserialize new extruder stack over the current ones (if any) - stack = self._overrideExtruderStack(global_stack, extruder_file_content) + stack = self._overrideExtruderStack(global_stack, extruder_file_content, extruder_stack_file) if stack is None: continue @@ -726,7 +736,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_config.write(tmp_string_io) extruder_file_content = tmp_string_io.getvalue() - stack.deserialize(extruder_file_content) + stack.deserialize(extruder_file_content, file_name = extruder_stack_file) # Ensure a unique ID and name stack._id = new_id diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index fa40819eeb..7ab4520aea 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -422,11 +422,11 @@ class XmlMaterialProfile(InstanceContainer): return version * 1000000 + setting_version ## Overridden from InstanceContainer - def deserialize(self, serialized): + def deserialize(self, serialized, file_name = None): containers_to_add = [] # update the serialized data first from UM.Settings.Interfaces import ContainerInterface - serialized = ContainerInterface.deserialize(self, serialized) + serialized = ContainerInterface.deserialize(self, serialized, file_name) try: data = ET.fromstring(serialized) From 3148027fbe7b0e70a0ab1dbc4733d85470aad674 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 12:43:14 +0100 Subject: [PATCH 319/764] Fix version upgrade for quality_changes CURA-4613 Explained in the code comments. --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 7b788f96ba..c496a66b29 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -116,7 +116,10 @@ class VersionUpgrade30to31(VersionUpgrade): all_quality_changes = self._getSingleExtrusionMachineQualityChanges(parser) # Note that DO NOT!!! use the quality_changes returned from _getSingleExtrusionMachineQualityChanges(). # Those are loaded from the hard drive which are original files that haven't been upgraded yet. - if len(all_quality_changes) == 1 and not parser.has_option("metadata", "extruder"): + # NOTE 2: The number can be 0 or 1 depends on whether you are loading it from the qualities folder or + # from a project file. When you load from a project file, the custom profile may not be in cura + # yet, so you will get 0. + if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) # Update version numbers @@ -199,7 +202,7 @@ class VersionUpgrade30to31(VersionUpgrade): def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) - machine_name = filename.strip("." + os.sep).replace(suffix, "") + machine_name = os.path.os.path.basename(filename).replace(".inst.cfg", "").replace(suffix, "") new_filename = machine_name + "_" + "fdmextruder" + suffix extruder_quality_changes_parser = configparser.ConfigParser() From 17f09ec21e57cbb45e207b3682c3d8489dab19f1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 12:46:32 +0100 Subject: [PATCH 320/764] Fix variant/material/quality handling in stacks CURA-4613 --- cura/Settings/CuraContainerRegistry.py | 75 ++++++++++++++++++++++++-- cura/Settings/CuraContainerStack.py | 17 ++++-- 2 files changed, 84 insertions(+), 8 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 1674405824..543678ee22 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -4,6 +4,7 @@ import os import os.path import re +import configparser from typing import Optional @@ -19,6 +20,7 @@ from UM.Message import Message from UM.Platform import Platform from UM.PluginRegistry import PluginRegistry # For getting the possible profile writers to write with. from UM.Util import parseBool +from UM.Resources import Resources from . import ExtruderStack from . import GlobalStack @@ -444,21 +446,84 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(user_container) variant_id = "default" - if machine.variant.getId() != "empty_variant": + if machine.variant.getId() not in ("empty", "empty_variant"): variant_id = machine.variant.getId() + else: + variant_id = "empty_variant" extruder_stack.setVariantById(variant_id) - extruder_stack.setMaterialById("default") - extruder_stack.setQualityById("default") - if machine.qualityChanges.getId() != "empty_quality_changes": + + material_id = "default" + if machine.material.getId() not in ("empty", "empty_material"): + # TODO: find the ID that's suitable for this extruder + pass + else: + material_id = "empty_material" + extruder_stack.setMaterialById(material_id) + + quality_id = "default" + if machine.quality.getId() not in ("empty", "empty_quality"): + # TODO: find the ID that's suitable for this extruder + pass + else: + quality_id = "empty_quality" + extruder_stack.setQualityById(quality_id) + + if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) if extruder_quality_changes_container: - quality_changes_id = extruder_quality_changes_container[0].getId() + extruder_quality_changes_container = extruder_quality_changes_container[0] + quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) + else: + # Some extruder quality_changes containers can be created at runtime as files in the qualities + # folder. Those files won't be loaded in the registry immediately. So we also need to search + # the folder to see if the quality_changes exists. + extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) + if extruder_quality_changes_container: + quality_changes_id = extruder_quality_changes_container.getId() + extruder_stack.setQualityChangesById(quality_changes_id) + + if not extruder_quality_changes_container: + Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", + machine.qualityChanges.getName(), extruder_stack.getId()) self.addContainer(extruder_stack) return extruder_stack + def _findQualityChangesContainerInCuraFolder(self, name): + quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) + + instance_container = None + + for item in os.listdir(quality_changes_dir): + file_path = os.path.join(quality_changes_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser() + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("general", "name"): + continue + + if parser["general"]["name"] == name: + # load the container + container_id = os.path.basename(file_path).replace(".inst.cfg", "") + + instance_container = InstanceContainer(container_id) + with open(file_path, "r") as f: + serialized = f.read() + instance_container.deserialize(serialized, file_path) + self.addContainer(instance_container) + break + + return instance_container + # Fix the extruders that were upgraded to ExtruderStack instances during addContainer. # The stacks are now responsible for setting the next stack on deserialize. However, # due to problems with loading order, some stacks may not have the proper next stack diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 9bbea044cf..156883ade3 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -41,9 +41,20 @@ class CuraContainerStack(ContainerStack): def __init__(self, container_id: str, *args, **kwargs): super().__init__(container_id, *args, **kwargs) - self._empty_instance_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + self._container_registry = ContainerRegistry.getInstance() + + self._empty_instance_container = self._container_registry.getEmptyInstanceContainer() + + self._empty_quality_changes = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + self._empty_quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + self._empty_material = self._container_registry.findInstanceContainers(id = "empty_material")[0] + self._empty_variant = self._container_registry.findInstanceContainers(id = "empty_variant")[0] self._containers = [self._empty_instance_container for i in range(len(_ContainerIndexes.IndexTypeMap))] + self._containers[_ContainerIndexes.QualityChanges] = self._empty_quality_changes + self._containers[_ContainerIndexes.Quality] = self._empty_quality + self._containers[_ContainerIndexes.Material] = self._empty_material + self._containers[_ContainerIndexes.Variant] = self._empty_variant self.containersChanged.connect(self._onContainersChanged) @@ -456,7 +467,7 @@ class CuraContainerStack(ContainerStack): else: search_criteria["definition"] = "fdmprinter" - if self.material != self._empty_instance_container: + if self.material != self._empty_material: search_criteria["name"] = self.material.name else: preferred_material = definition.getMetaDataEntry("preferred_material") @@ -503,7 +514,7 @@ class CuraContainerStack(ContainerStack): else: search_criteria["definition"] = "fdmprinter" - if self.quality != self._empty_instance_container: + if self.quality != self._empty_quality: search_criteria["name"] = self.quality.name else: preferred_quality = definition.getMetaDataEntry("preferred_quality") From 1141368682ba3121d29c2ffb67c422fa9536b97c Mon Sep 17 00:00:00 2001 From: Aleksei Sasin Date: Thu, 23 Nov 2017 12:54:53 +0100 Subject: [PATCH 321/764] Hide icons if monitor view is selected CURA-4527 --- resources/qml/Topbar.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 033e1a55f9..6085c6fe7e 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -228,6 +228,8 @@ Rectangle spacing: 2 + visible: !base.monitoringPrint + anchors { verticalCenter: base.verticalCenter right: viewModeButton.right From 1db448d7d89de6a2f18327380a098c487e416935 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 13:04:03 +0100 Subject: [PATCH 322/764] Use the correct quality container for global stacks loaded from project files CURA-4613 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 8e087611ef..65f026685b 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -790,6 +790,19 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for stack in [global_stack] + extruder_stacks: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) + # Fix quality: + # The quality specified in an old project file can be wrong, for example, for UM2, it should be "um2_normal" + # but instead it was "normal". This should be fixed by setting it to the correct quality. + # Note that this only seems to happen on single-extrusion machines on the global stack, so we only apply the + # fix for that + quality = global_stack.quality + if quality.getId() not in ("empty", "empty_quality"): + quality_type = quality.getMetaDataEntry("quality_type") + quality_containers = self._container_registry.findInstanceContainers(definition = global_stack.definition.getId(), + quality_type = quality_type) + if quality_containers: + global_stack.quality = quality_containers[0] + # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those # MUST get updated too. From 2397b68cd78bb40aea3852b6f6c43cbf1f2ceb25 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 14:07:38 +0100 Subject: [PATCH 323/764] Optimize MaterialsModel update CURA-4546 --- cura/Settings/MaterialsModel.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py index bee9307b53..bab8929765 100644 --- a/cura/Settings/MaterialsModel.py +++ b/cura/Settings/MaterialsModel.py @@ -18,4 +18,8 @@ class MaterialsModel(InstanceContainersModel): # \param container The container whose metadata was changed. def _onContainerMetaDataChanged(self, container): if container.getMetaDataEntry("type") == "material": #Only need to update if a material was changed. - self._update() \ No newline at end of file + self._update() + + def _onContainerChanged(self, container): + if container.getMetaDataEntry("type", "") == "material": + super()._onContainerChanged(container) From dad2dfda89e0c26b409f1bb4d981bacc1a8f0b39 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 14:08:10 +0100 Subject: [PATCH 324/764] No need to set currentItem after a material is imported CURA-4546 --- resources/qml/Preferences/MaterialsPage.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 5e014faf24..cd04b79b20 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -322,7 +322,6 @@ UM.ManagementPage { messageDialog.icon = StandardIcon.Information messageDialog.text = catalog.i18nc("@info:status Don't translate the XML tag !", "Successfully imported material %1").arg(fileUrl) - currentItem = base.model.getItem(base.objectList.currentIndex) } else if(result.status == "duplicate") { From 033cc4fbc79cdaedd554805c2e7c12a56307363e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 14:12:23 +0100 Subject: [PATCH 325/764] Fix quality update in project loading CURA-4613 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 65f026685b..d54e0a724e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -799,6 +799,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if quality.getId() not in ("empty", "empty_quality"): quality_type = quality.getMetaDataEntry("quality_type") quality_containers = self._container_registry.findInstanceContainers(definition = global_stack.definition.getId(), + type = "quality", quality_type = quality_type) if quality_containers: global_stack.quality = quality_containers[0] From 5703f954d4649e48adf904d6d34ea30e82555aca Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 23 Nov 2017 14:13:18 +0100 Subject: [PATCH 326/764] CURA-4552 fix support for relative extrusion --- plugins/GCodeReader/GCodeReader.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 2a7e29e370..ba4c12abb2 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -58,6 +58,7 @@ class GCodeReader(MeshReader): self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() self._center_is_zero = False self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) + self._is_absolute_extrusion = True # It can become absolute (M82, default) or relative (M83) @staticmethod def _getValue(line, code): @@ -180,11 +181,11 @@ class GCodeReader(MeshReader): f = params.f if params.f is not None else f if params.e is not None: - new_extrusion_value = params.e if self._is_absolute_positioning else e[self._extruder_number] + params.e + new_extrusion_value = params.e if self._is_absolute_extrusion else e[self._extruder_number] + params.e if new_extrusion_value > e[self._extruder_number]: - path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion + path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion else: - path.append([x, y, z, f, params.e + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction + path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction e[self._extruder_number] = new_extrusion_value # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions @@ -196,6 +197,7 @@ class GCodeReader(MeshReader): path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) return self._position(x, y, z, f, e) + # G0 and G1 should be handled exactly the same. _gCode1 = _gCode0 @@ -204,6 +206,7 @@ class GCodeReader(MeshReader): return self._position( params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, + 0, position.f, position.e) @@ -266,6 +269,14 @@ class GCodeReader(MeshReader): position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) return position + def _processMCode(self, m): + if m == 82: + # Set absolute extrusion mode + self._is_absolute_extrusion = True + elif m == 83: + # Set relative extrusion mode + self._is_absolute_extrusion = False + _type_keyword = ";TYPE:" _layer_keyword = ";LAYER:" @@ -383,6 +394,10 @@ class GCodeReader(MeshReader): current_position = self._processTCode(T, line, current_position, current_path) + if line.startswith("M"): + M = self._getInt(line, "M") + self._processMCode(M) + # "Flush" leftovers. Last layer paths are still stored if len(current_path) > 1: if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): From e3cdcc04fd7fc20f0f478aa0e87ec8c50267cc02 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 23 Nov 2017 14:57:28 +0100 Subject: [PATCH 327/764] Document IRC channels --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index f8d809df16..ba6a986093 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ For crashes and similar issues, please attach the following information: If the Cura user interface still starts, you can also reach this directory from the application menu in Help -> Show settings folder +For additional support, you could also ask in the #cura channel on FreeNode IRC. For help with development, there is also the #cura-dev channel. + Dependencies ------------ From b6410ecf125021138af4a1126550d260f19327bb Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 23 Nov 2017 15:27:22 +0100 Subject: [PATCH 328/764] CURA-4561 prepare button upgrades --- resources/qml/SaveButton.qml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index e2890a6b49..3237dd9ade 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -45,6 +45,14 @@ Item { } } + function sliceOrStopSlicing() { + if ([1, 5].indexOf(UM.Backend.state) != -1) { + backend.forceSlice(); + } else { + backend.stopSlicing(); + } + } + Label { id: statusLabel width: parent.width - 2 * UM.Theme.getSize("sidebar_margin").width @@ -86,6 +94,10 @@ Item { if (saveToButton.enabled) { saveToButton.clicked(); } + // prepare button + if (prepareButton.enabled) { + sliceOrStopSlicing(); + } } } @@ -145,7 +157,7 @@ Item { Button { id: prepareButton - tooltip: UM.OutputDeviceManager.activeDeviceDescription; + tooltip: catalog.i18nc("@info:tooltip","Slice"); // 1 = not started, 2 = Processing enabled: (base.backendState == 1 || base.backendState == 2) && base.activity == true visible: { @@ -162,11 +174,7 @@ Item { text: [1, 5].indexOf(UM.Backend.state) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { - if ([1, 5].indexOf(UM.Backend.state) != -1) { - backend.forceSlice(); - } else { - backend.stopSlicing(); - } + sliceOrStopSlicing(); } style: ButtonStyle { From 3ee2e0488f95e3311d9c6354c29dff954bb401bc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 23 Nov 2017 15:31:22 +0100 Subject: [PATCH 329/764] Only load metadata when finding hotends belonging to material We only need to have the hotend metadata. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 5dfa130145..a6825f33a6 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -781,7 +781,7 @@ class XmlMaterialProfile(InstanceContainer): # Same as machine compatibility, keep the derived material containers consistent with the parent # material - found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_hotend_id) + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) if found_materials: new_hotend_material_metadata = found_materials[0] else: From ef37f0d8c78bbbeee97737a61cbfe189808f96f9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 15:34:51 +0100 Subject: [PATCH 330/764] Fix project loading to reset quality if it doesn't exist CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index d54e0a724e..ccdff869a0 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -803,6 +803,22 @@ class ThreeMFWorkspaceReader(WorkspaceReader): quality_type = quality_type) if quality_containers: global_stack.quality = quality_containers[0] + else: + # the quality_type of the quality profile cannot be found. + # this can happen if a quality_type has been removed in a newer version, for example: + # "extra_coarse" is removed from 2.7 to 3.0 + # in this case, the quality will be reset to "normal" + quality_containers = self._container_registry.findInstanceContainers( + definition = global_stack.definition.getId(), + type = "quality", + quality_type = "normal") + if quality_containers: + global_stack.quality = quality_containers[0] + else: + # This should not happen! + Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", + global_stack.getId(), global_stack.definition.getId()) + global_stack.quality = self._container_registry.findInstanceContainers(id = "empty_quality") # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those From 2c6b2b869ef20686cf38395c20fe94d3eb4d8f06 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 23 Nov 2017 15:39:22 +0100 Subject: [PATCH 331/764] CURA-4605 Fix render issues when there are empty layers. Fix layer gap when raft is enabled. --- .../CuraEngineBackend/ProcessSlicedLayersJob.py | 16 ++++++++-------- plugins/SimulationView/SimulationView.py | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 51fcf3ec59..37ab451d16 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -95,22 +95,22 @@ class ProcessSlicedLayersJob(Job): # Find the minimum layer number # When using a raft, the raft layers are sent as layers < 0. Instead of allowing layers < 0, we - # instead simply offset all other layers so the lowest layer is always 0. + # instead simply offset all other layers so the lowest layer is always 0. It could happens that + # the first raft layer has value -8 but there are just 4 raft (negative) layers. min_layer_number = 0 + negative_layers = 0 for layer in self._layers: if layer.id < min_layer_number: min_layer_number = layer.id + if layer.id < 0: + negative_layers += 1 current_layer = 0 for layer in self._layers: - abs_layer_number = layer.id + abs(min_layer_number) - - # Workaround when the last layer doesn't have paths, this layer is skipped because this was generating - # some glitches when rendering. - if layer.id == len(self._layers)-1 and layer.repeatedMessageCount("path_segment") == 0: - Logger.log("i", "No sliced data in the layer", layer.id) - continue + # Negative layers are offset by the minimum layer number, but the positive layers are just + # offset by the number of negative layers so there is no layer gap between raft and model + abs_layer_number = layer.id + abs(min_layer_number) if layer.id < 0 else layer.id + negative_layers layer_data.addLayer(abs_layer_number) this_layer = layer_data.getLayer(abs_layer_number) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 2751ea4f60..b7bff91f9b 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -376,7 +376,7 @@ class SimulationView(View): if layer is None: return new_max_paths = layer.lineMeshElementCount() - if new_max_paths > 0 and new_max_paths != self._max_paths: + if new_max_paths >= 0 and new_max_paths != self._max_paths: self._max_paths = new_max_paths self.maxPathsChanged.emit() From 1e07325d8f4543b198ae894aac244f8a824f920b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 23 Nov 2017 16:11:02 +0100 Subject: [PATCH 332/764] Remove unused getIdsFromFile Since we now return all metadata at once from every file, we don't need this any more. We need to side-load the metadata anyway. Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index a6825f33a6..3d341778f3 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -799,51 +799,6 @@ class XmlMaterialProfile(InstanceContainer): return result_metadata - ## Override of getIdsFromFile because the XML files contain multiple IDs. - @classmethod - def getIdsFromFile(cls, file_name): - result_ids = super().getIdsFromFile(file_name) #The base file has the default ID, taken from the file name without extension. - base_id = result_ids[0] - - try: - data = ET.parse(file_name) - except: #IOError, PermissionError, or anything from the ElementTree library. - Logger.logException("e", "An exception occurred while parsing the material profile") - return - - common_compatibility = True - compatible_entries = data.iterfind("./um:settings/um:setting[@key='hardware compatible']", cls.__namespaces) - try: - common_compatibility = cls._parseCompatibleValue(next(compatible_entries).text) - except StopIteration: #No 'hardware compatible' setting. - pass - - #Get a mapping from the product names to the definition IDs. - product_id_map = cls.getProductIdMap() - - for machine in data.iterfind("./um:settings/um:machine", cls.__namespaces): - machine_compatibility = common_compatibility - compatible_entries = data.iterfind("./um:setting[@key='hardware compatible']", cls.__namespaces) - try: - machine_compatibility = cls._parseCompatibleValue(next(compatible_entries).text) - except StopIteration: #No 'hardware compatible' setting. - pass - - for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces): #For all machines. - machine_id = product_id_map.get(identifier.get("product"), None) - if machine_id is None: - #Let's try again with some naive heuristics. - machine_id = identifier.get("product").replace(" ", "").lower() - if machine_compatibility: - result_ids.append(base_id + "_" + machine_id) - - for hotend in machine.iterfind("./um:hotend", cls.__namespaces): #For all hotends. - hotend_id = hotend.get("id") - if hotend_id is None: - continue - result_ids.append(base_id + "_" + machine_id + "_" + hotend_id) - return result_ids - def _addSettingElement(self, builder, instance): try: key = UM.Dictionary.findKey(self.__material_settings_setting_map, instance.definition.key) From 6b3e1303494e380fc2cbd9aaa8cf9d05a5a6e624 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 23 Nov 2017 16:27:17 +0100 Subject: [PATCH 333/764] Fix edge cases with ultimaker2 and whatever other machines that may get affected CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 41 ++++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index ccdff869a0..dfb16b91e1 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -751,12 +751,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer(): stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack.getId() + "_settings")) - extruder_stacks.append(stack) + if stack.getMetaDataEntry("type") == "extruder_train": + extruder_stacks.append(stack) # If not extruder stacks were saved in the project file (pre 3.1) create one manually # We re-use the container registry's addExtruderStackForSingleExtrusionMachine method for this if not extruder_stacks: - extruder_stacks.append(self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder")) + stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") + if stack: + extruder_stacks.append(stack) except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") @@ -801,24 +804,34 @@ class ThreeMFWorkspaceReader(WorkspaceReader): quality_containers = self._container_registry.findInstanceContainers(definition = global_stack.definition.getId(), type = "quality", quality_type = quality_type) + quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] if quality_containers: global_stack.quality = quality_containers[0] else: - # the quality_type of the quality profile cannot be found. - # this can happen if a quality_type has been removed in a newer version, for example: - # "extra_coarse" is removed from 2.7 to 3.0 - # in this case, the quality will be reset to "normal" - quality_containers = self._container_registry.findInstanceContainers( - definition = global_stack.definition.getId(), - type = "quality", - quality_type = "normal") + # look for "fdmprinter" qualities if the machine-specific qualities cannot be found + quality_containers = self._container_registry.findInstanceContainers(definition = "fdmprinter", + type = "quality", + quality_type = quality_type) + quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] if quality_containers: global_stack.quality = quality_containers[0] else: - # This should not happen! - Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", - global_stack.getId(), global_stack.definition.getId()) - global_stack.quality = self._container_registry.findInstanceContainers(id = "empty_quality") + # the quality_type of the quality profile cannot be found. + # this can happen if a quality_type has been removed in a newer version, for example: + # "extra_coarse" is removed from 2.7 to 3.0 + # in this case, the quality will be reset to "normal" + quality_containers = self._container_registry.findInstanceContainers( + definition = global_stack.definition.getId(), + type = "quality", + quality_type = "normal") + quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] + if quality_containers: + global_stack.quality = quality_containers[0] + else: + # This should not happen! + Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", + global_stack.getId(), global_stack.definition.getId()) + global_stack.quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those From 7bb82cf56f702df6e3a36cf2ba1c2525709f355e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 23 Nov 2017 16:47:34 +0100 Subject: [PATCH 334/764] CURA-4605 Fix render issues when importing a GCode that has empty layers. Also fix gaps between raft and the model. --- plugins/GCodeReader/GCodeReader.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 2a7e29e370..d37769ec3a 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -143,6 +143,11 @@ class GCodeReader(MeshReader): this_layer.polygons.append(this_poly) return True + def _createEmptyLayer(self, layer_number): + self._layer_data_builder.addLayer(layer_number) + self._layer_data_builder.setLayerHeight(layer_number, 0) + self._layer_data_builder.setLayerThickness(layer_number, 0) + def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): # Area of the filament Af = (self._filament_diameter / 2) ** 2 * numpy.pi @@ -322,6 +327,9 @@ class GCodeReader(MeshReader): current_position = self._position(0, 0, 0, 0, [0]) current_path = [] + min_layer_number = 0 + negative_layers = 0 + previous_layer = 0 for line in file: if self._cancelled: @@ -359,7 +367,23 @@ class GCodeReader(MeshReader): layer_number = int(line[len(self._layer_keyword):]) self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) current_path.clear() + + # When using a raft, the raft layers are stored as layers < 0, it mimics the same behavior + # as in ProcessSlicedLayersJob + if layer_number < min_layer_number: + min_layer_number = layer_number + if layer_number < 0: + layer_number += abs(min_layer_number) + negative_layers += 1 + else: + layer_number += negative_layers + + # In case there is a gap in the layer count, empty layers are created + for empty_layer in range(previous_layer + 1, layer_number): + self._createEmptyLayer(empty_layer) + self._layer_number = layer_number + previous_layer = layer_number except: pass From 37935a8a90e75973a29e1fdb28c7876ba0cb7371 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 23 Nov 2017 16:47:55 +0100 Subject: [PATCH 335/764] Load only metadata on start-up Contributes to issue CURA-4243. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 27451c745c..b8c816615e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -279,7 +279,7 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) with ContainerRegistry.getInstance().lockFile(): - ContainerRegistry.getInstance().load() + ContainerRegistry.getInstance().loadAllMetadata() # set the setting version for Preferences preferences = Preferences.getInstance() From 43c9df5703ed10f51a7f65ea906bdaf8232dce3d Mon Sep 17 00:00:00 2001 From: Adam Rumjahn Date: Thu, 23 Nov 2017 20:14:43 -0500 Subject: [PATCH 336/764] Deactivate G32 auto leveling before print don't need this any more on the new printers --- resources/definitions/innovo_inventor.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index dd7e87d446..ea54e1fcc9 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -53,7 +53,7 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" + "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\n;G32 S3 ; auto level\nG92 E0 ; Reset extruder position" }, "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruders\nM140 S0 ; heated bed heater off\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" From c7667b56e240c0426d4f866e513af1055a7066da Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 24 Nov 2017 09:45:59 +0100 Subject: [PATCH 337/764] Multiple fixes for stacks CURA-4617 --- cura/Settings/CuraContainerRegistry.py | 6 ++---- cura/Settings/CuraContainerStack.py | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 543678ee22..3590d70602 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -454,16 +454,14 @@ class CuraContainerRegistry(ContainerRegistry): material_id = "default" if machine.material.getId() not in ("empty", "empty_material"): - # TODO: find the ID that's suitable for this extruder - pass + material_id = machine.material.getId() else: material_id = "empty_material" extruder_stack.setMaterialById(material_id) quality_id = "default" if machine.quality.getId() not in ("empty", "empty_quality"): - # TODO: find the ID that's suitable for this extruder - pass + quality_id = machine.quality.getId() else: quality_id = "empty_quality" extruder_stack.setQualityById(quality_id) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 156883ade3..f0cec3c450 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -121,7 +121,7 @@ class CuraContainerStack(ContainerStack): # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setQualityById(self, new_quality_id: str) -> None: - quality = self._empty_instance_container + quality = self._empty_quality if new_quality_id == "default": new_quality = self.findDefaultQuality() if new_quality: @@ -159,7 +159,7 @@ class CuraContainerStack(ContainerStack): # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setMaterialById(self, new_material_id: str) -> None: - material = self._empty_instance_container + material = self._empty_material if new_material_id == "default": new_material = self.findDefaultMaterial() if new_material: @@ -197,7 +197,7 @@ class CuraContainerStack(ContainerStack): # # \throws Exceptions.InvalidContainerError Raised when no container could be found with the specified ID. def setVariantById(self, new_variant_id: str) -> None: - variant = self._empty_instance_container + variant = self._empty_variant if new_variant_id == "default": new_variant = self.findDefaultVariant() if new_variant: From 0b434978dd7585782dbefd16f89058cabc5b382a Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 24 Nov 2017 10:34:38 +0100 Subject: [PATCH 338/764] CURA-4561 Add tooltip also to the Cancel button. --- resources/qml/SaveButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 3237dd9ade..b258ecad43 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -157,7 +157,7 @@ Item { Button { id: prepareButton - tooltip: catalog.i18nc("@info:tooltip","Slice"); + tooltip: [1, 5].indexOf(UM.Backend.state) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing enabled: (base.backendState == 1 || base.backendState == 2) && base.activity == true visible: { From 9ecfd5510a6f5e97645e061eaeaa84e5395dd49e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 24 Nov 2017 10:42:09 +0100 Subject: [PATCH 339/764] Clarify description for when bed temperature is 0 Fixes #2674. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 88ec34274e..0d0bc9dea1 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1966,7 +1966,7 @@ "material_bed_temperature": { "label": "Build Plate Temperature", - "description": "The temperature used for the heated build plate. If this is 0, the bed will not heat up for this print.", + "description": "The temperature used for the heated build plate. If this is 0, the bed temperature will not be adjusted.", "unit": "°C", "type": "float", "resolve": "max(extruderValues('material_bed_temperature'))", From c8c2129b7e7e2174181aed923994f1d6b6371eaf Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 24 Nov 2017 10:51:34 +0100 Subject: [PATCH 340/764] CURA-4552 Minor changes --- plugins/GCodeReader/GCodeReader.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 6578163aaf..14d3a2b741 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -211,7 +211,6 @@ class GCodeReader(MeshReader): return self._position( params.x if params.x is not None else position.x, params.y if params.y is not None else position.y, - 0, position.f, position.e) @@ -274,11 +273,11 @@ class GCodeReader(MeshReader): position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) return position - def _processMCode(self, m): - if m == 82: + def _processMCode(self, M): + if M == 82: # Set absolute extrusion mode self._is_absolute_extrusion = True - elif m == 83: + elif M == 83: # Set relative extrusion mode self._is_absolute_extrusion = False From bf1ecba641a0c6cc702a4b72474976d5ac217196 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 24 Nov 2017 10:54:20 +0100 Subject: [PATCH 341/764] Add the layer thickness back to the color options in Simulation View --- plugins/SimulationView/SimulationView.qml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index bc224f19e2..42cd23cd5f 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -138,11 +138,10 @@ Item text: catalog.i18nc("@label:listbox", "Feedrate"), type_id: 2 }) - // TODO DON'T DELETE!!!! This part must be enabled when adaptive layer height feature is available -// layerViewTypes.append({ -// text: catalog.i18nc("@label:listbox", "Layer thickness"), -// type_id: 3 // these ids match the switching in the shader -// }) + layerViewTypes.append({ + text: catalog.i18nc("@label:listbox", "Layer thickness"), + type_id: 3 // these ids match the switching in the shader + }) } ComboBox From 6cea9c59e89658e4d68c76a12e0a071486de0dc2 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 24 Nov 2017 11:59:09 +0100 Subject: [PATCH 342/764] Prevent crash handler exception --- cura/CrashHandler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index c6f94f0a80..fc12bff620 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -280,5 +280,7 @@ class CrashHandler: Application.getInstance().callLater(self._show) def _show(self): - self.dialog.exec_() - os._exit(1) + # When the exception is not in the fatal_exception_types list, the dialog is not created, so we don't need to show it + if self.dialog: + self.dialog.exec_() + os._exit(1) From 1ea937991343720c1fe0f32e942c21bdf94f8bc8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 24 Nov 2017 13:02:11 +0100 Subject: [PATCH 343/764] CURA-4609 Fix qml rectangle background in feedrate color scheme. --- plugins/SimulationView/SimulationView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index 17c71d2733..d802335304 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -349,7 +349,7 @@ Item } // Text for the minimum, maximum and units for the feedrates and layer thickness - Rectangle { + Item { id: gradientLegend visible: view_settings.show_gradient width: parent.width From 147cbdf592d010bcb42db72e00bfccf3b504e0d5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 24 Nov 2017 12:43:41 +0100 Subject: [PATCH 344/764] Clarify translations of 'unknown' For some languages, the gender matters. Contributes to issue CURA-4601. --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 6 +++--- .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 2 +- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index cec2bf0f0f..cb574384f9 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -230,13 +230,13 @@ Cura.MachineAction { if(base.selectedPrinter.printerType == "ultimaker3") { - return catalog.i18nc("@label", "Ultimaker 3") + return catalog.i18nc("@label Printer name", "Ultimaker 3") } else if(base.selectedPrinter.printerType == "ultimaker3_extended") { - return catalog.i18nc("@label", "Ultimaker 3 Extended") + return catalog.i18nc("@label Printer name", "Ultimaker 3 Extended") } else { - return catalog.i18nc("@label", "Unknown") // We have no idea what type it is. Should not happen 'in the field' + return catalog.i18nc("@label Printer name", "Unknown") // We have no idea what type it is. Should not happen 'in the field' } } else diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index b6e94121f8..09518575c9 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -486,7 +486,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte printer_name = self.__getPrinterNameFromUuid(print_job["printer_uuid"]) if printer_name is None: - printer_name = i18n_catalog.i18nc("@label", "Unknown") + printer_name = i18n_catalog.i18nc("@label Printer name", "Unknown") message_text = (i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.") diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 7ae8520d19..c253ebae89 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -44,7 +44,7 @@ Rectangle case "maintenance": // TODO: new string case "unknown": default: - return catalog.i18nc("@label", "Unknown"); + return catalog.i18nc("@label Printer status", "Unknown"); } } From 4a8dacbe063188995b122f789a8750aa202f19cf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 24 Nov 2017 13:11:05 +0100 Subject: [PATCH 345/764] Make crash handler easier to translate All that formatting doesn't need to be translated along. It's only confusing, especially because of those variable names. They always need to be in that position anyway. Contributes to issue CURA-4601. --- cura/CrashHandler.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index fc12bff620..7a386ee903 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -108,11 +108,11 @@ class CrashHandler: except: self.cura_version = catalog.i18nc("@label unknown version of Cura", "Unknown") - crash_info = catalog.i18nc("@label Cura version", "Cura version: {version}
    ").format(version = self.cura_version) - crash_info += catalog.i18nc("@label Platform", "Platform: {platform}
    ").format(platform = platform.platform()) - crash_info += catalog.i18nc("@label Qt version", "Qt version: {qt}
    ").format(qt = QT_VERSION_STR) - crash_info += catalog.i18nc("@label PyQt version", "PyQt version: {pyqt}
    ").format(pyqt = PYQT_VERSION_STR) - crash_info += catalog.i18nc("@label OpenGL", "OpenGL: {opengl}
    ").format(opengl = self._getOpenGLInfo()) + crash_info = "" + catalog.i18nc("@label Cura version number", "Cura version") + ": " + str(self.cura_version) + "
    " + crash_info += "" + catalog.i18nc("@label Type of platform", "Platform") + ": " + str(platform.platform()) + "
    " + crash_info += "" + catalog.i18nc("@label", "Qt version") + ": " + str(QT_VERSION_STR) + "
    " + crash_info += "" + catalog.i18nc("@label", "PyQt version") + ": " + str(PYQT_VERSION_STR) + "
    " + crash_info += "" + catalog.i18nc("@label OpenGL version", "OpenGL") + ": " + str(self._getOpenGLInfo()) + "
    " label.setText(crash_info) layout.addWidget(label) From a0ae7489f8013b87763fa4b11a0e831b6f346e60 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 24 Nov 2017 13:15:43 +0100 Subject: [PATCH 346/764] Less technical term for X/Y offset of infill Just in the description. It's good to describe a setting using different words than the setting name. Contributes to issue CURA-4601. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0d0bc9dea1..8db02b67f8 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1568,7 +1568,7 @@ "infill_offset_x": { "label": "Infill X Offset", - "description": "The infill pattern is offset this distance along the X axis.", + "description": "The infill pattern is moved this distance along the X axis.", "unit": "mm", "type": "float", "default_value": 0, @@ -1579,7 +1579,7 @@ "infill_offset_y": { "label": "Infill Y Offset", - "description": "The infill pattern is offset this distance along the Y axis.", + "description": "The infill pattern is moved this distance along the Y axis.", "unit": "mm", "type": "float", "default_value": 0, From d0c1569da6f323d5f8df4e8641a82a392840d176 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 22 Nov 2017 10:19:50 +0100 Subject: [PATCH 347/764] Merge branch 'fieldOfView-feature_simulation_ux_tweaks' --- plugins/SimulationView/SimulationView.qml | 328 ++++++++++++---------- resources/themes/cura-light/theme.json | 8 +- 2 files changed, 183 insertions(+), 153 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index d802335304..bc224f19e2 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -20,7 +20,12 @@ Item } } height: { - if (UM.SimulationView.compatibilityMode) { + if (viewSettings.collapsed) { + if (UM.SimulationView.compatibilityMode) { + return UM.Theme.getSize("layerview_menu_size_compatibility_collapsed").height; + } + return UM.Theme.getSize("layerview_menu_size_collapsed").height; + } else if (UM.SimulationView.compatibilityMode) { return UM.Theme.getSize("layerview_menu_size_compatibility").height; } else if (UM.Preferences.getValue("layerview/layer_view_type") == 0) { return UM.Theme.getSize("layerview_menu_size_material_color_mode").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) @@ -28,6 +33,7 @@ Item return UM.Theme.getSize("layerview_menu_size").height + UM.SimulationView.extruderCount * (UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("layerview_row_spacing").height) } } + Behavior on height { NumberAnimation { duration: 100 } } property var buttonTarget: { if(parent != null) @@ -40,21 +46,49 @@ Item visible: parent != null ? !parent.parent.monitoringPrint: true - UM.PointingRectangle { + Rectangle { id: layerViewMenu anchors.right: parent.right anchors.top: parent.top width: parent.width height: parent.height + clip: true z: layerSlider.z - 1 color: UM.Theme.getColor("tool_panel_background") - borderWidth: UM.Theme.getSize("default_lining").width - borderColor: UM.Theme.getColor("lining") - arrowSize: 0 // hide arrow until weird issue with first time rendering is fixed + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + + Button { + id: collapseButton + anchors.top: parent.top + anchors.topMargin: Math.floor(UM.Theme.getSize("default_margin").height + (UM.Theme.getSize("layerview_row").height - UM.Theme.getSize("default_margin").height) / 2) + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + + onClicked: viewSettings.collapsed = !viewSettings.collapsed + + style: ButtonStyle + { + background: UM.RecolorImage + { + width: control.width + height: control.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("setting_control_text") + source: viewSettings.collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom") + } + label: Label{ } + } + } ColumnLayout { - id: view_settings + id: viewSettings + property bool collapsed: false property var extruder_opacities: UM.Preferences.getValue("layerview/extruder_opacities").split("|") property bool show_travel_moves: UM.Preferences.getValue("layerview/show_travel_moves") property bool show_helpers: UM.Preferences.getValue("layerview/show_helpers") @@ -70,9 +104,9 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - spacing: UM.Theme.getSize("layerview_row_spacing").height anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("layerview_row_spacing").height Label { @@ -121,7 +155,6 @@ Item visible: !UM.SimulationView.compatibilityMode style: UM.Theme.styles.combobox anchors.right: parent.right - anchors.rightMargin: 10 * screenScaleFactor onActivated: { @@ -137,7 +170,7 @@ Item function updateLegends(type_id) { // update visibility of legends - view_settings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); + viewSettings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); } } @@ -155,12 +188,10 @@ Item Layout.preferredWidth: UM.Theme.getSize("layerview_row").width } - Label + Item { - id: space2Label - anchors.left: parent.left - text: " " - font.pointSize: 0.5 + height: Math.floor(UM.Theme.getSize("default_margin").width / 2) + width: width } Connections { @@ -170,13 +201,13 @@ Item layerTypeCombobox.currentIndex = UM.SimulationView.compatibilityMode ? 1 : UM.Preferences.getValue("layerview/layer_view_type"); layerTypeCombobox.updateLegends(layerTypeCombobox.currentIndex); playButton.pauseSimulation(); - view_settings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); - view_settings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); - view_settings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); - view_settings.show_skin = UM.Preferences.getValue("layerview/show_skin"); - view_settings.show_infill = UM.Preferences.getValue("layerview/show_infill"); - view_settings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); - view_settings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); + viewSettings.extruder_opacities = UM.Preferences.getValue("layerview/extruder_opacities").split("|"); + viewSettings.show_travel_moves = UM.Preferences.getValue("layerview/show_travel_moves"); + viewSettings.show_helpers = UM.Preferences.getValue("layerview/show_helpers"); + viewSettings.show_skin = UM.Preferences.getValue("layerview/show_skin"); + viewSettings.show_infill = UM.Preferences.getValue("layerview/show_infill"); + viewSettings.only_show_top_layers = UM.Preferences.getValue("view/only_show_top_layers"); + viewSettings.top_layer_count = UM.Preferences.getValue("view/top_layer_count"); } } @@ -184,24 +215,23 @@ Item model: Cura.ExtrudersModel{} CheckBox { id: extrudersModelCheckBox - checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" + checked: viewSettings.extruder_opacities[index] > 0.5 || viewSettings.extruder_opacities[index] == undefined || viewSettings.extruder_opacities[index] == "" onClicked: { - view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 - UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); + viewSettings.extruder_opacities[index] = checked ? 1.0 : 0.0 + UM.Preferences.setValue("layerview/extruder_opacities", viewSettings.extruder_opacities.join("|")); } visible: !UM.SimulationView.compatibilityMode enabled: index + 1 <= 4 Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: extrudersModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: model.color radius: width / 2 border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: !view_settings.show_legend & !view_settings.show_gradient + visible: !viewSettings.show_legend & !viewSettings.show_gradient } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -229,25 +259,25 @@ Item { typesLegendModel.append({ label: catalog.i18nc("@label", "Show Travels"), - initialValue: view_settings.show_travel_moves, + initialValue: viewSettings.show_travel_moves, preference: "layerview/show_travel_moves", colorId: "layerview_move_combing" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Helpers"), - initialValue: view_settings.show_helpers, + initialValue: viewSettings.show_helpers, preference: "layerview/show_helpers", colorId: "layerview_support" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Shell"), - initialValue: view_settings.show_skin, + initialValue: viewSettings.show_skin, preference: "layerview/show_skin", colorId: "layerview_inset_0" }); typesLegendModel.append({ label: catalog.i18nc("@label", "Show Infill"), - initialValue: view_settings.show_infill, + initialValue: viewSettings.show_infill, preference: "layerview/show_infill", colorId: "layerview_infill" }); @@ -263,13 +293,12 @@ Item Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: legendModelCheckBox.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: UM.Theme.getColor(model.colorId) border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + visible: viewSettings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -291,7 +320,7 @@ Item } CheckBox { - checked: view_settings.only_show_top_layers + checked: viewSettings.only_show_top_layers onClicked: { UM.Preferences.setValue("view/only_show_top_layers", checked ? 1.0 : 0.0); } @@ -300,7 +329,7 @@ Item style: UM.Theme.styles.checkbox } CheckBox { - checked: view_settings.top_layer_count == 5 + checked: viewSettings.top_layer_count == 5 onClicked: { UM.Preferences.setValue("view/top_layer_count", checked ? 5 : 1); } @@ -327,18 +356,17 @@ Item Label { text: label - visible: view_settings.show_legend + visible: viewSettings.show_legend id: typesLegendModelLabel Rectangle { anchors.verticalCenter: parent.verticalCenter anchors.right: typesLegendModelLabel.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("layerview_legend_size").width height: UM.Theme.getSize("layerview_legend_size").height color: UM.Theme.getColor(model.colorId) border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + visible: viewSettings.show_legend } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height @@ -351,7 +379,7 @@ Item // Text for the minimum, maximum and units for the feedrates and layer thickness Item { id: gradientLegend - visible: view_settings.show_gradient + visible: viewSettings.show_gradient width: parent.width height: UM.Theme.getSize("layerview_row").height anchors { @@ -427,7 +455,7 @@ Item Rectangle { // In QML 5.9 can be changed by LinearGradient // Invert values because then the bar is rotated 90 degrees id: gradient - visible: view_settings.show_gradient + visible: viewSettings.show_gradient anchors.left: parent.right height: parent.width width: UM.Theme.getSize("layerview_row").height * 1.5 @@ -458,134 +486,134 @@ Item } } } + } - Item { - id: slidersBox + Item { + id: slidersBox - width: parent.width - visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity + width: parent.width + visible: UM.SimulationView.layerActivity && CuraApplication.platformActivity + + anchors { + top: parent.bottom + topMargin: UM.Theme.getSize("slider_layerview_margin").height + left: parent.left + } + + PathSlider { + id: pathSlider + + height: UM.Theme.getSize("slider_handle").width + anchors.right: playButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.left: parent.left + visible: !UM.SimulationView.compatibilityMode + + // custom properties + handleValue: UM.SimulationView.currentPath + maximumValue: UM.SimulationView.numPaths + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + handleColor: UM.Theme.getColor("slider_handle") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + rangeColor: UM.Theme.getColor("slider_groove_fill") + + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + pathSlider.setHandleValue(UM.SimulationView.currentPath) + } + } + + LayerSlider { + id: layerSlider + + width: UM.Theme.getSize("slider_handle").width + height: UM.Theme.getSize("layerview_menu_size").height anchors { - top: parent.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").height - left: parent.left + top: !UM.SimulationView.compatibilityMode ? playButton.bottom : parent.top + topMargin: !UM.SimulationView.compatibilityMode ? UM.Theme.getSize("default_margin").height : 0 + right: parent.right + rightMargin: UM.Theme.getSize("slider_layerview_margin").width } - PathSlider { - id: pathSlider + // custom properties + upperValue: UM.SimulationView.currentLayer + lowerValue: UM.SimulationView.minimumLayer + maximumValue: UM.SimulationView.numLayers + handleSize: UM.Theme.getSize("slider_handle").width + trackThickness: UM.Theme.getSize("slider_groove").width + trackColor: UM.Theme.getColor("slider_groove") + trackBorderColor: UM.Theme.getColor("slider_groove_border") + upperHandleColor: UM.Theme.getColor("slider_handle") + lowerHandleColor: UM.Theme.getColor("slider_handle") + rangeHandleColor: UM.Theme.getColor("slider_groove_fill") + handleActiveColor: UM.Theme.getColor("slider_handle_active") + handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - width: parent.width - height: UM.Theme.getSize("slider_handle").width - anchors.left: parent.left - visible: !UM.SimulationView.compatibilityMode - - // custom properties - handleValue: UM.SimulationView.currentPath - maximumValue: UM.SimulationView.numPaths - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - handleColor: UM.Theme.getColor("slider_handle") - handleActiveColor: UM.Theme.getColor("slider_handle_active") - rangeColor: UM.Theme.getColor("slider_groove_fill") - - // update values when layer data changes - Connections { - target: UM.SimulationView - onMaxPathsChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) - onCurrentPathChanged: pathSlider.setHandleValue(UM.SimulationView.currentPath) - } - - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - pathSlider.setHandleValue(UM.SimulationView.currentPath) - } + // update values when layer data changes + Connections { + target: UM.SimulationView + onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) + onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) } - LayerSlider { - id: layerSlider + // make sure the slider handlers show the correct value after switching views + Component.onCompleted: { + layerSlider.setLowerValue(UM.SimulationView.minimumLayer) + layerSlider.setUpperValue(UM.SimulationView.currentLayer) + } + } - width: UM.Theme.getSize("slider_handle").width - height: UM.Theme.getSize("layerview_menu_size").height - - anchors { - top: pathSlider.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").height - right: parent.right - rightMargin: UM.Theme.getSize("slider_layerview_margin").width - } - - // custom properties - upperValue: UM.SimulationView.currentLayer - lowerValue: UM.SimulationView.minimumLayer - maximumValue: UM.SimulationView.numLayers - handleSize: UM.Theme.getSize("slider_handle").width - trackThickness: UM.Theme.getSize("slider_groove").width - trackColor: UM.Theme.getColor("slider_groove") - trackBorderColor: UM.Theme.getColor("slider_groove_border") - upperHandleColor: UM.Theme.getColor("slider_handle") - lowerHandleColor: UM.Theme.getColor("slider_handle") - rangeHandleColor: UM.Theme.getColor("slider_groove_fill") - handleActiveColor: UM.Theme.getColor("slider_handle_active") - handleLabelWidth: UM.Theme.getSize("slider_layerview_background").width - - // update values when layer data changes - Connections { - target: UM.SimulationView - onMaxLayersChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) - onMinimumLayerChanged: layerSlider.setLowerValue(UM.SimulationView.minimumLayer) - onCurrentLayerChanged: layerSlider.setUpperValue(UM.SimulationView.currentLayer) - } - - // make sure the slider handlers show the correct value after switching views - Component.onCompleted: { - layerSlider.setLowerValue(UM.SimulationView.minimumLayer) - layerSlider.setUpperValue(UM.SimulationView.currentLayer) - } + // Play simulation button + Button { + id: playButton + implicitWidth: Math.floor(UM.Theme.getSize("button").width * 0.75) + implicitHeight: Math.floor(UM.Theme.getSize("button").height * 0.75) + iconSource: "./resources/simulation_resume.svg" + style: UM.Theme.styles.tool_button + visible: !UM.SimulationView.compatibilityMode + anchors { + horizontalCenter: layerSlider.horizontalCenter + verticalCenter: pathSlider.verticalCenter } - // Play simulation button - Button { - id: playButton - implicitWidth: UM.Theme.getSize("button").width * 0.75; - implicitHeight: UM.Theme.getSize("button").height * 0.75; - iconSource: "./resources/simulation_resume.svg" - style: UM.Theme.styles.tool_button - visible: !UM.SimulationView.compatibilityMode - anchors { - horizontalCenter: layerSlider.horizontalCenter - top: layerSlider.bottom - topMargin: UM.Theme.getSize("slider_layerview_margin").width - } + property var status: 0 // indicates if it's stopped (0) or playing (1) - property var status: 0 // indicates if it's stopped (0) or playing (1) - - onClicked: { - switch(status) { - case 0: { - resumeSimulation() - break - } - case 1: { - pauseSimulation() - break - } + onClicked: { + switch(status) { + case 0: { + resumeSimulation() + break + } + case 1: { + pauseSimulation() + break } } + } - function pauseSimulation() { - UM.SimulationView.setSimulationRunning(false) - iconSource = "./resources/simulation_resume.svg" - simulationTimer.stop() - status = 0 - } + function pauseSimulation() { + UM.SimulationView.setSimulationRunning(false) + iconSource = "./resources/simulation_resume.svg" + simulationTimer.stop() + status = 0 + } - function resumeSimulation() { - UM.SimulationView.setSimulationRunning(true) - iconSource = "./resources/simulation_pause.svg" - simulationTimer.start() - } + function resumeSimulation() { + UM.SimulationView.setSimulationRunning(true) + iconSource = "./resources/simulation_pause.svg" + simulationTimer.start() } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 4197285dd8..09f93d413e 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -344,11 +344,13 @@ "slider_handle": [1.0, 1.0], "slider_layerview_size": [1.0, 22.0], "slider_layerview_background": [4.0, 0.0], - "slider_layerview_margin": [1.0, 1.0], + "slider_layerview_margin": [1.0, 1.5], - "layerview_menu_size": [15, 19.5], - "layerview_menu_size_material_color_mode": [15, 15.5], + "layerview_menu_size": [15, 20], + "layerview_menu_size_material_color_mode": [15, 16], + "layerview_menu_size_collapsed": [15, 6], "layerview_menu_size_compatibility": [22, 22.0], + "layerview_menu_size_compatibility_collapsed": [15, 3.5], "layerview_legend_size": [1.0, 1.0], "layerview_row": [11.0, 1.5], "layerview_row_spacing": [0.0, 0.5], From ebe766a7c8cbf74ab459c0efd8cbd47204c2b960 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 24 Nov 2017 16:45:09 +0100 Subject: [PATCH 348/764] Set definition by their ID The new function for setting the definition just adds the ID to the metadata. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 4 ++-- cura/Settings/CuraContainerRegistry.py | 4 ++-- cura/Settings/CuraStackBuilder.py | 14 +++++++------- cura/Settings/ExtruderManager.py | 2 +- plugins/3MFReader/ThreeMFReader.py | 2 +- plugins/GCodeWriter/GCodeWriter.py | 4 ++-- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 8 +++++--- tests/Settings/TestCuraContainerRegistry.py | 6 +++--- 9 files changed, 24 insertions(+), 22 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 52b97cd60d..a93dd3c1b6 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -1001,9 +1001,9 @@ class ContainerManager(QObject): # If the machine specifies qualities should be filtered, ensure we match the current criteria. if not machine_definition.getMetaDataEntry("has_machine_quality"): - quality_changes.setDefinition(self._container_registry.findDefinitionContainers(id = "fdmprinter")[0]) + quality_changes.setDefinition("fdmprinter") else: - quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition)) + quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition).getId()) from cura.CuraApplication import CuraApplication quality_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 8903e195dc..aa1f7617cb 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -284,7 +284,7 @@ class CuraContainerRegistry(ContainerRegistry): quality_type_criteria = {"quality_type": quality_type} if self._machineHasOwnQualities(): - profile.setDefinition(self._activeQualityDefinition()) + profile.setDefinition(self._activeQualityDefinition().getId()) if self._machineHasOwnMaterials(): active_material_id = self._activeMaterialId() if active_material_id and active_material_id != "empty": # only update if there is an active material @@ -294,7 +294,7 @@ class CuraContainerRegistry(ContainerRegistry): quality_type_criteria["definition"] = profile.getDefinition().getId() else: - profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) + profile.setDefinition(fdmprinter) quality_type_criteria["definition"] = "fdmprinter" machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index f7a1592155..4dabbf317f 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -56,7 +56,7 @@ class CuraStackBuilder: new_extruder = cls.createExtruderStack( new_extruder_id, definition = extruder_definition, - machine_definition = machine_definition, + machine_definition_id = machine_definition.getId(), quality = "default", material = "default", variant = "default", @@ -69,12 +69,13 @@ class CuraStackBuilder: # # \param new_stack_id The ID of the new stack. # \param definition The definition to base the new stack on. - # \param machine_definition The machine definition to use for the user container. + # \param machine_definition_id The ID of the machine definition to use for + # the user container. # \param kwargs You can add keyword arguments to specify IDs of containers to use for a specific type, for example "variant": "0.4mm" # # \return A new Global stack instance with the specified parameters. @classmethod - def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, **kwargs) -> ExtruderStack: + def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, machine_definition_id: str, **kwargs) -> ExtruderStack: stack = ExtruderStack(new_stack_id) stack.setName(definition.getName()) stack.setDefinition(definition) @@ -87,7 +88,7 @@ class CuraStackBuilder: user_container.addMetaDataEntry("extruder", new_stack_id) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(machine_definition) + user_container.setDefinition(machine_definition_id) stack.setUserChanges(user_container) @@ -136,7 +137,7 @@ class CuraStackBuilder: user_container.addMetaDataEntry("machine", new_stack_id) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(definition) + user_container.setDefinition(definition.getId()) stack.setUserChanges(user_container) @@ -172,8 +173,7 @@ class CuraStackBuilder: unique_container_name = ContainerRegistry.getInstance().uniqueName(container_name) definition_changes_container = InstanceContainer(unique_container_name) - definition = container_stack.getBottom() - definition_changes_container.setDefinition(definition) + definition_changes_container.setDefinition(container_stack.getBottom().getId()) definition_changes_container.addMetaDataEntry("type", "definition_changes") definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 8585c3cf7d..e01561c5f4 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -379,7 +379,7 @@ class ExtruderManager(QObject): user_profile.addMetaDataEntry("extruder", extruder_stack_id) from cura.CuraApplication import CuraApplication user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_profile.setDefinition(machine_definition) + user_profile.setDefinition(machine_definition.getId()) container_registry.addContainer(user_profile) container_stack.addContainer(user_profile) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index a34bf771d7..f4c675fdf9 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -124,7 +124,7 @@ class ThreeMFReader(MeshReader): # Get the definition & set it definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom()) - um_node.callDecoration("getStack").getTop().setDefinition(definition) + um_node.callDecoration("getStack").getTop().setDefinition(definition.getId()) setting_container = um_node.callDecoration("getStack").getTop() diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 3860590ef7..1e4fb666b7 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -75,9 +75,9 @@ class GCodeWriter(MeshWriter): def _createFlattenedContainerInstance(self, instance_container1, instance_container2): flat_container = InstanceContainer(instance_container2.getName()) if instance_container1.getDefinition(): - flat_container.setDefinition(instance_container1.getDefinition()) + flat_container.setDefinition(instance_container1.getDefinition().getId()) else: - flat_container.setDefinition(instance_container2.getDefinition()) + flat_container.setDefinition(instance_container2.getDefinition().getId()) flat_container.setMetaData(copy.deepcopy(instance_container2.getMetaData())) for key in instance_container2.getAllKeys(): diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 3d680f2b97..69e79bb974 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -121,7 +121,7 @@ class LegacyProfileReader(ProfileReader): Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") return None current_printer_definition = global_container_stack.getBottom() - profile.setDefinition(current_printer_definition) + profile.setDefinition(current_printer_definition.getId()) for new_setting in dict_of_doom["translation"]: # Evaluate all new settings that would get a value from the translations. old_setting_expression = dict_of_doom["translation"][new_setting] compiled = compile(old_setting_expression, new_setting, "eval") diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 3d341778f3..7ab1e0f7ad 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -496,8 +496,9 @@ class XmlMaterialProfile(InstanceContainer): meta_data["approximate_diameter"] = str(round(float(property_values.get("diameter", 2.85)))) # In mm meta_data["properties"] = property_values + meta_data["definition"] = "fdmprinter" - self.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) + self.setDefinition("fdmprinter") common_compatibility = True settings = data.iterfind("./um:settings/um:setting", self.__namespaces) @@ -569,7 +570,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True new_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_material.setDefinition(definition) + new_material.setDefinition(machine_id) # Don't use setMetadata, as that overrides it for all materials with same base file new_material.getMetaData()["compatible"] = machine_compatibility new_material.getMetaData()["machine_manufacturer"] = machine_manufacturer @@ -623,7 +624,7 @@ class XmlMaterialProfile(InstanceContainer): # Update the private directly, as we want to prevent the lookup that is done when using setName new_hotend_material.setName(self.getName()) new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_hotend_material.setDefinition(definition) + new_hotend_material.setDefinition(machine_id) new_hotend_material.addMetaDataEntry("variant", variant_containers[0]["id"]) # Don't use setMetadata, as that overrides it for all materials with same base file new_hotend_material.getMetaData()["compatible"] = hotend_compatibility @@ -706,6 +707,7 @@ class XmlMaterialProfile(InstanceContainer): base_metadata["approximate_diameter"] = str(round(float(property_values.get("diameter", 2.85)))) # In mm base_metadata["properties"] = property_values + base_metadata["definition"] = "fdmprinter" compatible_entries = data.iterfind("./um:settings/um:setting[@key='hardware compatible']", cls.__namespaces) try: diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index d502d31cc3..1abd098338 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -74,7 +74,7 @@ def test_addContainerGoodSettingVersion(container_registry, definition_container instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance") instance.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - instance.setDefinition(definition_container) + instance.setDefinition(definition_container.getId()) mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting containers get registered. with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container): @@ -89,7 +89,7 @@ def test_addContainerNoSettingVersion(container_registry, definition_container): instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance") #Don't add setting_version metadata. - instance.setDefinition(definition_container) + instance.setDefinition(definition_container.getId()) mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting container should not get registered. with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container): @@ -104,7 +104,7 @@ def test_addContainerBadSettingVersion(container_registry, definition_container) instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance") instance.addMetaDataEntry("setting_version", 9001) #Wrong version! - instance.setDefinition(definition_container) + instance.setDefinition(definition_container.getId()) mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting container should not get registered. with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container): From 77d134a3b70c74e08ffc7ab30e10fbf7a7ed4d1e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 24 Nov 2017 16:55:18 +0100 Subject: [PATCH 349/764] Fix python error when CrashHandler is opened before opengl is initialised Contributes to #2837 --- cura/CrashHandler.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index c6f94f0a80..85ff5d197d 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -126,13 +126,18 @@ class CrashHandler: return group def _getOpenGLInfo(self): + opengl_instance = OpenGL.getInstance() + if not opengl_instance: + self.data["opengl"] = {"version": "n/a", "vendor": "n/a", "type": "n/a"} + return catalog.i18nc("@label", "not yet initialised
    ") + info = "
      " - info += catalog.i18nc("@label OpenGL version", "
    • OpenGL Version: {version}
    • ").format(version = OpenGL.getInstance().getOpenGLVersion()) - info += catalog.i18nc("@label OpenGL vendor", "
    • OpenGL Vendor: {vendor}
    • ").format(vendor = OpenGL.getInstance().getGPUVendorName()) - info += catalog.i18nc("@label OpenGL renderer", "
    • OpenGL Renderer: {renderer}
    • ").format(renderer = OpenGL.getInstance().getGPUType()) + info += catalog.i18nc("@label OpenGL version", "
    • OpenGL Version: {version}
    • ").format(version = opengl_instance.getOpenGLVersion()) + info += catalog.i18nc("@label OpenGL vendor", "
    • OpenGL Vendor: {vendor}
    • ").format(vendor = opengl_instance.getGPUVendorName()) + info += catalog.i18nc("@label OpenGL renderer", "
    • OpenGL Renderer: {renderer}
    • ").format(renderer = opengl_instance.getGPUType()) info += "
    " - self.data["opengl"] = {"version": OpenGL.getInstance().getOpenGLVersion(), "vendor": OpenGL.getInstance().getGPUVendorName(), "type": OpenGL.getInstance().getGPUType()} + self.data["opengl"] = {"version": opengl_instance.getOpenGLVersion(), "vendor": opengl_instance.getGPUVendorName(), "type": opengl_instance.getGPUType()} return info From e7477359bb05f50a57add8f10a683d950c4c7e89 Mon Sep 17 00:00:00 2001 From: Dinow Date: Sat, 25 Nov 2017 00:31:48 +0800 Subject: [PATCH 350/764] Update fdmprinter for 3.1 --- resources/i18n/zh_TW/fdmprinter.def.json.po | 108 ++++++-------------- 1 file changed, 31 insertions(+), 77 deletions(-) diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index bcac969aa3..2be6fbeefe 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-22 23:36+0800\n" +"PO-Revision-Date: 2017-11-25 00:31+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -667,7 +667,7 @@ msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台 #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "切片公差" #: fdmprinter.def.json msgctxt "slicing_tolerance description" @@ -680,21 +680,25 @@ msgid "" "retains the most details, Inclusive makes for the best fit and Middle takes " "the least time to process." msgstr "" +"如何使用傾斜的外表切片。可以使用層高的中間與外表相交產生的截面(中間)。也可" +"以使用該層高完全不超出模型體積的區域(排除),或是該層高的模型投影區域(包" +"含)。「排除」保留最多的細節,「包含」有最符合的外形,而「中間」花最少的運算" +"時間。" #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "中間" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "排除" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "包含" #: fdmprinter.def.json msgctxt "line_width label" @@ -881,9 +885,6 @@ msgid "" msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "wall_x_extruder_nr label" -#| msgid "Inner Walls Extruder" msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" msgstr "內壁擠出機" @@ -1597,15 +1598,6 @@ msgid "Infill Pattern" msgstr "填充列印樣式" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "infill_pattern description" -#| msgid "" -#| "The pattern of the infill material of the print. The line and zig zag " -#| "infill swap direction on alternate layers, reducing material cost. The " -#| "grid, triangle, cubic, octet, quarter cubic and concentric patterns are " -#| "fully printed every layer. Cubic, quarter cubic and octet infill change " -#| "with every layer to provide a more equal distribution of strength over " -#| "each direction." msgctxt "infill_pattern description" msgid "" "The pattern of the infill material of the print. The line and zig zag infill " @@ -1616,8 +1608,9 @@ msgid "" "strength over each direction." msgstr "" "填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" -"三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" -"分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强度分布。" +"三角形、三-六邊形、立方體、八面體、四分立方體、十字形和同心的列印樣式在每層完" +"整列印。立方體、四分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强" +"度分布。" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1637,7 +1630,7 @@ msgstr "三角形" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "三-六邊形" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1690,14 +1683,6 @@ msgid "Connect Infill Lines" msgstr "連接填充線條" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "zig_zaggify_infill description" -#| msgid "" -#| "Connect the ends where the infill pattern meets the inner wall using a " -#| "lines which follows the shape of the inner wall. Enabling this setting " -#| "can make the infill adhere to the walls better and reduces the effects on " -#| "infill on the quality of vertical surfaces. Disabling this setting " -#| "reduces the amount of material used." msgctxt "zig_zaggify_infill description" msgid "" "Connect the ends where the infill pattern meets the inner wall using a line " @@ -1731,30 +1716,24 @@ msgstr "" "度)。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "z_offset_layer_0 label" -#| msgid "Initial Layer Z Offset" msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "起始層 Z 軸偏移" +msgstr "填充 X 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "填充樣式在 X 軸方向偏移此距離。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "z_offset_layer_0 label" -#| msgid "Initial Layer Z Offset" msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "起始層 Z 軸偏移" +msgstr "填充 Y 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "填充樣式在 Y 軸方向偏移此距離。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2176,33 +2155,24 @@ msgid "" msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "platform_adhesion description" -#| msgid "Adhesion" msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "附著" +msgstr "附著趨勢" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "表面附著趨勢。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "magic_mesh_surface_mode label" -#| msgid "Surface Mode" msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "表面模式" +msgstr "表面能量" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "magic_mesh_surface_mode label" -#| msgid "Surface Mode" msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "表面模式" +msgstr "表面能量。" #: fdmprinter.def.json msgctxt "material_flow label" @@ -4305,13 +4275,6 @@ msgid "Skirt Distance" msgstr "外圍間距" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "skirt_gap description" -#| msgid "" -#| "The horizontal distance between the skirt and the first layer of the " -#| "print.\n" -#| "This is the minimum distance, multiple skirt lines will extend outwards " -#| "from this distance." msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" @@ -4402,13 +4365,6 @@ msgid "Raft Smoothing" msgstr "木筏平滑處理" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "raft_smoothing description" -#| msgid "" -#| "This setting control how much inner corners in the raft outline are " -#| "rounded. Inward corners are rounded to a semi circle with a radius equal " -#| "to the value given here. This setting also removes holes in the raft " -#| "outline which are smaller than such a circle." msgctxt "raft_smoothing description" msgid "" "This setting controls how much inner corners in the raft outline are " @@ -4989,12 +4945,9 @@ msgstr "" "作最後手段。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "machine_max_acceleration_x label" -#| msgid "Maximum Acceleration X" msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "X 軸最大加速度" +msgstr "最高解析度" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" @@ -5004,6 +4957,8 @@ msgid "" "with the speed it has to process g-code and will increase slice speed by " "removing details of the mesh that it can't process anyway." msgstr "" +"切片後線段的最小尺寸。 如果你增加此設定值,網格的解析度將較低。 這允許印表機" +"保持處理 G-code 的速度,並通過移除無法處理的網格細節來增加切片速度。" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -5051,7 +5006,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "移除空的第一層" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" @@ -5060,6 +5015,8 @@ msgid "" "Disabling this setting can cause empty first layers if the Slicing Tolerance " "setting is set to Exclusive or Middle." msgstr "" +"如果可列印的第一層下方有空的層,將其移除。假如「切片公差」設定為「排除」或" +"「中間」,關閉此設定可能會導致空的第一層。" #: fdmprinter.def.json msgctxt "blackmagic label" @@ -5768,25 +5725,22 @@ msgstr "" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "流量補償的最大擠出偏移量" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "machine_max_feedrate_e description" -#| msgid "The maximum speed of the filament." msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "耗材的最大速度。" +msgstr "最大補償距離(以毫米為單位)。" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "流量補償因子" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "流量倍率 -> 移動距離。" #: fdmprinter.def.json msgctxt "wireframe_enabled label" From bb2be70daccab8110864ff3b3677687e01124be8 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Sat, 25 Nov 2017 02:25:36 +0100 Subject: [PATCH 351/764] Finds candidate quality profile for fdmextruder CURA-4620 --- cura/Settings/MachineManager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ca929b46fc..6b03916fdf 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -769,9 +769,10 @@ class MachineManager(QObject): candidate_quality = None if quality_type: candidate_quality = quality_manager.findQualityByQualityType(quality_type, - quality_manager.getWholeMachineDefinition(machine_definition), + quality_manager.getWholeMachineDefinition(material_container.getDefinition()), [material_container]) + if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): Logger.log("d", "Attempting to find fallback quality") # Fall back to a quality (which must be compatible with all other extruders) From 8847325cf8c16eea64a2e4f4e8173a0e2e021163 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 26 Nov 2017 18:47:58 +0100 Subject: [PATCH 352/764] Remove limit on length for integer arrays The integer arrays were limited because the text in the text field is not properly clipped. I found a fix for that. Fixes #2802. --- resources/qml/Settings/SettingTextField.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index cdc0588940..64df60b132 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -1,5 +1,5 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Uranium is released under the terms of the LGPLv3 or higher. +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 1.2 @@ -154,7 +154,7 @@ SettingItem selectByMouse: true; - maximumLength: (definition.type == "[int]") ? 20 : (definition.type == "str") ? -1 : 10; + maximumLength: (definition.type == "str" || definition.type == "[int]") ? -1 : 10; validator: RegExpValidator { regExp: (definition.type == "[int]") ? /^\[?(\s*-?[0-9]{0,9}\s*,)*(\s*-?[0-9]{0,9})\s*\]?$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : (definition.type == "float") ? /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ : /^.*$/ } // definition.type property from parent loader used to disallow fractional number entry From 0d0bcb8aeaaa85b8ed36f20b95c6ff64c1d9f4b1 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sun, 26 Nov 2017 18:48:27 +0100 Subject: [PATCH 353/764] Clip text that exceeds the width of the text box. For #2802. --- resources/qml/Settings/SettingTextField.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 64df60b132..8a51f2baff 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -108,6 +108,7 @@ SettingItem left: parent.left leftMargin: UM.Theme.getSize("setting_unit_margin").width right: parent.right + rightMargin: UM.Theme.getSize("setting_unit_margin").width verticalCenter: parent.verticalCenter } renderType: Text.NativeRendering @@ -155,6 +156,7 @@ SettingItem selectByMouse: true; maximumLength: (definition.type == "str" || definition.type == "[int]") ? -1 : 10; + clip: true; //Hide any text that exceeds the width of the text box. validator: RegExpValidator { regExp: (definition.type == "[int]") ? /^\[?(\s*-?[0-9]{0,9}\s*,)*(\s*-?[0-9]{0,9})\s*\]?$/ : (definition.type == "int") ? /^-?[0-9]{0,10}$/ : (definition.type == "float") ? /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ : /^.*$/ } // definition.type property from parent loader used to disallow fractional number entry From fa00a17c784f3b1e6b7a9354e31e5abad79f6c7c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sun, 26 Nov 2017 21:21:18 +0100 Subject: [PATCH 354/764] Make UI changes in the Simulation View for adapting the color gradient in the Feedrate color scheme. Due to the travel speed is normally very high compared with the other speeds in the model, the gradient is now gradual instead of linear in order to show more changes in the low values and less changes in the high values. Adapt also the button styles and themes' colors. Set the play/pause button to the left and reduce the size. --- plugins/SimulationView/SimulationView.qml | 61 ++++++--- plugins/SimulationView/layers3d.shader | 21 +++- .../resources/simulation_pause.svg | 116 ++++++++--------- .../resources/simulation_resume.svg | 118 +++++++++--------- resources/qml/Topbar.qml | 10 +- resources/themes/cura-dark/theme.json | 9 ++ resources/themes/cura-light/styles.qml | 94 +++++++------- resources/themes/cura-light/theme.json | 12 ++ 8 files changed, 257 insertions(+), 184 deletions(-) diff --git a/plugins/SimulationView/SimulationView.qml b/plugins/SimulationView/SimulationView.qml index bc224f19e2..6e7dec1875 100644 --- a/plugins/SimulationView/SimulationView.qml +++ b/plugins/SimulationView/SimulationView.qml @@ -97,6 +97,8 @@ Item // if we are in compatibility mode, we only show the "line type" property bool show_legend: UM.SimulationView.compatibilityMode ? true : UM.Preferences.getValue("layerview/layer_view_type") == 1 property bool show_gradient: UM.SimulationView.compatibilityMode ? false : UM.Preferences.getValue("layerview/layer_view_type") == 2 || UM.Preferences.getValue("layerview/layer_view_type") == 3 + property bool show_feedrate_gradient: show_gradient && UM.Preferences.getValue("layerview/layer_view_type") == 2 + property bool show_thickness_gradient: show_gradient && UM.Preferences.getValue("layerview/layer_view_type") == 3 property bool only_show_top_layers: UM.Preferences.getValue("view/only_show_top_layers") property int top_layer_count: UM.Preferences.getValue("view/top_layer_count") @@ -171,6 +173,9 @@ Item { // update visibility of legends viewSettings.show_legend = UM.SimulationView.compatibilityMode || (type_id == 1); + viewSettings.show_gradient = !UM.SimulationView.compatibilityMode && (type_id == 2 || type_id == 3); + viewSettings.show_feedrate_gradient = viewSettings.show_gradient && (type_id == 2); + viewSettings.show_thickness_gradient = viewSettings.show_gradient && (type_id == 3); } } @@ -451,11 +456,42 @@ Item } } - // Gradient colors for feedrate and thickness + // Gradient colors for feedrate Rectangle { // In QML 5.9 can be changed by LinearGradient // Invert values because then the bar is rotated 90 degrees - id: gradient - visible: viewSettings.show_gradient + id: feedrateGradient + visible: viewSettings.show_feedrate_gradient + anchors.left: parent.right + height: parent.width + width: UM.Theme.getSize("layerview_row").height * 1.5 + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + transform: Rotation {origin.x: 0; origin.y: 0; angle: 90} + gradient: Gradient { + GradientStop { + position: 0.000 + color: Qt.rgba(1, 0.5, 0, 1) + } + GradientStop { + position: 0.625 + color: Qt.rgba(0.375, 0.5, 0, 1) + } + GradientStop { + position: 0.75 + color: Qt.rgba(0.25, 1, 0, 1) + } + GradientStop { + position: 1.0 + color: Qt.rgba(0, 0, 1, 1) + } + } + } + + // Gradient colors for layer thickness + Rectangle { // In QML 5.9 can be changed by LinearGradient + // Invert values because then the bar is rotated 90 degrees + id: thicknessGradient + visible: viewSettings.show_thickness_gradient anchors.left: parent.right height: parent.width width: UM.Theme.getSize("layerview_row").height * 1.5 @@ -469,15 +505,15 @@ Item } GradientStop { position: 0.25 - color: Qt.rgba(0.75, 0.5, 0.25, 1) + color: Qt.rgba(0.5, 0.5, 0, 1) } GradientStop { position: 0.5 - color: Qt.rgba(0.5, 1, 0.5, 1) + color: Qt.rgba(0, 1, 0, 1) } GradientStop { position: 0.75 - color: Qt.rgba(0.25, 0.5, 0.75, 1) + color: Qt.rgba(0, 0.5, 0.5, 1) } GradientStop { position: 1.0 @@ -504,9 +540,9 @@ Item id: pathSlider height: UM.Theme.getSize("slider_handle").width - anchors.right: playButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.left: parent.left + anchors.left: playButton.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right visible: !UM.SimulationView.compatibilityMode // custom properties @@ -540,7 +576,7 @@ Item height: UM.Theme.getSize("layerview_menu_size").height anchors { - top: !UM.SimulationView.compatibilityMode ? playButton.bottom : parent.top + top: !UM.SimulationView.compatibilityMode ? pathSlider.bottom : parent.top topMargin: !UM.SimulationView.compatibilityMode ? UM.Theme.getSize("default_margin").height : 0 right: parent.right rightMargin: UM.Theme.getSize("slider_layerview_margin").width @@ -578,13 +614,10 @@ Item // Play simulation button Button { id: playButton - implicitWidth: Math.floor(UM.Theme.getSize("button").width * 0.75) - implicitHeight: Math.floor(UM.Theme.getSize("button").height * 0.75) iconSource: "./resources/simulation_resume.svg" - style: UM.Theme.styles.tool_button + style: UM.Theme.styles.small_tool_button visible: !UM.SimulationView.compatibilityMode anchors { - horizontalCenter: layerSlider.horizontalCenter verticalCenter: pathSlider.verticalCenter } diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index f377fca055..2633b54787 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -38,12 +38,25 @@ vertex41core = out highp vec3 f_vertex; out highp vec3 f_normal; - vec4 gradientColor(float abs_value, float min_value, float max_value) + vec4 feedrateGradientColor(float abs_value, float min_value, float max_value) { float value = (abs_value - min_value)/(max_value - min_value); float red = value; + float green = 1-abs(1-4*value); + if (value > 0.375) + { + green = 0.5; + } + float blue = max(1-4*value, 0); + return vec4(red, green, blue, 1.0); + } + + vec4 layerThicknessGradientColor(float abs_value, float min_value, float max_value) + { + float value = (abs_value - min_value)/(max_value - min_value); + float red = max(2*value-1, 0); float green = 1-abs(1-2*value); - float blue = 1-value; + float blue = max(1-2*value, 0); return vec4(red, green, blue, 1.0); } @@ -64,10 +77,10 @@ vertex41core = v_color = a_color; break; case 2: // "Feedrate" - v_color = gradientColor(a_feedrate, u_min_feedrate, u_max_feedrate); + v_color = feedrateGradientColor(a_feedrate, u_min_feedrate, u_max_feedrate); break; case 3: // "Layer thickness" - v_color = gradientColor(a_line_dim.y, u_min_thickness, u_max_thickness); + v_color = layerThicknessGradientColor(a_line_dim.y, u_min_thickness, u_max_thickness); break; } diff --git a/plugins/SimulationView/resources/simulation_pause.svg b/plugins/SimulationView/resources/simulation_pause.svg index 67f7deea5d..652434bd44 100644 --- a/plugins/SimulationView/resources/simulation_pause.svg +++ b/plugins/SimulationView/resources/simulation_pause.svg @@ -1,4 +1,6 @@ + + + id="svg877" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" + sodipodi:docname="simulation_pause2.svg"> + + + id="metadata874"> image/svg+xml + - - - - - - - + + + + + + diff --git a/plugins/SimulationView/resources/simulation_resume.svg b/plugins/SimulationView/resources/simulation_resume.svg index a8ed8e79a3..912a2ac418 100644 --- a/plugins/SimulationView/resources/simulation_resume.svg +++ b/plugins/SimulationView/resources/simulation_resume.svg @@ -1,4 +1,6 @@ + + + id="svg8" + inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" + sodipodi:docname="simulation_resume2.svg"> + + + id="metadata5"> image/svg+xml + - - - - - - + + + diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 6085c6fe7e..db9abafb5c 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -240,7 +240,7 @@ Rectangle Button { iconSource: UM.Theme.getIcon("view_3d") - style: UM.Theme.styles.orientation_button + style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("3d", 0); @@ -252,7 +252,7 @@ Rectangle Button { iconSource: UM.Theme.getIcon("view_front") - style: UM.Theme.styles.orientation_button + style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("home", 0); @@ -264,7 +264,7 @@ Rectangle Button { iconSource: UM.Theme.getIcon("view_top") - style: UM.Theme.styles.orientation_button + style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("y", 90); @@ -276,7 +276,7 @@ Rectangle Button { iconSource: UM.Theme.getIcon("view_left") - style: UM.Theme.styles.orientation_button + style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("x", 90); @@ -288,7 +288,7 @@ Rectangle Button { iconSource: UM.Theme.getIcon("view_right") - style: UM.Theme.styles.orientation_button + style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter onClicked:{ UM.Controller.rotateView("x", -90); diff --git a/resources/themes/cura-dark/theme.json b/resources/themes/cura-dark/theme.json index 5cfed426e5..9e99945d3d 100644 --- a/resources/themes/cura-dark/theme.json +++ b/resources/themes/cura-dark/theme.json @@ -55,6 +55,15 @@ "button_disabled": [39, 44, 48, 255], "button_disabled_text": [255, 255, 255, 101], + "small_button": [39, 44, 48, 0], + "small_button_hover": [39, 44, 48, 255], + "small_button_active": [67, 72, 75, 255], + "small_button_active_hover": [67, 72, 75, 255], + "small_button_text": [255, 255, 255, 197], + "small_button_text_hover": [255, 255, 255, 255], + "small_button_text_active": [255, 255, 255, 255], + "small_button_text_active_hover": [255, 255, 255, 255], + "button_tooltip": [39, 44, 48, 255], "button_tooltip_border": [39, 44, 48, 255], "button_tooltip_text": [255, 255, 255, 172], diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 0f3c910270..0de761b7d9 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -295,16 +295,26 @@ QtObject { anchors.fill: parent; property bool down: control.pressed || (control.checkable && control.checked); - color: { - if(control.customColor !== undefined && control.customColor !== null) { + color: + { + if(control.customColor !== undefined && control.customColor !== null) + { return control.customColor - } else if(control.checkable && control.checked && control.hovered) { + } + else if(control.checkable && control.checked && control.hovered) + { return Theme.getColor("button_active_hover"); - } else if(control.pressed || (control.checkable && control.checked)) { + } + else if(control.pressed || (control.checkable && control.checked)) + { return Theme.getColor("button_active"); - } else if(control.hovered) { + } + else if(control.hovered) + { return Theme.getColor("button_hover"); - } else { + } + else + { return Theme.getColor("button"); } } @@ -381,30 +391,39 @@ QtObject { } } - property Component orientation_button: Component { + property Component small_tool_button: Component { ButtonStyle { background: Item { - implicitWidth: 25; - implicitHeight: 25; + implicitWidth: Theme.getSize("small_button").width; + implicitHeight: Theme.getSize("small_button").height; Rectangle { - id: buttonFace2; + id: smallButtonFace; anchors.fill: parent; property bool down: control.pressed || (control.checkable && control.checked); - color: { - if(control.customColor !== undefined && control.customColor !== null) { + color: + { + if(control.customColor !== undefined && control.customColor !== null) + { return control.customColor - } else if(control.checkable && control.checked && control.hovered) { - return Theme.getColor("button_active_hover"); - } else if(control.pressed || (control.checkable && control.checked)) { - return Theme.getColor("button_active"); - } else if(control.hovered) { - return Theme.getColor("button_hover"); - } else { - //return Theme.getColor("button"); - return "transparent" + } + else if(control.checkable && control.checked && control.hovered) + { + return Theme.getColor("small_button_active_hover"); + } + else if(control.pressed || (control.checkable && control.checked)) + { + return Theme.getColor("small_button_active"); + } + else if(control.hovered) + { + return Theme.getColor("small_button_hover"); + } + else + { + return Theme.getColor("small_button"); } } Behavior on color { ColorAnimation { duration: 50; } } @@ -413,17 +432,10 @@ QtObject { border.color: Theme.getColor("tool_button_border") UM.RecolorImage { - id: tool_button_arrow2 - //anchors.right: parent.right; - //anchors.rightMargin: (Theme.getSize("button").width - Theme.getSize("button_icon").width) / 4 - //anchors.bottom: parent.bottom; - //anchors.bottomMargin: (Theme.getSize("button").height - Theme.getSize("button_icon").height) / 4 - //width: Theme.getSize("standard_arrow").width - //height: Theme.getSize("standard_arrow").height + id: smallToolButtonArrow width: 5 height: 5 - sourceSize.width: 5 sourceSize.height: 5 visible: control.menu != null; @@ -431,19 +443,19 @@ QtObject { { if(control.checkable && control.checked && control.hovered) { - return Theme.getColor("button_text_active_hover"); + return Theme.getColor("small_button_text_active_hover"); } else if(control.pressed || (control.checkable && control.checked)) { - return Theme.getColor("button_text_active"); + return Theme.getColor("small_button_text_active"); } else if(control.hovered) { - return Theme.getColor("button_text_hover"); + return Theme.getColor("small_button_text_hover"); } else { - return Theme.getColor("button_text"); + return Theme.getColor("small_button_text"); } } source: Theme.getIcon("arrow_bottom") @@ -456,31 +468,29 @@ QtObject { anchors.centerIn: parent; opacity: !control.enabled ? 0.2 : 1.0 source: control.iconSource; - width: 20; - height: 20; + width: Theme.getSize("small_button_icon").width; + height: Theme.getSize("small_button_icon").height; color: { if(control.checkable && control.checked && control.hovered) { - return Theme.getColor("button_text_active_hover"); + return Theme.getColor("small_button_text_active_hover"); } else if(control.pressed || (control.checkable && control.checked)) { - return Theme.getColor("button_text_active"); + return Theme.getColor("small_button_text_active"); } else if(control.hovered) { - //return Theme.getColor("button_text_hover"); - return "white" + return Theme.getColor("small_button_text_hover"); } else { - //return Theme.getColor("button_text"); - return "black" + return Theme.getColor("small_button_text"); } } - sourceSize: Theme.getSize("button_icon") + sourceSize: Theme.getSize("small_button_icon") } } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 09f93d413e..edc88f4654 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -103,6 +103,15 @@ "button_disabled": [31, 36, 39, 255], "button_disabled_text": [255, 255, 255, 101], + "small_button": [31, 36, 39, 0], + "small_button_hover": [68, 72, 75, 255], + "small_button_active": [68, 72, 75, 255], + "small_button_active_hover": [68, 72, 75, 255], + "small_button_text": [31, 36, 39, 197], + "small_button_text_hover": [255, 255, 255, 255], + "small_button_text_active": [255, 255, 255, 255], + "small_button_text_active_hover": [255, 255, 255, 255], + "button_tooltip": [31, 36, 39, 255], "button_tooltip_border": [68, 192, 255, 255], "button_tooltip_text": [192, 193, 194, 255], @@ -323,6 +332,9 @@ "button_icon": [2.5, 2.5], "button_lining": [0, 0], + "small_button": [2, 2], + "small_button_icon": [1.5, 1.5], + "topbar_logo_right_margin": [3, 0], "topbar_button": [8, 4], "topbar_button_icon": [1.2, 1.2], From bc9d31ccbc9d4522927fa97bead9f1224e5bd72c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 26 Nov 2017 21:44:09 +0100 Subject: [PATCH 355/764] Allow postprocessing before sending data to the printer Fixes https://github.com/Ultimaker/Cura/issues/2855 Also see https://github.com/Ultimaker/Cura/commit/91e8ac6868762595a73363230234d223c1270753 --- plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index b6e94121f8..de1aab434d 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -263,6 +263,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._error_message.show() return + self.writeStarted.emit(self) # Allow postprocessing before sending data to the printer + if len(self._printers) > 1: self.spawnPrintView() # Ask user how to print it. elif len(self._printers) == 1: From aa52b9682ea4168ea001e9927fab12b11e9c5967 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 09:10:55 +0100 Subject: [PATCH 356/764] Fix adding name when loading complete material file Also, don't use setName since that only operates on the base file and sends out unnecessary signals. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7ab1e0f7ad..554afa2dc8 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -451,8 +451,8 @@ class XmlMaterialProfile(InstanceContainer): else: meta_data["setting_version"] = self.xmlVersionToSettingVersion("1.2") #1.2 and lower didn't have that version number there yet. - metadata = data.iterfind("./um:metadata/*", self.__namespaces) - for entry in metadata: + meta_data["name"] = "Unknown Material" #In case the name tag is missing. + for entry in data.iterfind("./um:metadata/*", self.__namespaces): tag_name = _tag_without_namespace(entry) if tag_name == "name": @@ -462,9 +462,9 @@ class XmlMaterialProfile(InstanceContainer): label = entry.find("./um:label", self.__namespaces) if label is not None: - self.setName(label.text) + meta_data["name"] = label.text else: - self.setName(self._profile_name(material.text, color.text)) + meta_data["name"] = self._profile_name(material.text, color.text) meta_data["brand"] = brand.text meta_data["material"] = material.text meta_data["color_name"] = color.text @@ -570,6 +570,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True new_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_material.getMetaData()["name"] = self.getName() new_material.setDefinition(machine_id) # Don't use setMetadata, as that overrides it for all materials with same base file new_material.getMetaData()["compatible"] = machine_compatibility @@ -621,11 +622,10 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material = XmlMaterialProfile(new_hotend_id) is_new_material = True - # Update the private directly, as we want to prevent the lookup that is done when using setName - new_hotend_material.setName(self.getName()) new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.getMetaData()["name"] = self.getName() new_hotend_material.setDefinition(machine_id) - new_hotend_material.addMetaDataEntry("variant", variant_containers[0]["id"]) + new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] # Don't use setMetadata, as that overrides it for all materials with same base file new_hotend_material.getMetaData()["compatible"] = hotend_compatibility new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer @@ -789,7 +789,6 @@ class XmlMaterialProfile(InstanceContainer): else: new_hotend_material_metadata = {} - new_hotend_material_metadata["name"] = base_metadata["name"] new_hotend_material_metadata.update(base_metadata) new_hotend_material_metadata["variant"] = variant_containers[0]["id"] new_hotend_material_metadata["compatible"] = hotend_compatibility From 9938678347c986400faf53fa44585a1853b6570d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 09:16:27 +0100 Subject: [PATCH 357/764] Fix setting IDs of empty containers The _id hasn't been used for a very long time. Contributes to issue CURA-4243. --- cura/CuraApplication.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b8c816615e..d21428e76e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -260,21 +260,21 @@ class CuraApplication(QtApplication): # We need them to simplify the switching between materials. empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() empty_variant_container = copy.deepcopy(empty_container) - empty_variant_container._id = "empty_variant" + empty_variant_container.setMetaDataEntry("id", "empty_variant") empty_variant_container.addMetaDataEntry("type", "variant") ContainerRegistry.getInstance().addContainer(empty_variant_container) empty_material_container = copy.deepcopy(empty_container) - empty_material_container._id = "empty_material" + empty_material_container.setMetaDataEntry("id", "empty_material") empty_material_container.addMetaDataEntry("type", "material") ContainerRegistry.getInstance().addContainer(empty_material_container) empty_quality_container = copy.deepcopy(empty_container) - empty_quality_container._id = "empty_quality" + empty_quality_container.setMetaDataEntry("id", "empty_quality") empty_quality_container.setName("Not Supported") empty_quality_container.addMetaDataEntry("quality_type", "normal") empty_quality_container.addMetaDataEntry("type", "quality") ContainerRegistry.getInstance().addContainer(empty_quality_container) empty_quality_changes_container = copy.deepcopy(empty_container) - empty_quality_changes_container._id = "empty_quality_changes" + empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes") empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) From 8082c092e5d9fb6aff930a5dfa02f8bd4b528686 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 09:54:10 +0100 Subject: [PATCH 358/764] Fix setting extruder definition in user changes container --- cura/Settings/CuraStackBuilder.py | 2 +- cura/Settings/MachineManager.py | 1 - plugins/3MFReader/ThreeMFWorkspaceReader.py | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index a661237722..7a260e2145 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -108,7 +108,7 @@ class CuraStackBuilder: user_container.addMetaDataEntry("extruder", new_stack_id) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(machine_definition) + user_container.setDefinition(definition) stack.setUserChanges(user_container) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6b03916fdf..6bacae11a0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -772,7 +772,6 @@ class MachineManager(QObject): quality_manager.getWholeMachineDefinition(material_container.getDefinition()), [material_container]) - if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): Logger.log("d", "Attempting to find fallback quality") # Fall back to a quality (which must be compatible with all other extruders) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index dfb16b91e1..4300d8605d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -768,6 +768,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._container_registry.removeContainer(container.getId()) return + # Check quality profiles to make sure that if one stack has the "not supported" quality profile, # all others should have the same. # From e0f0e098ffa08ee412149d866970885541b23b13 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 09:54:12 +0100 Subject: [PATCH 359/764] Use MaterialsModel for materialsModel This specialized InstanceContainersModel has an override that makes the model a bit more efficient when non-materials get their metadata updated. Contributes to issue CURA-4243. --- resources/qml/Menus/MaterialMenu.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 1688bc228a..3fb694af90 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -143,7 +143,7 @@ Menu } //: Model used to populate the brandModel - UM.InstanceContainersModel + Cura.MaterialsModel { id: materialsModel filter: materialFilter() From 9571181178c534d66c00cb034bc4d0ae39245ed9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 10:37:54 +0100 Subject: [PATCH 360/764] Fix ID of derived materials Because the ID is now in the metadata it would get overwritten by this deep copy. We need to set it again. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 554afa2dc8..36e4c4017b 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -570,6 +570,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True new_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_material.getMetaData()["id"] = new_material_id new_material.getMetaData()["name"] = self.getName() new_material.setDefinition(machine_id) # Don't use setMetadata, as that overrides it for all materials with same base file @@ -623,6 +624,7 @@ class XmlMaterialProfile(InstanceContainer): is_new_material = True new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.getMetaData()["id"] = new_hotend_id new_hotend_material.getMetaData()["name"] = self.getName() new_hotend_material.setDefinition(machine_id) new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] From 4a4f01f9eb27db31bbf16cb1a3f5c6cae8cc1881 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 10:50:30 +0100 Subject: [PATCH 361/764] Fix resetting not supported profiles for project loading CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 87 +++++++++++++++------ 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 4300d8605d..0b5193eb60 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -13,6 +13,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.MimeTypeDatabase import MimeTypeDatabase from UM.Job import Job from UM.Preferences import Preferences +from UM.Util import parseBool from .WorkspaceDialog import WorkspaceDialog import xml.etree.ElementTree as ET @@ -793,6 +794,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] for stack in [global_stack] + extruder_stacks: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) + empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + for stack in [global_stack] + extruder_stacks: + stack.replaceContainer(_ContainerIndexes.QualityChanges, empty_quality_changes_container) # Fix quality: # The quality specified in an old project file can be wrong, for example, for UM2, it should be "um2_normal" @@ -800,39 +804,70 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Note that this only seems to happen on single-extrusion machines on the global stack, so we only apply the # fix for that quality = global_stack.quality + has_empty_quality = True + project_quality_is_not_supported = True if quality.getId() not in ("empty", "empty_quality"): + has_empty_quality = False quality_type = quality.getMetaDataEntry("quality_type") - quality_containers = self._container_registry.findInstanceContainers(definition = global_stack.definition.getId(), - type = "quality", - quality_type = quality_type) + search_criteria = {"type": "quality", + "quality_type": quality_type} + if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")): + search_criteria["definition"] = global_stack.definition.getId() + else: + search_criteria["definition"] = "fdmprinter" + + quality_containers = self._container_registry.findInstanceContainers(**search_criteria) quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] if quality_containers: global_stack.quality = quality_containers[0] + project_quality_is_not_supported = False else: - # look for "fdmprinter" qualities if the machine-specific qualities cannot be found - quality_containers = self._container_registry.findInstanceContainers(definition = "fdmprinter", - type = "quality", - quality_type = quality_type) + # the quality_type of the quality profile cannot be found. + # this can happen if a quality_type has been removed in a newer version, for example: + # "extra_coarse" is removed from 2.7 to 3.0 + # in this case, the quality will be reset to "normal" + quality_containers = self._container_registry.findInstanceContainers( + definition = global_stack.definition.getId(), + type = "quality", + quality_type = "normal") quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] if quality_containers: global_stack.quality = quality_containers[0] - else: - # the quality_type of the quality profile cannot be found. - # this can happen if a quality_type has been removed in a newer version, for example: - # "extra_coarse" is removed from 2.7 to 3.0 - # in this case, the quality will be reset to "normal" - quality_containers = self._container_registry.findInstanceContainers( - definition = global_stack.definition.getId(), - type = "quality", - quality_type = "normal") - quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] - if quality_containers: - global_stack.quality = quality_containers[0] + + if not quality_containers: + # This should not happen! + Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", + global_stack.getId(), global_stack.definition.getId()) + has_empty_quality = True + + if project_quality_is_not_supported: + empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + + if has_empty_quality: + for stack in [global_stack] + extruder_stacks: + stack.quality = empty_quality_container + stack.qualityChanges = empty_quality_changes_container + else: + for stack in [global_stack] + extruder_stacks: + stack.qualityChanges = empty_quality_changes_container + # for extruder stacks, the quality containers also need to be switched + for stack in extruder_stacks: + search_criteria = {"type": "quality", + "quality_type": "normal"} + if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")): + search_criteria["definition"] = global_stack.definition.getId() else: - # This should not happen! - Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", - global_stack.getId(), global_stack.definition.getId()) - global_stack.quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + search_criteria["definition"] = "fdmprinter" + + if parseBool(global_stack.getMetaDataEntry("has_machine_material")): + search_criteria["material"] = stack.material.getId() + + quality_containers = self._container_registry.findInstanceContainers(**search_criteria) + if quality_containers: + stack.quality = quality_containers[0] + else: + Logger.log("e", "Cannot find quality container for extruder stack [%s]", stack.getId()) # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those @@ -856,7 +891,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): global_stack.userChanges = container continue - for changes_container_type in ("quality_changes", "definition_changes"): + changes_container_types = ("quality_changes", "definition_changes") + if project_quality_is_not_supported: + # DO NOT replace quality_changes if the current quality_type is not supported + changes_container_types = ("definition_changes",) + for changes_container_type in changes_container_types: if self._resolve_strategies[changes_container_type] == "new": # Quality changes needs to get a new ID, added to registry and to the right stacks for each_changes_container in quality_and_definition_changes_instance_containers: From a2b0c4535c63dc0a330e80248852a35fa63c1889 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 10:55:51 +0100 Subject: [PATCH 362/764] Only load metadata of machines for derived profiles We only need the metadata of these machines (now that the ID is in the metadata). We won't need all of those machines because some of them are not added. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 36e4c4017b..ead0864d6f 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -545,14 +545,14 @@ class XmlMaterialProfile(InstanceContainer): # Lets try again with some naive heuristics. machine_id = identifier.get("product").replace(" ", "").lower() - definitions = ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + definitions = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) if not definitions: Logger.log("w", "No definition found for machine ID %s", machine_id) continue definition = definitions[0] - machine_manufacturer = identifier.get("manufacturer", definition.getMetaDataEntry("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. + machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. if machine_compatibility: new_material_id = self.getId() + "_" + machine_id @@ -593,7 +593,7 @@ class XmlMaterialProfile(InstanceContainer): variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition.getId(), name = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition["id"], name = hotend_id) if not variant_containers: continue From 46c6c6aa9b146f60fa270a932d9ccf031bfc40df Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 11:19:37 +0100 Subject: [PATCH 363/764] Fix quality profile in project loading CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 23 ++++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 0b5193eb60..e49cfa33a9 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -822,17 +822,24 @@ class ThreeMFWorkspaceReader(WorkspaceReader): global_stack.quality = quality_containers[0] project_quality_is_not_supported = False else: - # the quality_type of the quality profile cannot be found. - # this can happen if a quality_type has been removed in a newer version, for example: - # "extra_coarse" is removed from 2.7 to 3.0 - # in this case, the quality will be reset to "normal" - quality_containers = self._container_registry.findInstanceContainers( - definition = global_stack.definition.getId(), - type = "quality", - quality_type = "normal") + search_criteria["definition"] = "fdmprinter" + quality_containers = self._container_registry.findInstanceContainers(**search_criteria) quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] if quality_containers: global_stack.quality = quality_containers[0] + project_quality_is_not_supported = False + else: + # the quality_type of the quality profile cannot be found. + # this can happen if a quality_type has been removed in a newer version, for example: + # "extra_coarse" is removed from 2.7 to 3.0 + # in this case, the quality will be reset to "normal" + quality_containers = self._container_registry.findInstanceContainers( + definition = global_stack.definition.getId(), + type = "quality", + quality_type = "normal") + quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] + if quality_containers: + global_stack.quality = quality_containers[0] if not quality_containers: # This should not happen! From fab85616c74f089185f6a18a382c7cc0dcc2c0fe Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 11:23:24 +0100 Subject: [PATCH 364/764] Remove test for upgrading from legacy stacks to modern stacks This is because ContainerRegistry.saveAll has been removed. That function was only used by this test. I don't think it's worth keeping this unit test for the effort. It's only for code that's passed through in the version upgrade from 2.4 to 2.5 anyway. Contributes to issue CURA-4243. --- tests/Settings/TestCuraContainerRegistry.py | 38 +-------------------- 1 file changed, 1 insertion(+), 37 deletions(-) diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index 1abd098338..e6dc6b99d8 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -145,40 +145,4 @@ def test_loadTypes(filename, output_class, container_registry): assert type(container) == output_class break else: - assert False #Container stack with specified ID was not loaded. - -## Tests whether loading a legacy file moves the upgraded file properly. -def test_loadLegacyFileRenamed(container_registry): - #Create a temporary file for the registry to load. - stacks_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks") - temp_file = os.path.join(stacks_folder, "temporary.stack.cfg") - temp_file_source = os.path.join(stacks_folder, "MachineLegacy.stack.cfg") - shutil.copyfile(temp_file_source, temp_file) - - #Mock some dependencies. - UM.Settings.ContainerStack.setContainerRegistry(container_registry) - Resources.getAllResourcesOfType = unittest.mock.MagicMock(return_value = [temp_file]) #Return a temporary file that we'll make for this test. - - def findContainers(container_type = 0, id = None): - if id == "MachineLegacy": - return None - - container = UM.Settings.ContainerRegistry._EmptyInstanceContainer(id) - container.getNextStack = unittest.mock.MagicMock() - return [container] - - old_find_containers = container_registry.findContainers - container_registry.findContainers = findContainers - - with unittest.mock.patch("cura.Settings.GlobalStack.GlobalStack.findContainer"): - container_registry.load() - - container_registry.findContainers = old_find_containers - - container_registry.saveAll() - print("all containers in registry", container_registry._containers) - assert not os.path.isfile(temp_file) - mime_type = container_registry.getMimeTypeForContainer(GlobalStack) - file_name = urllib.parse.quote_plus("MachineLegacy") + "." + mime_type.preferredSuffix - path = Resources.getStoragePath(Resources.ContainerStacks, file_name) - assert os.path.isfile(path) + assert False #Container stack with specified ID was not loaded. \ No newline at end of file From 4189f8dfa379ff2b56e0759443376d530eae9398 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 11:59:37 +0100 Subject: [PATCH 365/764] Use new findDirtyContainers function This prevents all instance containers from being loaded every time we auto-save. Contributes to issue CURA-4243. --- cura/CuraApplication.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index d21428e76e..696b16ac37 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -433,10 +433,7 @@ class CuraApplication(QtApplication): # Lock file for "more" atomically loading and saving to/from config dir. with ContainerRegistry.getInstance().lockFile(): - for instance in ContainerRegistry.getInstance().findInstanceContainers(): - if not instance.isDirty(): - continue - + for instance in ContainerRegistry.getInstance().findDirtyContainers(container_type = InstanceContainer): try: data = instance.serialize() except NotImplementedError: From 828fff5ee5ebcc48049fda21445ea06248688639 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 12:04:21 +0100 Subject: [PATCH 366/764] Fix quality check in project loading CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 120 ++++++++------------ 1 file changed, 45 insertions(+), 75 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index e49cfa33a9..e7a47561ce 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -784,12 +784,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # has_not_supported = False for stack in [global_stack] + extruder_stacks: - if stack.quality.getId() == "empty_quality": + if stack.quality.getId() in ("empty", "empty_quality"): has_not_supported = True break + available_quality = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_stack, + extruder_stacks) if not has_not_supported: - available_quality = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_stack, extruder_stacks) has_not_supported = not available_quality + + quality_has_been_changed = False + if has_not_supported: empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] for stack in [global_stack] + extruder_stacks: @@ -797,84 +801,50 @@ class ThreeMFWorkspaceReader(WorkspaceReader): empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] for stack in [global_stack] + extruder_stacks: stack.replaceContainer(_ContainerIndexes.QualityChanges, empty_quality_changes_container) + quality_has_been_changed = True - # Fix quality: - # The quality specified in an old project file can be wrong, for example, for UM2, it should be "um2_normal" - # but instead it was "normal". This should be fixed by setting it to the correct quality. - # Note that this only seems to happen on single-extrusion machines on the global stack, so we only apply the - # fix for that - quality = global_stack.quality - has_empty_quality = True - project_quality_is_not_supported = True - if quality.getId() not in ("empty", "empty_quality"): - has_empty_quality = False - quality_type = quality.getMetaDataEntry("quality_type") - search_criteria = {"type": "quality", - "quality_type": quality_type} - if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")): - search_criteria["definition"] = global_stack.definition.getId() - else: - search_criteria["definition"] = "fdmprinter" + else: + empty_quality_changes_container = self._container_registry.findInstanceContainers(id="empty_quality_changes")[0] - quality_containers = self._container_registry.findInstanceContainers(**search_criteria) - quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] - if quality_containers: - global_stack.quality = quality_containers[0] - project_quality_is_not_supported = False - else: - search_criteria["definition"] = "fdmprinter" - quality_containers = self._container_registry.findInstanceContainers(**search_criteria) - quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] - if quality_containers: - global_stack.quality = quality_containers[0] - project_quality_is_not_supported = False - else: - # the quality_type of the quality profile cannot be found. - # this can happen if a quality_type has been removed in a newer version, for example: - # "extra_coarse" is removed from 2.7 to 3.0 - # in this case, the quality will be reset to "normal" - quality_containers = self._container_registry.findInstanceContainers( - definition = global_stack.definition.getId(), - type = "quality", - quality_type = "normal") - quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] - if quality_containers: - global_stack.quality = quality_containers[0] + # The machine in the project has non-empty quality and there are usable qualities for this machine. + # We need to check if the current quality_type is still usable for this machine, if not, then the quality + # will be reset to the "preferred quality" if present, otherwise "normal". + available_quality_types = [q.getMetaDataEntry("quality_type") for q in available_quality] - if not quality_containers: - # This should not happen! - Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", - global_stack.getId(), global_stack.definition.getId()) - has_empty_quality = True + if global_stack.quality.getMetaDataEntry("quality_type") not in available_quality_types: + quality_has_been_changed = True - if project_quality_is_not_supported: - empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] - empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + # find the preferred quality + preferred_quality_id = global_stack.getMetaDataEntry("preferred_quality", None) + if preferred_quality_id is not None: + definition_id = global_stack.definition.getId() + if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): + definition_id = "fdmprinter" + + containers = self._container_registry.findInstanceContainers(id = preferred_quality_id, + type = "quality", + definition = definition_id) + containers = [c for c in containers if not c.getMetaDataEntry("material", "")] + if containers: + global_stack.quality = containers[0] + global_stack.qualityChanges = empty_quality_changes_container + # also find the quality containers for the extruders + for extruder_stack in extruder_stacks: + search_criteria = {"id": preferred_quality_id, + "type": "quality", + "definition": definition_id} + if global_stack.getMetaDataEntry("has_machine_materials") and extruder_stack.material.getId() not in ("empty", "empty_material"): + search_criteria["material"] = extruder_stack.material.getId() + containers = self._container_registry.findInstanceContainers(**search_criteria) + if containers: + extruder_stack.quality = containers[0] + extruder_stack.qualityChanges = empty_quality_changes_container + else: + Logger.log("e", "Cannot find preferred quality for extruder [%s].", extruder_stack.getId()) - if has_empty_quality: - for stack in [global_stack] + extruder_stacks: - stack.quality = empty_quality_container - stack.qualityChanges = empty_quality_changes_container - else: - for stack in [global_stack] + extruder_stacks: - stack.qualityChanges = empty_quality_changes_container - # for extruder stacks, the quality containers also need to be switched - for stack in extruder_stacks: - search_criteria = {"type": "quality", - "quality_type": "normal"} - if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")): - search_criteria["definition"] = global_stack.definition.getId() else: - search_criteria["definition"] = "fdmprinter" - - if parseBool(global_stack.getMetaDataEntry("has_machine_material")): - search_criteria["material"] = stack.material.getId() - - quality_containers = self._container_registry.findInstanceContainers(**search_criteria) - if quality_containers: - stack.quality = quality_containers[0] - else: - Logger.log("e", "Cannot find quality container for extruder stack [%s]", stack.getId()) + # we cannot find the preferred quality. THIS SHOULD NOT HAPPEN + Logger.log("e", "Cannot find the preferred quality for machine [%s]", global_stack.getId()) # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those @@ -899,7 +869,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): continue changes_container_types = ("quality_changes", "definition_changes") - if project_quality_is_not_supported: + if quality_has_been_changed: # DO NOT replace quality_changes if the current quality_type is not supported changes_container_types = ("definition_changes",) for changes_container_type in changes_container_types: From 1866c4ee66de8d726fc5b1d37ffad373bdaaffd6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 12:56:53 +0100 Subject: [PATCH 367/764] Split user settings for single extrusion machines CURA-4617 --- cura/Settings/CuraContainerRegistry.py | 30 +++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 3590d70602..1975458548 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -431,19 +431,25 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) extruder_stack.setNextStack(machine) + # create empty user changes container otherwise + user_container = InstanceContainer(extruder_stack.id + "_user") + user_container.addMetaDataEntry("type", "user") + user_container.addMetaDataEntry("machine", extruder_stack.getId()) + from cura.CuraApplication import CuraApplication + user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + user_container.setDefinition(extruder_definition) + if machine.userChanges: - # set existing user changes if found - extruder_stack.setUserChanges(machine.userChanges) - else: - # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.id + "_user") - user_container.addMetaDataEntry("type", "user") - user_container.addMetaDataEntry("machine", extruder_stack.getId()) - from cura.CuraApplication import CuraApplication - user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(extruder_definition) - extruder_stack.setUserChanges(user_container) - self.addContainer(user_container) + # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes + # container to the extruder stack. + for user_setting_key in machine.userChanges.getAllKeys(): + settable_per_extruder = machine.getProperty(user_setting_key, "settable_per_extruder") + if settable_per_extruder: + user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) + machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) + + extruder_stack.setUserChanges(user_container) + self.addContainer(user_container) variant_id = "default" if machine.variant.getId() not in ("empty", "empty_variant"): From 0613b1e4b7589446ee9692c87226dfd9f158a00d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 13:00:49 +0100 Subject: [PATCH 368/764] Creating components is now done with the prefab function CURA-4568 --- cura/MachineAction.py | 10 ++-------- plugins/3MFReader/WorkspaceDialog.py | 10 ++-------- plugins/ChangeLogPlugin/ChangeLog.py | 8 ++------ plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 8 ++------ plugins/UserAgreementPlugin/UserAgreement.py | 8 ++------ 5 files changed, 10 insertions(+), 34 deletions(-) diff --git a/cura/MachineAction.py b/cura/MachineAction.py index bc7b17af85..37f09b4efa 100644 --- a/cura/MachineAction.py +++ b/cura/MachineAction.py @@ -73,14 +73,8 @@ class MachineAction(QObject, PluginObject): ## Protected helper to create a view object based on provided QML. def _createViewFromQML(self): - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), self._qml_url)) - self._component = QQmlComponent(Application.getInstance()._engine, path) - self._context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._context.setContextProperty("manager", self) - self._view = self._component.create(self._context) - if self._view is None: - Logger.log("c", "QQmlComponent status %s", self._component.status()) - Logger.log("c", "QQmlComponent error string %s", self._component.errorString()) + path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), self._qml_url) + self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) @pyqtProperty(QObject, constant = True) def displayItem(self): diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 151771b25d..95fef78081 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -256,14 +256,8 @@ class WorkspaceDialog(QObject): return self._result def _createViewFromQML(self): - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url)) - self._component = QQmlComponent(Application.getInstance()._engine, path) - self._context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._context.setContextProperty("manager", self) - self._view = self._component.create(self._context) - if self._view is None: - Logger.log("c", "QQmlComponent status %s", self._component.status()) - Logger.log("c", "QQmlComponent error string %s", self._component.errorString()) + path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url) + self._view = Application.getInstance().createQmlComponent(path, {"manager": self}) def show(self): # Emit signal so the right thread actually shows the view. diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index a80779da50..22218bfaeb 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -106,9 +106,5 @@ class ChangeLog(Extension, QObject,): self._changelog_window.hide() def createChangelogWindow(self): - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.qml")) - - component = QQmlComponent(Application.getInstance()._engine, path) - self._changelog_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._changelog_context.setContextProperty("manager", self) - self._changelog_window = component.create(self._changelog_context) + path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.qml") + self._changelog_window = Application.getInstance().createQmlComponent(path, {"manager": self}) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index fe9095a08b..6167356c4b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -91,12 +91,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): # This will create the view if its not already created. def spawnFirmwareInterface(self, serial_port): if self._firmware_view is None: - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml")) - component = QQmlComponent(Application.getInstance()._engine, path) - - self._firmware_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._firmware_context.setContextProperty("manager", self) - self._firmware_view = component.create(self._firmware_context) + path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") + self._firmware_view = Application.getInstance().createQmlComponent(path, {"manager": self}) self._firmware_view.show() diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index f472b6fb13..da225a63b4 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -45,9 +45,5 @@ class UserAgreement(QObject, Extension): CuraApplication.getInstance().setNeedToShowUserAgreement(False) def createUserAgreementWindow(self): - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml")) - - component = QQmlComponent(Application.getInstance()._engine, path) - self._user_agreement_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._user_agreement_context.setContextProperty("manager", self) - self._user_agreement_window = component.create(self._user_agreement_context) + path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "UserAgreement.qml") + self._user_agreement_window = Application.getInstance().createQmlComponent(path, {"manager": self}) From 99780c3b4417916722ca315b12d4c53be8d2460c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 13:31:29 +0100 Subject: [PATCH 369/764] Fix casing of getMetadataEntry This is done a bit inconsistently because it's unclear whether metadata should be considered as one word or two. I'd say it is one word, not 'meta data', but people seem to disagree. Contributes to issue CURA-4243. --- cura/QualityManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 5c0a16da96..17d3fb652c 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -213,7 +213,7 @@ class QualityManager: "type": "material", "name": base_material, "definition": definition_id, - "variant": material_container.getMetadataEntry("variant") + "variant": material_container.getMetaDataEntry("variant") } containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) return containers From 65ea8a614cc23fbba6eb64347cf439c82d57dd45 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 13:54:09 +0100 Subject: [PATCH 370/764] Don't make filter_out_tiny_gaps a child setting of fill_perimeter_gaps Parent settings are not used by the engine. Or they shouldn't be, because the parent settings are disabled by the front-end when all of their child settings are overwritten. Then you'd have a parent setting that is used by the engine but you can't modify it. Also, the command-line slicing doesn't load parent settings since it can't parse categories and such. --- resources/definitions/fdmprinter.def.json | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8db02b67f8..6861189f85 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1208,7 +1208,8 @@ } } }, - "fill_perimeter_gaps": { + "fill_perimeter_gaps": + { "label": "Fill Gaps Between Walls", "description": "Fills the gaps between walls where no walls fit.", "type": "enum", @@ -1218,17 +1219,16 @@ }, "default_value": "everywhere", "limit_to_extruder": "wall_0_extruder_nr", - "settable_per_mesh": true, - "children": { - "filter_out_tiny_gaps": { - "label": "Filter Out Tiny Gaps", - "description": "Filter out tiny gaps to reduce blobs on outside of model.", - "type": "bool", - "default_value": true, - "limit_to_extruder": "wall_0_extruder_nr", - "settable_per_mesh": true - } - } + "settable_per_mesh": true + }, + "filter_out_tiny_gaps": + { + "label": "Filter Out Tiny Gaps", + "description": "Filter out tiny gaps to reduce blobs on outside of model.", + "type": "bool", + "default_value": true, + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true }, "fill_outline_gaps": { "label": "Print Thin Walls", From 53627c5f1f4bfe389a84d996905de0bdd9420916 Mon Sep 17 00:00:00 2001 From: Buco Date: Mon, 27 Nov 2017 13:58:10 +0100 Subject: [PATCH 371/764] Removed the "Not supported" materials Removed the "not supported" materials. So all the other material quality profiles, BVOH, global, Innoflex60, PET, PLA and PVA are supported by our printer. In Cura 3.1 beta only PLA is supported. --- .../bp_ABS_Coarse_Quality.inst.cfg | 14 -------------- .../builder_premium/bp_ABS_High_Quality.inst.cfg | 14 -------------- .../bp_ABS_Normal_Quality.inst.cfg | 14 -------------- .../bp_CPE_Coarse_Quality.inst.cfg | 14 -------------- .../builder_premium/bp_CPE_High_Quality.inst.cfg | 14 -------------- .../bp_CPE_Normal_Quality.inst.cfg | 14 -------------- .../bp_HIPS_Coarse_Quality.inst.cfg | 15 --------------- .../builder_premium/bp_HIPS_High_Quality.inst.cfg | 14 -------------- .../bp_HIPS_Normal_Quality.inst.cfg | 14 -------------- .../bp_Nylon_Coarse_Quality.inst.cfg | 14 -------------- .../bp_Nylon_High_Quality.inst.cfg | 14 -------------- .../bp_Nylon_Normal_Quality.inst.cfg | 14 -------------- .../builder_premium/bp_PC_Coarse_Quality.inst.cfg | 14 -------------- .../builder_premium/bp_PC_High_Quality.inst.cfg | 14 -------------- .../builder_premium/bp_PC_Normal_Quality.inst.cfg | 14 -------------- 15 files changed, 211 deletions(-) delete mode 100644 resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg delete mode 100644 resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg diff --git a/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg deleted file mode 100644 index 4e1294fdb6..0000000000 --- a/resources/quality/builder_premium/bp_ABS_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_abs_175 -setting_version = 3 -weight = -1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg deleted file mode 100644 index e6ec6b2158..0000000000 --- a/resources/quality/builder_premium/bp_ABS_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_abs_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg deleted file mode 100644 index c033dca279..0000000000 --- a/resources/quality/builder_premium/bp_ABS_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_abs_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg deleted file mode 100644 index 4f5c56af04..0000000000 --- a/resources/quality/builder_premium/bp_CPE_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_cpe_175 -setting_version = 3 -weight = -1 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg deleted file mode 100644 index dfa7302ee0..0000000000 --- a/resources/quality/builder_premium/bp_CPE_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_cpe_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg deleted file mode 100644 index 8a72c81b16..0000000000 --- a/resources/quality/builder_premium/bp_CPE_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_cpe_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg deleted file mode 100644 index 646f69cee1..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_hips_175 -setting_version = 3 -weight = -1 -supported = False - -[values] - diff --git a/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg deleted file mode 100644 index cb28b7c3d4..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_hips_175 -setting_version = 3 -weight = 1 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg deleted file mode 100644 index 49ae840c49..0000000000 --- a/resources/quality/builder_premium/bp_HIPS_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_hips_175 -setting_version = 3 -weight = 0 -supported = False - -[values] \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg deleted file mode 100644 index 14441b7c6c..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg deleted file mode 100644 index 90f9a2ed84..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg deleted file mode 100644 index b943f0bd02..0000000000 --- a/resources/quality/builder_premium/bp_Nylon_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_nylon_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg deleted file mode 100644 index c7c5782d96..0000000000 --- a/resources/quality/builder_premium/bp_PC_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = coarse -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg deleted file mode 100644 index 01f5845748..0000000000 --- a/resources/quality/builder_premium/bp_PC_High_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = high -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] diff --git a/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg deleted file mode 100644 index 26a2183a91..0000000000 --- a/resources/quality/builder_premium/bp_PC_Normal_Quality.inst.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[general] -version = 2 -name = Not Supported -definition = builder_premium_small - -[metadata] -type = quality -quality_type = normal -material = generic_pc_175 -setting_version = 3 -weight = 0 -supported = False - -[values] From 13124ae983e6e3fadb9e438445c9cecc659995c3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 13:54:09 +0100 Subject: [PATCH 372/764] Don't make filter_out_tiny_gaps a child setting of fill_perimeter_gaps Parent settings are not used by the engine. Or they shouldn't be, because the parent settings are disabled by the front-end when all of their child settings are overwritten. Then you'd have a parent setting that is used by the engine but you can't modify it. Also, the command-line slicing doesn't load parent settings since it can't parse categories and such. --- resources/definitions/fdmprinter.def.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index be2c5d9757..be15450db6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1208,7 +1208,8 @@ } } }, - "fill_perimeter_gaps": { + "fill_perimeter_gaps": + { "label": "Fill Gaps Between Walls", "description": "Fills the gaps between walls where no walls fit.", "type": "enum", @@ -1220,6 +1221,15 @@ "limit_to_extruder": "wall_0_extruder_nr", "settable_per_mesh": true }, + "filter_out_tiny_gaps": + { + "label": "Filter Out Tiny Gaps", + "description": "Filter out tiny gaps to reduce blobs on outside of model.", + "type": "bool", + "default_value": true, + "limit_to_extruder": "wall_0_extruder_nr", + "settable_per_mesh": true + }, "fill_outline_gaps": { "label": "Print Thin Walls", "description": "Print pieces of the model which are horizontally thinner than the nozzle size.", From 49cac860a8e56dbde66fa9c8bb1589ff2c40c137 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 14:16:40 +0100 Subject: [PATCH 373/764] Fix project loading CURA-4617 --- cura/Settings/CuraContainerRegistry.py | 134 ++++++++++---------- plugins/3MFReader/ThreeMFWorkspaceReader.py | 47 ++++++- 2 files changed, 110 insertions(+), 71 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 1975458548..b838aa1e24 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -408,90 +408,84 @@ class CuraContainerRegistry(ContainerRegistry): def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id - extruder_stack = None - # if extruders are defined in the machine definition use those instead - if machine.extruders and "0" in machine.extruders: - new_extruder_id = machine.extruders["0"].getId() - extruder_stack = machine.extruders["0"] + extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) + if not extruder_definitions: + Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) + return - # if the extruder stack doesn't exist yet we create and add it - if not extruder_stack: - extruder_definitions = self.findDefinitionContainers(id = new_extruder_id) - if not extruder_definitions: - Logger.log("w", "Could not find definition containers for extruder %s", new_extruder_id) - return + extruder_definition = extruder_definitions[0] + unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) - extruder_definition = extruder_definitions[0] - unique_name = self.uniqueName(machine.getName() + " " + new_extruder_id) + extruder_stack = ExtruderStack.ExtruderStack(unique_name) + extruder_stack.setName(extruder_definition.getName()) + extruder_stack.setDefinition(extruder_definition) + extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) + extruder_stack.setNextStack(machine) - extruder_stack = ExtruderStack.ExtruderStack(unique_name) - extruder_stack.setName(extruder_definition.getName()) - extruder_stack.setDefinition(extruder_definition) - extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) - extruder_stack.setNextStack(machine) + # create empty user changes container otherwise + user_container = InstanceContainer(extruder_stack.id + "_user") + user_container.addMetaDataEntry("type", "user") + user_container.addMetaDataEntry("machine", extruder_stack.getId()) + from cura.CuraApplication import CuraApplication + user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + user_container.setDefinition(extruder_definition) - # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.id + "_user") - user_container.addMetaDataEntry("type", "user") - user_container.addMetaDataEntry("machine", extruder_stack.getId()) - from cura.CuraApplication import CuraApplication - user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(extruder_definition) + if machine.userChanges: + # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes + # container to the extruder stack. + for user_setting_key in machine.userChanges.getAllKeys(): + settable_per_extruder = machine.getProperty(user_setting_key, "settable_per_extruder") + if settable_per_extruder: + user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) + machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) - if machine.userChanges: - # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes - # container to the extruder stack. - for user_setting_key in machine.userChanges.getAllKeys(): - settable_per_extruder = machine.getProperty(user_setting_key, "settable_per_extruder") - if settable_per_extruder: - user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) - machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) + extruder_stack.setUserChanges(user_container) + self.addContainer(user_container) - extruder_stack.setUserChanges(user_container) - self.addContainer(user_container) + variant_id = "default" + if machine.variant.getId() not in ("empty", "empty_variant"): + variant_id = machine.variant.getId() + else: + variant_id = "empty_variant" + extruder_stack.setVariantById(variant_id) - variant_id = "default" - if machine.variant.getId() not in ("empty", "empty_variant"): - variant_id = machine.variant.getId() + material_id = "default" + if machine.material.getId() not in ("empty", "empty_material"): + material_id = machine.material.getId() + else: + material_id = "empty_material" + extruder_stack.setMaterialById(material_id) + + quality_id = "default" + if machine.quality.getId() not in ("empty", "empty_quality"): + quality_id = machine.quality.getId() + else: + quality_id = "empty_quality" + extruder_stack.setQualityById(quality_id) + + if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): + extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) + if extruder_quality_changes_container: + extruder_quality_changes_container = extruder_quality_changes_container[0] + quality_changes_id = extruder_quality_changes_container.getId() + extruder_stack.setQualityChangesById(quality_changes_id) else: - variant_id = "empty_variant" - extruder_stack.setVariantById(variant_id) - - material_id = "default" - if machine.material.getId() not in ("empty", "empty_material"): - material_id = machine.material.getId() - else: - material_id = "empty_material" - extruder_stack.setMaterialById(material_id) - - quality_id = "default" - if machine.quality.getId() not in ("empty", "empty_quality"): - quality_id = machine.quality.getId() - else: - quality_id = "empty_quality" - extruder_stack.setQualityById(quality_id) - - if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): - extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) + # Some extruder quality_changes containers can be created at runtime as files in the qualities + # folder. Those files won't be loaded in the registry immediately. So we also need to search + # the folder to see if the quality_changes exists. + extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) if extruder_quality_changes_container: - extruder_quality_changes_container = extruder_quality_changes_container[0] quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) - else: - # Some extruder quality_changes containers can be created at runtime as files in the qualities - # folder. Those files won't be loaded in the registry immediately. So we also need to search - # the folder to see if the quality_changes exists. - extruder_quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) - if extruder_quality_changes_container: - quality_changes_id = extruder_quality_changes_container.getId() - extruder_stack.setQualityChangesById(quality_changes_id) - if not extruder_quality_changes_container: - Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", - machine.qualityChanges.getName(), extruder_stack.getId()) + if not extruder_quality_changes_container: + Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", + machine.qualityChanges.getName(), extruder_stack.getId()) + else: + extruder_stack.setQualityChangesById("empty_quality_changes") - self.addContainer(extruder_stack) + self.addContainer(extruder_stack) return extruder_stack diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index e7a47561ce..156b960396 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -760,7 +760,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if not extruder_stacks: stack = self._container_registry.addExtruderStackForSingleExtrusionMachine(global_stack, "fdmextruder") if stack: - extruder_stacks.append(stack) + if self._resolve_strategies["machine"] == "override": + # in case the extruder is newly created (for a single-extrusion machine), we need to override + # the existing extruder stack. + existing_extruder_stack = global_stack.extruders[stack.getMetaDataEntry("position")] + for idx in range(len(_ContainerIndexes.IndexTypeMap)): + existing_extruder_stack.replaceContainer(idx, stack._containers[idx], postpone_emit = True) + extruder_stacks.append(existing_extruder_stack) + else: + extruder_stacks.append(stack) except: Logger.logException("w", "We failed to serialize the stack. Trying to clean up.") @@ -812,6 +820,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): available_quality_types = [q.getMetaDataEntry("quality_type") for q in available_quality] if global_stack.quality.getMetaDataEntry("quality_type") not in available_quality_types: + # We are here because the quality_type specified in the project is not supported any more, + # so we need to switch it to the "preferred quality" if present, otherwise "normal". quality_has_been_changed = True # find the preferred quality @@ -845,6 +855,41 @@ class ThreeMFWorkspaceReader(WorkspaceReader): else: # we cannot find the preferred quality. THIS SHOULD NOT HAPPEN Logger.log("e", "Cannot find the preferred quality for machine [%s]", global_stack.getId()) + else: + # The quality_type specified in the project file is usable, but the quality container itself may not + # be correct. For example, for UM2, the quality container can be "draft" while it should be "um2_draft" + # instead. + # In this code branch, we try to fix those incorrect quality containers. + search_criteria = {"type": "quality", + "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} + search_criteria["definition"] = global_stack.definition.getId() + if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): + search_criteria["definition"] = "fdmprinter" + + containers = self._container_registry.findInstanceContainers(**search_criteria) + containers = [c for c in containers if not c.getMetaDataEntry("material", "")] + if not containers: + # cannot find machine-specific qualities, so just use fdmprinter to search again + search_criteria["definition"] = "fdmprinter" + containers = self._container_registry.findInstanceContainers(**search_criteria) + containers = [c for c in containers if not c.getMetaDataEntry("material", "")] + + if containers: + new_quality_container = containers[0] + global_stack.quality = new_quality_container + + for extruder_stack in extruder_stacks: + search_criteria = {"type": "quality", + "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} + search_criteria["definition"] = global_stack.definition.getId() + if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): + search_criteria["definition"] = "fdmprinter" + + if global_stack.getMetaDataEntry("has_machine_materials") and extruder_stack.material.getId() not in ("empty", "empty_material"): + search_criteria["material"] = extruder_stack.material.getId() + containers = self._container_registry.findInstanceContainers(**search_criteria) + if containers: + extruder_stack.quality = containers[0] # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those From 54a12d14c48ffd847b855981d20cee0e5132ce46 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 14:19:30 +0100 Subject: [PATCH 374/764] Add string representation for debugging My IDE shows the str(inst) representation of an object when indicating what value is in there. This makes it easier to find stuff. It'll also make debug prints more clear than the default stuff of Python. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index ead0864d6f..23d4ed3860 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -834,6 +834,10 @@ class XmlMaterialProfile(InstanceContainer): def _parseCompatibleValue(cls, value: str): return value in {"yes", "unknown"} + ## Small string representation for debugging. + def __str__(self): + return "".format(my_id = self.getId(), name = self.getName(), base_file = self.getMetaDataEntry("base_file")) + # Map XML file setting names to internal names __material_settings_setting_map = { "print temperature": "default_material_print_temperature", From 952e3974ebca0a98e7c58fa486676f38b6b349b6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 14:22:09 +0100 Subject: [PATCH 375/764] Remove convenience handling of 'None' Because this parameter has type checking, we'll get warned if this variable is None. Contributes to issue CURA-4243. --- cura/QualityManager.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 17d3fb652c..1f9c1b8b44 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -231,10 +231,6 @@ class QualityManager: if quality_definition_id is not None: machine_definition = ContainerRegistry.getInstance().findDefinitionContainers(id = quality_definition_id)[0] - # for convenience - if material_containers is None: - material_containers = [] - if not material_containers: active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks: From 33a06e13a9fa7f4f374f9a9b8089591ba70a33fd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 27 Nov 2017 14:27:11 +0100 Subject: [PATCH 376/764] Remove legacy if check in project loading CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 156b960396..acd4242fff 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -715,11 +715,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_file_content = archive.open(extruder_stack_file, "r").read().decode("utf-8") if self._resolve_strategies["machine"] == "override": - if global_stack.getProperty("machine_extruder_count", "value") > 1: - # deserialize new extruder stack over the current ones (if any) - stack = self._overrideExtruderStack(global_stack, extruder_file_content, extruder_stack_file) - if stack is None: - continue + # deserialize new extruder stack over the current ones (if any) + stack = self._overrideExtruderStack(global_stack, extruder_file_content, extruder_stack_file) + if stack is None: + continue elif self._resolve_strategies["machine"] == "new": new_id = extruder_stack_id_map[container_id] From 9e6704a1624535f04c7ee499f0d917e92ee431bf Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 15:14:32 +0100 Subject: [PATCH 377/764] Fix extruder stack machine definition link for per extruder settings resolvement - CURA-4627 --- cura/Settings/CuraContainerRegistry.py | 2 +- cura/Settings/CuraStackBuilder.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index b838aa1e24..bd915e0c62 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -429,7 +429,7 @@ class CuraContainerRegistry(ContainerRegistry): user_container.addMetaDataEntry("machine", extruder_stack.getId()) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(extruder_definition) + user_container.setDefinition(machine.definition) if machine.userChanges: # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 7a260e2145..a661237722 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -108,7 +108,7 @@ class CuraStackBuilder: user_container.addMetaDataEntry("extruder", new_stack_id) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(definition) + user_container.setDefinition(machine_definition) stack.setUserChanges(user_container) From e5427eded6adc2a10a64bbddb2ff6f5ae3ff9472 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 27 Nov 2017 15:33:14 +0100 Subject: [PATCH 378/764] Refactor _getBasicMaterials to only handle metadata Otherwise the full profile of all materials and all their definitions gets loaded. Contributes to issue CURA-4243. --- cura/QualityManager.py | 49 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 1f9c1b8b44..f776ed56e8 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -3,11 +3,10 @@ # This collects a lot of quality and quality changes related code which was split between ContainerManager # and the MachineManager and really needs to usable from both. -from typing import List, Optional, Dict, TYPE_CHECKING +from typing import Any, Dict, List, Optional, TYPE_CHECKING from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry -from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.InstanceContainer import InstanceContainer from cura.Settings.ExtruderManager import ExtruderManager @@ -42,7 +41,7 @@ class QualityManager: # Fall back to using generic materials and qualities if nothing could be found. if not result and material_containers and len(material_containers) == 1: - basic_materials = self._getBasicMaterials(material_containers[0]) + basic_materials = self._getBasicMaterialMetadatas(material_containers[0].getMetaData()) result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result[0] if result else None @@ -119,7 +118,7 @@ class QualityManager: result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria) # Fall back to using generic materials and qualities if nothing could be found. if not result and material_containers and len(material_containers) == 1: - basic_materials = self._getBasicMaterials(material_containers[0]) + basic_materials = self._getBasicMaterialMetadatas(material_containers[0].getMetaData()) if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result[0] if result else None @@ -131,9 +130,9 @@ class QualityManager: # \return \type{List[InstanceContainer]} the list of suitable qualities. def findAllQualitiesForMachineMaterial(self, machine_definition: "DefinitionContainerInterface", material_container: InstanceContainer) -> List[InstanceContainer]: criteria = {"type": "quality"} - result = self._getFilteredContainersForStack(machine_definition, [material_container], **criteria) + result = self._getFilteredContainersForStack(machine_definition, [material_container.getMetaData()], **criteria) if not result: - basic_materials = self._getBasicMaterials(material_container) + basic_materials = self._getBasicMaterialMetadatas(material_container.getMetaData()) if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) @@ -198,13 +197,19 @@ class QualityManager: ## Fetch more basic versions of a material. # # This tries to find a generic or basic version of the given material. - # \param material_container \type{InstanceContainer} the material - # \return \type{List[InstanceContainer]} a list of the basic materials or an empty list if one could not be found. - def _getBasicMaterials(self, material_container: InstanceContainer): - base_material = material_container.getMetaDataEntry("material") - material_container_definition = material_container.getDefinition() - if material_container_definition and material_container_definition.getMetaDataEntry("has_machine_quality"): - definition_id = material_container.getDefinition().getMetaDataEntry("quality_definition", material_container.getDefinition().getId()) + # \param material_container \type{Dict[str, Any]} The metadata of a + # material to find the basic versions of. + # \return \type{List[Dict[str, Any]]} A list of the metadata of basic + # materials, or an empty list if none could be found. + def _getBasicMaterialMetadatas(self, material_container: Dict[str, Any]) -> List[Dict[str, Any]]: + base_material = material_container.get("material") + material_container_definition = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = material_container["definition"]) + if material_container_definition: + material_container_definition = material_container_definition[0] + if "has_machine_quality" in material_container_definition: + definition_id = material_container_definition.get("quality_definition", material_container_definition["id"]) + else: + definition_id = "fdmprinter" else: definition_id = "fdmprinter" if base_material: @@ -213,9 +218,9 @@ class QualityManager: "type": "material", "name": base_material, "definition": definition_id, - "variant": material_container.getMetaDataEntry("variant") + "variant": material_container.get("variant") } - containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(**criteria) return containers return [] @@ -223,7 +228,7 @@ class QualityManager: def _getFilteredContainers(self, **kwargs): return self._getFilteredContainersForStack(None, None, **kwargs) - def _getFilteredContainersForStack(self, machine_definition: "DefinitionContainerInterface" = None, material_containers: List[InstanceContainer] = None, **kwargs): + def _getFilteredContainersForStack(self, machine_definition: "DefinitionContainerInterface" = None, material_metadata: List[Dict[str, Any]] = None, **kwargs): # Fill in any default values. if machine_definition is None: machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() @@ -231,10 +236,10 @@ class QualityManager: if quality_definition_id is not None: machine_definition = ContainerRegistry.getInstance().findDefinitionContainers(id = quality_definition_id)[0] - if not material_containers: + if not material_metadata: active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks: - material_containers = [stack.material for stack in active_stacks] + material_metadata = [stack.material.getMetaData() for stack in active_stacks] criteria = kwargs filter_by_material = False @@ -255,12 +260,12 @@ class QualityManager: # Stick the material IDs in a set material_ids = set() - for material_instance in material_containers: + for material_instance in material_metadata: if material_instance is not None: # Add the parent material too. - for basic_material in self._getBasicMaterials(material_instance): - material_ids.add(basic_material.getId()) - material_ids.add(material_instance.getId()) + for basic_material in self._getBasicMaterialMetadatas(material_instance): + material_ids.add(basic_material["id"]) + material_ids.add(material_instance["id"]) containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) result = [] From 8cfaa445807fe93328d580ad477e1254f4425e29 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 16:40:23 +0100 Subject: [PATCH 379/764] Fix resolving global stack definition when switching variant - CURA-4620 --- cura/Settings/MachineManager.py | 41 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6bacae11a0..7237aa5674 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -763,29 +763,30 @@ class MachineManager(QObject): quality_type = old_quality_changes.getMetaDataEntry("quality_type") new_quality_id = old_quality_changes.getId() - # See if the requested quality type is available in the new situation. - machine_definition = self._active_container_stack.getBottom() - quality_manager = QualityManager.getInstance() - candidate_quality = None - if quality_type: - candidate_quality = quality_manager.findQualityByQualityType(quality_type, - quality_manager.getWholeMachineDefinition(material_container.getDefinition()), - [material_container]) + global_stack = Application.getInstance().getGlobalContainerStack() + if global_stack: + quality_manager = QualityManager.getInstance() - if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): - Logger.log("d", "Attempting to find fallback quality") - # Fall back to a quality (which must be compatible with all other extruders) - new_qualities = quality_manager.findAllUsableQualitiesForMachineAndExtruders( - self._global_container_stack, ExtruderManager.getInstance().getExtruderStacks()) - if new_qualities: - new_quality_id = new_qualities[0].getId() # Just pick the first available one + candidate_quality = None + if quality_type: + candidate_quality = quality_manager.findQualityByQualityType(quality_type, + quality_manager.getWholeMachineDefinition(global_stack.definition), + [material_container]) + + if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): + Logger.log("d", "Attempting to find fallback quality") + # Fall back to a quality (which must be compatible with all other extruders) + new_qualities = quality_manager.findAllUsableQualitiesForMachineAndExtruders( + self._global_container_stack, ExtruderManager.getInstance().getExtruderStacks()) + if new_qualities: + new_quality_id = new_qualities[0].getId() # Just pick the first available one + else: + Logger.log("w", "No quality profile found that matches the current machine and extruders.") else: - Logger.log("w", "No quality profile found that matches the current machine and extruders.") - else: - if not old_quality_changes: - new_quality_id = candidate_quality.getId() + if not old_quality_changes: + new_quality_id = candidate_quality.getId() - self.setActiveQuality(new_quality_id) + self.setActiveQuality(new_quality_id) @pyqtSlot(str) def setActiveVariant(self, variant_id: str): From 26b9fc3163610d9cf7ee7ae9f16d173e32c0dd89 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 16:55:01 +0100 Subject: [PATCH 380/764] Only create extruder stack for single extrusion machine when not yet existing - CURA-4482 --- cura/Settings/CuraContainerRegistry.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index bd915e0c62..7ffed279fc 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -402,9 +402,11 @@ class CuraContainerRegistry(ContainerRegistry): return new_stack def _registerSingleExtrusionMachinesExtruderStacks(self): - machines = ContainerRegistry.getInstance().findContainerStacks(machine_extruder_trains = {"0": "fdmextruder"}) + machines = self.findContainerStacks(type = "machine", machine_extruder_trains = {"0": "fdmextruder"}) for machine in machines: - self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + extruder_stacks = self.findContainerStacks(type = "extruder_train", machine = machine.getId()) + if not extruder_stacks: + self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id From cab2e147282c8a4a7ed9635ffcdaff17a56eba87 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 27 Nov 2017 16:56:26 +0100 Subject: [PATCH 381/764] CURA-4552 Add flavors to GCodeReader. The preRead looks for the flavor in the GCode and then the right flavor handler is responsible for reading the code. At this moment just the Griffin and RepRap flavors are taken into account. --- plugins/GCodeReader/GCodeFlavor.py | 463 ++++++++++++++++++++++++++ plugins/GCodeReader/GCodeReader.py | 470 ++------------------------- plugins/GCodeReader/GriffinFlavor.py | 9 + plugins/GCodeReader/RepRapFlavor.py | 31 ++ 4 files changed, 522 insertions(+), 451 deletions(-) create mode 100644 plugins/GCodeReader/GCodeFlavor.py create mode 100644 plugins/GCodeReader/GriffinFlavor.py create mode 100644 plugins/GCodeReader/RepRapFlavor.py diff --git a/plugins/GCodeReader/GCodeFlavor.py b/plugins/GCodeReader/GCodeFlavor.py new file mode 100644 index 0000000000..1d1ca4de8b --- /dev/null +++ b/plugins/GCodeReader/GCodeFlavor.py @@ -0,0 +1,463 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Application import Application +from UM.Backend import Backend +from UM.Job import Job +from UM.Logger import Logger +from UM.Math.AxisAlignedBox import AxisAlignedBox +from UM.Math.Vector import Vector +from UM.Message import Message +from UM.Scene.SceneNode import SceneNode +from UM.i18n import i18nCatalog +from UM.Preferences import Preferences + +catalog = i18nCatalog("cura") + +from cura import LayerDataBuilder +from cura import LayerDataDecorator +from cura.LayerPolygon import LayerPolygon +from cura.GCodeListDecorator import GCodeListDecorator +from cura.Settings.ExtruderManager import ExtruderManager + +import numpy +import math +import re +from collections import namedtuple + + +# Class for loading and parsing G-code files +class GCodeFlavor: + + def __init__(self): + Application.getInstance().hideMessageSignal.connect(self._onHideMessage) + self._cancelled = False + self._message = None + self._layer_number = 0 + self._extruder_number = 0 + self._clearValues() + self._scene_node = None + # X, Y, Z position, F feedrate and E extruder values are stored + self._position = namedtuple('Position', ['x', 'y', 'z', 'f', 'e']) + self._is_layers_in_file = False # Does the Gcode have the layers comment? + self._extruder_offsets = {} # Offsets for multi extruders. key is index, value is [x-offset, y-offset] + self._current_layer_thickness = 0.2 # default + + Preferences.getInstance().addPreference("gcodereader/show_caution", True) + + def _clearValues(self): + self._filament_diameter = 2.85 + self._extruder_number = 0 + self._extrusion_length_offset = [0] + self._layer_type = LayerPolygon.Inset0Type + self._layer_number = 0 + self._previous_z = 0 + self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() + self._center_is_zero = False + self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) + self._is_absolute_extrusion = True # It can become absolute (M82, default) or relative (M83) + + @staticmethod + def _getValue(line, code): + n = line.find(code) + if n < 0: + return None + n += len(code) + pattern = re.compile("[;\s]") + match = pattern.search(line, n) + m = match.start() if match is not None else -1 + try: + if m < 0: + return line[n:] + return line[n:m] + except: + return None + + def _getInt(self, line, code): + value = self._getValue(line, code) + try: + return int(value) + except: + return None + + def _getFloat(self, line, code): + value = self._getValue(line, code) + try: + return float(value) + except: + return None + + def _onHideMessage(self, message): + if message == self._message: + self._cancelled = True + + @staticmethod + def _getNullBoundingBox(): + return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) + + def _createPolygon(self, layer_thickness, path, extruder_offsets): + countvalid = 0 + for point in path: + if point[5] > 0: + countvalid += 1 + if countvalid >= 2: + # we know what to do now, no need to count further + continue + if countvalid < 2: + return False + try: + self._layer_data_builder.addLayer(self._layer_number) + self._layer_data_builder.setLayerHeight(self._layer_number, path[0][2]) + self._layer_data_builder.setLayerThickness(self._layer_number, layer_thickness) + this_layer = self._layer_data_builder.getLayer(self._layer_number) + except ValueError: + return False + count = len(path) + line_types = numpy.empty((count - 1, 1), numpy.int32) + line_widths = numpy.empty((count - 1, 1), numpy.float32) + line_thicknesses = numpy.empty((count - 1, 1), numpy.float32) + line_feedrates = numpy.empty((count - 1, 1), numpy.float32) + line_widths[:, 0] = 0.35 # Just a guess + line_thicknesses[:, 0] = layer_thickness + points = numpy.empty((count, 3), numpy.float32) + extrusion_values = numpy.empty((count, 1), numpy.float32) + i = 0 + for point in path: + points[i, :] = [point[0] + extruder_offsets[0], point[2], -point[1] - extruder_offsets[1]] + extrusion_values[i] = point[4] + if i > 0: + line_feedrates[i - 1] = point[3] + line_types[i - 1] = point[5] + if point[5] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + line_widths[i - 1] = 0.1 + line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines + else: + line_widths[i - 1] = self._calculateLineWidth(points[i], points[i-1], extrusion_values[i], extrusion_values[i-1], layer_thickness) + i += 1 + + this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) + this_poly.buildCache() + + this_layer.polygons.append(this_poly) + return True + + def _createEmptyLayer(self, layer_number): + self._layer_data_builder.addLayer(layer_number) + self._layer_data_builder.setLayerHeight(layer_number, 0) + self._layer_data_builder.setLayerThickness(layer_number, 0) + + def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): + # Area of the filament + Af = (self._filament_diameter / 2) ** 2 * numpy.pi + # Length of the extruded filament + de = current_extrusion - previous_extrusion + # Volumne of the extruded filament + dVe = de * Af + # Length of the printed line + dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2) + # When the extruder recovers from a retraction, we get zero distance + if dX == 0: + return 0.1 + # Area of the printed line. This area is a rectangle + Ae = dVe / dX + # This area is a rectangle with area equal to layer_thickness * layer_width + line_width = Ae / layer_thickness + + # A threshold is set to avoid weird paths in the GCode + if line_width > 1.2: + return 0.35 + return line_width + + def _gCode0(self, position, params, path): + x, y, z, f, e = position + + if self._is_absolute_positioning: + x = params.x if params.x is not None else x + y = params.y if params.y is not None else y + z = params.z if params.z is not None else z + else: + x += params.x if params.x is not None else 0 + y += params.y if params.y is not None else 0 + z += params.z if params.z is not None else 0 + + f = params.f if params.f is not None else f + + if params.e is not None: + new_extrusion_value = params.e if self._is_absolute_extrusion else e[self._extruder_number] + params.e + if new_extrusion_value > e[self._extruder_number]: + path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion + else: + path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction + e[self._extruder_number] = new_extrusion_value + + # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions + # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. + if z > self._previous_z and (z - self._previous_z < 1.5): + self._current_layer_thickness = z - self._previous_z # allow a tiny overlap + self._previous_z = z + else: + path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) + return self._position(x, y, z, f, e) + + + # G0 and G1 should be handled exactly the same. + _gCode1 = _gCode0 + + ## Home the head. + def _gCode28(self, position, params, path): + return self._position( + params.x if params.x is not None else position.x, + params.y if params.y is not None else position.y, + params.z if params.z is not None else position.z, + position.f, + position.e) + + ## Set the absolute positioning + def _gCode90(self, position, params, path): + self._is_absolute_positioning = True + self._is_absolute_extrusion = True + return position + + ## Set the relative positioning + def _gCode91(self, position, params, path): + self._is_absolute_positioning = False + self._is_absolute_extrusion = False + return position + + ## Reset the current position to the values specified. + # For example: G92 X10 will set the X to 10 without any physical motion. + def _gCode92(self, position, params, path): + if params.e is not None: + # Sometimes a G92 E0 is introduced in the middle of the GCode so we need to keep those offsets for calculate the line_width + self._extrusion_length_offset[self._extruder_number] += position.e[self._extruder_number] - params.e + position.e[self._extruder_number] = params.e + return self._position( + params.x if params.x is not None else position.x, + params.y if params.y is not None else position.y, + params.z if params.z is not None else position.z, + params.f if params.f is not None else position.f, + position.e) + + def processGCode(self, G, line, position, path): + func = getattr(self, "_gCode%s" % G, None) + line = line.split(";", 1)[0] # Remove comments (if any) + if func is not None: + s = line.upper().split(" ") + x, y, z, f, e = None, None, None, None, None + for item in s[1:]: + if len(item) <= 1: + continue + if item.startswith(";"): + continue + if item[0] == "X": + x = float(item[1:]) + if item[0] == "Y": + y = float(item[1:]) + if item[0] == "Z": + z = float(item[1:]) + if item[0] == "F": + f = float(item[1:]) / 60 + if item[0] == "E": + e = float(item[1:]) + if self._is_absolute_positioning and ((x is not None and x < 0) or (y is not None and y < 0)): + self._center_is_zero = True + params = self._position(x, y, z, f, e) + return func(position, params, path) + return position + + def processTCode(self, T, line, position, path): + self._extruder_number = T + if self._extruder_number + 1 > len(position.e): + self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1)) + position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) + return position + + def processMCode(self, M, line, position, path): + pass + + _type_keyword = ";TYPE:" + _layer_keyword = ";LAYER:" + + ## For showing correct x, y offsets for each extruder + def _extruderOffsets(self): + result = {} + for extruder in ExtruderManager.getInstance().getExtruderStacks(): + result[int(extruder.getMetaData().get("position", "0"))] = [ + extruder.getProperty("machine_nozzle_offset_x", "value"), + extruder.getProperty("machine_nozzle_offset_y", "value")] + return result + + def processGCodeFile(self, file_name): + Logger.log("d", "Preparing to load %s" % file_name) + self._cancelled = False + # We obtain the filament diameter from the selected printer to calculate line widths + self._filament_diameter = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") + + scene_node = SceneNode() + # Override getBoundingBox function of the sceneNode, as this node should return a bounding box, but there is no + # real data to calculate it from. + scene_node.getBoundingBox = self._getNullBoundingBox + + gcode_list = [] + self._is_layers_in_file = False + + Logger.log("d", "Opening file %s" % file_name) + + self._extruder_offsets = self._extruderOffsets() # dict with index the extruder number. can be empty + + with open(file_name, "r") as file: + file_lines = 0 + current_line = 0 + for line in file: + file_lines += 1 + gcode_list.append(line) + if not self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: + self._is_layers_in_file = True + file.seek(0) + + file_step = max(math.floor(file_lines / 100), 1) + + self._clearValues() + + self._message = Message(catalog.i18nc("@info:status", "Parsing G-code"), + lifetime=0, + title = catalog.i18nc("@info:title", "G-code Details")) + + self._message.setProgress(0) + self._message.show() + + Logger.log("d", "Parsing %s..." % file_name) + + current_position = self._position(0, 0, 0, 0, [0]) + current_path = [] + min_layer_number = 0 + negative_layers = 0 + previous_layer = 0 + + for line in file: + if self._cancelled: + Logger.log("d", "Parsing %s cancelled" % file_name) + return None + current_line += 1 + + if current_line % file_step == 0: + self._message.setProgress(math.floor(current_line / file_lines * 100)) + Job.yieldThread() + if len(line) == 0: + continue + + if line.find(self._type_keyword) == 0: + type = line[len(self._type_keyword):].strip() + if type == "WALL-INNER": + self._layer_type = LayerPolygon.InsetXType + elif type == "WALL-OUTER": + self._layer_type = LayerPolygon.Inset0Type + elif type == "SKIN": + self._layer_type = LayerPolygon.SkinType + elif type == "SKIRT": + self._layer_type = LayerPolygon.SkirtType + elif type == "SUPPORT": + self._layer_type = LayerPolygon.SupportType + elif type == "FILL": + self._layer_type = LayerPolygon.InfillType + else: + Logger.log("w", "Encountered a unknown type (%s) while parsing g-code.", type) + + # When the layer change is reached, the polygon is computed so we have just one layer per layer per extruder + if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: + try: + layer_number = int(line[len(self._layer_keyword):]) + self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) + current_path.clear() + + # When using a raft, the raft layers are stored as layers < 0, it mimics the same behavior + # as in ProcessSlicedLayersJob + if layer_number < min_layer_number: + min_layer_number = layer_number + if layer_number < 0: + layer_number += abs(min_layer_number) + negative_layers += 1 + else: + layer_number += negative_layers + + # In case there is a gap in the layer count, empty layers are created + for empty_layer in range(previous_layer + 1, layer_number): + self._createEmptyLayer(empty_layer) + + self._layer_number = layer_number + previous_layer = layer_number + except: + pass + + # This line is a comment. Ignore it (except for the layer_keyword) + if line.startswith(";"): + continue + + G = self._getInt(line, "G") + if G is not None: + # When find a movement, the new posistion is calculated and added to the current_path, but + # don't need to create a polygon until the end of the layer + current_position = self.processGCode(G, line, current_position, current_path) + continue + + # When changing the extruder, the polygon with the stored paths is computed + if line.startswith("T"): + T = self._getInt(line, "T") + if T is not None: + self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) + current_path.clear() + + current_position = self.processTCode(T, line, current_position, current_path) + + if line.startswith("M"): + M = self._getInt(line, "M") + self.processMCode(M, line, current_position, current_path) + + # "Flush" leftovers. Last layer paths are still stored + if len(current_path) > 1: + if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): + self._layer_number += 1 + current_path.clear() + + material_color_map = numpy.zeros((10, 4), dtype = numpy.float32) + material_color_map[0, :] = [0.0, 0.7, 0.9, 1.0] + material_color_map[1, :] = [0.7, 0.9, 0.0, 1.0] + layer_mesh = self._layer_data_builder.build(material_color_map) + decorator = LayerDataDecorator.LayerDataDecorator() + decorator.setLayerData(layer_mesh) + scene_node.addDecorator(decorator) + + gcode_list_decorator = GCodeListDecorator() + gcode_list_decorator.setGCodeList(gcode_list) + scene_node.addDecorator(gcode_list_decorator) + + Application.getInstance().getController().getScene().gcode_list = gcode_list + + Logger.log("d", "Finished parsing %s" % file_name) + self._message.hide() + + if self._layer_number == 0: + Logger.log("w", "File %s doesn't contain any valid layers" % file_name) + + settings = Application.getInstance().getGlobalContainerStack() + machine_width = settings.getProperty("machine_width", "value") + machine_depth = settings.getProperty("machine_depth", "value") + + if not self._center_is_zero: + scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + + Logger.log("d", "Loaded %s" % file_name) + + if Preferences.getInstance().getValue("gcodereader/show_caution"): + caution_message = Message(catalog.i18nc( + "@info:generic", + "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."), + lifetime=0, + title = catalog.i18nc("@info:title", "G-code Details")) + caution_message.show() + + # The "save/print" button's state is bound to the backend state. + backend = Application.getInstance().getBackend() + backend.backendStateChange.emit(Backend.BackendState.Disabled) + + return scene_node diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 14d3a2b741..938be59151 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -1,471 +1,39 @@ # Copyright (c) 2017 Aleph Objects, Inc. # Cura is released under the terms of the LGPLv3 or higher. -from UM.Application import Application -from UM.Backend import Backend -from UM.Job import Job -from UM.Logger import Logger -from UM.Math.AxisAlignedBox import AxisAlignedBox -from UM.Math.Vector import Vector +from UM.FileHandler.FileReader import FileReader from UM.Mesh.MeshReader import MeshReader -from UM.Message import Message -from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog from UM.Preferences import Preferences catalog = i18nCatalog("cura") - - -from cura import LayerDataBuilder -from cura import LayerDataDecorator -from cura.LayerPolygon import LayerPolygon -from cura.GCodeListDecorator import GCodeListDecorator -from cura.Settings.ExtruderManager import ExtruderManager - -import numpy -import math -import re -from collections import namedtuple - +from . import GriffinFlavor, RepRapFlavor # Class for loading and parsing G-code files class GCodeReader(MeshReader): + + _flavor_keyword = ";FLAVOR:" + _flavor_readers_dict = {"Griffin" : GriffinFlavor.GriffinFlavor(), + "RepRap" : RepRapFlavor.RepRapFlavor()} + def __init__(self): super(GCodeReader, self).__init__() self._supported_extensions = [".gcode", ".g"] - Application.getInstance().hideMessageSignal.connect(self._onHideMessage) - self._cancelled = False - self._message = None - self._layer_number = 0 - self._extruder_number = 0 - self._clearValues() - self._scene_node = None - # X, Y, Z position, F feedrate and E extruder values are stored - self._position = namedtuple('Position', ['x', 'y', 'z', 'f', 'e']) - self._is_layers_in_file = False # Does the Gcode have the layers comment? - self._extruder_offsets = {} # Offsets for multi extruders. key is index, value is [x-offset, y-offset] - self._current_layer_thickness = 0.2 # default + self._flavor_reader = None Preferences.getInstance().addPreference("gcodereader/show_caution", True) - def _clearValues(self): - self._filament_diameter = 2.85 - self._extruder_number = 0 - self._extrusion_length_offset = [0] - self._layer_type = LayerPolygon.Inset0Type - self._layer_number = 0 - self._previous_z = 0 - self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() - self._center_is_zero = False - self._is_absolute_positioning = True # It can be absolute (G90) or relative (G91) - self._is_absolute_extrusion = True # It can become absolute (M82, default) or relative (M83) + # PreRead is used to get the correct flavor. If not, Marlin is set by default + def preRead(self, file_name, *args, **kwargs): + with open(file_name, "r") as file: + for line in file: + if line[:len(self._flavor_keyword)] == self._flavor_keyword: + self._flavor_reader = self._flavor_readers_dict[line[len(self._flavor_keyword):].rstrip()] + return FileReader.PreReadResult.accepted - @staticmethod - def _getValue(line, code): - n = line.find(code) - if n < 0: - return None - n += len(code) - pattern = re.compile("[;\s]") - match = pattern.search(line, n) - m = match.start() if match is not None else -1 - try: - if m < 0: - return line[n:] - return line[n:m] - except: - return None - - def _getInt(self, line, code): - value = self._getValue(line, code) - try: - return int(value) - except: - return None - - def _getFloat(self, line, code): - value = self._getValue(line, code) - try: - return float(value) - except: - return None - - def _onHideMessage(self, message): - if message == self._message: - self._cancelled = True - - @staticmethod - def _getNullBoundingBox(): - return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) - - def _createPolygon(self, layer_thickness, path, extruder_offsets): - countvalid = 0 - for point in path: - if point[5] > 0: - countvalid += 1 - if countvalid >= 2: - # we know what to do now, no need to count further - continue - if countvalid < 2: - return False - try: - self._layer_data_builder.addLayer(self._layer_number) - self._layer_data_builder.setLayerHeight(self._layer_number, path[0][2]) - self._layer_data_builder.setLayerThickness(self._layer_number, layer_thickness) - this_layer = self._layer_data_builder.getLayer(self._layer_number) - except ValueError: - return False - count = len(path) - line_types = numpy.empty((count - 1, 1), numpy.int32) - line_widths = numpy.empty((count - 1, 1), numpy.float32) - line_thicknesses = numpy.empty((count - 1, 1), numpy.float32) - line_feedrates = numpy.empty((count - 1, 1), numpy.float32) - line_widths[:, 0] = 0.35 # Just a guess - line_thicknesses[:, 0] = layer_thickness - points = numpy.empty((count, 3), numpy.float32) - extrusion_values = numpy.empty((count, 1), numpy.float32) - i = 0 - for point in path: - points[i, :] = [point[0] + extruder_offsets[0], point[2], -point[1] - extruder_offsets[1]] - extrusion_values[i] = point[4] - if i > 0: - line_feedrates[i - 1] = point[3] - line_types[i - 1] = point[5] - if point[5] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: - line_widths[i - 1] = 0.1 - line_thicknesses[i - 1] = 0.0 # Travels are set as zero thickness lines - else: - line_widths[i - 1] = self._calculateLineWidth(points[i], points[i-1], extrusion_values[i], extrusion_values[i-1], layer_thickness) - i += 1 - - this_poly = LayerPolygon(self._extruder_number, line_types, points, line_widths, line_thicknesses, line_feedrates) - this_poly.buildCache() - - this_layer.polygons.append(this_poly) - return True - - def _createEmptyLayer(self, layer_number): - self._layer_data_builder.addLayer(layer_number) - self._layer_data_builder.setLayerHeight(layer_number, 0) - self._layer_data_builder.setLayerThickness(layer_number, 0) - - def _calculateLineWidth(self, current_point, previous_point, current_extrusion, previous_extrusion, layer_thickness): - # Area of the filament - Af = (self._filament_diameter / 2) ** 2 * numpy.pi - # Length of the extruded filament - de = current_extrusion - previous_extrusion - # Volumne of the extruded filament - dVe = de * Af - # Length of the printed line - dX = numpy.sqrt((current_point[0] - previous_point[0])**2 + (current_point[2] - previous_point[2])**2) - # When the extruder recovers from a retraction, we get zero distance - if dX == 0: - return 0.1 - # Area of the printed line. This area is a rectangle - Ae = dVe / dX - # This area is a rectangle with area equal to layer_thickness * layer_width - line_width = Ae / layer_thickness - - # A threshold is set to avoid weird paths in the GCode - if line_width > 1.2: - return 0.35 - return line_width - - def _gCode0(self, position, params, path): - x, y, z, f, e = position - - if self._is_absolute_positioning: - x = params.x if params.x is not None else x - y = params.y if params.y is not None else y - z = params.z if params.z is not None else z - else: - x += params.x if params.x is not None else 0 - y += params.y if params.y is not None else 0 - z += params.z if params.z is not None else 0 - - f = params.f if params.f is not None else f - - if params.e is not None: - new_extrusion_value = params.e if self._is_absolute_extrusion else e[self._extruder_number] + params.e - if new_extrusion_value > e[self._extruder_number]: - path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], self._layer_type]) # extrusion - else: - path.append([x, y, z, f, new_extrusion_value + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveRetractionType]) # retraction - e[self._extruder_number] = new_extrusion_value - - # Only when extruding we can determine the latest known "layer height" which is the difference in height between extrusions - # Also, 1.5 is a heuristic for any priming or whatsoever, we skip those. - if z > self._previous_z and (z - self._previous_z < 1.5): - self._current_layer_thickness = z - self._previous_z # allow a tiny overlap - self._previous_z = z - else: - path.append([x, y, z, f, e[self._extruder_number] + self._extrusion_length_offset[self._extruder_number], LayerPolygon.MoveCombingType]) - return self._position(x, y, z, f, e) - - - # G0 and G1 should be handled exactly the same. - _gCode1 = _gCode0 - - ## Home the head. - def _gCode28(self, position, params, path): - return self._position( - params.x if params.x is not None else position.x, - params.y if params.y is not None else position.y, - 0, - position.f, - position.e) - - ## Set the absolute positioning - def _gCode90(self, position, params, path): - self._is_absolute_positioning = True - return position - - ## Set the relative positioning - def _gCode91(self, position, params, path): - self._is_absolute_positioning = False - return position - - ## Reset the current position to the values specified. - # For example: G92 X10 will set the X to 10 without any physical motion. - def _gCode92(self, position, params, path): - if params.e is not None: - # Sometimes a G92 E0 is introduced in the middle of the GCode so we need to keep those offsets for calculate the line_width - self._extrusion_length_offset[self._extruder_number] += position.e[self._extruder_number] - params.e - position.e[self._extruder_number] = params.e - return self._position( - params.x if params.x is not None else position.x, - params.y if params.y is not None else position.y, - params.z if params.z is not None else position.z, - params.f if params.f is not None else position.f, - position.e) - - def _processGCode(self, G, line, position, path): - func = getattr(self, "_gCode%s" % G, None) - line = line.split(";", 1)[0] # Remove comments (if any) - if func is not None: - s = line.upper().split(" ") - x, y, z, f, e = None, None, None, None, None - for item in s[1:]: - if len(item) <= 1: - continue - if item.startswith(";"): - continue - if item[0] == "X": - x = float(item[1:]) - if item[0] == "Y": - y = float(item[1:]) - if item[0] == "Z": - z = float(item[1:]) - if item[0] == "F": - f = float(item[1:]) / 60 - if item[0] == "E": - e = float(item[1:]) - if self._is_absolute_positioning and ((x is not None and x < 0) or (y is not None and y < 0)): - self._center_is_zero = True - params = self._position(x, y, z, f, e) - return func(position, params, path) - return position - - def _processTCode(self, T, line, position, path): - self._extruder_number = T - if self._extruder_number + 1 > len(position.e): - self._extrusion_length_offset.extend([0] * (self._extruder_number - len(position.e) + 1)) - position.e.extend([0] * (self._extruder_number - len(position.e) + 1)) - return position - - def _processMCode(self, M): - if M == 82: - # Set absolute extrusion mode - self._is_absolute_extrusion = True - elif M == 83: - # Set relative extrusion mode - self._is_absolute_extrusion = False - - _type_keyword = ";TYPE:" - _layer_keyword = ";LAYER:" - - ## For showing correct x, y offsets for each extruder - def _extruderOffsets(self): - result = {} - for extruder in ExtruderManager.getInstance().getExtruderStacks(): - result[int(extruder.getMetaData().get("position", "0"))] = [ - extruder.getProperty("machine_nozzle_offset_x", "value"), - extruder.getProperty("machine_nozzle_offset_y", "value")] - return result + # If no flavor is found in the GCode, then we use the by-default + self._flavor_reader = self._flavor_readers_dict["Griffin"] + return FileReader.PreReadResult.accepted def read(self, file_name): - Logger.log("d", "Preparing to load %s" % file_name) - self._cancelled = False - # We obtain the filament diameter from the selected printer to calculate line widths - self._filament_diameter = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") - - scene_node = SceneNode() - # Override getBoundingBox function of the sceneNode, as this node should return a bounding box, but there is no - # real data to calculate it from. - scene_node.getBoundingBox = self._getNullBoundingBox - - gcode_list = [] - self._is_layers_in_file = False - - Logger.log("d", "Opening file %s" % file_name) - - self._extruder_offsets = self._extruderOffsets() # dict with index the extruder number. can be empty - - last_z = 0 - with open(file_name, "r") as file: - file_lines = 0 - current_line = 0 - for line in file: - file_lines += 1 - gcode_list.append(line) - if not self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: - self._is_layers_in_file = True - file.seek(0) - - file_step = max(math.floor(file_lines / 100), 1) - - self._clearValues() - - self._message = Message(catalog.i18nc("@info:status", "Parsing G-code"), - lifetime=0, - title = catalog.i18nc("@info:title", "G-code Details")) - - self._message.setProgress(0) - self._message.show() - - Logger.log("d", "Parsing %s..." % file_name) - - current_position = self._position(0, 0, 0, 0, [0]) - current_path = [] - min_layer_number = 0 - negative_layers = 0 - previous_layer = 0 - - for line in file: - if self._cancelled: - Logger.log("d", "Parsing %s cancelled" % file_name) - return None - current_line += 1 - last_z = current_position.z - - if current_line % file_step == 0: - self._message.setProgress(math.floor(current_line / file_lines * 100)) - Job.yieldThread() - if len(line) == 0: - continue - - if line.find(self._type_keyword) == 0: - type = line[len(self._type_keyword):].strip() - if type == "WALL-INNER": - self._layer_type = LayerPolygon.InsetXType - elif type == "WALL-OUTER": - self._layer_type = LayerPolygon.Inset0Type - elif type == "SKIN": - self._layer_type = LayerPolygon.SkinType - elif type == "SKIRT": - self._layer_type = LayerPolygon.SkirtType - elif type == "SUPPORT": - self._layer_type = LayerPolygon.SupportType - elif type == "FILL": - self._layer_type = LayerPolygon.InfillType - else: - Logger.log("w", "Encountered a unknown type (%s) while parsing g-code.", type) - - # When the layer change is reached, the polygon is computed so we have just one layer per layer per extruder - if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: - try: - layer_number = int(line[len(self._layer_keyword):]) - self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) - current_path.clear() - - # When using a raft, the raft layers are stored as layers < 0, it mimics the same behavior - # as in ProcessSlicedLayersJob - if layer_number < min_layer_number: - min_layer_number = layer_number - if layer_number < 0: - layer_number += abs(min_layer_number) - negative_layers += 1 - else: - layer_number += negative_layers - - # In case there is a gap in the layer count, empty layers are created - for empty_layer in range(previous_layer + 1, layer_number): - self._createEmptyLayer(empty_layer) - - self._layer_number = layer_number - previous_layer = layer_number - except: - pass - - # This line is a comment. Ignore it (except for the layer_keyword) - if line.startswith(";"): - continue - - G = self._getInt(line, "G") - if G is not None: - # When find a movement, the new posistion is calculated and added to the current_path, but - # don't need to create a polygon until the end of the layer - current_position = self._processGCode(G, line, current_position, current_path) - continue - - # When changing the extruder, the polygon with the stored paths is computed - if line.startswith("T"): - T = self._getInt(line, "T") - if T is not None: - self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) - current_path.clear() - - current_position = self._processTCode(T, line, current_position, current_path) - - if line.startswith("M"): - M = self._getInt(line, "M") - self._processMCode(M) - - # "Flush" leftovers. Last layer paths are still stored - if len(current_path) > 1: - if self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])): - self._layer_number += 1 - current_path.clear() - - material_color_map = numpy.zeros((10, 4), dtype = numpy.float32) - material_color_map[0, :] = [0.0, 0.7, 0.9, 1.0] - material_color_map[1, :] = [0.7, 0.9, 0.0, 1.0] - layer_mesh = self._layer_data_builder.build(material_color_map) - decorator = LayerDataDecorator.LayerDataDecorator() - decorator.setLayerData(layer_mesh) - scene_node.addDecorator(decorator) - - gcode_list_decorator = GCodeListDecorator() - gcode_list_decorator.setGCodeList(gcode_list) - scene_node.addDecorator(gcode_list_decorator) - - Application.getInstance().getController().getScene().gcode_list = gcode_list - - Logger.log("d", "Finished parsing %s" % file_name) - self._message.hide() - - if self._layer_number == 0: - Logger.log("w", "File %s doesn't contain any valid layers" % file_name) - - settings = Application.getInstance().getGlobalContainerStack() - machine_width = settings.getProperty("machine_width", "value") - machine_depth = settings.getProperty("machine_depth", "value") - - if not self._center_is_zero: - scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) - - Logger.log("d", "Loaded %s" % file_name) - - if Preferences.getInstance().getValue("gcodereader/show_caution"): - caution_message = Message(catalog.i18nc( - "@info:generic", - "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."), - lifetime=0, - title = catalog.i18nc("@info:title", "G-code Details")) - caution_message.show() - - # The "save/print" button's state is bound to the backend state. - backend = Application.getInstance().getBackend() - backend.backendStateChange.emit(Backend.BackendState.Disabled) - - return scene_node + return self._flavor_reader.processGCodeFile(file_name) diff --git a/plugins/GCodeReader/GriffinFlavor.py b/plugins/GCodeReader/GriffinFlavor.py new file mode 100644 index 0000000000..ba9853d5ce --- /dev/null +++ b/plugins/GCodeReader/GriffinFlavor.py @@ -0,0 +1,9 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import GCodeFlavor + +class GriffinFlavor(GCodeFlavor.GCodeFlavor): + + def __init__(self): + super().__init__() \ No newline at end of file diff --git a/plugins/GCodeReader/RepRapFlavor.py b/plugins/GCodeReader/RepRapFlavor.py new file mode 100644 index 0000000000..f96a2d7857 --- /dev/null +++ b/plugins/GCodeReader/RepRapFlavor.py @@ -0,0 +1,31 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import GCodeFlavor + +class RepRapFlavor(GCodeFlavor.GCodeFlavor): + + def __init__(self): + super().__init__() + + def processMCode(self, M, line, position, path): + if M == 82: + # Set absolute extrusion mode + self._is_absolute_extrusion = True + elif M == 83: + # Set relative extrusion mode + self._is_absolute_extrusion = False + + ## Set the absolute positioning + # RepRapFlavor code G90 sets position of X, Y, Z, and E to absolute + def _gCode90(self, position, params, path): + self._is_absolute_positioning = True + self._is_absolute_extrusion = True + return position + + ## Set the relative positioning + # RepRapFlavor code G91 sets position of X, Y, Z to relative + # For relative E, M83 is used + def _gCode91(self, position, params, path): + self._is_absolute_positioning = False + return position \ No newline at end of file From b74ebc57b47755a9517ed71236da153554e9349d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 17:00:57 +0100 Subject: [PATCH 382/764] Fix per extruder setting value depending on extruder count - CURA-4627 --- resources/qml/Settings/SettingView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index d1c8ae2c51..1ebb5cc40e 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -337,7 +337,7 @@ Item // machine gets changed. var activeMachineId = Cura.MachineManager.activeMachineId; - if(!model.settable_per_extruder || machineExtruderCount.properties.value == 1) + if(!model.settable_per_extruder) { //Not settable per extruder or there only is global, so we must pick global. return activeMachineId; From 0e2f60f18b53dde5ed30179cf6922132c43e45ac Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 17:35:57 +0100 Subject: [PATCH 383/764] Fix toggling UM2 upgrades on extruder 0 - CURA-4626 --- plugins/UltimakerMachineActions/UM2UpgradeSelection.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py index db277bc485..1bf0b98217 100644 --- a/plugins/UltimakerMachineActions/UM2UpgradeSelection.py +++ b/plugins/UltimakerMachineActions/UM2UpgradeSelection.py @@ -38,7 +38,6 @@ class UM2UpgradeSelection(MachineAction): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: variant_container = global_container_stack.extruders["0"].variant - variant_index = global_container_stack.getContainerIndex(variant_container) if has_variants: if "has_variants" in global_container_stack.getMetaData(): @@ -60,6 +59,6 @@ class UM2UpgradeSelection(MachineAction): global_container_stack.removeMetaDataEntry("has_variants") # Set the variant container to an empty variant - global_container_stack.variant = ContainerRegistry.getInstance().getEmptyInstanceContainer() + global_container_stack.extruders["0"].variant = ContainerRegistry.getInstance().getEmptyInstanceContainer() Application.getInstance().globalContainerStackChanged.emit() From ab64cb574927ca92e1e6a624c965ebc979ba4898 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Mon, 27 Nov 2017 23:10:58 +0100 Subject: [PATCH 384/764] Add print head shape Fixes #2808. --- resources/definitions/creality_cr10.def.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/definitions/creality_cr10.def.json b/resources/definitions/creality_cr10.def.json index bacae6e2e5..f913f27b6b 100644 --- a/resources/definitions/creality_cr10.def.json +++ b/resources/definitions/creality_cr10.def.json @@ -20,6 +20,14 @@ "machine_depth": { "default_value": 300 }, + "machine_head_polygon": { + "default_value": [ + [-30, 34], + [-30, -32], + [30, -32], + [30, 34] + ] + }, "material_diameter": { "default_value": 1.75 }, From 0c4db90b7bc3460a21a9edbe505e639af5313824 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Tue, 28 Nov 2017 00:20:43 +0100 Subject: [PATCH 385/764] Add button to disable sending info directly Convenient and easy. --- plugins/SliceInfoPlugin/SliceInfo.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 79963a4740..4399b0a450 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -40,16 +40,21 @@ class SliceInfo(Extension): Preferences.getInstance().addPreference("info/asked_send_slice_info", False) if not Preferences.getInstance().getValue("info/asked_send_slice_info"): - self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymised slicing statistics. You can disable this in the preferences."), + self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymized usage statistics."), lifetime = 0, dismissable = False, title = catalog.i18nc("@info:title", "Collecting Data")) - self.send_slice_info_message.addAction("Dismiss", catalog.i18nc("@action:button", "Dismiss"), None, "") + self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None, + description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) + self.send_slice_info_message.addAction("Disable", name = catalog.i18nc("@action:button", "Disable"), icon = None, + description = catalog.i18nc("@action:tooltip", "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences.")) self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() def messageActionTriggered(self, message_id, action_id): + if action_id == "Disable": + Preferences.getInstance().setValue("info/send_slice_info", False) self.send_slice_info_message.hide() Preferences.getInstance().setValue("info/asked_send_slice_info", True) From 0e95063f8f535f51463d94ea13ae827b52581892 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Tue, 28 Nov 2017 00:45:01 +0100 Subject: [PATCH 386/764] desktop.in: Ultimaker Cura everywhere! --- cura.desktop.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura.desktop.in b/cura.desktop.in index 778e1d5033..a91032dd6f 100644 --- a/cura.desktop.in +++ b/cura.desktop.in @@ -1,6 +1,6 @@ [Desktop Entry] -Name=Cura -Name[de]=Cura +Name=Ultimaker Cura +Name[de]=Ultimaker Cura GenericName=3D Printing Software GenericName[de]=3D-Druck-Software Comment=Cura converts 3D models into paths for a 3D printer. It prepares your print for maximum accuracy, minimum printing time and good reliability with many extra features that make your print come out great. From 6caa434dc2a30d459b18a2fe07141dafd47917f2 Mon Sep 17 00:00:00 2001 From: Buco Date: Tue, 28 Nov 2017 09:07:34 +0100 Subject: [PATCH 387/764] Add Quality Profiles Added extra Quality profiles for BVOH, PET, Innoflex60 and PVA --- .../bp_BVOH_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_BVOH_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_BVOH_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_Innoflex60_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_Innoflex60_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_Innoflex60_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_PET_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_PET_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_PET_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_PLA_Coarse_Quality.inst.cfg | 3 +-- .../bp_PLA_High_Quality.inst.cfg | 3 +-- .../bp_PLA_Normal_Quality.inst.cfg | 3 +-- .../bp_PVA_Coarse_Quality.inst.cfg | 24 ++++++++++++++++++ .../bp_PVA_High_Quality.inst.cfg | 25 +++++++++++++++++++ .../bp_PVA_Normal_Quality.inst.cfg | 23 +++++++++++++++++ .../bp_global_Coarse_Quality.inst.cfg | 14 +++++++++++ .../bp_global_High_Quality.inst.cfg | 14 +++++++++++ .../bp_global_Normal_Quality.inst.cfg | 14 +++++++++++ 18 files changed, 333 insertions(+), 6 deletions(-) create mode 100644 resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_High_Quality.inst.cfg create mode 100644 resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg diff --git a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..80bc8adaa6 --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = verbatim_bvoh_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 + diff --git a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg new file mode 100644 index 0000000000..54ff19f0c6 --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = verbatim_bvoh_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..8d026391db --- /dev/null +++ b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = verbatim_bvoh_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..32a3695148 --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = innofill_innoflex60_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 30 + diff --git a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg new file mode 100644 index 0000000000..43d547436b --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = innofill_innoflex60_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 30 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..658e868a5f --- /dev/null +++ b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = innofill_innoflex60_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 30 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..fb56005655 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_petg_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 60 + diff --git a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg new file mode 100644 index 0000000000..f6e735deb0 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..13b1e90be6 --- /dev/null +++ b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 50 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg index 3454f8b3ad..88b1a899e9 100644 --- a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg @@ -7,9 +7,8 @@ definition = builder_premium_small type = quality quality_type = coarse material = generic_pla_175 -setting_version = 4 +setting_version = 3 weight = -1 -global_quality = True [values] material_print_temperature = =default_material_print_temperature + 15 diff --git a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg index b5ac4cb6a1..a61b4ee958 100644 --- a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg @@ -7,9 +7,8 @@ definition = builder_premium_small type = quality quality_type = high material = generic_pla_175 -setting_version = 4 +setting_version = 3 weight = 1 -global_quality = True [values] acceleration_print = 2000 diff --git a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg index c5a93e65c1..6b0648b4e4 100644 --- a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg @@ -7,9 +7,8 @@ definition = builder_premium_small type = quality quality_type = normal material = generic_pla_175 -setting_version = 4 +setting_version = 3 weight = 0 -global_quality = True [values] material_print_temperature = =default_material_print_temperature + 15 diff --git a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..fe0c1046b8 --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +material = generic_pva_175 +setting_version = 3 +weight = -1 + +[values] +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.3 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 + diff --git a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg new file mode 100644 index 0000000000..13c6c7ef89 --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +material = generic_pva_175 +setting_version = 3 +weight = 1 + +[values] +acceleration_print = 2000 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.1 +top_thickness = =layer_height * 7 +bottom_thickness = =layer_height * 5 +speed_print = 40 +layer_height_0 = 0.2 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5b16476b4b --- /dev/null +++ b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +material = generic_pva_175 +setting_version = 3 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = =material_print_temperature +material_initial_print_temperature= =material_print_temperature +material_final_print_temperature= =material_print_temperature +material_bed_temperature = 45 +material_bed_temperature_layer_0= =material_bed_temperature +layer_height = 0.2 +top_thickness = =layer_height * 5 +bottom_thickness = =layer_height * 3 +speed_print = 40 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..0edca57629 --- /dev/null +++ b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Coarse +definition = builder_premium_small + +[metadata] +type = quality +quality_type = coarse +setting_version = 3 +weight = -1 +global_quality = True + +[values] +layer_height = 0.3 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..193202cd6f --- /dev/null +++ b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = High Quality +definition = builder_premium_small + +[metadata] +type = quality +quality_type = high +setting_version = 3 +weight = 1 +global_quality = True + +[values] +layer_height = 0.1 \ No newline at end of file diff --git a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..60aa0a150c --- /dev/null +++ b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 2 +name = Normal +definition = builder_premium_small + +[metadata] +type = quality +quality_type = normal +setting_version = 3 +weight = 0 +global_quality = True + +[values] +layer_height = 0.2 \ No newline at end of file From af0b949a6f27874ae4b807263fab38fa48cb7dc2 Mon Sep 17 00:00:00 2001 From: Buco Date: Tue, 28 Nov 2017 09:28:25 +0100 Subject: [PATCH 388/764] Changed Setting version Setting version to 4 --- .../quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg | 2 +- resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg | 2 +- .../builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg | 2 +- .../builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg | 2 +- resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PET_Normal_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg | 2 +- resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg | 2 +- resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_global_Coarse_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_global_High_Quality.inst.cfg | 2 +- .../quality/builder_premium/bp_global_Normal_Quality.inst.cfg | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg index 80bc8adaa6..92f899bdeb 100644 --- a/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_BVOH_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = verbatim_bvoh_175 -setting_version = 3 +setting_version = 4 weight = -1 [values] diff --git a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg index 54ff19f0c6..cd8947aa80 100644 --- a/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_BVOH_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = verbatim_bvoh_175 -setting_version = 3 +setting_version = 4 weight = 1 [values] diff --git a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg index 8d026391db..d59f768470 100644 --- a/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_BVOH_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = verbatim_bvoh_175 -setting_version = 3 +setting_version = 4 weight = 0 [values] diff --git a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg index 32a3695148..41d882ee1d 100644 --- a/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_Innoflex60_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = innofill_innoflex60_175 -setting_version = 3 +setting_version = 4 weight = -1 [values] diff --git a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg index 43d547436b..147e1f4db8 100644 --- a/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_Innoflex60_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = innofill_innoflex60_175 -setting_version = 3 +setting_version = 4 weight = 1 [values] diff --git a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg index 658e868a5f..fb43c8de19 100644 --- a/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_Innoflex60_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = innofill_innoflex60_175 -setting_version = 3 +setting_version = 4 weight = 0 [values] diff --git a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg index fb56005655..f887600585 100644 --- a/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PET_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = generic_petg_175 -setting_version = 3 +setting_version = 4 weight = -1 [values] diff --git a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg index f6e735deb0..4258f2f708 100644 --- a/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PET_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = generic_petg_175 -setting_version = 3 +setting_version = 4 weight = 1 [values] diff --git a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg index 13b1e90be6..b732073795 100644 --- a/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PET_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = generic_petg_175 -setting_version = 3 +setting_version = 4 weight = 0 [values] diff --git a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg index 88b1a899e9..4f0c26dd7d 100644 --- a/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = -1 [values] diff --git a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg index a61b4ee958..4a9bcb90bf 100644 --- a/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = 1 [values] diff --git a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg index 6b0648b4e4..6af5601fd6 100644 --- a/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PLA_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = generic_pla_175 -setting_version = 3 +setting_version = 4 weight = 0 [values] diff --git a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg index fe0c1046b8..12a4c9d883 100644 --- a/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PVA_Coarse_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = coarse material = generic_pva_175 -setting_version = 3 +setting_version = 4 weight = -1 [values] diff --git a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg index 13c6c7ef89..d32017c5f2 100644 --- a/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PVA_High_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = high material = generic_pva_175 -setting_version = 3 +setting_version = 4 weight = 1 [values] diff --git a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg index 5b16476b4b..2acc354822 100644 --- a/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_PVA_Normal_Quality.inst.cfg @@ -7,7 +7,7 @@ definition = builder_premium_small type = quality quality_type = normal material = generic_pva_175 -setting_version = 3 +setting_version = 4 weight = 0 [values] diff --git a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg index 0edca57629..4b66293d04 100644 --- a/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_global_Coarse_Quality.inst.cfg @@ -6,7 +6,7 @@ definition = builder_premium_small [metadata] type = quality quality_type = coarse -setting_version = 3 +setting_version = 4 weight = -1 global_quality = True diff --git a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg index 193202cd6f..4a97dda084 100644 --- a/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_global_High_Quality.inst.cfg @@ -6,7 +6,7 @@ definition = builder_premium_small [metadata] type = quality quality_type = high -setting_version = 3 +setting_version = 4 weight = 1 global_quality = True diff --git a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg index 60aa0a150c..15ea66879f 100644 --- a/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg +++ b/resources/quality/builder_premium/bp_global_Normal_Quality.inst.cfg @@ -6,7 +6,7 @@ definition = builder_premium_small [metadata] type = quality quality_type = normal -setting_version = 3 +setting_version = 4 weight = 0 global_quality = True From 49537b64f729d05a1e4d37a2700872c724ec4072 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 28 Nov 2017 09:39:57 +0100 Subject: [PATCH 389/764] CURA-4482 Fix error in SolidView when the support angle stack doesn't exist. This error was sent twice through the CrashHandler and it is in Metabase. --- plugins/SolidView/SolidView.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index bc1b08cc5e..90f402b78f 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -49,9 +49,9 @@ class SolidView(View): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") - support_angle_stack = ExtruderManager.getInstance().getExtruderStack(support_extruder_nr) + support_angle_stack = Application.getInstance().getExtruderManager().getExtruderStack(support_extruder_nr) - if Preferences.getInstance().getValue("view/show_overhang"): + if support_angle_stack is not None and Preferences.getInstance().getValue("view/show_overhang"): angle = support_angle_stack.getProperty("support_angle", "value") # Make sure the overhang angle is valid before passing it to the shader # Note: if the overhang angle is set to its default value, it does not need to get validated (validationState = None) From 9db8bff924623c41f34bb874a5707f3518b2f8a5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 27 Nov 2017 17:18:38 +0100 Subject: [PATCH 390/764] Merge pull request #2838 from fieldOfView/fix_crashhandler_crash Fix error when CrashHandler is opened before opengl is initialised --- cura/CrashHandler.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index c6f94f0a80..85ff5d197d 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -126,13 +126,18 @@ class CrashHandler: return group def _getOpenGLInfo(self): + opengl_instance = OpenGL.getInstance() + if not opengl_instance: + self.data["opengl"] = {"version": "n/a", "vendor": "n/a", "type": "n/a"} + return catalog.i18nc("@label", "not yet initialised
    ") + info = "
      " - info += catalog.i18nc("@label OpenGL version", "
    • OpenGL Version: {version}
    • ").format(version = OpenGL.getInstance().getOpenGLVersion()) - info += catalog.i18nc("@label OpenGL vendor", "
    • OpenGL Vendor: {vendor}
    • ").format(vendor = OpenGL.getInstance().getGPUVendorName()) - info += catalog.i18nc("@label OpenGL renderer", "
    • OpenGL Renderer: {renderer}
    • ").format(renderer = OpenGL.getInstance().getGPUType()) + info += catalog.i18nc("@label OpenGL version", "
    • OpenGL Version: {version}
    • ").format(version = opengl_instance.getOpenGLVersion()) + info += catalog.i18nc("@label OpenGL vendor", "
    • OpenGL Vendor: {vendor}
    • ").format(vendor = opengl_instance.getGPUVendorName()) + info += catalog.i18nc("@label OpenGL renderer", "
    • OpenGL Renderer: {renderer}
    • ").format(renderer = opengl_instance.getGPUType()) info += "
    " - self.data["opengl"] = {"version": OpenGL.getInstance().getOpenGLVersion(), "vendor": OpenGL.getInstance().getGPUVendorName(), "type": OpenGL.getInstance().getGPUType()} + self.data["opengl"] = {"version": opengl_instance.getOpenGLVersion(), "vendor": opengl_instance.getGPUVendorName(), "type": opengl_instance.getGPUType()} return info From 6db06ea7134d51888517a2dc00eba371ade2b9e9 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 28 Nov 2017 11:15:48 +0100 Subject: [PATCH 391/764] Fix project loading for single-extrusion machines CURA-4617 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 30 ++++++++------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index acd4242fff..9f03c9ae3d 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -827,6 +827,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): preferred_quality_id = global_stack.getMetaDataEntry("preferred_quality", None) if preferred_quality_id is not None: definition_id = global_stack.definition.getId() + definition_id = global_stack.definition.getMetaDataEntry("quality_definition", definition_id) if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): definition_id = "fdmprinter" @@ -859,25 +860,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # be correct. For example, for UM2, the quality container can be "draft" while it should be "um2_draft" # instead. # In this code branch, we try to fix those incorrect quality containers. - search_criteria = {"type": "quality", - "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} - search_criteria["definition"] = global_stack.definition.getId() - if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): - search_criteria["definition"] = "fdmprinter" + # + # ***IMPORTANT***: We only do this fix for single-extrusion machines. + # We will first find the correct quality profile for the extruder, then apply the same + # quality profile for the global stack. + # + if len(extruder_stacks) == 1: + extruder_stack = extruder_stacks[0] - containers = self._container_registry.findInstanceContainers(**search_criteria) - containers = [c for c in containers if not c.getMetaDataEntry("material", "")] - if not containers: - # cannot find machine-specific qualities, so just use fdmprinter to search again - search_criteria["definition"] = "fdmprinter" - containers = self._container_registry.findInstanceContainers(**search_criteria) - containers = [c for c in containers if not c.getMetaDataEntry("material", "")] - - if containers: - new_quality_container = containers[0] - global_stack.quality = new_quality_container - - for extruder_stack in extruder_stacks: search_criteria = {"type": "quality", "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} search_criteria["definition"] = global_stack.definition.getId() @@ -888,7 +878,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): search_criteria["material"] = extruder_stack.material.getId() containers = self._container_registry.findInstanceContainers(**search_criteria) if containers: - extruder_stack.quality = containers[0] + new_quality_container = containers[0] + extruder_stack.quality = new_quality_container + global_stack.quality = new_quality_container # Replacing the old containers if resolve is "new". # When resolve is "new", some containers will get renamed, so all the other containers that reference to those From cf187215dd8f1aa5bc184e0936d31da872162c9d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 11:44:20 +0100 Subject: [PATCH 392/764] Add experimental settings for adaptive layer heights - CURA-4524 --- resources/definitions/fdmprinter.def.json | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6861189f85..36ad8499db 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5983,6 +5983,49 @@ "settable_per_mesh": false, "settable_per_extruder": false, "settable_per_meshgroup": false + }, + "adaptive_layer_height_enabled": + { + "label": "Use adaptive layers", + "description": "Adaptive layers computes the layer heights depending on the shape of the model.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "adaptive_layer_height_variation": + { + "label": "Adaptive layers maximum variation", + "description": "The maximum allowed height different from the base layer height in mm.", + "type": "float", + "enabled": "adaptive_layer_height_enabled", + "default_value": 0.1, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "adaptive_layer_height_variation_step": + { + "label": "Adaptive layers variation step size", + "description": "The difference in height of the next layer height compared to the previous one.", + "type": "float", + "enabled": "adaptive_layer_height_enabled", + "default_value": 0.01, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "adaptive_layer_height_threshold": + { + "label": "Adaptive layers threshold", + "description": "Threshold whether to use a smaller layer or not. This number is compared to the tan of the steepest slope in a layer.", + "type": "float", + "enabled": "adaptive_layer_height_enabled", + "default_value": 200.0, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false } } }, From 8054bc3d7d8c007778068bc3bb4f5055df4dcd78 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 28 Nov 2017 11:47:34 +0100 Subject: [PATCH 393/764] CURA-4552 Change names as indicated in the review and making Marlin the default flavor. Also fix the case in which the read flavor was not in the dict. --- .../{GCodeFlavor.py => FlavorParser.py} | 5 ++--- plugins/GCodeReader/GCodeReader.py | 17 +++++++++++------ plugins/GCodeReader/GriffinFlavor.py | 9 --------- plugins/GCodeReader/MarlinFlavorParser.py | 10 ++++++++++ .../{RepRapFlavor.py => RepRapFlavorParser.py} | 5 +++-- 5 files changed, 26 insertions(+), 20 deletions(-) rename plugins/GCodeReader/{GCodeFlavor.py => FlavorParser.py} (99%) delete mode 100644 plugins/GCodeReader/GriffinFlavor.py create mode 100644 plugins/GCodeReader/MarlinFlavorParser.py rename plugins/GCodeReader/{RepRapFlavor.py => RepRapFlavorParser.py} (84%) diff --git a/plugins/GCodeReader/GCodeFlavor.py b/plugins/GCodeReader/FlavorParser.py similarity index 99% rename from plugins/GCodeReader/GCodeFlavor.py rename to plugins/GCodeReader/FlavorParser.py index 1d1ca4de8b..cd317027ee 100644 --- a/plugins/GCodeReader/GCodeFlavor.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -25,9 +25,8 @@ import math import re from collections import namedtuple - -# Class for loading and parsing G-code files -class GCodeFlavor: +# This parser is intented for interpret the common firmware codes among all the different flavors +class FlavorParser: def __init__(self): Application.getInstance().hideMessageSignal.connect(self._onHideMessage) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 938be59151..cb2f5d99e0 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -7,14 +7,15 @@ from UM.i18n import i18nCatalog from UM.Preferences import Preferences catalog = i18nCatalog("cura") -from . import GriffinFlavor, RepRapFlavor +from . import MarlinFlavorParser, RepRapFlavorParser # Class for loading and parsing G-code files class GCodeReader(MeshReader): + _flavor_default = "Marlin" _flavor_keyword = ";FLAVOR:" - _flavor_readers_dict = {"Griffin" : GriffinFlavor.GriffinFlavor(), - "RepRap" : RepRapFlavor.RepRapFlavor()} + _flavor_readers_dict = {"RepRap" : RepRapFlavorParser.RepRapFlavorParser(), + "Marlin" : MarlinFlavorParser.MarlinFlavorParser()} def __init__(self): super(GCodeReader, self).__init__() @@ -28,11 +29,15 @@ class GCodeReader(MeshReader): with open(file_name, "r") as file: for line in file: if line[:len(self._flavor_keyword)] == self._flavor_keyword: - self._flavor_reader = self._flavor_readers_dict[line[len(self._flavor_keyword):].rstrip()] - return FileReader.PreReadResult.accepted + try: + self._flavor_reader = self._flavor_readers_dict[line[len(self._flavor_keyword):].rstrip()] + return FileReader.PreReadResult.accepted + except: + # If there is no entry in the dictionary for this flavor, just skip and select the by-default flavor + break # If no flavor is found in the GCode, then we use the by-default - self._flavor_reader = self._flavor_readers_dict["Griffin"] + self._flavor_reader = self._flavor_readers_dict[self._flavor_default] return FileReader.PreReadResult.accepted def read(self, file_name): diff --git a/plugins/GCodeReader/GriffinFlavor.py b/plugins/GCodeReader/GriffinFlavor.py deleted file mode 100644 index ba9853d5ce..0000000000 --- a/plugins/GCodeReader/GriffinFlavor.py +++ /dev/null @@ -1,9 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from . import GCodeFlavor - -class GriffinFlavor(GCodeFlavor.GCodeFlavor): - - def __init__(self): - super().__init__() \ No newline at end of file diff --git a/plugins/GCodeReader/MarlinFlavorParser.py b/plugins/GCodeReader/MarlinFlavorParser.py new file mode 100644 index 0000000000..482285a2c9 --- /dev/null +++ b/plugins/GCodeReader/MarlinFlavorParser.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import FlavorParser + +# This parser is intented for interpret the Marlin/Sprinter Firmware flavor +class MarlinFlavorParser(FlavorParser.FlavorParser): + + def __init__(self): + super().__init__() \ No newline at end of file diff --git a/plugins/GCodeReader/RepRapFlavor.py b/plugins/GCodeReader/RepRapFlavorParser.py similarity index 84% rename from plugins/GCodeReader/RepRapFlavor.py rename to plugins/GCodeReader/RepRapFlavorParser.py index f96a2d7857..42853913d6 100644 --- a/plugins/GCodeReader/RepRapFlavor.py +++ b/plugins/GCodeReader/RepRapFlavorParser.py @@ -1,9 +1,10 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from . import GCodeFlavor +from . import FlavorParser -class RepRapFlavor(GCodeFlavor.GCodeFlavor): +# This parser is intented for interpret the RepRap Firmware flavor +class RepRapFlavorParser(FlavorParser.FlavorParser): def __init__(self): super().__init__() From 6e171be0b93e7132b191cd86e85757b3f5273988 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 28 Nov 2017 13:08:25 +0100 Subject: [PATCH 394/764] After changing the settings refresh simulation max path number CURA-4632 --- plugins/SimulationView/SimulationView.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index b7bff91f9b..44f472129f 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -154,6 +154,7 @@ class SimulationView(View): def _onSceneChanged(self, node): self.setActivity(False) self.calculateMaxLayers() + self.calculateMaxPathsOnLayer(self._current_layer_num) def isBusy(self): return self._busy From cfbb553182b6965c6f5ee53354f8ab1f37744b67 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:16:58 +0100 Subject: [PATCH 395/764] Use new QML element creator for output device view - CURA-4568 --- cura/PrinterOutputDevice.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 837ecc97c6..d3b298dfba 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -171,20 +171,9 @@ class PrinterOutputDevice(QObject, OutputDevice): if not self._control_view_qml_path: return - path = QUrl.fromLocalFile(self._control_view_qml_path) - - # Because of garbage collection we need to keep this referenced by python. - self._control_component = QQmlComponent(Application.getInstance()._engine, path) - - # Check if the context was already requested before (Printer output device might have multiple items in the future) - if self._qml_context is None: - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("OutputDevice", self) - - self._control_item = self._control_component.create(self._qml_context) - if self._control_item is None: - Logger.log("e", "QQmlComponent status %s", self._control_component.status()) - Logger.log("e", "QQmlComponent error string %s", self._control_component.errorString()) + self._control_component = Application.getInstance().createQmlComponent(self._control_view_qml_path, { + "OutputDevice": self + }) def _createMonitorViewFromQML(self): if not self._monitor_view_qml_path: From 74eb4958af86146f53fa56f1dbdb5e102f79b9ea Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:21:47 +0100 Subject: [PATCH 396/764] Fixes for printer output device views - CURA-4568 --- cura/PrinterOutputDevice.py | 32 ++++--------------- .../NetworkClusterPrinterOutputDevice.py | 2 +- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index d3b298dfba..6c7ba83e0a 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -3,19 +3,15 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl -from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import pyqtProperty, pyqtSlot, QObject, QTimer, pyqtSignal from PyQt5.QtWidgets import QMessageBox from enum import IntEnum # For the connection state tracking. from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Logger import Logger from UM.Signal import signalemitter -from UM.PluginRegistry import PluginRegistry from UM.Application import Application -import os - i18n_catalog = i18nCatalog("cura") ## Printer output device adds extra interface options on top of output device. @@ -63,11 +59,9 @@ class PrinterOutputDevice(QObject, OutputDevice): self._camera_active = False self._monitor_view_qml_path = "" - self._monitor_component = None self._monitor_item = None self._control_view_qml_path = "" - self._control_component = None self._control_item = None self._qml_context = None @@ -155,43 +149,31 @@ class PrinterOutputDevice(QObject, OutputDevice): # Note that we specifically only check if the monitor component is created. # It could be that it failed to actually create the qml item! If we check if the item was created, it will try to # create the item (and fail) every time. - if not self._monitor_component: + if not self._monitor_item: self._createMonitorViewFromQML() - return self._monitor_item @pyqtProperty(QObject, constant=True) def controlItem(self): - if not self._control_component: + if not self._control_item: self._createControlViewFromQML() - return self._control_item def _createControlViewFromQML(self): if not self._control_view_qml_path: return - self._control_component = Application.getInstance().createQmlComponent(self._control_view_qml_path, { + self._control_item = Application.getInstance().createQmlComponent(self._control_view_qml_path, { "OutputDevice": self }) def _createMonitorViewFromQML(self): if not self._monitor_view_qml_path: return - path = QUrl.fromLocalFile(self._monitor_view_qml_path) - # Because of garbage collection we need to keep this referenced by python. - self._monitor_component = QQmlComponent(Application.getInstance()._engine, path) - - # Check if the context was already requested before (Printer output device might have multiple items in the future) - if self._qml_context is None: - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("OutputDevice", self) - - self._monitor_item = self._monitor_component.create(self._qml_context) - if self._monitor_item is None: - Logger.log("e", "QQmlComponent status %s", self._monitor_component.status()) - Logger.log("e", "QQmlComponent error string %s", self._monitor_component.errorString()) + self._monitor_item = Application.getInstance().createQmlComponent(self._monitor_view_qml_path, { + "OutputDevice": self + }) @pyqtProperty(str, notify=printerTypeChanged) def printerType(self): diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 09518575c9..a737212e64 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -131,7 +131,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte @pyqtProperty(QObject, notify=selectedPrinterChanged) def controlItem(self): # TODO: Probably not the nicest way to do this. This needs to be done better at some point in time. - if not self._control_component: + if not self._control_item: self._createControlViewFromQML() name = self._selected_printer.get("friendly_name") if name == self._automatic_printer.get("friendly_name") or name == "": From e3f1144d974c1c9507f655779ccde521b920a7b2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:25:09 +0100 Subject: [PATCH 397/764] Update creating QML component in plugin browser - CURA-4568 --- plugins/3MFReader/WorkspaceDialog.py | 4 +--- plugins/PluginBrowser/PluginBrowser.py | 12 +++++------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 95fef78081..5b474843d5 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -1,12 +1,10 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import QUrl, pyqtSignal, QObject, pyqtProperty, QCoreApplication +from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication from UM.FlameProfiler import pyqtSlot -from PyQt5.QtQml import QQmlComponent, QQmlContext from UM.PluginRegistry import PluginRegistry from UM.Application import Application -from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Settings.ContainerRegistry import ContainerRegistry diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 37ad128b49..338513d499 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -11,7 +11,6 @@ from UM.Message import Message from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply from PyQt5.QtCore import QUrl, QObject, Qt, pyqtProperty, pyqtSignal, pyqtSlot -from PyQt5.QtQml import QQmlComponent, QQmlContext import json import os @@ -112,16 +111,15 @@ class PluginBrowser(QObject, Extension): def _createDialog(self, qml_name): Logger.log("d", "Creating dialog [%s]", qml_name) - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), qml_name)) - self._qml_component = QQmlComponent(Application.getInstance()._engine, path) + path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), qml_name) + dialog = Application.getInstance().createQmlComponent(path, { + "manager": self + }) - # We need access to engine (although technically we can't) - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("manager", self) - dialog = self._qml_component.create(self._qml_context) if dialog is None: Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) + return dialog def setIsDownloading(self, is_downloading): From eb3981b4e0734fbe5f5ae093e7db90cfdae9835d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 28 Nov 2017 14:26:14 +0100 Subject: [PATCH 398/764] Let _fetchInstanceContainers return containers split by loaded or not It must now return two dictionaries: One for the profiles that have been completely loaded and one for the profiles that are only metadata. We could probably improve on these a little bit, since all of these (except the material model) will now load all available quality profiles. I'll see if it is necessary to optimise that. Contributes to issue CURA-4243. --- cura/Settings/ProfilesModel.py | 4 ++-- cura/Settings/QualityAndUserProfilesModel.py | 14 ++++++++------ cura/Settings/UserProfilesModel.py | 14 +++++++------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 6ba38dcf48..65ac556e78 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -53,7 +53,7 @@ class ProfilesModel(InstanceContainersModel): def _fetchInstanceContainers(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: - return [] + return {}, {} global_stack_definition = global_container_stack.getBottom() # Get the list of extruders and place the selected extruder at the front of the list. @@ -83,7 +83,7 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - return result + return {item.getId():item for item in result}, {} ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 9d7d913d5e..06b9733249 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -18,7 +18,7 @@ class QualityAndUserProfilesModel(ProfilesModel): def _fetchInstanceContainers(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if not global_container_stack: - return [] + return {}, {} # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() @@ -50,19 +50,21 @@ class QualityAndUserProfilesModel(ProfilesModel): # The actual list of quality profiles come from the first extruder in the extruder list. quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + result = {quality.getId():quality for quality in quality_list} # Filter the quality_change by the list of available quality_types quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) if multiple_extrusion: # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and + filtered_quality_changes = {qc.getId():qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") is not None and (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} else: # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = {qc.getId():qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is None} + result.update(filtered_quality_changes) - return quality_list + filtered_quality_changes + return result, {} diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index aa815ef4aa..a5fc1bc7c2 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -18,7 +18,7 @@ class UserProfilesModel(ProfilesModel): def _fetchInstanceContainers(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if not global_container_stack: - return [] + return {}, {} # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() @@ -27,7 +27,7 @@ class UserProfilesModel(ProfilesModel): # Detecting if the machine has multiple extrusion multiple_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 - # Get the list of extruders and place the selected extruder at the front of the list. + # Get the list of extruders and place the selected extruder at the front of the list. extruder_manager = ExtruderManager.getInstance() active_extruder = extruder_manager.getActiveExtruderStack() extruder_stacks = extruder_manager.getActiveExtruderStacks() @@ -56,13 +56,13 @@ class UserProfilesModel(ProfilesModel): if multiple_extrusion: # If the printer has multiple extruders then quality changes related to the current extruder are kept - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and + filtered_quality_changes = {qc.getId():qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") is not None and (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or - qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())] + qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} else: # If not, the quality changes of the global stack are selected - filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and - qc.getMetaDataEntry("extruder") is None] + filtered_quality_changes = {qc.getId():qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and + qc.getMetaDataEntry("extruder") is None} - return filtered_quality_changes + return filtered_quality_changes, {} From dd43bcee776ca61acb93a777c35a7b13a12745da Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:27:05 +0100 Subject: [PATCH 399/764] Small cleanups for new component creation method - CURA-4568 --- plugins/UserAgreementPlugin/UserAgreement.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.py b/plugins/UserAgreementPlugin/UserAgreement.py index da225a63b4..915c1761fa 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.py +++ b/plugins/UserAgreementPlugin/UserAgreement.py @@ -9,13 +9,12 @@ from UM.Logger import Logger from cura.CuraApplication import CuraApplication -from PyQt5.QtQml import QQmlComponent, QQmlContext -from PyQt5.QtCore import QUrl, QObject, pyqtSlot +from PyQt5.QtCore import QObject, pyqtSlot import os.path class UserAgreement(QObject, Extension): - def __init__(self, parent = None): + def __init__(self): super(UserAgreement, self).__init__() self._user_agreement_window = None self._user_agreement_context = None @@ -33,8 +32,8 @@ class UserAgreement(QObject, Extension): self._user_agreement_window.show() @pyqtSlot(bool) - def didAgree(self, userChoice): - if userChoice: + def didAgree(self, user_choice): + if user_choice: Logger.log("i", "User agreed to the user agreement") Preferences.getInstance().setValue("general/accepted_user_agreement", True) self._user_agreement_window.hide() From 055e4792b0ecd81de911735043a05436850eef0b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:27:51 +0100 Subject: [PATCH 400/764] Cleanup for change log dialog - CURA-4568 --- plugins/ChangeLogPlugin/ChangeLog.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index 22218bfaeb..c31d1337ef 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -8,8 +8,7 @@ from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Version import Version -from PyQt5.QtQml import QQmlComponent, QQmlContext -from PyQt5.QtCore import QUrl, pyqtSlot, QObject +from PyQt5.QtCore import pyqtSlot, QObject import os.path import collections From 1d68bcc218feee7c7d6926fe3bd0344885990e61 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:31:21 +0100 Subject: [PATCH 401/764] Cleanup usb printer output device manager qml component creation - CURA-4568 --- plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 6167356c4b..62412bb521 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -16,13 +16,11 @@ from cura.CuraApplication import CuraApplication import threading import platform -import glob import time import os.path import serial.tools.list_ports from UM.Extension import Extension -from PyQt5.QtQml import QQmlComponent, QQmlContext from PyQt5.QtCore import QUrl, QObject, pyqtSlot, pyqtProperty, pyqtSignal, Qt from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -99,7 +97,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): @pyqtSlot(str) def updateAllFirmware(self, file_name): if file_name.startswith("file://"): - file_name = QUrl(file_name).toLocalFile() # File dialogs prepend the path with file://, which we don't need / want + file_name = QUrl(file_name).toLocalFile() # File dialogs prepend the path with file://, which we don't need / want + if not self._usb_output_devices: Message(i18n_catalog.i18nc("@info", "Unable to update firmware because there are no printers connected."), title = i18n_catalog.i18nc("@info:title", "Warning")).show() return From fa1d1ee3ad105390ab7a631228d3151c8f0252df Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 28 Nov 2017 14:35:42 +0100 Subject: [PATCH 402/764] Fix layer height slider auto switching CURA-4617 --- resources/qml/SidebarSimple.qml | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 020b75e3ce..e923963355 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -303,7 +303,7 @@ Item // only change if an active machine is set and the slider is visible at all. if (Cura.MachineManager.activeMachine != null && visible) { // prevent updating during view initializing. Trigger only if the value changed by user - if (qualitySlider.value != qualityModel.qualitySliderActiveIndex) { + if (qualitySlider.value != qualityModel.qualitySliderActiveIndex && qualityModel.qualitySliderActiveIndex != -1) { // start updating with short delay qualitySliderChangeTimer.start() } @@ -368,7 +368,7 @@ Item { id: customisedSettings - visible: Cura.SimpleModeSettingsManager.isProfileCustomized + visible: Cura.SimpleModeSettingsManager.isProfileCustomized || Cura.SimpleModeSettingsManager.isProfileUserCreated height: speedSlider.height * 0.8 width: speedSlider.height * 0.8 @@ -381,7 +381,18 @@ Item onClicked: { - discardOrKeepProfileChangesDialog.show() + // if the current profile is user-created, switch to a built-in quality + if (Cura.SimpleModeSettingsManager.isProfileUserCreated) + { + if (Cura.ProfilesModel.rowCount() > 0) + { + Cura.MachineManager.setActiveQuality(Cura.ProfilesModel.getItem(0).id) + } + } + if (Cura.SimpleModeSettingsManager.isProfileCustomized) + { + discardOrKeepProfileChangesDialog.show() + } } onEntered: { From 11f50f1cd3eeed06f8ece7ef1d2fa1d3ee099795 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:55:35 +0100 Subject: [PATCH 403/764] Update machine action and image reader dialogs with new component creation method - CURA-4568 --- cura/MachineAction.py | 4 +--- plugins/ImageReader/ImageReaderUI.py | 12 +++--------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/cura/MachineAction.py b/cura/MachineAction.py index 37f09b4efa..66467c53e7 100644 --- a/cura/MachineAction.py +++ b/cura/MachineAction.py @@ -1,12 +1,10 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal, QUrl -from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.PluginObject import PluginObject from UM.PluginRegistry import PluginRegistry -from UM.Logger import Logger from UM.Application import Application import os diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py index 40ea15f7a0..1f8a434129 100644 --- a/plugins/ImageReader/ImageReaderUI.py +++ b/plugins/ImageReader/ImageReaderUI.py @@ -4,8 +4,7 @@ import os import threading -from PyQt5.QtCore import Qt, QUrl, pyqtSignal, QObject -from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import Qt, pyqtSignal, QObject from UM.FlameProfiler import pyqtSlot from UM.Application import Application from UM.PluginRegistry import PluginRegistry @@ -81,14 +80,9 @@ class ImageReaderUI(QObject): def _createConfigUI(self): if self._ui_view is None: Logger.log("d", "Creating ImageReader config UI") - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("ImageReader"), "ConfigUI.qml")) - component = QQmlComponent(Application.getInstance()._engine, path) - self._ui_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._ui_context.setContextProperty("manager", self) - self._ui_view = component.create(self._ui_context) - + path = os.path.join(PluginRegistry.getInstance().getPluginPath("ImageReader"), "ConfigUI.qml") + self._ui_view = Application.getInstance().createQmlComponent(path, {"manager": self}) self._ui_view.setFlags(self._ui_view.flags() & ~Qt.WindowCloseButtonHint & ~Qt.WindowMinimizeButtonHint & ~Qt.WindowMaximizeButtonHint); - self._disable_size_callbacks = False @pyqtSlot() From b40ba0cfc7bdf1a3e185200865084c9276a03760 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:58:53 +0100 Subject: [PATCH 404/764] Update network cluster output device print view component creation - CURA-4568 --- .../NetworkClusterPrinterOutputDevice.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index a737212e64..738177e99d 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -235,17 +235,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte def spawnPrintView(self): if self._print_view is None: - path = QUrl.fromLocalFile(os.path.join(self._plugin_path, "PrintWindow.qml")) - component = QQmlComponent(Application.getInstance()._engine, path) - - self._print_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._print_context.setContextProperty("OutputDevice", self) - self._print_view = component.create(self._print_context) - - if component.isError(): - Logger.log("e", " Errors creating component: \n%s", "\n".join( - [e.toString() for e in component.errors()])) - + path = os.path.join(self._plugin_path, "PrintWindow.qml") + self._print_view = Application.getInstance().createQmlComponent(path, {"OutputDevice", self}) if self._print_view is not None: self._print_view.show() From bd5e4f9a51d310af1d794aa2723a2303a45bbbe3 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 14:59:55 +0100 Subject: [PATCH 405/764] Cleanup cluster output device component creation - CURA-4568 --- .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 738177e99d..b69508ee75 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -8,12 +8,10 @@ import time from enum import Enum from PyQt5.QtNetwork import QNetworkRequest, QHttpPart, QHttpMultiPart -from PyQt5.QtCore import QUrl, QByteArray, pyqtSlot, pyqtProperty, QCoreApplication, QTimer, pyqtSignal, QObject +from PyQt5.QtCore import QUrl, pyqtSlot, pyqtProperty, QCoreApplication, QTimer, pyqtSignal, QObject from PyQt5.QtGui import QDesktopServices from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply -from PyQt5.QtQml import QQmlComponent, QQmlContext from UM.Application import Application -from UM.Decorators import override from UM.Logger import Logger from UM.Message import Message from UM.OutputDevice import OutputDeviceError From 9a7fa67da75778a94b931d46fefbcf01203cb604 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 15:02:17 +0100 Subject: [PATCH 406/764] Cleanup plugin browser dialog creation - CURA-4568 --- plugins/PluginBrowser/PluginBrowser.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/plugins/PluginBrowser/PluginBrowser.py b/plugins/PluginBrowser/PluginBrowser.py index 338513d499..35b88b3465 100644 --- a/plugins/PluginBrowser/PluginBrowser.py +++ b/plugins/PluginBrowser/PluginBrowser.py @@ -38,8 +38,6 @@ class PluginBrowser(QObject, Extension): self._plugins_metadata = [] self._plugins_model = None - self._qml_component = None - self._qml_context = None self._dialog = None self._download_progress = 0 @@ -110,16 +108,8 @@ class PluginBrowser(QObject, Extension): def _createDialog(self, qml_name): Logger.log("d", "Creating dialog [%s]", qml_name) - path = os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), qml_name) - dialog = Application.getInstance().createQmlComponent(path, { - "manager": self - }) - - if dialog is None: - Logger.log("e", "QQmlComponent status %s", self._qml_component.status()) - Logger.log("e", "QQmlComponent errorString %s", self._qml_component.errorString()) - + dialog = Application.getInstance().createQmlComponent(path, {"manager": self}) return dialog def setIsDownloading(self, is_downloading): From eeeefcc47a993b64c0517e0d72a1e9cf93c1c5fc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 15:06:53 +0100 Subject: [PATCH 407/764] Update UM3 discovery dialog creation to new method - CURA-4568 --- .../UM3NetworkPrinting/DiscoverUM3Action.py | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index af1a556892..0d5d259ce4 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -1,17 +1,15 @@ -from cura.MachineAction import MachineAction +import os.path +import time + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject from UM.Application import Application from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger - -from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QUrl, QObject -from PyQt5.QtQml import QQmlComponent, QQmlContext - -import os.path - -import time - from UM.i18n import i18nCatalog + +from cura.MachineAction import MachineAction + catalog = i18nCatalog("cura") class DiscoverUM3Action(MachineAction): @@ -136,17 +134,14 @@ class DiscoverUM3Action(MachineAction): def _createAdditionalComponentsView(self): Logger.log("d", "Creating additional ui components for UM3.") - path = QUrl.fromLocalFile(os.path.join(PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), "UM3InfoComponents.qml")) - self.__additional_component = QQmlComponent(Application.getInstance()._engine, path) - # We need access to engine (although technically we can't) - self.__additional_components_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self.__additional_components_context.setContextProperty("manager", self) - - self.__additional_components_view = self.__additional_component.create(self.__additional_components_context) + # Create networking dialog + path = os.path.join(PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"), "UM3InfoComponents.qml") + self.__additional_components_view = Application.getInstance().createQmlComponent(path, {"manager": self}) if not self.__additional_components_view: Logger.log("w", "Could not create ui components for UM3.") return + # Create extra components Application.getInstance().addAdditionalComponent("monitorButtons", self.__additional_components_view.findChild(QObject, "networkPrinterConnectButton")) Application.getInstance().addAdditionalComponent("machinesDetailPane", self.__additional_components_view.findChild(QObject, "networkPrinterConnectionInfo")) From b961c37ead7caf7633f0414348a3f6fb68a56158 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 15:18:05 +0100 Subject: [PATCH 408/764] Fix generating view for machine action - CURA-4568 --- cura/MachineAction.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/cura/MachineAction.py b/cura/MachineAction.py index 66467c53e7..969fef0edf 100644 --- a/cura/MachineAction.py +++ b/cura/MachineAction.py @@ -24,9 +24,6 @@ class MachineAction(QObject, PluginObject): self._key = key self._label = label self._qml_url = "" - - self._component = None - self._context = None self._view = None self._finished = False @@ -50,7 +47,6 @@ class MachineAction(QObject, PluginObject): # /sa _reset @pyqtSlot() def reset(self): - self._component = None self._finished = False self._reset() @@ -76,7 +72,6 @@ class MachineAction(QObject, PluginObject): @pyqtProperty(QObject, constant = True) def displayItem(self): - if not self._component: + if not self._view: self._createViewFromQML() - - return self._view \ No newline at end of file + return self._view From f41759e1dcdfb3e228d89bdca3733eecb0e50f11 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 28 Nov 2017 15:20:05 +0100 Subject: [PATCH 409/764] Fix binding extruder manager in machine actions view - CURA-4568 --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 5e2e67eed6..1f0e0160c5 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -355,7 +355,7 @@ Cura.MachineAction if(currentIndex > 0) { contentItem.forceActiveFocus(); - ExtruderManager.setActiveExtruderIndex(currentIndex - 1); + Cura.ExtruderManager.setActiveExtruderIndex(currentIndex - 1); } } @@ -585,11 +585,11 @@ Cura.MachineAction propertyProvider.setPropertyValue("value", text); if(_forceUpdateOnChange) { - var extruderIndex = ExtruderManager.activeExtruderIndex; + var extruderIndex = Cura.ExtruderManager.activeExtruderIndex; manager.forceUpdate(); - if(ExtruderManager.activeExtruderIndex != extruderIndex) + if(Cura.ExtruderManager.activeExtruderIndex != extruderIndex) { - ExtruderManager.setActiveExtruderIndex(extruderIndex) + Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex) } } if(_afterOnEditingFinished) From 56d6664c8c404f1d043f30b5bbb226c56e30b36a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 28 Nov 2017 15:33:21 +0100 Subject: [PATCH 410/764] Guard against materials not having a definition The empty container has no definition. Contributes to issue CURA-4243. --- cura/QualityManager.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index f776ed56e8..4ed2242ec1 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -202,16 +202,20 @@ class QualityManager: # \return \type{List[Dict[str, Any]]} A list of the metadata of basic # materials, or an empty list if none could be found. def _getBasicMaterialMetadatas(self, material_container: Dict[str, Any]) -> List[Dict[str, Any]]: - base_material = material_container.get("material") - material_container_definition = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = material_container["definition"]) - if material_container_definition: - material_container_definition = material_container_definition[0] - if "has_machine_quality" in material_container_definition: - definition_id = material_container_definition.get("quality_definition", material_container_definition["id"]) - else: - definition_id = "fdmprinter" - else: + if "definition" not in material_container: definition_id = "fdmprinter" + else: + material_container_definition = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = material_container["definition"]) + if not material_container_definition: + definition_id = "fdmprinter" + else: + material_container_definition = material_container_definition[0] + if "has_machine_quality" not in material_container_definition: + definition_id = "fdmprinter" + else: + definition_id = material_container_definition.get("quality_definition", material_container_definition["id"]) + + base_material = material_container.get("material") if base_material: # There is a basic material specified criteria = { From 381d9bf3f1b53f9bc17301b7b9dcbe841d54052e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 28 Nov 2017 16:15:20 +0100 Subject: [PATCH 411/764] Log which file caused it to go wrong Contributes to issue CURA-4243. --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2a77032a33..285a329cae 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -836,7 +836,7 @@ class MachineManager(QObject): elif container_type == "quality_changes": new_quality_settings_list = self._determineQualityAndQualityChangesForQualityChanges(quality_name) else: - Logger.log("e", "Tried to set quality to a container that is not of the right type") + Logger.log("e", "Tried to set quality to a container that is not of the right type: {container_id}".format(container_id = containers[0]["id"])) return # Check if it was at all possible to find new settings From 21c1272e45e0d6362c2b1f725ad5331523352939 Mon Sep 17 00:00:00 2001 From: Dinow Date: Mon, 27 Nov 2017 23:16:14 +0800 Subject: [PATCH 412/764] Update cura.po for 3.1 --- resources/i18n/zh_TW/cura.po | 269 ++++++++++------------------------- 1 file changed, 74 insertions(+), 195 deletions(-) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 03be837a5b..b17800b6f6 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-22 23:36+0800\n" +"PO-Revision-Date: 2017-11-28 23:48+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -91,9 +91,6 @@ msgid "File sent to Doodle3D Connect" msgstr "檔案已被傳送到 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Open Connect.." msgctxt "@action:button" msgid "Open Connect..." msgstr "開啟連線..." @@ -144,12 +141,9 @@ msgid "Unable to start a new job because the printer is busy or not connected." msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 -#, fuzzy -#| msgctxt "@label:PrintjobStatus" -#| msgid "Slicing unavailable" msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "切片不可用" +msgstr "印表機無法使用" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -641,7 +635,7 @@ msgctxt "" msgid "" "New features are available for your {machine_name}! It is recommended to " "update the firmware on your printer." -msgstr "" +msgstr "你的 {machine_name} 有新功能可用!建議更新印表機韌體。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -652,12 +646,12 @@ msgstr "有新 %s 韌體可用" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "如何更新" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." -msgstr "無法存取升級資訊。" +msgstr "無法存取更新資訊。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" @@ -690,12 +684,9 @@ msgid "Error while starting %s!" msgstr "啟動 %s 時發生錯誤!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 -#, fuzzy -#| msgctxt "@item:inmenu" -#| msgid "Solid view" msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "實體檢視" +msgstr "模擬檢視" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -705,12 +696,9 @@ msgstr "" "(Layers)" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 -#, fuzzy -#| msgctxt "name" -#| msgid "Solid View" msgctxt "@info:title" msgid "Simulation View" -msgstr "實體檢視" +msgstr "模擬檢視" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -794,16 +782,13 @@ msgid "" msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 -#, fuzzy, python-brace-format -#| msgctxt "@info:status" -#| msgid "" -#| "Unable to slice with the current settings. The following settings have " -#| "errors: {0}" +#, python-brace-format msgctxt "@info:status" msgid "" "Unable to slice due to some per-model settings. The following settings have " "errors on one or more models: {error_labels}" -msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" +msgstr "" +"因部份模型設定問題無法進行切片。部份模型的下列設定有錯誤:{error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -842,34 +827,34 @@ msgid "Configure Per Model Settings" msgstr "設定對每個模型的單獨設定" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Installed" msgid "Install" -msgstr "已安裝" +msgstr "安裝" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "" "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " "is not set to a directory." msgstr "" +"無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR,它沒有設置到正確的目" +"錄。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Cura 外掛已成功安裝。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "" "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "" "Failed to install Siemens NX plugin. Could not set environment variable " "UGII_USER_DIR for Siemens NX." msgstr "" +"無法安裝 Siemens NX 外掛。無法為 Siemens NX 設定環境變數 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -1034,9 +1019,6 @@ msgid "Other" msgstr "其它" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 -#, fuzzy -#| msgctxt "@label" -#| msgid "Unknown" msgctxt "@label unknown material" msgid "Unknown" msgstr "未知" @@ -1106,16 +1088,12 @@ msgstr "自訂耗材" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "整體" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 -#, fuzzy -#| msgctxt "@action:label" -#| msgid "%1 override" -#| msgid_plural "%1 overrides" msgctxt "@menuitem" msgid "Not overridden" -msgstr "%1 覆寫" +msgstr "不覆寫" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1171,7 +1149,7 @@ msgstr "列印參數已匯出至:{0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "匯出成功" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1252,19 +1230,16 @@ msgid "" "automatically to our servers

    \n" " " msgstr "" +"

    程式發生了致命異常。請將錯誤報告傳送給我們以解決這個問題

    \n" +"

    請使用「送出報告」按鈕將錯誤報告自動發送到我們的伺服器

    \n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 -#, fuzzy -#| msgctxt "@info:title" -#| msgid "Information" msgctxt "@title:groupbox" msgid "System information" -msgstr "資訊" +msgstr "系統資訊" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 -#, fuzzy -#| msgctxt "@label" -#| msgid "Unknown" msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "未知" @@ -1273,72 +1248,69 @@ msgstr "未知" #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura 版本: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "平台: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt 版本: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt 版本: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL 版本:{version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL 供應商:{vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL 渲染器:{renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "異常追溯" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "日誌" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 -#, fuzzy -#| msgctxt "@label" -#| msgid "Description" msgctxt "@title:groupbox" msgid "User description" -msgstr "描述" +msgstr "使用者描述" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "送出報告" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1378,7 +1350,7 @@ msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過 #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "選擇的模型太小無法載入。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1788,12 +1760,9 @@ msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 -#, fuzzy -#| msgctxt "@info:tooltip" -#| msgid "Opens the print jobs page with your default web browser." msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "使用你的預設瀏覽器開啟列印作業頁面。" +msgstr "使用預設瀏覽器開啟列印作業頁面。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1828,7 +1797,7 @@ msgstr "與印表機的連接中斷" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "已關閉" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1841,17 +1810,11 @@ msgid "Finished" msgstr "已完成" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 -#, fuzzy -#| msgctxt "@label:MonitorStatus" -#| msgid "Paused" msgctxt "@label:status" msgid "Paused" msgstr "已暫停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 -#, fuzzy -#| msgctxt "@label:" -#| msgid "Resume" msgctxt "@label:status" msgid "Resuming" msgstr "繼續" @@ -1890,7 +1853,7 @@ msgstr "列印作業" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 msgctxt "@label" msgid "Printing" -msgstr "列印中" +msgstr "已排入佇列" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 msgctxt "@label" @@ -1996,15 +1959,12 @@ msgstr "線條類型" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "進給率" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 -#, fuzzy -#| msgctxt "@item:inlistbox" -#| msgid "Layer view" msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "分層檢視" +msgstr "層厚" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -2052,20 +2012,14 @@ msgid "Inner Wall" msgstr "內壁" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 -#, fuzzy -#| msgctxt "@label" -#| msgid "X min" msgctxt "@label" msgid "min" -msgstr "X 最小值" +msgstr "最小值" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 -#, fuzzy -#| msgctxt "@label" -#| msgid "X max" msgctxt "@label" msgid "max" -msgstr "X 最大值" +msgstr "最大值" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2305,12 +2259,9 @@ msgid "%1 out of %2" msgstr "%1 / %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 -#, fuzzy -#| msgctxt "@action:warning" -#| msgid "Loading a project will clear all models on the buildplate" msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "載入專案時將清除列印平台上的所有模型" +msgstr "載入專案時將清除列印平台上的所有模型。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2348,19 +2299,13 @@ msgid "Plugin License Agreement" msgstr "外掛授權協議" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 -#, fuzzy -#| msgctxt "@label" -#| msgid "" -#| " plugin contains a license.\n" -#| "You need to accept this license to install this plugin.\n" -#| "Do you agree with the terms below?" msgctxt "@label" msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -" 外掛內含一份授權\n" +"外掛內含一份授權協議。\n" "你必需同意此份授權協議才能安裝此外掛。\n" "是否同意下列條款?" @@ -2375,12 +2320,9 @@ msgid "Decline" msgstr "拒絕" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 -#, fuzzy -#| msgctxt "@title:window" -#| msgid "Plugin License Agreement" msgctxt "@title:window" msgid "User Agreement" -msgstr "外掛授權協議" +msgstr "使用者授權" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -3310,12 +3252,9 @@ msgid "About Cura" msgstr "關於 Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 -#, fuzzy -#| msgctxt "@label %1 is printer name" -#| msgid "Printer: %1" msgctxt "@label" msgid "version: %1" -msgstr "印表機:%1" +msgstr "版本:%1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3412,12 +3351,9 @@ msgid "Polygon clipping library" msgstr "多邊形剪輯函式庫" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 -#, fuzzy -#| msgctxt "@label" -#| msgid "Polygon clipping library" msgctxt "@Label" msgid "Python HTTP library" -msgstr "多邊形剪輯函式庫" +msgstr "Python HTTP 函式庫" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3435,12 +3371,9 @@ msgid "Profile:" msgstr "列印參數:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -#, fuzzy -#| msgctxt "@info:title The %s gets replaced with the printer name." -#| msgid "New %s firmware available" msgctxt "@" msgid "No Profile Available" -msgstr "有新 %s 韌體可用" +msgstr "無可用的列印參數" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3552,57 +3485,42 @@ msgid "" "Print Setup disabled\n" "G-code files cannot be modified" msgstr "" -"列印設定已禁用\n" +"列印設定已關閉\n" "G-code 檔案無法被修改" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 -#, fuzzy -#| msgctxt "@label" -#| msgid "00h 00min" msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小時 00 分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 -#, fuzzy -#| msgctxt "@tooltip" -#| msgid "Time information" msgctxt "@tooltip" msgid "Time specification
    " + feature_name + ":" + - "  " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + - "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + + content += "
    " + feature + "
    " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + "
    " -msgstr "時間資訊" +msgstr "時間資訊
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "成本明細" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1" msgctxt "@label m for meter" msgid "%1m" -msgstr "%1" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1" msgctxt "@label g for grams" msgid "%1g" -msgstr "%1" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "總共:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1m / ~ %2g / ~ %4 %3" msgctxt "" "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " "print cost" @@ -3610,9 +3528,6 @@ msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1m / ~ %2g" msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" @@ -3753,35 +3668,29 @@ msgstr "" "待熱床加熱完畢。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 -#, fuzzy -#| msgctxt "@action:button Preceded by 'Ready to'." -#| msgid "Print over network" msgctxt "@label" msgid "Printer control" -msgstr "網路連線列印" +msgstr "印表機控制" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Move to Next Position" msgctxt "@label" msgid "Jog Position" -msgstr "移動到下一個位置" +msgstr "輕搖位置" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "輕搖距離" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3824,12 +3733,9 @@ msgid "&Quit" msgstr "退出(&Q)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -#, fuzzy -#| msgctxt "@action:inmenu menubar:edit" -#| msgid "Reset All Model Positions" msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "重置所有模型位置" +msgstr "重置視角位置" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -4032,7 +3938,7 @@ msgstr "無法切片" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" -msgstr "切片不可用" +msgstr "切片無法使用" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" @@ -4071,12 +3977,9 @@ msgid "Import all as models" msgstr "匯入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 -#, fuzzy -#| msgctxt "@label" -#| msgid "Ultimaker 3" msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "Ultimaker 3" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -4243,6 +4146,7 @@ msgid "" "A custom profile is currently active. To enable the quality slider, choose a " "default quality profile in Custom tab" msgstr "" +"目前正使用自訂列印參數。若要使用品質滑動條,在自訂分頁中選擇預設的列印參數" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -4260,18 +4164,11 @@ msgid "Faster" msgstr "更快" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 -#, fuzzy -#| msgctxt "@text:window" -#| msgid "" -#| "You have customized some profile settings.\n" -#| "Would you like to keep or discard those settings?" msgctxt "@tooltip" msgid "" "You have modified some profile settings. If you want to change these go to " "custom mode." -msgstr "" -"你已自訂部份列印參數設定。\n" -"你想保留或捨棄這些設定嗎?" +msgstr "你修改過部份列印參數設定。如果你想改變這些設定,請切換到自訂模式。" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4377,9 +4274,6 @@ msgid "Material" msgstr "耗材" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 -#, fuzzy -#| msgctxt "@label" -#| msgid "Check material compatibility" msgctxt "@label" msgid "Check compatibility" msgstr "檢查耗材相容性" @@ -4523,23 +4417,17 @@ msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" msgid "SolidWorks Integration" -msgstr "SolidWorks 集成" +msgstr "SolidWorks 整合" #: SimulationView/plugin.json -#, fuzzy -#| msgctxt "description" -#| msgid "Provides the X-Ray view." msgctxt "description" msgid "Provides the Simulation view." -msgstr "提供透視檢視。" +msgstr "提供模擬檢視。" #: SimulationView/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "Solid View" msgctxt "name" msgid "Simulation View" -msgstr "實體檢視" +msgstr "模擬檢視" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4622,20 +4510,14 @@ msgid "Version Upgrade 2.7 to 3.0" msgstr "升級版本 2.7 到 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json -#, fuzzy -#| msgctxt "description" -#| msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" +msgstr "將設定從 Cura 3.0 版本升級至 3.1 版本。" #: VersionUpgrade/VersionUpgrade30to31/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "Version Upgrade 2.7 to 3.0" msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "升級版本 2.7 到 3.0" +msgstr "升級版本 3.0 到 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4700,15 +4582,12 @@ msgstr "單一模型設定工具" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "協助你在 Siemens NX 中安裝一個「匯出到 Cura」按鈕。" #: cura-siemensnx-plugin/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "SolidWorks Integration" msgctxt "name" msgid "Siemens NX Integration" -msgstr "SolidWorks 集成" +msgstr "Siemens NX 整合" #: 3MFReader/plugin.json msgctxt "description" @@ -4773,12 +4652,12 @@ msgstr "3MF 寫入器" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "詢問使用者是否同意我們的授權協議" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "使用者授權" #: UltimakerMachineActions/plugin.json msgctxt "description" From c63ef6fed60ac49d78123a543338f5121d17b571 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 28 Nov 2017 16:58:04 +0100 Subject: [PATCH 413/764] Remove unused variables The machine_name variable is later redefined. Contributes to issue CURA-4243. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 15ee48164d..011bac022c 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -119,7 +119,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Could not find reader that was able to read the scene data for 3MF workspace") return WorkspaceReader.PreReadResult.failed - machine_name = "" machine_type = "" variant_type_name = i18n_catalog.i18nc("@label", "Nozzle") @@ -131,7 +130,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # When loading the global stack file, it may be associated with those containers, which may or may not be # in Cura already, so we need to provide them as alternative search lists. instance_container_list = [] - material_container_list = [] resolve_strategy_keys = ["machine", "material", "quality_changes"] self._resolve_strategies = {k: None for k in resolve_strategy_keys} From 8707396ad7698c5a02a75b383df54ca295731831 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 28 Nov 2017 17:30:00 +0100 Subject: [PATCH 414/764] Remove isReadOnly functionality Everyone should now ask it from the container registry. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 36 +++++++++---------- cura/Settings/CuraContainerRegistry.py | 1 - cura/Settings/ExtruderManager.py | 2 +- cura/Settings/MachineManager.py | 5 +-- plugins/3MFReader/ThreeMFWorkspaceReader.py | 7 ++-- .../NetworkPrinterOutputDevice.py | 5 +-- .../XmlMaterialProfile/XmlMaterialProfile.py | 27 ++++++-------- 7 files changed, 35 insertions(+), 48 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index a93dd3c1b6..be302d2a6f 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -164,15 +164,15 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, result = bool) def clearContainer(self, container_id): + if self._container_registry.isReadOnly(container_id): + Logger.log("w", "Cannot clear read-only container %s", container_id) + return False + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could clear container %s because it was not found.", container_id) return False - if containers[0].isReadOnly(): - Logger.log("w", "Cannot clear read-only container %s", container_id) - return False - containers[0].clear() return True @@ -200,6 +200,10 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, str, result = bool) def setContainerMetaDataEntry(self, container_id, entry_name, entry_value): + if self._container_registry.isReadOnly(container_id): + Logger.log("w", "Cannot set metadata of read-only container %s.", container_id) + return False + containers = self._container_registry.findContainers(id = container_id) #We need the complete container, since we need to know whether the container is read-only or not. if not containers: Logger.log("w", "Could not set metadata of container %s because it was not found.", container_id) @@ -207,10 +211,6 @@ class ContainerManager(QObject): container = containers[0] - if container.isReadOnly(): - Logger.log("w", "Cannot set metadata of read-only container %s.", container_id) - return False - entries = entry_name.split("/") entry_name = entries.pop() @@ -250,6 +250,10 @@ class ContainerManager(QObject): # \return True if successful, False if not. @pyqtSlot(str, str, str, str, result = bool) def setContainerProperty(self, container_id, setting_key, property_name, property_value): + if self._container_registry.isReadOnly(container_id): + Logger.log("w", "Cannot set properties of read-only container %s.", container_id) + return False + containers = self._container_registry.findContainers(id = container_id) if not containers: Logger.log("w", "Could not set properties of container %s because it was not found.", container_id) @@ -257,10 +261,6 @@ class ContainerManager(QObject): container = containers[0] - if container.isReadOnly(): - Logger.log("w", "Cannot set properties of read-only container %s.", container_id) - return False - container.setProperty(setting_key, property_name, property_value) basefile = container.getMetaDataEntry("base_file", container_id) @@ -296,18 +296,16 @@ class ContainerManager(QObject): ## Set the name of the specified container. @pyqtSlot(str, str, result = bool) def setContainerName(self, container_id, new_name): + if self._container_registry.isReadOnly(container_id): + Logger.log("w", "Cannot set name of read-only container %s.", container_id) + return False + containers = self._container_registry.findContainers(id = container_id) #We need to get the full container, not just metadata, since we need to know whether it's read-only. if not containers: Logger.log("w", "Could not set name of container %s because it was not found.", container_id) return False - container = containers[0] - - if container.isReadOnly(): - Logger.log("w", "Cannot set name of read-only container %s.", container_id) - return False - - container.setName(new_name) + containers[0].setName(new_name) return True diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index aa1f7617cb..b19bdca2cf 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -266,7 +266,6 @@ class CuraContainerRegistry(ContainerRegistry): # # \return None if configuring was successful or an error message if an error occurred. def _configureProfile(self, profile: InstanceContainer, id_seed: str, new_name: str) -> Optional[str]: - profile.setReadOnly(False) profile.setDirty(True) # Ensure the profiles are correctly saved new_id = self.createUniqueName("quality_changes", "", id_seed, catalog.i18nc("@label", "Custom profile")) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index e01561c5f4..03681d9e82 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -332,7 +332,7 @@ class ExtruderManager(QObject): preferred_materials = container_registry.findInstanceContainers(**search_criteria) if len(preferred_materials) >= 1: # In some cases we get multiple materials. In that case, prefer materials that are marked as read only. - read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if preferred_material.isReadOnly()] + read_only_preferred_materials = [preferred_material for preferred_material in preferred_materials if container_registry.isReadOnly(preferred_material.getId())] if len(read_only_preferred_materials) >= 1: material = read_only_preferred_materials[0] else: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 285a329cae..e117efe289 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -704,10 +704,7 @@ class MachineManager(QObject): ## Check if a container is read_only @pyqtSlot(str, result = bool) def isReadOnly(self, container_id: str) -> bool: - containers = ContainerRegistry.getInstance().findInstanceContainers(id = container_id) - if not containers or not self._active_container_stack: - return True - return containers[0].isReadOnly() + return ContainerRegistry.getInstance().isReadOnly(container_id) ## Copy the value of the setting of the current extruder to all other extruders as well as the global container. @pyqtSlot(str) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 011bac022c..bfd31f2ebe 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -180,11 +180,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): material_container_files = [name for name in cura_file_names if name.endswith(self._material_container_suffix)] for material_container_file in material_container_files: container_id = self._stripFileToId(material_container_file) - materials = self._container_registry.findInstanceContainers(id=container_id) material_labels.append(self._getMaterialLabelFromSerialized(archive.open(material_container_file).read().decode("utf-8"))) - if materials: + if self._container_registry.findContainersMetadata(id = container_id): #This material already exists. containers_found_dict["material"] = True - if not materials[0].isReadOnly(): # Only non readonly materials can be in conflict + if not self._container_registry.isReadOnly(container_id): # Only non readonly materials can be in conflict material_conflict = True Job.yieldThread() @@ -501,7 +500,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): containers_to_add.append(material_container) else: material_container = materials[0] - if not material_container.isReadOnly(): # Only create new materials if they are not read only. + if not self._container_registry.isReadOnly(container_id): # Only create new materials if they are not read only. if self._resolve_strategies["material"] == "override": material_container.deserialize(archive.open(material_container_file).read().decode("utf-8")) elif self._resolve_strategies["material"] == "new": diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index 07a8df985c..0193434b18 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -969,7 +969,8 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): ## Send all material profiles to the printer. def sendMaterialProfiles(self): - for container in UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material"): + registry = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance() + for container in registry.findInstanceContainers(type = "material"): try: xml_data = container.serialize() if xml_data == "" or xml_data is None: @@ -978,7 +979,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): names = ContainerManager.getInstance().getLinkedMaterials(container.getId()) if names: # There are other materials that share this GUID. - if not container.isReadOnly(): + if not registry.isReadOnly(container.getId()): continue # If it's not readonly, it's created by user, so skip it. material_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 23d4ed3860..47b0b4f2e9 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -45,25 +45,18 @@ class XmlMaterialProfile(InstanceContainer): def getInheritedFiles(self): return self._inherited_files - ## Overridden from InstanceContainer - def setReadOnly(self, read_only): - super().setReadOnly(read_only) - - basefile = self.getMetaDataEntry("base_file", self.getId()) # if basefile is self.getId, this is a basefile. - for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): - container._read_only = read_only # prevent loop instead of calling setReadOnly - ## Overridden from InstanceContainer # set the meta data for all machine / variant combinations def setMetaDataEntry(self, key, value): - if self.isReadOnly(): + registry = ContainerRegistry.getInstance() + if registry.isReadOnly(self.getId()): return super().setMetaDataEntry(key, value) basefile = self.getMetaDataEntry("base_file", self.getId()) #if basefile is self.getId, this is a basefile. # Update all containers that share basefile - for container in ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile): + for container in registry.findInstanceContainers(base_file = basefile): if container.getMetaDataEntry(key, None) != value: # Prevent recursion container.setMetaDataEntry(key, value) @@ -71,7 +64,8 @@ class XmlMaterialProfile(InstanceContainer): # without this function the setName would only set the name of the specific nozzle / material / machine combination container # The function is a bit tricky. It will not set the name of all containers if it has the correct name itself. def setName(self, new_name): - if self.isReadOnly(): + registry = ContainerRegistry.getInstance() + if registry.isReadOnly(self.getId()): return # Not only is this faster, it also prevents a major loop that causes a stack overflow. @@ -83,7 +77,7 @@ class XmlMaterialProfile(InstanceContainer): basefile = self.getMetaDataEntry("base_file", self.getId()) # if basefile is self.getId, this is a basefile. # Update the basefile as well, this is actually what we're trying to do # Update all containers that share GUID and basefile - containers = ContainerRegistry.getInstance().findInstanceContainers(base_file = basefile) + containers = registry.findInstanceContainers(base_file = basefile) for container in containers: container.setName(new_name) @@ -91,12 +85,11 @@ class XmlMaterialProfile(InstanceContainer): def setDirty(self, dirty): super().setDirty(dirty) base_file = self.getMetaDataEntry("base_file", None) - if base_file is not None and base_file != self.getId(): - containers = ContainerRegistry.getInstance().findContainers(id=base_file) + registry = ContainerRegistry.getInstance() + if base_file is not None and base_file != self.getId() and not registry.isReadOnly(base_file): + containers = registry.findContainers(id = base_file) if containers: - base_container = containers[0] - if not base_container.isReadOnly(): - base_container.setDirty(dirty) + containers[0].setDirty(dirty) ## Overridden from InstanceContainer # base file: common settings + supported machines From 16e07fc461ad186038c6f8aa2cf55847593bd1ec Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 29 Nov 2017 10:47:39 +0100 Subject: [PATCH 415/764] Update color indicators for extruders when changing material color - CURA-4641 --- cura/Settings/ExtrudersModel.py | 39 ++++++--------------------------- resources/qml/SidebarHeader.qml | 4 +++- 2 files changed, 10 insertions(+), 33 deletions(-) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 40d13461cc..dadea4d0a4 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -8,8 +8,9 @@ from UM.i18n import i18nCatalog import UM.Qt.ListModel from UM.Application import Application import UM.FlameProfiler -from cura.Settings.ExtruderManager import ExtruderManager -from cura.Settings.ExtruderStack import ExtruderStack #To listen to changes on the extruders. +from UM.Settings.ContainerRegistry import ContainerRegistry #To listen for changes to the materials. + +from cura.Settings.ExtruderStack import ExtruderStack # To listen to changes on the extruders. catalog = i18nCatalog("cura") @@ -68,7 +69,6 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self._update_extruder_timer.setSingleShot(True) self._update_extruder_timer.timeout.connect(self.__updateExtruders) - self._add_global = False self._simple_names = False self._active_machine_extruders = [] # type: Iterable[ExtruderStack] @@ -76,21 +76,10 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # Listen to changes Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) # When the machine is swapped we must update the active machine extruders - ExtruderManager.getInstance().extrudersChanged.connect(self._extrudersChanged) # When the extruders change we must link to the stack-changed signal of the new extruder + Application.getInstance().getExtruderManager().extrudersChanged.connect(self._extrudersChanged) # When the extruders change we must link to the stack-changed signal of the new extruder + ContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onExtruderStackContainersChanged) # When meta data from a material container changes we must update self._extrudersChanged() # Also calls _updateExtruders - def setAddGlobal(self, add): - if add != self._add_global: - self._add_global = add - self._updateExtruders() - self.addGlobalChanged.emit() - - addGlobalChanged = pyqtSignal() - - @pyqtProperty(bool, fset = setAddGlobal, notify = addGlobalChanged) - def addGlobal(self): - return self._add_global - addOptionalExtruderChanged = pyqtSignal() def setAddOptionalExtruder(self, add_optional_extruder): @@ -140,7 +129,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # Link to new extruders self._active_machine_extruders = [] - extruder_manager = ExtruderManager.getInstance() + extruder_manager = Application.getInstance().getExtruderManager() for extruder in extruder_manager.getExtruderStacks(): extruder.containersChanged.connect(self._onExtruderStackContainersChanged) self._active_machine_extruders.append(extruder) @@ -173,24 +162,10 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - # TODO: remove this - CURA-4482 - if self._add_global: - material = global_container_stack.material - color = material.getMetaDataEntry("color_code", default = self.defaultColors[0]) if material else self.defaultColors[0] - item = { - "id": global_container_stack.getId(), - "name": catalog.i18nc("@menuitem", "Global"), - "color": color, - "index": -1, - "definition": "" - } - items.append(item) - extruders_changed = True - # get machine extruder count for verification machine_extruder_count = global_container_stack.getProperty("machine_extruder_count", "value") - for extruder in ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()): + for extruder in Application.getInstance().getExtruderManager().getMachineExtruders(global_container_stack.getId()): position = extruder.getMetaDataEntry("position", default = "0") # Get the position try: position = int(position) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index fab8dc6130..07ce75d738 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -72,7 +72,7 @@ Column orientation: ListView.Horizontal - model: Cura.ExtrudersModel { id: extrudersModel; addGlobal: false } + model: Cura.ExtrudersModel { id: extrudersModel; } Connections { @@ -185,6 +185,8 @@ Column // Only draw the filling colour of the material inside the SVG border. Rectangle { + id: materialColorCircle + anchors { right: parent.right From e5ac33a9291a7f9704ad13f37a72a7f1c64dea6e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 29 Nov 2017 11:19:11 +0100 Subject: [PATCH 416/764] CURA-4641 Minor changes --- cura/Settings/ExtrudersModel.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index dadea4d0a4..9e365b6b1a 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -8,7 +8,6 @@ from UM.i18n import i18nCatalog import UM.Qt.ListModel from UM.Application import Application import UM.FlameProfiler -from UM.Settings.ContainerRegistry import ContainerRegistry #To listen for changes to the materials. from cura.Settings.ExtruderStack import ExtruderStack # To listen to changes on the extruders. @@ -77,7 +76,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # Listen to changes Application.getInstance().globalContainerStackChanged.connect(self._extrudersChanged) # When the machine is swapped we must update the active machine extruders Application.getInstance().getExtruderManager().extrudersChanged.connect(self._extrudersChanged) # When the extruders change we must link to the stack-changed signal of the new extruder - ContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onExtruderStackContainersChanged) # When meta data from a material container changes we must update + Application.getInstance().getContainerRegistry().containerMetaDataChanged.connect(self._onExtruderStackContainersChanged) # When meta data from a material container changes we must update self._extrudersChanged() # Also calls _updateExtruders addOptionalExtruderChanged = pyqtSignal() From 6274f70949a593b8e7689f6ff1d8946eeae1851c Mon Sep 17 00:00:00 2001 From: Aleksei Sasin Date: Wed, 29 Nov 2017 12:01:03 +0100 Subject: [PATCH 417/764] Added .stl extension association for windows --- installer.nsi | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/installer.nsi b/installer.nsi index 79704eece8..63ca59e451 100644 --- a/installer.nsi +++ b/installer.nsi @@ -126,11 +126,7 @@ Section "Install Arduino Drivers" SectionEnd Section "Open STL files with Cura" - WriteRegStr HKCR .stl "" "Cura STL model file" - DeleteRegValue HKCR .stl "Content Type" - WriteRegStr HKCR "Cura STL model file\DefaultIcon" "" "$INSTDIR\Cura.exe,0" - WriteRegStr HKCR "Cura STL model file\shell" "" "open" - WriteRegStr HKCR "Cura STL model file\shell\open\command" "" '"$INSTDIR\Cura.exe" "%1"' + ${registerExtension} "$INSTDIR\Cura.exe.exe" ".stl" "STL_File" SectionEnd Section /o "Open OBJ files with Cura" From 1dba27339e660085ef7a82d44e66485b206ebb75 Mon Sep 17 00:00:00 2001 From: Aleksei Sasin Date: Wed, 29 Nov 2017 13:10:45 +0100 Subject: [PATCH 418/764] Typo in association CURA-4555 --- installer.nsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installer.nsi b/installer.nsi index 63ca59e451..7516f733a1 100644 --- a/installer.nsi +++ b/installer.nsi @@ -126,7 +126,7 @@ Section "Install Arduino Drivers" SectionEnd Section "Open STL files with Cura" - ${registerExtension} "$INSTDIR\Cura.exe.exe" ".stl" "STL_File" + ${registerExtension} "$INSTDIR\Cura.exe" ".stl" "STL_File" SectionEnd Section /o "Open OBJ files with Cura" From 14e99cef17e1adefb6d447b6532282b83b525683 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 29 Nov 2017 13:33:40 +0100 Subject: [PATCH 419/764] CURA-4634 Remove standby temperature from quality profiles --- .../quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg | 3 +-- resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg index 980da522c8..f3c6ae8387 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Draft_Print.inst.cfg @@ -15,8 +15,7 @@ cool_fan_full_at_height = =layer_height_0 + 2 * layer_height cool_fan_speed_max = =cool_fan_speed machine_nozzle_cool_down_speed = 0.75 machine_nozzle_heat_up_speed = 1.6 -material_print_temperature = =230 -material_standby_temperature = 100 +material_print_temperature = =default_material_print_temperature + 5 # prime_tower_enable: see CURA-4248 prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 skin_overlap = 20 diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg index 86b584c9af..e027477595 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Fast_Print.inst.cfg @@ -11,12 +11,10 @@ weight = -1 setting_version = 4 [values] -default_material_print_temperature = 225 cool_fan_full_at_height = =layer_height_0 + 2 * layer_height cool_fan_speed_max = =cool_fan_speed machine_nozzle_cool_down_speed = 0.75 machine_nozzle_heat_up_speed = 1.6 -material_standby_temperature = 100 # prime_tower_enable: see CURA-4248 prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 speed_print = 80 From 99cd139ba40e3e9846d5f9f0e99f36d5f1d32e49 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 29 Nov 2017 13:39:24 +0100 Subject: [PATCH 420/764] Remove setting definition double Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7265f93090..dfcd41abd2 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -491,8 +491,6 @@ class XmlMaterialProfile(InstanceContainer): meta_data["properties"] = property_values meta_data["definition"] = "fdmprinter" - self.setDefinition("fdmprinter") - common_compatibility = True settings = data.iterfind("./um:settings/um:setting", self.__namespaces) for entry in settings: From b7fed81fc1c49c9c0ea10c8ea0f0e8c0cd2b7941 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 29 Nov 2017 14:00:32 +0100 Subject: [PATCH 421/764] Pass "is_debug_mode" flag to Application CURA-4539 --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b3e6caed4e..9d7ff3b738 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -205,7 +205,9 @@ class CuraApplication(QtApplication): self._additional_components = {} # Components to add to certain areas in the interface + is_debug_mode = CuraBuildType.strip().lower() == "debug" super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType, + is_debug_mode = is_debug_mode, tray_icon_name = "cura-icon-32.png") self.default_theme = "cura-light" From 0b9f7c85c8be50d2a0b2c67b1dd682c538178af4 Mon Sep 17 00:00:00 2001 From: Aleksei Sasin Date: Wed, 29 Nov 2017 14:07:23 +0100 Subject: [PATCH 422/764] Skip keyboard clicks for authentication dialog CURA-4643 Please enter the commit message for your changes. Lines starting --- plugins/UserAgreementPlugin/UserAgreement.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 52d35a4f44..9c65fcf7e2 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -15,6 +15,8 @@ UM.Dialog height: minimumHeight title: catalog.i18nc("@title:window", "User Agreement") + disableKeyButtons: false; + TextArea { anchors.top: parent.top From 838e49f3daf4198bc8d5d14a176020be4b469af7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 29 Nov 2017 14:33:04 +0100 Subject: [PATCH 423/764] Pass just metadata through quality manager instead of full containers Where we only need metadata, we should pass metadata instead of full containers. Also add some type hinting. Contributes to issue CURA-4243. --- cura/QualityManager.py | 26 +++++++++++++------------- cura/Settings/ContainerManager.py | 26 ++++++++++++++------------ cura/Settings/MachineManager.py | 22 ++++++++-------------- 3 files changed, 35 insertions(+), 39 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 42ef297559..76a0c86a5f 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -32,16 +32,16 @@ class QualityManager: # \param quality_name # \param machine_definition (Optional) \type{DefinitionContainerInterface} If nothing is # specified then the currently selected machine definition is used. - # \param material_containers (Optional) \type{List[InstanceContainer]} If nothing is specified then - # the current set of selected materials is used. + # \param material_containers_metadata If nothing is specified then the + # current set of selected materials is used. # \return the matching quality container \type{InstanceContainer} - def findQualityByName(self, quality_name: str, machine_definition: Optional["DefinitionContainerInterface"] = None, material_containers: List[InstanceContainer] = None) -> Optional[InstanceContainer]: + def findQualityByName(self, quality_name: str, machine_definition: Optional["DefinitionContainerInterface"] = None, material_containers_metadata: Optional[List[Dict[str, Any]]] = None) -> Optional[InstanceContainer]: criteria = {"type": "quality", "name": quality_name} - result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria) + result = self._getFilteredContainersForStack(machine_definition, material_containers_metadata, **criteria) # Fall back to using generic materials and qualities if nothing could be found. - if not result and material_containers and len(material_containers) == 1: - basic_materials = self._getBasicMaterialMetadatas(material_containers[0].getMetaData()) + if not result and material_containers_metadata and len(material_containers_metadata) == 1: + basic_materials = self._getBasicMaterialMetadatas(material_containers_metadata[0]) result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result[0] if result else None @@ -107,18 +107,18 @@ class QualityManager: # \param quality_type \type{str} the name of the quality type to search for. # \param machine_definition (Optional) \type{InstanceContainer} If nothing is # specified then the currently selected machine definition is used. - # \param material_containers (Optional) \type{List[InstanceContainer]} If nothing is specified then - # the current set of selected materials is used. + # \param material_containers_metadata If nothing is specified then the + # current set of selected materials is used. # \return the matching quality container \type{InstanceContainer} - def findQualityByQualityType(self, quality_type: str, machine_definition: Optional["DefinitionContainerInterface"] = None, material_containers: List[InstanceContainer] = None, **kwargs) -> InstanceContainer: + def findQualityByQualityType(self, quality_type: str, machine_definition: Optional["DefinitionContainerInterface"] = None, material_containers_metadata: Optional[List[Dict[str, Any]]] = None, **kwargs) -> InstanceContainer: criteria = kwargs criteria["type"] = "quality" if quality_type: criteria["quality_type"] = quality_type - result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria) + result = self._getFilteredContainersForStack(machine_definition, material_containers_metadata, **criteria) # Fall back to using generic materials and qualities if nothing could be found. - if not result and material_containers and len(material_containers) == 1: - basic_materials = self._getBasicMaterialMetadatas(material_containers[0].getMetaData()) + if not result and material_containers_metadata and len(material_containers_metadata) == 1: + basic_materials = self._getBasicMaterialMetadatas(material_containers_metadata[0]) if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result[0] if result else None @@ -236,7 +236,7 @@ class QualityManager: def _getFilteredContainers(self, **kwargs): return self._getFilteredContainersForStack(None, None, **kwargs) - def _getFilteredContainersForStack(self, machine_definition: "DefinitionContainerInterface" = None, material_metadata: List[Dict[str, Any]] = None, **kwargs): + def _getFilteredContainersForStack(self, machine_definition: "DefinitionContainerInterface" = None, material_metadata: Optional[List[Dict[str, Any]]] = None, **kwargs): # Fill in any default values. if machine_definition is None: machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index be302d2a6f..8abe627f3d 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -4,7 +4,7 @@ import os.path import urllib import uuid -from typing import Dict, Union +from typing import Any, Dict, List, Union from PyQt5.QtCore import QObject, QUrl, QVariant from UM.FlameProfiler import pyqtSlot @@ -677,27 +677,29 @@ class ContainerManager(QObject): machine_definition = global_stack.getBottom() active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() - material_containers = [stack.material for stack in active_stacks] + if active_stacks is None: + return "" + material_metadatas = [stack.material.getMetaData() for stack in active_stacks] result = self._duplicateQualityOrQualityChangesForMachineType(quality_name, base_name, QualityManager.getInstance().getParentMachineDefinition(machine_definition), - material_containers) + material_metadatas) return result[0].getName() if result else "" ## Duplicate a quality or quality changes profile specific to a machine type # - # \param quality_name \type{str} the name of the quality or quality changes container to duplicate. - # \param base_name \type{str} the desired name for the new container. - # \param machine_definition \type{DefinitionContainer} - # \param material_instances \type{List[InstanceContainer]} - # \return \type{str} the name of the newly created container. - def _duplicateQualityOrQualityChangesForMachineType(self, quality_name, base_name, machine_definition, material_instances): + # \param quality_name The name of the quality or quality changes container to duplicate. + # \param base_name The desired name for the new container. + # \param machine_definition The machine with the specific machine type. + # \param material_metadatas Metadata of materials + # \return List of duplicated quality profiles. + def _duplicateQualityOrQualityChangesForMachineType(self, quality_name: str, base_name: str, machine_definition: DefinitionContainer, material_metadatas: List[Dict[str, Any]]) -> List[InstanceContainer]: Logger.log("d", "Attempting to duplicate the quality %s", quality_name) if base_name is None: base_name = quality_name # Try to find a Quality with the name. - container = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_instances) + container = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_metadatas) if container: Logger.log("d", "We found a quality to duplicate.") return self._duplicateQualityForMachineType(container, base_name, machine_definition) @@ -706,7 +708,7 @@ class ContainerManager(QObject): return self._duplicateQualityChangesForMachineType(quality_name, base_name, machine_definition) # Duplicate a quality profile - def _duplicateQualityForMachineType(self, quality_container, base_name, machine_definition): + def _duplicateQualityForMachineType(self, quality_container, base_name, machine_definition) -> List[InstanceContainer]: if base_name is None: base_name = quality_container.getName() new_name = self._container_registry.uniqueName(base_name) @@ -730,7 +732,7 @@ class ContainerManager(QObject): return new_change_instances # Duplicate a quality changes container - def _duplicateQualityChangesForMachineType(self, quality_changes_name, base_name, machine_definition): + def _duplicateQualityChangesForMachineType(self, quality_changes_name, base_name, machine_definition) -> List[InstanceContainer]: new_change_instances = [] for container in QualityManager.getInstance().findQualityChangesByName(quality_changes_name, machine_definition): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e4e48ae6fd..9a3f529355 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -768,7 +768,7 @@ class MachineManager(QObject): if quality_type: candidate_quality = quality_manager.findQualityByQualityType(quality_type, quality_manager.getWholeMachineDefinition(global_stack.definition), - [material_container]) + [material_container.getMetaData()]) if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): Logger.log("d", "Attempting to find fallback quality") @@ -923,13 +923,13 @@ class MachineManager(QObject): # find qualities for extruders for extruder_stack in extruder_stacks: - material = extruder_stack.material + material_metadata = extruder_stack.material.getMetaData() # TODO: fix this if self._new_material_container and extruder_stack.getId() == self._active_container_stack.getId(): - material = self._new_material_container + material_metadata = self._new_material_container.getMetaData() - quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material_metadata]) if not quality: # No quality profile is found for this quality type. @@ -979,12 +979,6 @@ class MachineManager(QObject): Logger.log("e", "Could not find the global quality changes container with name %s", quality_changes_name) return None - material = global_container_stack.material - - # find a quality type that matches both machine and materials - if self._new_material_container and self._active_container_stack.getId() == global_container_stack.getId(): - material = self._new_material_container - # For the global stack, find a quality which matches the quality_type in # the quality changes profile and also satisfies any material constraints. quality_type = global_quality_changes.getMetaDataEntry("quality_type") @@ -1004,12 +998,12 @@ class MachineManager(QObject): if not quality_changes: quality_changes = self._empty_quality_changes_container - material = extruder_stack.material + material_metadata = extruder_stack.material.getMetaData() if self._new_material_container and self._active_container_stack.getId() == extruder_stack.getId(): - material = self._new_material_container + material_metadata = self._new_material_container.getMetaData() - quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material]) + quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material_metadata]) if not quality: # No quality profile found for this quality type. @@ -1022,7 +1016,7 @@ class MachineManager(QObject): }) # append the global quality changes - global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, [material], global_quality = "True") + global_quality = quality_manager.findQualityByQualityType(quality_type, global_machine_definition, global_quality = "True") # if there is not global quality but we're using a single extrusion machine, copy the quality of the first extruder - CURA-4482 if not global_quality and len(extruder_stacks) == 1: From e1167ee68f22f93e07c10b29521feba2c1432c9a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 29 Nov 2017 14:33:17 +0100 Subject: [PATCH 424/764] Fix disableKeyButtons in UserAgreement dialog CURA-4643 --- plugins/UserAgreementPlugin/UserAgreement.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 9c65fcf7e2..1d86a33d0f 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -15,7 +15,7 @@ UM.Dialog height: minimumHeight title: catalog.i18nc("@title:window", "User Agreement") - disableKeyButtons: false; + disableKeyButtons: true TextArea { From 320330b788f88b0d24226b373c7e96df255da6ea Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 29 Nov 2017 14:36:00 +0100 Subject: [PATCH 425/764] Take DebugMode flag from CuraVersion CURA-4539 --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9d7ff3b738..9427e15552 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -95,10 +95,11 @@ numpy.seterr(all="ignore") MYPY = False if not MYPY: try: - from cura.CuraVersion import CuraVersion, CuraBuildType + from cura.CuraVersion import CuraVersion, CuraBuildType, CuraDebugMode except ImportError: CuraVersion = "master" # [CodeStyle: Reflecting imported value] CuraBuildType = "" + CuraDebugMode = False class CuraApplication(QtApplication): @@ -205,9 +206,8 @@ class CuraApplication(QtApplication): self._additional_components = {} # Components to add to certain areas in the interface - is_debug_mode = CuraBuildType.strip().lower() == "debug" super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType, - is_debug_mode = is_debug_mode, + is_debug_mode = CuraDebugMode, tray_icon_name = "cura-icon-32.png") self.default_theme = "cura-light" From cacc4b858654917ad1c4a4a0c2e44f8517430d55 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 29 Nov 2017 16:39:56 +0100 Subject: [PATCH 426/764] Properly set the definition to the currently processed machine Otherwise all of them stay at fdmprinter. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index dfcd41abd2..e3f9413003 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -565,6 +565,7 @@ class XmlMaterialProfile(InstanceContainer): # Don't use setMetadata, as that overrides it for all materials with same base file new_material.getMetaData()["compatible"] = machine_compatibility new_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_material.getMetaData()["definition"] = machine_id new_material.setCachedValues(cached_machine_setting_properties) @@ -615,11 +616,11 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) new_hotend_material.getMetaData()["id"] = new_hotend_id new_hotend_material.getMetaData()["name"] = self.getName() - new_hotend_material.setDefinition(machine_id) new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] # Don't use setMetadata, as that overrides it for all materials with same base file new_hotend_material.getMetaData()["compatible"] = hotend_compatibility new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_hotend_material.getMetaData()["definition"] = machine_id cached_hotend_setting_properties = cached_machine_setting_properties.copy() cached_hotend_setting_properties.update(hotend_setting_values) @@ -748,6 +749,7 @@ class XmlMaterialProfile(InstanceContainer): new_material_metadata["id"] = new_material_id new_material_metadata["compatible"] = machine_compatibility new_material_metadata["machine_manufacturer"] = machine_manufacturer + new_material_metadata["definition"] = machine_id if len(found_materials) == 0: #This is a new material. result_metadata.append(new_material_metadata) @@ -785,6 +787,7 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material_metadata["compatible"] = hotend_compatibility new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer new_hotend_material_metadata["id"] = new_hotend_id + new_hotend_material_metadata["definition"] = machine_id if len(found_materials) == 0: result_metadata.append(new_hotend_material_metadata) From c34de83e3f6849d8af81d30980fafe2ac8f6d2fe Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 29 Nov 2017 18:04:07 +0100 Subject: [PATCH 427/764] Use isLoaded to check if a material is already loaded This prevents us from having to make an expensive findContainers call if it's not necessary, and also prevents us from unnecessarily loading the subcontainers in a loop during loading. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index e3f9413003..b203f36684 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -550,10 +550,9 @@ class XmlMaterialProfile(InstanceContainer): # project file and the a material in Cura have the same ID. # In the case if a derived material already exists, override that material container because if # the data in the parent material has been changed, the derived ones should be updated too. - found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_material_id) - is_new_material = False - if found_materials: - new_material = found_materials[0] + if ContainerRegistry.getInstance().isLoaded(new_material_id): + new_material = ContainerRegistry.getInstance().findContainers(id = new_material_id)[0] + is_new_material = False else: new_material = XmlMaterialProfile(new_material_id) is_new_material = True @@ -605,10 +604,9 @@ class XmlMaterialProfile(InstanceContainer): # Same as machine compatibility, keep the derived material containers consistent with the parent # material - found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_hotend_id) - is_new_material = False - if found_materials: - new_hotend_material = found_materials[0] + if ContainerRegistry.getInstance().isLoaded(new_hotend_id): + new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] + is_new_material = False else: new_hotend_material = XmlMaterialProfile(new_hotend_id) is_new_material = True From d5d75aca190180eb47f9eee97ddfad88a672a72a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 29 Nov 2017 22:46:17 +0100 Subject: [PATCH 428/764] Hide material diameter when the machine has no materials eg Ultimaker 2 when using UltiGcode --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 1f0e0160c5..f50dd9d206 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -283,6 +283,7 @@ Cura.MachineAction Loader { id: materialDiameterField + visible: Cura.MachineManager.hasMaterials sourceComponent: numericTextFieldWithUnit property string settingKey: "material_diameter" property string unit: catalog.i18nc("@label", "mm") From c1ba64fd9e93d8e364804b6f8ff2fc7d133de5f8 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Thu, 30 Nov 2017 00:10:02 +0100 Subject: [PATCH 429/764] Correct variants after all metadata is loaded As explained in the block of documentation, we can't find the variants because there is no guarantee that the variants have been loaded by the time that the metadata of materials is deserialised and we don't know their IDs either (so no lazy loading). This registers a function to be called upon completely loading the metadata, which runs a query on the metadata to find the variant by its definition and name. A bit hacky but I see no better solution. Contributes to issue CURA-4243. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index b203f36684..414886e1da 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -17,7 +17,6 @@ import UM.Dictionary from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry - ## Handles serializing and deserializing material containers from an XML file class XmlMaterialProfile(InstanceContainer): CurrentFdmMaterialVersion = "1.3" @@ -761,8 +760,6 @@ class XmlMaterialProfile(InstanceContainer): if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = hotend_id) - if not variant_containers: - continue hotend_compatibility = machine_compatibility for entry in hotend.iterfind("./um:setting", cls.__namespaces): @@ -781,7 +778,11 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material_metadata = {} new_hotend_material_metadata.update(base_metadata) - new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + if variant_containers: + new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + else: + new_hotend_material_metadata["variant"] = hotend_id + _with_missing_variants.append(new_hotend_material_metadata) new_hotend_material_metadata["compatible"] = hotend_compatibility new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer new_hotend_material_metadata["id"] = new_hotend_id @@ -876,4 +877,22 @@ def _indent(elem, level = 0): # We are only interested in the actual tag name, so discard everything # before the last } def _tag_without_namespace(element): - return element.tag[element.tag.rfind("}") + 1:] \ No newline at end of file + return element.tag[element.tag.rfind("}") + 1:] + +#While loading XML profiles, some of these profiles don't know what variant +#they belong to. We'd like to search by the machine ID and the variant's +#name, but we don't know the variant's ID. Not all variants have been loaded +#yet so we can't run a filter on the name and machine. The ID is unknown +#so we can't lazily load the variant either. So we have to wait until all +#the rest is loaded properly and then assign the correct variant to the +#material files that were missing it. +_with_missing_variants = [] +def _fillMissingVariants(): + registry = ContainerRegistry.getInstance() + for variant_metadata in _with_missing_variants: + variants = registry.findContainersMetadata(definition = variant_metadata["definition"], name = variant_metadata["variant"]) + if not variants: + Logger.log("w", "Could not find variant for variant-specific material {material_id}.".format(material_id = variant_metadata["id"])) + continue + variant_metadata["variant"] = variants[0]["id"] +ContainerRegistry.allMetadataLoaded.connect(_fillMissingVariants) \ No newline at end of file From f9c59c7e1ebad7177984471c63a3c7c0ff7f6ecc Mon Sep 17 00:00:00 2001 From: Ruben D Date: Thu, 30 Nov 2017 00:33:10 +0100 Subject: [PATCH 430/764] Don't update model if extruders haven't all been loaded yet This model is created while the extruder stacks have not yet been filled in. You can't connect yet. When the extruder is ready, _extrudersChanged will be called again and then the new extruder will also get connected. Contributes to issue CURA-4243. --- cura/Settings/ExtrudersModel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 40d13461cc..48517c4a7b 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -142,6 +142,8 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self._active_machine_extruders = [] extruder_manager = ExtruderManager.getInstance() for extruder in extruder_manager.getExtruderStacks(): + if extruder is None: #This extruder wasn't loaded yet. This happens asynchronously while this model is constructed from QML. + continue extruder.containersChanged.connect(self._onExtruderStackContainersChanged) self._active_machine_extruders.append(extruder) From d29d73413f3138b8d90c286ba7e1d0e3ff2236c9 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Thu, 30 Nov 2017 01:11:10 +0100 Subject: [PATCH 431/764] Remove unused function Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 8abe627f3d..daf30d0792 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -954,14 +954,6 @@ class ContainerManager(QObject): name_filter = "{0} ({1})".format(mime_type.comment, suffix_list) self._container_name_filters[name_filter] = entry - ## Get containers filtered by machine type and material if required. - # - # \param kwargs Initial search criteria that the containers need to match. - # - # \return A list of containers matching the search criteria. - def _getFilteredContainers(self, **kwargs): - return QualityManager.getInstance()._getFilteredContainers(**kwargs) - ## Creates a unique ID for a container by prefixing the name with the stack ID. # # This method creates a unique ID for a container by prefixing it with a specified stack ID. From b425672ad0fb44bb9b1fa79d0d4f9df6a64ca009 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 30 Nov 2017 09:31:07 +0100 Subject: [PATCH 432/764] CURA-4643 Allow using the ESC/ENTER keys for reject or accept the user agreement --- plugins/UserAgreementPlugin/UserAgreement.qml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/plugins/UserAgreementPlugin/UserAgreement.qml b/plugins/UserAgreementPlugin/UserAgreement.qml index 1d86a33d0f..c7f3f165e3 100644 --- a/plugins/UserAgreementPlugin/UserAgreement.qml +++ b/plugins/UserAgreementPlugin/UserAgreement.qml @@ -15,8 +15,6 @@ UM.Dialog height: minimumHeight title: catalog.i18nc("@title:window", "User Agreement") - disableKeyButtons: true - TextArea { anchors.top: parent.top @@ -45,7 +43,7 @@ UM.Dialog anchors.right: parent.right text: catalog.i18nc("@action:button", "I understand and agree") onClicked: { - manager.didAgree(true) + baseDialog.accepted() } } @@ -54,13 +52,12 @@ UM.Dialog anchors.left: parent.left text: catalog.i18nc("@action:button", "I don't agree") onClicked: { - manager.didAgree(false) + baseDialog.rejected() } } - } - onClosing: { - manager.didAgree(false) - } + onAccepted: manager.didAgree(true) + onRejected: manager.didAgree(false) + onClosing: manager.didAgree(false) } From 4303278602d2d93f68342e3d9939c193814ad015 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 30 Nov 2017 10:35:31 +0100 Subject: [PATCH 433/764] Tweak layout and alignment of print time and (material) cost estimation... improving readability * table takes the full width and values are right-aligned * time estimates are shortened * values are right aligned * feature/time/percentage are on a single line again * handle long feature & material names gracefully Fixes #2712 * totals are only shown when there are multiple extruders --- resources/qml/Sidebar.qml | 69 +++++++++++++++++++++++---------------- 1 file changed, 40 insertions(+), 29 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 31bda45b56..e02bb00c0a 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -350,21 +350,20 @@ Rectangle var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) // A message is created and displayed when the user hover the time label - var content = catalog.i18nc("@tooltip", "Time specification
    "); + var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); for(var feature in print_time) { if(!print_time[feature].isTotalDurationZero) { - content += "" + - "" + - "" + - "" + + "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + + "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + ""; } } - content += "
    " + feature + "
    " + print_time[feature].getDisplayString(UM.DurationFormat.Short) + "  " + Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds) + "%" + + tooltip_html += "
    " + feature + " (in a more verbose language):  %1  %1%
    "; + tooltip_html += ""; - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), content); + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), tooltip_html); } } onExited: @@ -376,9 +375,26 @@ Rectangle Label { + function formatRow(items) + { + var row_html = ""; + for(var item = 0; item < items.length; item++) + { + if (item == 0) + { + row_html += "%1".arg(items[item]); + } + else + { + row_html += "  %1".arg(items[item]); + } + } + row_html += ""; + return row_html; + } - function getSpecsData(){ - + function getSpecsData() + { var lengths = []; var total_length = 0; var weights = []; @@ -387,7 +403,8 @@ Rectangle var total_cost = 0; var some_costs_known = false; var names = []; - if(base.printMaterialLengths) { + if(base.printMaterialLengths) + { for(var index = 0; index < base.printMaterialLengths.length; index++) { if(base.printMaterialLengths[index] > 0) @@ -415,34 +432,28 @@ Rectangle costs = ["0.00"]; } - var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); + var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); for(var index = 0; index < lengths.length; index++) { - var item_strings = [ + tooltip_html += formatRow([ "%1:".arg(names[index]), catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), - ]; - tooltip_html += ""; - for(var item = 0; item < item_strings.length; item++) { - tooltip_html += "".arg(item_strings[item]); - } + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), + ]); } - var item_strings = [ - catalog.i18nc("@label", "Total:"), - catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), - catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), - ]; - tooltip_html += ""; - for(var item = 0; item < item_strings.length; item++) { - tooltip_html += "".arg(item_strings[item]); + if(lengths.length > 1) + { + tooltip_html += formatRow([ + catalog.i18nc("@label", "Total:"), + catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), + catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), + ]); } - tooltip_html += "
    %1  
    %1  
    "; + tooltip_html += ""; tooltipText = tooltip_html; - return tooltipText } From e8a723739128ade9d8f0c370e1fb5ccb5203da43 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 30 Nov 2017 11:46:06 +0100 Subject: [PATCH 434/764] Fix updating material container for extruder when changing gcode flavor Since single extrusion printers have a single extruder stack now, material container needs to be set on the extruder stack instead of the global stack --- .../MachineSettingsAction.py | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 2de5b6e9b8..7b407519e5 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -188,29 +188,32 @@ class MachineSettingsAction(MachineAction): # In other words: only continue for the UM2 (extended), but not for the UM2+ return + stacks = ExtruderManager.getInstance().getExtruderStacks() has_materials = self._global_container_stack.getProperty("machine_gcode_flavor", "value") != "UltiGCode" - material_container = self._global_container_stack.material - if has_materials: if "has_materials" in self._global_container_stack.getMetaData(): self._global_container_stack.setMetaDataEntry("has_materials", True) else: self._global_container_stack.addMetaDataEntry("has_materials", True) - # Set the material container to a sane default - if material_container == self._empty_container: - search_criteria = { "type": "material", "definition": "fdmprinter", "id": self._global_container_stack.getMetaDataEntry("preferred_material")} - materials = self._container_registry.findInstanceContainers(**search_criteria) - if materials: - self._global_container_stack.material = materials[0] + # Set the material container for each extruder to a sane default + for stack in stacks: + material_container = stack.material + if material_container == self._empty_container: + machine_approximate_diameter = str(round(self._global_container_stack.getProperty("material_diameter", "value"))) + search_criteria = { "type": "material", "definition": "fdmprinter", "id": self._global_container_stack.getMetaDataEntry("preferred_material"), "approximate_diameter": machine_approximate_diameter} + materials = self._container_registry.findInstanceContainers(**search_criteria) + if materials: + stack.material = materials[0] else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. # Because any non-empty string evaluates to a boolean True, we have to remove the entry to make it False. if "has_materials" in self._global_container_stack.getMetaData(): self._global_container_stack.removeMetaDataEntry("has_materials") - self._global_container_stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() + for stack in stacks: + stack.material = ContainerRegistry.getInstance().getEmptyInstanceContainer() Application.getInstance().globalContainerStackChanged.emit() From 3bb45488c322f0f37a3b27f4bac9e46dafaa9b2c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 30 Nov 2017 14:54:34 +0100 Subject: [PATCH 435/764] Update translations for 3.1 From Bothof. Contributes to issue CURA-4601. --- resources/i18n/de_DE/cura.po | 185 ++++++++----------- resources/i18n/de_DE/fdmextruder.def.json.po | 4 +- resources/i18n/de_DE/fdmprinter.def.json.po | 70 ++++--- resources/i18n/es_ES/cura.po | 185 ++++++++----------- resources/i18n/es_ES/fdmextruder.def.json.po | 4 +- resources/i18n/es_ES/fdmprinter.def.json.po | 70 ++++--- 6 files changed, 232 insertions(+), 286 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index e5e2509fd0..da42c9a4d8 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" @@ -91,7 +91,7 @@ msgstr "Datei wurde zu Doodle3D Connect gesendet" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Connect wird geöffnet ..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "Es kann kein neuer Auftrag gestartet werden, da der Drucker beschäftigt #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Drucker nicht verfügbar" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Anschluss über Netzwerk" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Für Ihren {machine_name} sind neue Funktionen verfügbar! Es wird empfohlen, ein Firmware-Update für Ihren Drucker auszuführen." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Neue Firmware für %s verfügbar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Anleitung für die Aktualisierung" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "Fehler beim Starten %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Simulationsansicht" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Cura zeigt die Schichten nicht akkurat an, wenn Wire Printing aktiviert #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Simulationsansicht" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Die aktuellen Einstellungen lassen kein Schneiden (Slicing) zu. Die folg #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Aufgrund der Pro-Modell-Einstellungen ist kein Schneiden (Slicing) möglich. Die folgenden Einstellungen sind für ein oder mehrere Modelle fehlerhaft: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Pro Objekteinstellungen konfigurieren" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Installieren" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Siemens NX Plugin-Dateien konnten nicht kopiert werden. Überprüfen Sie Ihr UGII_USER_DIR. Sie ist keinem Verzeichnis zugeordnet." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Cura Plugin wurde erfolgreich installiert." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Siemens NX Plugin-Dateien konnten nicht kopiert werden. Überprüfen Sie Ihr UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Siemens NX Plugin konnte nicht installiert werden. Umgebungsvariable UGII_USER_DIR für Siemens NX konnte nicht zugewiesen werden." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Sonstige" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Unbekannt" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Benutzerdefiniertes Material" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Global" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Nicht überschrieben" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Profil wurde nach {0} exportiert" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Export erfolgreich ausgeführt" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Ein schwerer Ausnahmefehler ist aufgetreten. Senden Sie uns diesen Absturzbericht, um das Problem zu beheben

    \n

    Verwenden Sie bitte die Schaltfläche „Bericht senden“, um den Fehlerbericht automatisch an unsere Server zu senden

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Systeminformationen" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Unbekannt" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura-Version: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Plattform: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt-Version: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt-Version: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL-Version: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL-Anbieter: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL-Renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Ausnahme-Rückverfolgung" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Protokolle" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Benutzerbeschreibung" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Bericht senden" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "Wenn G-Code geladen wird, kann keine weitere Datei geöffnet werden. Wic #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Das gewählte Modell war zu klein zum Laden." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n" -"\n" -"Wählen Sie Ihren Drucker aus der folgenden Liste:" +msgstr "Um über das Netzwerk direkt auf Ihrem Drucker zu drucken, stellen Sie bitte sicher, dass der Drucker mit dem Netzwerkkabel verbunden ist oder verbinden Sie Ihren Drucker mit Ihrem WLAN-Netzwerk. Wenn Sie Cura nicht mit Ihrem Drucker verbinden, können Sie dennoch ein USB-Laufwerk für die Übertragung von G-Code-Dateien auf Ihren Drucker verwenden.\n\nWählen Sie Ihren Drucker aus der folgenden Liste:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1 ist nicht für das Hosten einer Gruppe verbundener Ultimaker 3-Drucke #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Öffnet die Seite für Druckaufträge mit Ihrem Standard-Webbrowser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Verbindung zum Drucker wurde unterbrochen" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Deaktiviert" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Beendet" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Pausiert" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Wird fortgesetzt ..." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Linientyp" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Vorschub" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Schichtdicke" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "Innenwand" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "max." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 von %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Das Laden eines Projekts entfernt alle Modelle von der Druckplatte." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Dieses Plugin enthält eine Lizenz.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Ablehnen" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Benutzervereinbarung" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sie haben einige Profileinstellungen angepasst.\n" -"Möchten Sie diese Einstellungen übernehmen oder verwerfen?" +msgstr "Sie haben einige Profileinstellungen angepasst.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "Über Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "Version: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n" -"Cura verwendet mit Stolz die folgenden Open Source-Projekte:" +msgstr "Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Bibliothek für Polygon-Beschneidung" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Bibliothek für Python HTTP" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Profil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Kein Profil verfügbar" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n" -"\n" -"Klicken Sie, um den Profilmanager zu öffnen." +msgstr "Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n\nKlicken Sie, um den Profilmanager zu öffnen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n" -"\n" -"Klicken Sie, um diese Einstellungen sichtbar zu machen." +msgstr "Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n\nKlicken Sie, um diese Einstellungen sichtbar zu machen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Diese Einstellung hat einen vom Profil abweichenden Wert.\n" -"\n" -"Klicken Sie, um den Wert des Profils wiederherzustellen." +msgstr "Diese Einstellung hat einen vom Profil abweichenden Wert.\n\nKlicken Sie, um den Wert des Profils wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n" -"\n" -"Klicken Sie, um den berechneten Wert wiederherzustellen." +msgstr "Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n\nKlicken Sie, um den berechneten Wert wiederherzustellen." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Druckeinrichtung deaktiviert\n" -"G-Code-Dateien können nicht geändert werden" +msgstr "Druckeinrichtung deaktiviert\nG-Code-Dateien können nicht geändert werden" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00 Stunden 00 Minuten" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Zeitangabe
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Kostenangabe" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1 m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Insgesamt:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Heizen Sie das Bett vor Druckbeginn auf. Sie können Ihren Druck währen #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Druckersteuerung" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Tippposition" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Tippdistanz" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "&Beenden" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Kameraposition zurücksetzen" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Alle als Modelle importieren" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Schichtdicke" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Ein benutzerdefiniertes Profil ist derzeit aktiv. Wählen Sie ein voreingestelltes Qualitätsprofil aus der Registerkarte „Benutzerdefiniert“, um den Schieberegler für Qualität zu aktivieren." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Schneller" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Sie haben einige Profileinstellungen geändert. Wenn Sie diese ändern möchten, wechseln Sie in den Modus „Benutzerdefiniert“." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Kompatibilität prüfen" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "SolidWorks Integration" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Ermöglicht die Simulationsansicht." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Simulationsansicht" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "Upgrade von Version 2.7 auf 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Aktualisiert Konfigurationen von Cura 3.0 auf Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Upgrade von Version 3.0 auf 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Werkzeug „Einstellungen pro Objekt“" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Unterstützt die Installation der Schaltfläche „Zu Cura exportieren“ in Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "3MF-Writer" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Den Benutzer einmalig fragen, ob er unsere Lizenz akzeptiert." #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/de_DE/fdmextruder.def.json.po b/resources/i18n/de_DE/fdmextruder.def.json.po index 1858c6c76c..1108f1a541 100644 --- a/resources/i18n/de_DE/fdmextruder.def.json.po +++ b/resources/i18n/de_DE/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:30+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index b853e4a70f..337df8bff2 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: German\n" "Language: de_DE\n" @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "Gcode-Befehle, die zu Beginn ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n" -"." +msgstr "Gcode-Befehle, die Am Ende ausgeführt werden sollen – getrennt durch \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -612,27 +608,27 @@ msgstr "Die Dicke der ersten Schicht in mm. Eine dicke erste Schicht erleichtert #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Slicing-Toleranz" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Slicen von Schichten mit diagonalen Flächen. Die Bereiche einer Schicht können anhand der Position generiert werden, an der die Mitte einer Schicht die Oberfläche kreuzt (Mitte). Optional kann jede Schicht die Bereiche enthalten, die in das Volumen entlang der Höhe der Schicht (Exklusiv) fallen oder eine Schicht enthält die Bereiche, die irgendwo innerhalb der Schicht positioniert sind (Inklusiv). Exklusiv bewahrt die meisten Details, Inklusiv ermöglicht die beste Passform und Mitte erfordert die kürzeste Bearbeitungszeit." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Mitte" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exklusiv" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inklusiv" #: fdmprinter.def.json msgctxt "line_width label" @@ -807,7 +803,7 @@ msgstr "Die für das Drucken der Außenwände verwendete Extruder-Einheit. Diese #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Extruder Innenwand" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1387,7 +1383,7 @@ msgstr "Füllmuster" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Das Muster des Füllmaterials des Drucks. Die Linien- und Zickzackfüllmethode wechseln nach jeder Schicht die Richtung, um Materialkosten zu reduzieren. Die Gitter-, Dreieck- Tri-Hexagon-, Würfel-, Octahedral-, Viertelwürfel-, Quer- und konzentrischen Muster werden in jeder Schicht vollständig gedruckt. Würfel-, Viertelwürfel- und Octahedral-Füllungen wechseln mit jeder Schicht, um eine gleichmäßigere Verteilung der Stärke in allen Richtungen zu erzielen." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1407,7 +1403,7 @@ msgstr "Dreiecke" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Tri-Hexagon" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1462,7 +1458,7 @@ msgstr "Füllungslinien verbinden" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Verbindet die Enden, an denen das Füllmuster auf die Innenwand trifft, mithilfe einer Linie, die der Form der Innenwand folgt. Durch Aktivierung dieser Einstellung kann die Füllung besser an den Wänden haften; auch die Auswirkungen der Füllung auf die Qualität der vertikalen Flächen werden reduziert. Die Deaktivierung dieser Einstellung reduziert den Materialverbrauch." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1477,22 +1473,22 @@ msgstr "Eine Liste von Ganzzahl-Linienrichtungen für die Verwendung. Elemente a #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "X-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Das Füllmuster wird um diese Distanz entlang der X-Achse versetzt." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Y-Versatz Füllung" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Das Füllmuster wird um diese Distanz entlang der Y-Achse versetzt." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1807,22 +1803,22 @@ msgstr "Der Durchmesser des verwendeten Filaments wird angepasst. Stellen Sie hi #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Haftungstendenz" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Oberflächenhaftungstendenz" #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Oberflächenenergie" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Oberflächenenergie." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3554,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "Der horizontale Abstand zwischen dem Skirt und der ersten Schicht des Drucks.\nEs handelt sich dabei um den Mindestabstand. Ab diesem Abstand werden mehrere Skirt-Linien in äußerer Richtung angebracht." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3614,7 +3610,7 @@ msgstr "Raft-Glättung" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Diese Einstellung steuert, wie stark die Innenkanten des Raft-Umrisses gerundet werden. Die Innenkanten werden zu einem Halbkreis mit einem Radius entsprechend des hier definierten Werts gerundet. Diese Einstellung entfernt außerdem Löcher im Raft-Umriss, die kleiner als ein solcher Kreis sind." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4089,12 +4085,12 @@ msgstr "Normalerweise versucht Cura kleine Löcher im Netz abzudecken und Teile #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Maximale Auflösung" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Die Mindestgröße eines Linienabschnitts nach dem Slicen. Wenn Sie diesen Wert erhöhen, führt dies zu einer niedrigeren Auslösung des Mesh. Damit kann der Drucker die erforderliche Geschwindigkeit für die Verarbeitung des G-Codes beibehalten; außerdem wird die Slice-Geschwindigkeit erhöht, indem Details des Mesh entfernt werden, die ohnehin nicht verarbeitet werden können." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4129,12 +4125,12 @@ msgstr "Schaltet mit jeder Schicht das Volumen zu den entsprechenden Netzübersc #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Leere erste Schichten entfernen" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Entfernen Sie die leeren Schichten unter der ersten gedruckten Schicht, sofern vorhanden. Die Deaktivierung dieser Einstellung kann zu leeren ersten Schichten führen, wenn die Einstellung der Slicing-Toleranz auf Exklusiv oder Mittel gesetzt wurde." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4664,22 +4660,22 @@ msgstr "Der durchschnittliche Abstand zwischen den willkürlich auf jedes Linien #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Ausgleich Durchflussrate max. Extrusionswirkung" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Die maximale Distanz in mm für den Ausgleich." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Ausgleichsfaktor Durchflussrate" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Der Multiplikationsfaktor für die Übersetzung Durchflussrate -> Distanz." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4831,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\n" -"Dies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." +msgstr "Die Strecke einer Aufwärtsbewegung, die mit halber Geschwindigkeit extrudiert wird.\nDies kann zu einer besseren Haftung an vorhergehenden Schichten führen, während gleichzeitig ein Überhitzen des Materials in diesen Schichten vermieden wird. Dies gilt nur für das Drucken mit Drahtstruktur." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 00eb28955a..ae16570127 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -91,7 +91,7 @@ msgstr "Archivo enviado a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Abrir Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "No se puede iniciar un trabajo nuevo porque la impresora está ocupada o #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Impresora no disponible" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Conectar a través de la red" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Hay nuevas funciones disponibles para {machine_name}. Se recomienda actualizar el firmware de la impresora." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Nuevo firmware de %s disponible" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Cómo actualizar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "Error al iniciar %s" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Vista de simulación" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Cura no muestra correctamente las capas si la impresión de alambre est #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Vista de simulación" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Los ajustes actuales no permiten la segmentación. Los siguientes ajuste #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Los ajustes de algunos modelos no permiten la segmentación. Los siguientes ajustes contienen errores en uno o más modelos: {error_labels}." #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Configurar ajustes por modelo" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Instalar" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Se ha producido un error al copiar los archivos de complemento de Siemens NX. Compruebe la UGII_USER_DIR. No está asignada a ningún directorio." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "El complemento Siemens NX Cura se ha instalado correctamente." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Se ha producido un error al copiar los archivos de complemento de Siemens NX. Compruebe la UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Se ha producido un error al instalar el complemento de Siemens NX. No se pudo definir la variable de entorno UGII_USER_DIR de Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Otro" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Desconocido" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Material personalizado" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Global" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "No reemplazado" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Perfil exportado a {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Exportación correcta" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Información del sistema" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Desconocido" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Versión de Cura: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Platforma: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Versión de Qt: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Versión de PyQt: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Versión de OpenGL: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Proveedor de OpenGL: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • Representador de OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Rastreabilidad de excepciones" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Registros" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Descripción del usuario" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Enviar informe" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "No se puede abrir ningún archivo si se está cargando un archivo GCode. #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "No se puede cargar el modelo seleccionado, es demasiado pequeño." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n" -"\n" -"Seleccione la impresora de la siguiente lista:" +msgstr "Para imprimir directamente en la impresora a través de la red, asegúrese de que esta está conectada a la red utilizando un cable de red o conéctela a la red wifi. Si no conecta Cura con la impresora, también puede utilizar una unidad USB para transferir archivos GCode a la impresora.\n\nSeleccione la impresora de la siguiente lista:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1 no está configurada para alojar un grupo de impresoras conectadas de #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Abre la página de trabajos de impresión en su navegador web por defecto." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Se ha perdido la conexión con la impresora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Deshabilitado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Terminado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "En pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Reanudando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Tipo de línea" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Velocidad de alimentación" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Grosor de la capa" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "Pared interior" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "mín." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "máx." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 de un total de %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Si carga un proyecto, se borrarán todos los modelos de la placa de impresión." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Este complemento incluye una licencia.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Rechazar" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Acuerdo de usuario" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Ha personalizado parte de los ajustes del perfil.\n" -"¿Desea descartar los cambios o guardarlos?" +msgstr "Ha personalizado parte de los ajustes del perfil.\n¿Desea descartar los cambios o guardarlos?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "Acerca de Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "versión: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\n" -"Cura se enorgullece de utilizar los siguientes proyectos de código abierto:" +msgstr "Ultimaker B.V. ha desarrollado Cura en cooperación con la comunidad.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Biblioteca de recorte de polígonos" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Biblioteca HTTP de Python" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Perfil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "No hay perfiles disponibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n" -"\n" -"Haga clic para abrir el administrador de perfiles." +msgstr "Algunos valores de los ajustes o sobrescrituras son distintos a los valores almacenados en el perfil.\n\nHaga clic para abrir el administrador de perfiles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n" -"\n" -"Haga clic para mostrar estos ajustes." +msgstr "Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n\nHaga clic para mostrar estos ajustes." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Este ajuste tiene un valor distinto del perfil.\n" -"\n" -"Haga clic para restaurar el valor del perfil." +msgstr "Este ajuste tiene un valor distinto del perfil.\n\nHaga clic para restaurar el valor del perfil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n" -"\n" -"Haga clic para restaurar el valor calculado." +msgstr "Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n\nHaga clic para restaurar el valor calculado." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Ajustes de impresión deshabilitados\n" -"No se pueden modificar los archivos GCode" +msgstr "Ajustes de impresión deshabilitados\nNo se pueden modificar los archivos GCode" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00 h 00 min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Especificación de tiempo
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Especificación de costes" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1 m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Total:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1 m/~ %2 g/~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1 m/~ %2 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Caliente la plataforma antes de imprimir. Puede continuar ajustando la i #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Control de impresoras" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Posición de desplazamiento" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Distancia de desplazamiento" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "&Salir" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Restablecer posición de la cámara" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Importar todos como modelos" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Altura de capa" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Hay un perfil personalizado activado en este momento. Para habilitar el control deslizante de calidad, seleccione un perfil de calidad predeterminado en la pestaña Personalizado." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Más rápido" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Ha modificado algunos ajustes del perfil. Si desea cambiarlos, hágalo en el modo personalizado." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Comprobar compatibilidad" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "Integración con SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Abre la vista de simulación." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Vista de simulación" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "Actualización de la versión 2.7 a la 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Actualiza la configuración de Cura 3.0 a Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Actualización de la versión 3.0 a la 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Herramienta de ajustes por modelo" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Ayuda a instalar el botón para exportar a Cura en in Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "Escritor de 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Preguntar al usuario una vez si acepta la licencia" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po index 616b670f93..1d0986f4e1 100644 --- a/resources/i18n/es_ES/fdmextruder.def.json.po +++ b/resources/i18n/es_ES/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:31+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 6e21158a77..d3515844e3 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Spanish\n" "Language: es_ES\n" @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n" -"." +msgstr "Los comandos de Gcode que se ejecutarán justo al inicio - separados por \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Los comandos de Gcode que se ejecutarán justo al final - separados por \n" -"." +msgstr "Los comandos de Gcode que se ejecutarán justo al final - separados por \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -612,27 +608,27 @@ msgstr "Altura de capa inicial en mm. Una capa inicial más gruesa se adhiere a #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Tolerancia de segmentación" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Cómo segmentar capas con superficies diagonales. Las áreas de una capa se pueden crear según el punto en el que el centro de esta intersecta con la superficie (Media). Las capas también pueden tener áreas comprendidas en el volumen a lo largo de la altura de la capa (Exclusiva) o una capa puede tener áreas comprendidas en cualquier lugar de la capa (Inclusiva). Las capas exclusivas tienen un mayor nivel de detalle, mientras que las inclusivas son las que mejor se ajustan y las medias las que tardan menos en procesarse." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Media" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exclusiva" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusiva" #: fdmprinter.def.json msgctxt "line_width label" @@ -807,7 +803,7 @@ msgstr "El tren extrusor que se utiliza para imprimir la pared exterior. Se empl #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Extrusor de pared interior" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1387,7 +1383,7 @@ msgstr "Patrón de relleno" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Patrón del material de relleno de la impresión. El relleno de línea y zigzag cambia de dirección en capas alternas, con lo que se reduce el coste del material. Los patrones de rejilla, triángulo, trihexagonal, cúbico, de octeto, cúbico bitruncado y transversal y concéntrico se imprimen en todas las capas por completo. El relleno cúbico, cúbico bitruncado y de octeto cambian en cada capa para proporcionar una distribución de fuerza equitativa en cada dirección." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1407,7 +1403,7 @@ msgstr "Triángulos" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Trihexagonal" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1462,7 +1458,7 @@ msgstr "Conectar líneas de relleno" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Conectar los extremos donde los patrones de relleno se juntan con la pared interior usando una línea que siga la forma de esta. Habilitar este ajuste puede lograr que el relleno se adhiera mejor a las paredes y se reduzca el efecto del relleno sobre la calidad de las superficies verticales. Deshabilitar este ajuste reduce la cantidad de material utilizado." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1477,22 +1473,22 @@ msgstr "Una lista de los valores enteros de las direcciones de línea. Los eleme #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Desplazamiento del relleno sobre el eje X" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "El patrón de relleno se desplaza esta distancia a lo largo del eje Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1807,22 +1803,22 @@ msgstr "Ajusta el diámetro del filamento utilizado. Este valor debe coincidir c #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Tendencia de adherencia" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Tendencia de adherencia de la superficie." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Energía de la superficie" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Energía de la superficie." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3554,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "La distancia horizontal entre la falda y la primera capa de la impresión.\nSe trata de la distancia mínima. Múltiples líneas de falda se extenderán hacia el exterior a partir de esta distancia." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3614,7 +3610,7 @@ msgstr "Suavizado de la balsa" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Este ajuste controla la medida en que se redondean las esquinas interiores en el contorno de la balsa. Las esquinas hacia el interior se redondean en semicírculo con un radio equivalente al valor aquí indicado. Este ajuste también elimina los orificios del contorno de la balsa que sean más pequeños que dicho círculo." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4089,12 +4085,12 @@ msgstr "Normalmente, Cura intenta coser los pequeños agujeros de la malla y eli #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Resolución máxima" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "El tamaño mínimo de un segmento de línea tras la segmentación. Si se aumenta, la resolución de la malla será menor. Esto puede permitir a la impresora mantener la velocidad que necesita para procesar GCode y aumentará la velocidad de segmentación al eliminar detalles de la malla que, de todas formas, no puede procesar." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4129,12 +4125,12 @@ msgstr "Cambiar la malla a la que pertenecerán los volúmenes que se cruzan en #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Eliminar primeras capas vacías" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Eliminar (si las hubiera) las capas vacías por debajo de la primera capa impresa. Deshabilitar este ajuste puede hacer que aparezcan primeras capas vacías si el ajuste de tolerancia de segmentación está establecido en Exclusiva o Medio." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4664,22 +4660,22 @@ msgstr "Distancia media entre los puntos aleatorios introducidos en cada segment #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Desplazamiento de extrusión máximo del factor de compensación del caudal" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Distancia máxima en mm que se va a compensar." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Factor de compensación del caudal" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "La multiplicación factor por caudal da como resultado la conversión de distancia." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4831,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Distancia de un movimiento ascendente que se extrude a media velocidad.\n" -"Esto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." +msgstr "Distancia de un movimiento ascendente que se extrude a media velocidad.\nEsto puede causar una mejor adherencia a las capas anteriores, aunque no calienta demasiado el material en esas capas. Solo se aplica a la impresión de alambre." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" From 0fdb21fc91a953245cfb2acac233af754b568b4c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 30 Nov 2017 15:12:44 +0100 Subject: [PATCH 436/764] Update translations for 3.1 The rest of the ones from Bothof. Contributes to issue CURA-4601. --- resources/i18n/fr_FR/cura.po | 185 ++- resources/i18n/fr_FR/fdmextruder.def.json.po | 4 +- resources/i18n/fr_FR/fdmprinter.def.json.po | 70 +- resources/i18n/it_IT/cura.po | 185 ++- resources/i18n/it_IT/fdmextruder.def.json.po | 4 +- resources/i18n/it_IT/fdmprinter.def.json.po | 70 +- resources/i18n/ja_JP/cura.po | 178 ++- resources/i18n/ja_JP/fdmextruder.def.json.po | 4 +- resources/i18n/ja_JP/fdmprinter.def.json.po | 1136 +++++++++--------- resources/i18n/ko_KR/cura.po | 199 ++- resources/i18n/ko_KR/fdmextruder.def.json.po | 6 +- resources/i18n/ko_KR/fdmprinter.def.json.po | 60 +- resources/i18n/nl_NL/cura.po | 185 ++- resources/i18n/nl_NL/fdmextruder.def.json.po | 4 +- resources/i18n/nl_NL/fdmprinter.def.json.po | 62 +- resources/i18n/ru_RU/cura.po | 187 ++- resources/i18n/ru_RU/fdmextruder.def.json.po | 4 +- resources/i18n/ru_RU/fdmprinter.def.json.po | 70 +- resources/i18n/tr_TR/cura.po | 185 ++- resources/i18n/tr_TR/fdmextruder.def.json.po | 4 +- resources/i18n/tr_TR/fdmprinter.def.json.po | 70 +- resources/i18n/zh_CN/cura.po | 187 ++- resources/i18n/zh_CN/fdmextruder.def.json.po | 4 +- resources/i18n/zh_CN/fdmprinter.def.json.po | 70 +- 24 files changed, 1465 insertions(+), 1668 deletions(-) mode change 100755 => 100644 resources/i18n/ru_RU/cura.po mode change 100755 => 100644 resources/i18n/ru_RU/fdmprinter.def.json.po diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index 54d5eadd62..e65d19d978 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -91,7 +91,7 @@ msgstr "Fichier envoyé vers Doodle3D Connecter" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Ouvrir Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "Impossible de démarrer une nouvelle tâche car l'imprimante est occupé #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Imprimante indisponible" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Connecter via le réseau" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "De nouvelles fonctionnalités sont disponibles pour votre {machine_name} ! Il est recommandé de mettre à jour le firmware sur votre imprimante." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Nouveau firmware %s disponible" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Comment effectuer la mise à jour" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "Erreur lors du lancement de %s !" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Vue simulation" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Cura n'affiche pas les couches avec précision lorsque l'impression fila #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Vue simulation" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suiva #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Impossible de couper en raison de certains paramètres par modèle. Les paramètres suivants contiennent des erreurs sur un ou plusieurs modèles : {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Configurer les paramètres par modèle" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Installer" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Échec de la copie des fichiers plug-ins Siemens NX. Veuillez vérifier votre UGII_USER_DIR. Il n'est pas défini sur un répertoire." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "L'installation du plug-in Siemens NX Cura a réussie." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Échec de la copie des fichiers plug-ins Siemens NX. Veuillez vérifier votre UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Échec de l'installation du plug-in Siemens NX. Impossible de définir la variable d'environnement UGII_USER_DIR pour Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Autre" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Inconnu" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Matériau personnalisé" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Global" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Pas écrasé" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Profil exporté vers {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "L'exportation a réussi" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Une exception fatale s'est produite. Veuillez nous envoyer ce Rapport d'incident pour résoudre le problème

    \n

    Veuillez utiliser le bouton « Envoyer rapport » pour publier automatiquement un rapport d'erreur sur nos serveurs

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Informations système" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Inconnu" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Version Cura : {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Plateforme : {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Version Qt : {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Version PyQt : {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL : {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Version OpenGL : {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Revendeur OpenGL : {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • Moteur de rendu OpenGL : {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Retraçage de l'exception" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Journaux" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Description de l'utilisateur" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Envoyer rapport" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "Impossible d'ouvrir un autre fichier si le G-Code est en cours de charge #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Le modèle sélectionné était trop petit pour être chargé." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n" -"\n" -"Sélectionnez votre imprimante dans la liste ci-dessous :" +msgstr "Pour imprimer directement sur votre imprimante sur le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble réseau ou en connectant votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante.\n\nSélectionnez votre imprimante dans la liste ci-dessous :" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1 n'est pas configurée pour héberger un groupe d'imprimantes connect #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Ouvre la page des tâches d'impression avec votre navigateur web." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Connexion avec l'imprimante perdue" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Désactivé" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Terminé" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "En pause" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Reprise" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Type de ligne" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Taux d'alimentation" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Épaisseur de la couche" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "Paroi interne" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "max." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 sur %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Le chargement d'un projet effacera tous les modèles sur le plateau." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Ce plug-in contient une licence.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Refuser" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Accord utilisateur" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Vous avez personnalisé certains paramètres du profil.\n" -"Souhaitez-vous conserver ces changements, ou les annuler ?" +msgstr "Vous avez personnalisé certains paramètres du profil.\nSouhaitez-vous conserver ces changements, ou les annuler ?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "À propos de Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "version : %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" -"Cura est fier d'utiliser les projets open source suivants :" +msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Bibliothèque de découpe polygone" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Bibliothèque Python HTTP" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Profil :" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Aucun profil disponible" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" -"\n" -"Cliquez pour ouvrir le gestionnaire de profils." +msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" -"\n" -"Cliquez pour rendre ces paramètres visibles." +msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Ce paramètre possède une valeur qui est différente du profil.\n" -"\n" -"Cliquez pour restaurer la valeur du profil." +msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" -"\n" -"Cliquez pour restaurer la valeur calculée." +msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Configuration de l'impression désactivée\n" -"Les fichiers G-Code ne peuvent pas être modifiés" +msgstr "Configuration de l'impression désactivée\nLes fichiers G-Code ne peuvent pas être modifiés" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Spécification de temps
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Spécification de coût" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Total :" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Préchauffez le plateau avant l'impression. Vous pouvez continuer à aju #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Contrôle de l'imprimante" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Position de coupe" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Distance de coupe" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "&Quitter" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Réinitialiser la position de la caméra" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Importer tout comme modèles" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Hauteur de la couche" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Un profil personnalisé est actuellement actif. Pour activer le curseur de qualité, choisissez un profil de qualité par défaut dans l'onglet Personnaliser" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Accélérer" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Vous avez modifié certains paramètres du profil. Si vous souhaitez les modifier, allez dans le mode Personnaliser." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Matériau" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Vérifier la compatibilité" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "Intégration SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Fournit la Vue simulation." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Vue simulation" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "Mise à niveau de version, de 2.7 vers 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Met à niveau les configurations, de Cura 3.0 vers Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Mise à niveau de version, de 3.0 vers 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Outil de paramètres par modèle" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Vous aide à installer un bouton « exporter vers Cura » dans Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "Générateur 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Demander à l'utilisateur une fois s'il appose son accord à notre licence" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po index d190a4ef2c..fdec72de32 100644 --- a/resources/i18n/fr_FR/fdmextruder.def.json.po +++ b/resources/i18n/fr_FR/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:31+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index 3327f1af8c..0e768253dc 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: French\n" "Language: fr_FR\n" @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Commandes Gcode à exécuter au tout début, séparées par \n" -"." +msgstr "Commandes Gcode à exécuter au tout début, séparées par \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Commandes Gcode à exécuter à la toute fin, séparées par \n" -"." +msgstr "Commandes Gcode à exécuter à la toute fin, séparées par \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -612,27 +608,27 @@ msgstr "La hauteur de la couche initiale en mm. Une couche initiale plus épaiss #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Tolérance à la découpe" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Comment découper des couches avec des surfaces diagonales. Les zones d'une couche peuvent être générées en fonction de l'endroit où le milieu de la couche croise la surface (Milieu). Alternativement, chaque couche peut posséder des zones situées à l'intérieur du volume à travers toute la hauteur de la couche (Exclusif), ou une couche peut avoir des zones situées à l'intérieur à tout endroit dans la couche (Inclusif). L'option Exclusif permet de retenir le plus de détails, Inclusif permet d'obtenir une adaptation optimale et Milieu demande le moins de temps de traitement." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Milieu" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exclusif" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusif" #: fdmprinter.def.json msgctxt "line_width label" @@ -807,7 +803,7 @@ msgstr "Le train d'extrudeuse utilisé pour l'impression des parois externes. Ce #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Extrudeuse de paroi interne" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1387,7 +1383,7 @@ msgstr "Motif de remplissage" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Motif du matériau de remplissage de l'impression. La ligne et le remplissage en zigzag changent de sens à chaque alternance de couche, réduisant ainsi les coûts matériels. Les motifs en grille, en triangle, trihexagonaux, cubiques, octaédriques, quart cubiques et concentriques sont entièrement imprimés sur chaque couche. Les remplissages cubique, quart cubique et octaédrique changent à chaque couche afin d'offrir une répartition plus égale de la solidité dans chaque direction." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1407,7 +1403,7 @@ msgstr "Triangles" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Trihexagonal" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1462,7 +1458,7 @@ msgstr "Relier les lignes de remplissage" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Relie les extrémités où le motif de remplissage touche la paroi interne, à l'aide d'une ligne épousant la forme de la paroi interne. Activer ce paramètre peut faire mieux coller le remplissage aux parois, et réduit les effets du remplissage sur la qualité des surfaces verticales. Désactiver ce paramètre diminue la quantité de matière utilisée." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1477,22 +1473,22 @@ msgstr "Une liste de sens de ligne (exprimés en nombres entiers) à utiliser. L #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Remplissage Décalage X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Le motif de remplissage est décalé de cette distance sur l'axe X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Remplissage Décalage Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Le motif de remplissage est décalé de cette distance sur l'axe Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1807,22 +1803,22 @@ msgstr "Ajuste le diamètre du filament utilisé. Faites correspondre cette vale #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Tendance à l'adhérence" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Tendance à l'adhérence de la surface." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Énergie de la surface" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Énergie de la surface." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3554,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "La distance horizontale entre la jupe et la première couche de l’impression.\nIl s’agit de la distance minimale séparant la jupe de l’objet. Si la jupe a d’autres lignes, celles-ci s’étendront vers l’extérieur." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3614,7 +3610,7 @@ msgstr "Lissage de radeau" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Ce paramètre définit combien d'angles intérieurs sont arrondis dans le contour de radeau. Les angles internes sont arrondis en un demi-cercle avec un rayon égal à la valeur indiquée ici. Ce paramètre élimine également les cavités dans le contour de radeau qui sont d'une taille inférieure à ce cercle." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4089,12 +4085,12 @@ msgstr "Normalement, Cura essaye de raccommoder les petits trous dans le maillag #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Résolution maximum" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Taille minimum d'un segment de ligne après découpage. Si vous augmentez cette valeur, la maille aura une résolution plus faible. Cela peut permettre à l'imprimante de suivre la vitesse à laquelle elle doit traiter le G-Code et augmentera la vitesse de découpe en enlevant des détails de la maille que l'imprimante ne peut pas traiter de toute manière." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4129,12 +4125,12 @@ msgstr "Passe aux volumes d'intersection de maille qui appartiennent à chaque c #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Supprimer les premières couches vides" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Supprimer les couches vides sous la première couche imprimée si elles sont présentes. Le fait de désactiver ce paramètre peut entraîner l'apparition de premières couches vides si le paramètre Tolérance à la découpe est défini sur Exclusif ou Milieu." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4664,22 +4660,22 @@ msgstr "Distance moyenne entre les points ajoutés aléatoirement sur chaque seg #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Décalage d'extrusion max. pour compensation du débit" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Distance de compensation maximum en mm." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Facteur de compensation du débit" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Facteur de multiplication pour le débit -> translation de la distance." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4831,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\n" -"Cela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." +msgstr "Distance d’un déplacement ascendant qui est extrudé à mi-vitesse.\nCela peut permettre une meilleure adhérence aux couches précédentes sans surchauffer le matériau dans ces couches. Uniquement applicable à l'impression filaire." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index ae81a507bd..8a37f992dd 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -91,7 +91,7 @@ msgstr "File inviato a Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Apri Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "Impossibile avviare un nuovo processo di stampa perché la stampante è #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Stampante non disponibile" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Collega tramite rete" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Sono disponibili nuove funzioni per la {machine_name}! Si consiglia di aggiornare il firmware sulla stampante." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Nuovo firmware %s disponibile" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Modalità di aggiornamento" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "Errore durante l'avvio di %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Vista simulazione" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Cura non visualizza in modo accurato gli strati se la funzione Wire Prin #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Vista simulazione" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Impossibile eseguire il sezionamento con le impostazioni attuali. Le seg #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Impossibile eseguire il sezionamento a causa di alcune impostazioni per modello. Le seguenti impostazioni presentano errori su uno o più modelli: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Configura impostazioni per modello" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Installazione" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Impossibile copiare i file di plugin Siemens NX. Controllare UGII_USER_DIR. Non è assegnato ad alcuna directory." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Installato correttamente plugin Siemens NX Cura." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Impossibile copiare i file di plugin Siemens NX. Controllare UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Impossibile installare plugin Siemens NX. Impossibile impostare la variabile di ambiente UGII_USER_DIR per Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Altro" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Sconosciuto" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Materiale personalizzato" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Globale" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Non sottoposto a override" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Profilo esportato su {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Esportazione riuscita" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Si è verificata un'eccezione irreversibile. Si prega di inviarci questo crash report per risolvere il problema

    \n

    Utilizzare il pulsante \"Invia report\" per inviare un report sui bug automaticamente ai nostri server

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Informazioni di sistema" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Sconosciuto" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Versione Cura: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Piattaforma: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Versione Qt: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Versione PyQt: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Versione OpenGL: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Fornitore OpenGL: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • Renderer OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Analisi eccezione" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Registri" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Descrizione utente" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Invia report" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "Impossibile aprire altri file durante il caricamento del codice G. Impor #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Il modello selezionato è troppo piccolo per il caricamento." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n" -"\n" -"Selezionare la stampante dall’elenco seguente:" +msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n\nSelezionare la stampante dall’elenco seguente:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1 non è configurata per supportare la connessione di un gruppo di stam #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Apre la pagina processi di stampa con il browser web predefinito." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Persa connessione con la stampante" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Disabilitato" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Terminato" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "In pausa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Ripresa" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Tipo di linea" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Velocità di alimentazione" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Spessore strato" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "Parete interna" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "max" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 su %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Il caricamento di un progetto annulla tutti i modelli sul piano di stampa." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Questo plugin contiene una licenza.\nÈ necessario accettare questa licenza per poter installare il plugin.\nAccetti i termini sotto riportati?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Non accetto" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Contratto di licenza" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Sono state personalizzate alcune impostazioni del profilo.\n" -"Mantenere o eliminare tali impostazioni?" +msgstr "Sono state personalizzate alcune impostazioni del profilo.\nMantenere o eliminare tali impostazioni?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "Informazioni su Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "versione: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\n" -"Cura è orgogliosa di utilizzare i seguenti progetti open source:" +msgstr "Cura è stato sviluppato da Ultimaker B.V. in cooperazione con la comunità.\nCura è orgogliosa di utilizzare i seguenti progetti open source:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Libreria ritaglio poligono" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Libreria Python HTTP" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Profilo:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Nessun profilo disponibile" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n" -"\n" -"Fare clic per aprire la gestione profili." +msgstr "Alcuni valori di impostazione/esclusione sono diversi dai valori memorizzati nel profilo.\n\nFare clic per aprire la gestione profili." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n" -"\n" -"Fare clic per rendere visibili queste impostazioni." +msgstr "Alcune impostazioni nascoste utilizzano valori diversi dal proprio valore normale calcolato.\n\nFare clic per rendere visibili queste impostazioni." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Questa impostazione ha un valore diverso dal profilo.\n" -"\n" -"Fare clic per ripristinare il valore del profilo." +msgstr "Questa impostazione ha un valore diverso dal profilo.\n\nFare clic per ripristinare il valore del profilo." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n" -"\n" -"Fare clic per ripristinare il valore calcolato." +msgstr "Questa impostazione normalmente viene calcolata, ma attualmente ha impostato un valore assoluto.\n\nFare clic per ripristinare il valore calcolato." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Impostazione di stampa disabilitata\n" -"I file codice G non possono essere modificati" +msgstr "Impostazione di stampa disabilitata\nI file codice G non possono essere modificati" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Indicazione del tempo
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Indicazione di costo" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Totale:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Riscalda il piano prima della stampa. È possibile continuare a regolare #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Comando stampante" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Posizione Jog" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Distanza Jog" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "E&sci" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Ripristina la posizione della telecamera" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Importa tutto come modelli" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Altezza dello strato" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Un profilo personalizzato è attualmente attivo. Per attivare il cursore qualità, selezionare un profilo di qualità predefinito nella scheda Personalizza" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Più veloce" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Sono state modificate alcune impostazioni del profilo. Per modificarle, andare alla modalità personalizzata." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Materiale" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Controllo compatibilità" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "Integrazione SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Fornisce la vista di simulazione." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Vista simulazione" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "Aggiornamento della versione da 2.7 a 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Aggiorna le configurazioni da Cura 3.0 a Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Aggiornamento della versione da 3.0 a 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Utilità impostazioni per modello" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Consente di installare un pulsante 'Esporta in Cura' in Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Integrazione Siemens NX" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "Writer 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Chiedere una volta all'utente se accetta la nostra licenza" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "Contratto di licenza" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po index bfb6ef876b..ec3c8051cf 100644 --- a/resources/i18n/it_IT/fdmextruder.def.json.po +++ b/resources/i18n/it_IT/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:31+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index 112065dc28..5fb7743130 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Italian\n" "Language: it_IT\n" @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire all’avvio, separati da \n" -"." +msgstr "I comandi codice G da eseguire all’avvio, separati da \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"I comandi codice G da eseguire alla fine, separati da \n" -"." +msgstr "I comandi codice G da eseguire alla fine, separati da \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -612,27 +608,27 @@ msgstr "Indica l’altezza dello strato iniziale in mm. Uno strato iniziale più #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Tolleranza di sezionamento" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Modalità di sezionamento di strati con superfici diagonali. Le aree di uno strato possono essere generate in base al punto in cui la parte intermedia dello strato interseca la superficie (intermedia). In alternativa le aree di ciascuno strato possono ricadere all'interno del volume per tutta l'altezza dello strato (Esclusiva) ovvero possono cadere in qualsiasi punto all'interno dello strato (Inclusiva). La tolleranza esclusiva mantiene il maggior numero di dettagli, la tolleranza inclusiva è la più idonea, mentre la tolleranza intermedia richiede il minor tempo di processo." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Intermedia" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Esclusiva" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusiva" #: fdmprinter.def.json msgctxt "line_width label" @@ -807,7 +803,7 @@ msgstr "Treno estrusore utilizzato per stampare la parete esterna. Si utilizza n #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Estrusore parete interna" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1387,7 +1383,7 @@ msgstr "Configurazione di riempimento" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Configurazione del materiale di riempimento della stampa. Il riempimento a linea e a zig zag cambia direzione su strati alternati, riducendo il costo del materiale. Le configurazioni a griglia, a triangolo, tri-esagonali, cubiche, ottagonali, a quarto di cubo, incrociate e concentriche sono stampate completamente su ogni strato. Le configurazioni cubiche, a quarto di cubo e ottagonali variano per ciascuno strato per garantire una più uniforme distribuzione della forza in ogni direzione." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1407,7 +1403,7 @@ msgstr "Triangoli" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Tri-esagonale" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1462,7 +1458,7 @@ msgstr "Collegamento delle linee di riempimento" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Collegare le estremità nel punto in cui il riempimento incontra la parete interna utilizzando una linea che segue la forma della parete interna. L'abilitazione di questa impostazione può far meglio aderire il riempimento alle pareti riducendo nel contempo gli effetti del riempimento sulla qualità delle superfici verticali. La disabilitazione di questa impostazione consente di ridurre la quantità di materiale utilizzato." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1477,22 +1473,22 @@ msgstr "Un elenco di direzioni linee intere. Gli elementi dall’elenco sono uti #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Offset X riempimento" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Il riempimento si scosta di questa distanza lungo l'asse X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Offset Y riempimento" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Il riempimento si scosta di questa distanza lungo l'asse Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1807,22 +1803,22 @@ msgstr "Regolare il diametro del filamento utilizzato. Abbinare questo valore al #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Tendenza di adesione" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Tendenza di adesione superficiale." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Energia superficiale" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Energia superficiale." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3554,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "Indica la distanza orizzontale tra lo skirt ed il primo strato della stampa.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3614,7 +3610,7 @@ msgstr "Smoothing raft" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Questa impostazione controlla l'entità dell'arrotondamento degli angoli interni sul profilo raft. Gli angoli interni vengono arrotondati a semicerchio con un raggio pari al valore indicato. Questa impostazione elimina inoltre i fori sul profilo raft più piccoli di tale cerchio." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4089,12 +4085,12 @@ msgstr "Di norma Cura cerca di \"ricucire\" piccoli fori nella maglia e di rimuo #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Risoluzione massima" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "La dimensione minima di un segmento di linea dopo il sezionamento. Se tale dimensione aumenta, la maglia avrà una risoluzione inferiore. Questo può consentire alla stampante di mantenere la velocità per processare il g-code ed aumenterà la velocità di sezionamento eliminando i dettagli della maglia che non è comunque in grado di processare." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4129,12 +4125,12 @@ msgstr "Selezionare quali volumi di intersezione maglie appartengono a ciascuno #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Rimuovere i primi strati vuoti" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Rimuovere gli strati vuoti sotto il primo strato stampato, se presenti. La disabilitazione di questa impostazione può provocare la presenza di primi strati vuoti, se l'impostazione di Tolleranza di sezionamento è impostata su Esclusiva o Intermedia." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4664,22 +4660,22 @@ msgstr "Indica la distanza media tra i punti casuali introdotti su ciascun segme #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Offset massimo dell'estrusione di compensazione del flusso" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "La massima distanza in mm da compensare." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Fattore di compensazione del flusso" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Il fattore di moltiplicazione per il flusso -> traslazione distanza." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4831,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\n" -"Ciò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." +msgstr "Indica la distanza di uno spostamento verso l'alto con estrusione a velocità dimezzata.\nCiò può garantire una migliore adesione agli strati precedenti, senza eccessivo riscaldamento del materiale su questi strati. Applicabile solo alla funzione Wire Printing." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 329a844eb0..f2c10b77bb 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-11-17 15:52+0100\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: \n" "Language-Team: TEAM\n" "Language: xx_XX\n" @@ -93,7 +93,7 @@ msgstr "Doodle3D Connectにファイル送信完了" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Connectを開いています..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -145,7 +145,7 @@ msgstr "新しいプリントジョブをはじめることができません。 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "プリンターが利用できません" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -597,7 +597,7 @@ msgstr "ネットワーク上にて接続" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "{machine_name} で利用可能な新しい機能があります。プリンターのファームウェアをアップデートしてください。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -608,7 +608,7 @@ msgstr "新しい利用可能な%sファームウェアのアップデートが #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "アップデートの仕方" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -643,7 +643,7 @@ msgstr "%sを開始中にエラーが発生" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "シミュレーションビュー" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -653,7 +653,7 @@ msgstr "Curaはワイヤープリンティング設定中には正確にレイ #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "シミュレーションビュー" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -734,7 +734,7 @@ msgstr "現在の設定でスライスが完了できません。以下の設定 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "モデル別の設定があるためスライスできません。1つまたは複数のモデルで以下の設定にエラーが発生しました:{error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -769,25 +769,25 @@ msgstr "各モデル構成設定" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "インストール" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Siemens NXプラグインファイルのコピーに失敗しました。UGII_USER_DIRを確認してください。ディレクトリに割り当てられていません。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Curaプラグインを正常にインストールしました。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Siemens NXプラグインファイルのコピーに失敗しました。UGII_USER_DIRを確認してください。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Siemens NXプラグインのインストールに失敗しました。Siemens NX用の環境変数UGII_USER_DIRが設定できませんでした。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -950,7 +950,7 @@ msgstr "他" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "不明" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1015,12 +1015,12 @@ msgstr "カスタムフィラメント" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "グローバル" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "上書きできません" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1069,7 +1069,7 @@ msgstr "{0}にプロファイルを書き出しました。 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "書き出し完了" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1141,85 +1141,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    致命的な例外が発生しました。問題解決のためこのクラッシュレポートを送信してください

    \n

    「レポート送信」ボタンを使用してバグレポートが自動的にサーバーに送られるようにしてください

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "システム情報" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "不明" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Curaバージョン: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "プラットフォーム: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qtバージョン: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQtバージョン: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGLバージョン: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGLベンダー: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGLレンダラー: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "例外トレースバック" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "ログ" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "ユーザー詳細" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "レポート送信" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1257,7 +1257,7 @@ msgstr "G-codeを読み込み中は他のファイルを開くことができま #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "選択したモデルは読み込むのに小さすぎます。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1632,7 +1632,7 @@ msgstr "%1は、繋がっているUltimaker3プリンターのグループをホ #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "デフォルトのウェブブラウザで印刷ジョブページを開きます。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1667,7 +1667,7 @@ msgstr "プリンターへの接続が切断されました。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "無効" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1682,12 +1682,12 @@ msgstr "終了" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "一時停止" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "再開" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1829,12 +1829,12 @@ msgstr "ラインタイプ" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "送り速度" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "レイヤーの厚さ" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1884,12 +1884,12 @@ msgstr "インナーウォール" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "最小" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "最大" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2129,7 +2129,7 @@ msgstr "%2のうち%1" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "プロジェクトを読み込むとビルドプレート上のすべてのモデルがクリアされます。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2172,7 +2172,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "このプラグインにはライセンスが含まれています。\nこのプラグインをインストールするにはこのライセンスに同意する必要があります。\n下の利用規約に同意しますか?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2187,7 +2187,7 @@ msgstr "拒否する" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "ユーザー用使用許諾契約" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -3071,7 +3071,7 @@ msgstr "Curaについて" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "バージョン: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3168,7 +3168,7 @@ msgstr "ポリゴンクリッピングライブラリー" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Python HTTPライブラリー" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3188,7 +3188,7 @@ msgstr "プロファイル:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "利用可能なプロファイルがありません" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3196,9 +3196,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"いくらかの設定プロファイルにある値とことなる場合無効にします。\n" -"プロファイルマネージャーをクリックして開いてください。" +msgstr "いくらかの設定プロファイルにある値とことなる場合無効にします。\nプロファイルマネージャーをクリックして開いてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3236,9 +3234,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n" -"表示されるようにクリックしてください。" +msgstr "いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n表示されるようにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,9 +3262,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"この設定にプロファイルと異なった値があります。\n" -"プロファイルの値を戻すためにクリックしてください。" +msgstr "この設定にプロファイルと異なった値があります。\nプロファイルの値を戻すためにクリックしてください。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3276,9 +3270,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"このセッティングは通常計算されます、今は絶対値に固定されています。\n" -"計算された値に変更するためにクリックを押してください。" +msgstr "このセッティングは通常計算されます、今は絶対値に固定されています。\n計算された値に変更するためにクリックを押してください。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3290,51 +3282,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"プリントセットアップが無効\n" -"G-codeファイルを修正することができません。" +msgstr "プリントセットアップが無効\nG-codeファイルを修正することができません。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00時間 00分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "時間仕様
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "コスト仕様" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "合計:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3366,14 +3356,14 @@ msgstr "自動選択: %1" msgctxt "@label" msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" -msgstr[0] "" +msgstr[0] "選択したモデルで印刷:" # can’t eneter japanese texts #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "" +msgstr[0] "選択した複数のモデル" #: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 msgctxt "@label" @@ -3459,27 +3449,27 @@ msgstr "プリント開始前にベッドを加熱します。加熱中もプリ #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "プリンターコントロール" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "ジョグの位置" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "ジョグの距離" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3524,7 +3514,7 @@ msgstr "&やめる" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&カメラ位置のリセット" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3586,21 +3576,21 @@ msgstr "アバウト..." msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" -msgstr[0] "" +msgstr[0] "&選択したモデルを削除" # can’t enter japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" -msgstr[0] "" +msgstr[0] "選択したモデルを中央に移動" # can’t edit japanese text #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" -msgstr[0] "" +msgstr[0] "選択した複数のモデル" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" @@ -3766,7 +3756,7 @@ msgstr "すべてをモデルとして取り入れる" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3923,7 +3913,7 @@ msgstr "レイヤーの高さ" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "カスタムプロファイルが有効になっています。品質スライダーを有効にするには、カスタムタブでデフォルトの品質プロファイルを選択してください" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3943,7 +3933,7 @@ msgstr "早く" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "プロファイルの設定がいくつか変更されました。変更を有効にするにはカスタムモードに移動してください。" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4035,7 +4025,7 @@ msgstr "フィラメント" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "互換性の確認" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4175,12 +4165,12 @@ msgstr "ソリッドワークスインタグレーション" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "シミュレーションビューを提供します。" #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "シミュレーションビュー" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4265,12 +4255,12 @@ msgstr "2.7から3.0にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Cura 3.0からCura 3.1のコンフィグレーションアップグレート" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "3.0から3.1にバージョンアップグレート" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4335,12 +4325,12 @@ msgstr "各モデル設定ツール" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Siemens NXの「Curaにエクスポート」ボタンをインストールできるようにします。" #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4405,12 +4395,12 @@ msgstr "3MFリーダー" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "ライセンスに同意するかどうかユーザーに1回だけ確認する" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po index 392cde1aad..d1ff38fcf2 100644 --- a/resources/i18n/ja_JP/fdmextruder.def.json.po +++ b/resources/i18n/ja_JP/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-10-02 17:55+0900\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ja_JP\n" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 235b9ef64e..56ba768bc9 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-10-04 14:30+0900\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ja_JP\n" @@ -21,7 +21,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "machine_settings label" msgid "Machine" -msgstr "" +msgstr "プリンター" # msgstr "プリンター" #: fdmprinter.def.json @@ -32,7 +32,7 @@ msgstr "プリンター詳細設定" #: fdmprinter.def.json msgctxt "machine_name label" msgid "Machine Type" -msgstr "" +msgstr "プリンターのタイプ" # msgstr "プリンタータイプ" #: fdmprinter.def.json @@ -43,7 +43,7 @@ msgstr "3Dプリンターの機種名" #: fdmprinter.def.json msgctxt "machine_show_variants label" msgid "Show Machine Variants" -msgstr "" +msgstr "プリンターのバリエーションの表示" # msgstr "プリンターのバリエーションを表示する" #: fdmprinter.def.json @@ -54,7 +54,7 @@ msgstr "このプリンターのバリエーションを表示するかどうか #: fdmprinter.def.json msgctxt "machine_start_gcode label" msgid "Start GCode" -msgstr "" +msgstr "GCode開始" # msgstr "GCodeを開始する" #: fdmprinter.def.json @@ -62,14 +62,12 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Gcodeのコマンドは −で始まり\n" -"で区切られます。" +msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" #: fdmprinter.def.json msgctxt "machine_end_gcode label" msgid "End GCode" -msgstr "" +msgstr "GCode終了" # msgstr "GCodeを終了する" #: fdmprinter.def.json @@ -77,14 +75,12 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Gcodeのコマンドは −で始まり\n" -"で区切られます。" +msgstr "Gcodeのコマンドは −で始まり\nで区切られます。" #: fdmprinter.def.json msgctxt "material_guid label" msgid "Material GUID" -msgstr "" +msgstr "マテリアルGUID" # msgstr "マテリアルGUID" #: fdmprinter.def.json @@ -95,7 +91,7 @@ msgstr "マテリアルのGUID。これは自動的に設定されます。" #: fdmprinter.def.json msgctxt "material_bed_temp_wait label" msgid "Wait for Build Plate Heatup" -msgstr "" +msgstr "ビルドプレート加熱待ち時間" # msgstr "ビルドプレート加熱の待機" #: fdmprinter.def.json @@ -106,7 +102,7 @@ msgstr "開始時にビルドプレートが温度に達するまで待つコマ #: fdmprinter.def.json msgctxt "material_print_temp_wait label" msgid "Wait for Nozzle Heatup" -msgstr "" +msgstr "ノズル加熱待ち時間" # msgstr "ノズル加熱の待機" #: fdmprinter.def.json @@ -117,7 +113,7 @@ msgstr "開始時にノズルの温度が達するまで待つかどうか。" #: fdmprinter.def.json msgctxt "material_print_temp_prepend label" msgid "Include Material Temperatures" -msgstr "" +msgstr "マテリアル温度を含む" # msgstr "マテリアル温度を含む" #: fdmprinter.def.json @@ -128,7 +124,7 @@ msgstr "GCodeの開始時にノズル温度設定を含めるかどうか。 既 #: fdmprinter.def.json msgctxt "material_bed_temp_prepend label" msgid "Include Build Plate Temperature" -msgstr "" +msgstr "ビルドプレート温度を含む" # msgstr "ビルドプレートの温度を含める" #: fdmprinter.def.json @@ -139,7 +135,7 @@ msgstr "GCodeの開始時にビルドプレート温度設定を含めるかど #: fdmprinter.def.json msgctxt "machine_width label" msgid "Machine Width" -msgstr "" +msgstr "プリンターの幅" # msgstr "プリンターの幅" #: fdmprinter.def.json @@ -150,7 +146,7 @@ msgstr "造形可能領域の幅(X方向)。" #: fdmprinter.def.json msgctxt "machine_depth label" msgid "Machine Depth" -msgstr "" +msgstr "プリンターの奥行" # msgstr "プリンターの奥行き" #: fdmprinter.def.json @@ -161,7 +157,7 @@ msgstr "造形可能領域の幅(Y方向)。" #: fdmprinter.def.json msgctxt "machine_shape label" msgid "Build Plate Shape" -msgstr "" +msgstr "ビルドプレートの形状" # msgstr "ビルドプレートの形" #: fdmprinter.def.json @@ -172,19 +168,19 @@ msgstr "造形不可領域を考慮しないビルドプレートの形状。" #: fdmprinter.def.json msgctxt "machine_shape option rectangular" msgid "Rectangular" -msgstr "" +msgstr "長方形" # msgstr "長方形" #: fdmprinter.def.json msgctxt "machine_shape option elliptic" msgid "Elliptic" -msgstr "" +msgstr "楕円形" # msgstr "楕円形" #: fdmprinter.def.json msgctxt "machine_height label" msgid "Machine Height" -msgstr "" +msgstr "プリンターの高さ" # msgstr "プリンターの高さ" #: fdmprinter.def.json @@ -195,7 +191,7 @@ msgstr "造形可能領域の幅(Z方向)。" #: fdmprinter.def.json msgctxt "machine_heated_bed label" msgid "Has Heated Build Plate" -msgstr "" +msgstr "加熱式ビルドプレートあり" # msgstr "加熱したビルドプレート" #: fdmprinter.def.json @@ -206,7 +202,7 @@ msgstr "プリンターに加熱式ビルドプレートが付属しているか #: fdmprinter.def.json msgctxt "machine_center_is_zero label" msgid "Is Center Origin" -msgstr "" +msgstr "中心位置" # msgstr "センター原点" #: fdmprinter.def.json @@ -217,7 +213,7 @@ msgstr "プリンタのゼロポジションのX / Y座標が印刷可能領域 #: fdmprinter.def.json msgctxt "machine_extruder_count label" msgid "Number of Extruders" -msgstr "" +msgstr "エクストルーダーの数" # msgstr "エクストルーダーの数" #: fdmprinter.def.json @@ -228,7 +224,7 @@ msgstr "エクストルーダーの数。エクストルーダーの単位は、 #: fdmprinter.def.json msgctxt "machine_nozzle_tip_outer_diameter label" msgid "Outer nozzle diameter" -msgstr "" +msgstr "ノズル外径" # msgstr "ノズル外径" #: fdmprinter.def.json @@ -239,7 +235,7 @@ msgstr "ノズルの外径。" #: fdmprinter.def.json msgctxt "machine_nozzle_head_distance label" msgid "Nozzle length" -msgstr "" +msgstr "ノズル長さ" # msgstr "ノズルの長さ" #: fdmprinter.def.json @@ -250,7 +246,7 @@ msgstr "ノズル先端とプリントヘッドの最下部との高さの差。 #: fdmprinter.def.json msgctxt "machine_nozzle_expansion_angle label" msgid "Nozzle angle" -msgstr "" +msgstr "ノズル角度" # msgstr "ノズル角度" #: fdmprinter.def.json @@ -261,7 +257,7 @@ msgstr "水平面とノズル直上の円錐部分との間の角度。" #: fdmprinter.def.json msgctxt "machine_heat_zone_length label" msgid "Heat zone length" -msgstr "" +msgstr "ノズル加熱長さ" # msgstr "加熱範囲" #: fdmprinter.def.json @@ -272,7 +268,7 @@ msgstr "ノズルからの熱がフィラメントに伝達される距離。" #: fdmprinter.def.json msgctxt "machine_filament_park_distance label" msgid "Filament Park Distance" -msgstr "" +msgstr "フィラメント留め位置" #: fdmprinter.def.json msgctxt "machine_filament_park_distance description" @@ -282,7 +278,7 @@ msgstr "エクストルーダーが使用していない時、フィラメント #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled label" msgid "Enable Nozzle Temperature Control" -msgstr "" +msgstr "ノズルの温度管理を有効にする" #: fdmprinter.def.json msgctxt "machine_nozzle_temp_enabled description" @@ -292,7 +288,7 @@ msgstr "Curaから温度を制御するかどうか。これをオフにして #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed label" msgid "Heat up speed" -msgstr "" +msgstr "加熱速度" #: fdmprinter.def.json msgctxt "machine_nozzle_heat_up_speed description" @@ -302,7 +298,7 @@ msgstr "ノズルが加熱する速度(℃/ s)は、通常の印刷時温度 #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed label" msgid "Cool down speed" -msgstr "" +msgstr "冷却速度" #: fdmprinter.def.json msgctxt "machine_nozzle_cool_down_speed description" @@ -312,7 +308,7 @@ msgstr "ノズルが冷却される速度(℃/ s)は、通常の印刷温度 #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window label" msgid "Minimal Time Standby Temperature" -msgstr "" +msgstr "スタンバイ温度までの最短時間" #: fdmprinter.def.json msgctxt "machine_min_cool_heat_time_window description" @@ -322,7 +318,7 @@ msgstr "ノズルが冷却される前にエクストルーダーが静止しな #: fdmprinter.def.json msgctxt "machine_gcode_flavor label" msgid "Gcode flavour" -msgstr "" +msgstr "Gcodeフレーバー" #: fdmprinter.def.json msgctxt "machine_gcode_flavor description" @@ -332,60 +328,60 @@ msgstr "生成するGコードの種類" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" msgid "Marlin" -msgstr "" +msgstr "Marlin" # msgstr "Marlin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (Volumetric)" msgid "Marlin (Volumetric)" -msgstr "" +msgstr "Marlin (Volumetric)" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option RepRap (RepRap)" msgid "RepRap" -msgstr "" +msgstr "RepRap" # msgstr "RepRap" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option UltiGCode" msgid "Ultimaker 2" -msgstr "" +msgstr "Ultimaker 2" # msgstr "Ultimaker 2" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Griffin" msgid "Griffin" -msgstr "" +msgstr "Griffin" # msgstr "Griffin" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Makerbot" msgid "Makerbot" -msgstr "" +msgstr "Makerbot" # msgstr "Makerbot" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option BFB" msgid "Bits from Bytes" -msgstr "" +msgstr "Bits from Bytes" # msgstr "Bits from Bytes" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option MACH3" msgid "Mach3" -msgstr "" +msgstr "Mach3" # msgstr "Mach3" #: fdmprinter.def.json msgctxt "machine_gcode_flavor option Repetier" msgid "Repetier" -msgstr "" +msgstr "Repetier" # msgstr "Repetier" #: fdmprinter.def.json msgctxt "machine_disallowed_areas label" msgid "Disallowed areas" -msgstr "" +msgstr "拒否エリア" #: fdmprinter.def.json msgctxt "machine_disallowed_areas description" @@ -395,7 +391,7 @@ msgstr "プリントヘッドの領域を持つポリゴンのリストは入力 #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas label" msgid "Nozzle Disallowed Areas" -msgstr "" +msgstr "ノズル拒否エリア" #: fdmprinter.def.json msgctxt "nozzle_disallowed_areas description" @@ -405,7 +401,7 @@ msgstr "ノズルが入ることができない領域を持つポリゴンのリ #: fdmprinter.def.json msgctxt "machine_head_polygon label" msgid "Machine head polygon" -msgstr "" +msgstr "プリントヘッドポリゴン" #: fdmprinter.def.json msgctxt "machine_head_polygon description" @@ -415,7 +411,7 @@ msgstr "プリントヘッドの2Dシルエット(ファンキャップは除 #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon label" msgid "Machine head & Fan polygon" -msgstr "" +msgstr "プリントヘッドとファンポリゴン" #: fdmprinter.def.json msgctxt "machine_head_with_fans_polygon description" @@ -425,7 +421,7 @@ msgstr "プリントヘッドの2Dシルエット(ファンキャップが含 #: fdmprinter.def.json msgctxt "gantry_height label" msgid "Gantry height" -msgstr "" +msgstr "ガントリー高さ" #: fdmprinter.def.json msgctxt "gantry_height description" @@ -435,7 +431,7 @@ msgstr "ノズルの先端とガントリーシステムの高さの差(X軸 #: fdmprinter.def.json msgctxt "machine_nozzle_id label" msgid "Nozzle ID" -msgstr "" +msgstr "ノズルID" # msgstr "ノズル ID" #: fdmprinter.def.json @@ -446,7 +442,7 @@ msgstr "\"AA 0.4\"や\"BB 0.8\"などのノズルID" #: fdmprinter.def.json msgctxt "machine_nozzle_size label" msgid "Nozzle Diameter" -msgstr "" +msgstr "ノズル内径" #: fdmprinter.def.json msgctxt "machine_nozzle_size description" @@ -456,7 +452,7 @@ msgstr "ノズルの内径。標準以外のノズルを使用する場合は、 #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords label" msgid "Offset With Extruder" -msgstr "" +msgstr "エクストルーダーのオフセット" #: fdmprinter.def.json msgctxt "machine_use_extruder_offset_to_offset_coords description" @@ -466,7 +462,7 @@ msgstr "エクストルーダーのオフセットを座標システムに適用 #: fdmprinter.def.json msgctxt "extruder_prime_pos_z label" msgid "Extruder Prime Z Position" -msgstr "" +msgstr "エクストルーダーのZ座標" #: fdmprinter.def.json msgctxt "extruder_prime_pos_z description" @@ -476,7 +472,7 @@ msgstr "印刷開始時にノズルがポジションを確認するZ座標。" #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs label" msgid "Absolute Extruder Prime Position" -msgstr "" +msgstr "エクストルーダーの絶対位置" #: fdmprinter.def.json msgctxt "extruder_prime_pos_abs description" @@ -486,7 +482,7 @@ msgstr "最後のヘッドの既知位置からではなく、エクストルー #: fdmprinter.def.json msgctxt "machine_max_feedrate_x label" msgid "Maximum Speed X" -msgstr "" +msgstr "最大速度X" #: fdmprinter.def.json msgctxt "machine_max_feedrate_x description" @@ -496,7 +492,7 @@ msgstr "X方向のモーターの最大速度。" #: fdmprinter.def.json msgctxt "machine_max_feedrate_y label" msgid "Maximum Speed Y" -msgstr "" +msgstr "最大速度Y" #: fdmprinter.def.json msgctxt "machine_max_feedrate_y description" @@ -506,7 +502,7 @@ msgstr "Y方向のモーターの最大速度。" #: fdmprinter.def.json msgctxt "machine_max_feedrate_z label" msgid "Maximum Speed Z" -msgstr "" +msgstr "最大速度Z" #: fdmprinter.def.json msgctxt "machine_max_feedrate_z description" @@ -516,7 +512,7 @@ msgstr "Z方向のモーターの最大速度。" #: fdmprinter.def.json msgctxt "machine_max_feedrate_e label" msgid "Maximum Feedrate" -msgstr "" +msgstr "最大送り速度" #: fdmprinter.def.json msgctxt "machine_max_feedrate_e description" @@ -526,7 +522,7 @@ msgstr "フィラメントの最大速度。" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x label" msgid "Maximum Acceleration X" -msgstr "" +msgstr "最大加速度X" #: fdmprinter.def.json msgctxt "machine_max_acceleration_x description" @@ -536,7 +532,7 @@ msgstr "X方向のモーターの最大速度。" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y label" msgid "Maximum Acceleration Y" -msgstr "" +msgstr "最大加速度Y" #: fdmprinter.def.json msgctxt "machine_max_acceleration_y description" @@ -546,7 +542,7 @@ msgstr "Y方向のモーターの最大加速度。" #: fdmprinter.def.json msgctxt "machine_max_acceleration_z label" msgid "Maximum Acceleration Z" -msgstr "" +msgstr "最大加速度Z" #: fdmprinter.def.json msgctxt "machine_max_acceleration_z description" @@ -556,7 +552,7 @@ msgstr "Z方向のモーターの最大加速度。" #: fdmprinter.def.json msgctxt "machine_max_acceleration_e label" msgid "Maximum Filament Acceleration" -msgstr "" +msgstr "フィラメント最大加速度" #: fdmprinter.def.json msgctxt "machine_max_acceleration_e description" @@ -566,7 +562,7 @@ msgstr "フィラメントのモーターの最大加速度。" #: fdmprinter.def.json msgctxt "machine_acceleration label" msgid "Default Acceleration" -msgstr "" +msgstr "デフォルト加速度" #: fdmprinter.def.json msgctxt "machine_acceleration description" @@ -576,7 +572,7 @@ msgstr "プリントヘッド移動のデフォルトの加速度。" #: fdmprinter.def.json msgctxt "machine_max_jerk_xy label" msgid "Default X-Y Jerk" -msgstr "" +msgstr "X-Yデフォルトジャーク" #: fdmprinter.def.json msgctxt "machine_max_jerk_xy description" @@ -586,7 +582,7 @@ msgstr "水平面内での移動のデフォルトジャーク。" #: fdmprinter.def.json msgctxt "machine_max_jerk_z label" msgid "Default Z Jerk" -msgstr "" +msgstr "Zデフォルトジャーク" #: fdmprinter.def.json msgctxt "machine_max_jerk_z description" @@ -596,7 +592,7 @@ msgstr "Z方向のモーターのデフォルトジャーク。" #: fdmprinter.def.json msgctxt "machine_max_jerk_e label" msgid "Default Filament Jerk" -msgstr "" +msgstr "フィラメントデフォルトジャーク" #: fdmprinter.def.json msgctxt "machine_max_jerk_e description" @@ -606,7 +602,7 @@ msgstr "フィラメントのモーターのデフォルトジャーク。" #: fdmprinter.def.json msgctxt "machine_minimum_feedrate label" msgid "Minimum Feedrate" -msgstr "" +msgstr "最小送り速度" #: fdmprinter.def.json msgctxt "machine_minimum_feedrate description" @@ -616,7 +612,7 @@ msgstr "プリントヘッドの最小移動速度。" #: fdmprinter.def.json msgctxt "resolution label" msgid "Quality" -msgstr "" +msgstr "品質" # msgstr "品質" #: fdmprinter.def.json @@ -627,7 +623,7 @@ msgstr "プリントの解像度に影響を与えるすべての設定。これ #: fdmprinter.def.json msgctxt "layer_height label" msgid "Layer Height" -msgstr "" +msgstr "レイヤー高さ" # msgstr "積層ピッチ" #: fdmprinter.def.json @@ -638,7 +634,7 @@ msgstr "各レイヤーの高さ(mm)。値を大きくすると早く印刷 #: fdmprinter.def.json msgctxt "layer_height_0 label" msgid "Initial Layer Height" -msgstr "" +msgstr "初期レイヤー高さ" #: fdmprinter.def.json msgctxt "layer_height_0 description" @@ -648,32 +644,32 @@ msgstr "初期レイヤーの高さ(mm)。厚い初期層はビルドプレ #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "スライス公差" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "表面を斜めにスライスする方法を指定します。レイヤーの領域は、レイヤーの中央がサーフェス(中央)と交差する位置に基づいて生成できます。また、各層は、レイヤーの高さを通してボリュームの内側に収まる領域を持つ(排他)か、またはレイヤー内の任意の場所内に収まる領域を持っています(包括)。排他は最も細かく、包括は最もフィットし、中間は時間がかかります。" #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "中間" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "排他" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "包括" #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" -msgstr "" +msgstr "ライン幅" #: fdmprinter.def.json msgctxt "line_width description" @@ -683,7 +679,7 @@ msgstr "1ラインの幅。一般に、各ラインの幅は、ノズルの幅 #: fdmprinter.def.json msgctxt "wall_line_width label" msgid "Wall Line Width" -msgstr "" +msgstr "ウォールライン幅" #: fdmprinter.def.json msgctxt "wall_line_width description" @@ -693,7 +689,7 @@ msgstr "ウォールラインの幅。" #: fdmprinter.def.json msgctxt "wall_line_width_0 label" msgid "Outer Wall Line Width" -msgstr "" +msgstr "外側ウォールライン幅" #: fdmprinter.def.json msgctxt "wall_line_width_0 description" @@ -703,7 +699,7 @@ msgstr "最も外側のウォールラインの幅。この値を下げると、 #: fdmprinter.def.json msgctxt "wall_line_width_x label" msgid "Inner Wall(s) Line Width" -msgstr "" +msgstr "内側ウォールライン幅" #: fdmprinter.def.json msgctxt "wall_line_width_x description" @@ -713,7 +709,7 @@ msgstr "一番外側のウォールラインを除くすべてのウォールラ #: fdmprinter.def.json msgctxt "roofing_line_width label" msgid "Top Surface Skin Line Width" -msgstr "" +msgstr "最上面のライン幅" # msgstr "上表面スキンの線幅" #: fdmprinter.def.json @@ -724,7 +720,7 @@ msgstr "プリントの上部の 線の幅。" #: fdmprinter.def.json msgctxt "skin_line_width label" msgid "Top/Bottom Line Width" -msgstr "" +msgstr "上下面ライン幅" #: fdmprinter.def.json msgctxt "skin_line_width description" @@ -734,7 +730,7 @@ msgstr "上辺/底辺線のライン幅。" #: fdmprinter.def.json msgctxt "infill_line_width label" msgid "Infill Line Width" -msgstr "" +msgstr "インフィルラインの幅" #: fdmprinter.def.json msgctxt "infill_line_width description" @@ -744,7 +740,7 @@ msgstr "インフィル線の幅。" #: fdmprinter.def.json msgctxt "skirt_brim_line_width label" msgid "Skirt/Brim Line Width" -msgstr "" +msgstr "スカート/ブリムラインの幅" #: fdmprinter.def.json msgctxt "skirt_brim_line_width description" @@ -754,7 +750,7 @@ msgstr "単一のスカートまたはブリムラインの幅。" #: fdmprinter.def.json msgctxt "support_line_width label" msgid "Support Line Width" -msgstr "" +msgstr "サポートライン幅" #: fdmprinter.def.json msgctxt "support_line_width description" @@ -764,7 +760,7 @@ msgstr "単一のサポート構造のライン幅。" #: fdmprinter.def.json msgctxt "support_interface_line_width label" msgid "Support Interface Line Width" -msgstr "" +msgstr "サポート面のライン幅" #: fdmprinter.def.json msgctxt "support_interface_line_width description" @@ -774,7 +770,7 @@ msgstr "サポートのルーフ、フロアのライン幅" #: fdmprinter.def.json msgctxt "support_roof_line_width label" msgid "Support Roof Line Width" -msgstr "" +msgstr "サポートルーフのライン幅" # msgstr "サポートルーフライン幅" #: fdmprinter.def.json @@ -785,7 +781,7 @@ msgstr "サポートルーフのライン一幅。" #: fdmprinter.def.json msgctxt "support_bottom_line_width label" msgid "Support Floor Line Width" -msgstr "" +msgstr "サポートフロアのライン幅" # msgstr "サポートフロアライン幅" #: fdmprinter.def.json @@ -796,7 +792,7 @@ msgstr "サポートのフロアのラインの一幅。" #: fdmprinter.def.json msgctxt "prime_tower_line_width label" msgid "Prime Tower Line Width" -msgstr "" +msgstr "プライムタワーのライン幅" #: fdmprinter.def.json msgctxt "prime_tower_line_width description" @@ -806,7 +802,7 @@ msgstr "単一のプライムタワーラインの幅。" #: fdmprinter.def.json msgctxt "initial_layer_line_width_factor label" msgid "Initial Layer Line Width" -msgstr "" +msgstr "初期レイヤーのライン幅" # msgstr "初期レイヤー線幅" #: fdmprinter.def.json @@ -817,7 +813,7 @@ msgstr "最初のレイヤーに線幅の乗数です。この値を増やすと #: fdmprinter.def.json msgctxt "shell label" msgid "Shell" -msgstr "" +msgstr "外郭" # msgstr "外郭" #: fdmprinter.def.json @@ -828,7 +824,7 @@ msgstr "外郭" #: fdmprinter.def.json msgctxt "wall_extruder_nr label" msgid "Wall Extruder" -msgstr "" +msgstr "ウォールエクストルーダー" #: fdmprinter.def.json msgctxt "wall_extruder_nr description" @@ -838,7 +834,7 @@ msgstr "壁造形用のエクストルーダー。デュアルノズル印刷時 #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" -msgstr "" +msgstr "外壁用エクストルーダー" # msgstr "外側印刷用エクストルーダー" #: fdmprinter.def.json @@ -849,7 +845,7 @@ msgstr "外壁印刷用のエクストルーダー。デュアルノズル印刷 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "内壁用エクストルーダー" # msgstr "内側用エクストルーダー" #: fdmprinter.def.json @@ -860,7 +856,7 @@ msgstr "内壁印刷用のエクストルーダー。デュアルノズル印刷 #: fdmprinter.def.json msgctxt "wall_thickness label" msgid "Wall Thickness" -msgstr "" +msgstr "壁の厚さ" #: fdmprinter.def.json msgctxt "wall_thickness description" @@ -870,7 +866,7 @@ msgstr "壁の厚さ。この値をラインの幅で割ることで壁の数が #: fdmprinter.def.json msgctxt "wall_line_count label" msgid "Wall Line Count" -msgstr "" +msgstr "ウォールライン数" # msgstr "壁の線本数" #: fdmprinter.def.json @@ -881,7 +877,7 @@ msgstr "ウォールの数。厚さから計算された場合、この値は整 #: fdmprinter.def.json msgctxt "wall_0_wipe_dist label" msgid "Outer Wall Wipe Distance" -msgstr "" +msgstr "外壁移動距離" # msgstr "外壁のワイピング距離" #: fdmprinter.def.json @@ -892,7 +888,7 @@ msgstr "外壁の後に挿入された移動の距離はZシームをよりよ #: fdmprinter.def.json msgctxt "roofing_extruder_nr label" msgid "Top Surface Skin Extruder" -msgstr "" +msgstr "上部表面用エクストルーダー" # msgstr "上層表面スキンエクストルーダー" #: fdmprinter.def.json @@ -903,7 +899,7 @@ msgstr "上部の表面印刷用のエクストルーダー。デュアルノズ #: fdmprinter.def.json msgctxt "roofing_layer_count label" msgid "Top Surface Skin Layers" -msgstr "" +msgstr "上部表面レイヤー" # msgstr "上の表皮層" #: fdmprinter.def.json @@ -914,7 +910,7 @@ msgstr "上部表面のレイヤー数。通常一層で綺麗に出来上がり #: fdmprinter.def.json msgctxt "roofing_pattern label" msgid "Top Surface Skin Pattern" -msgstr "" +msgstr "上部表面パターン" # msgstr "上層表面スキンパターン" #: fdmprinter.def.json @@ -925,25 +921,25 @@ msgstr "上層のパターン" #: fdmprinter.def.json msgctxt "roofing_pattern option lines" msgid "Lines" -msgstr "" +msgstr "直線" # msgstr "線" #: fdmprinter.def.json msgctxt "roofing_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心" #: fdmprinter.def.json msgctxt "roofing_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" # msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "roofing_angles label" msgid "Top Surface Skin Line Directions" -msgstr "" +msgstr "最上面のラインの向き" # msgstr "上層表面スキンラインの方向" #: fdmprinter.def.json @@ -954,7 +950,7 @@ msgstr "トップ表面層に縦かジグザグパターンを利用する時に #: fdmprinter.def.json msgctxt "top_bottom_extruder_nr label" msgid "Top/Bottom Extruder" -msgstr "" +msgstr "上部/底面エクストルーダー" # msgstr "トップ/ボトムエクストルーダー" #: fdmprinter.def.json @@ -965,7 +961,7 @@ msgstr "上部と下部の表面を印刷する時に使われるエクストル #: fdmprinter.def.json msgctxt "top_bottom_thickness label" msgid "Top/Bottom Thickness" -msgstr "" +msgstr "上部/底面の厚さ" #: fdmprinter.def.json msgctxt "top_bottom_thickness description" @@ -975,7 +971,7 @@ msgstr "プリント時の最上面、最底面の厚み。これを積層ピッ #: fdmprinter.def.json msgctxt "top_thickness label" msgid "Top Thickness" -msgstr "" +msgstr "上部厚さ" #: fdmprinter.def.json msgctxt "top_thickness description" @@ -985,7 +981,7 @@ msgstr "プリント時の最上面の厚み。これを積層ピッチで割っ #: fdmprinter.def.json msgctxt "top_layers label" msgid "Top Layers" -msgstr "" +msgstr "上部レイヤー" #: fdmprinter.def.json msgctxt "top_layers description" @@ -995,7 +991,7 @@ msgstr "最上面のレイヤー数。トップの厚さを計算する場合、 #: fdmprinter.def.json msgctxt "bottom_thickness label" msgid "Bottom Thickness" -msgstr "" +msgstr "底面厚さ" #: fdmprinter.def.json msgctxt "bottom_thickness description" @@ -1005,7 +1001,7 @@ msgstr "プリント時の最底面の厚み。これを積層ピッチで割っ #: fdmprinter.def.json msgctxt "bottom_layers label" msgid "Bottom Layers" -msgstr "" +msgstr "底面レイヤー" #: fdmprinter.def.json msgctxt "bottom_layers description" @@ -1015,7 +1011,7 @@ msgstr "最底面のレイヤー数。下の厚さで計算すると、この値 #: fdmprinter.def.json msgctxt "top_bottom_pattern label" msgid "Top/Bottom Pattern" -msgstr "" +msgstr "上層/底層パターン" #: fdmprinter.def.json msgctxt "top_bottom_pattern description" @@ -1025,23 +1021,23 @@ msgstr "上層/底層のパターン。" #: fdmprinter.def.json msgctxt "top_bottom_pattern option lines" msgid "Lines" -msgstr "" +msgstr "直線" #: fdmprinter.def.json msgctxt "top_bottom_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心" #: fdmprinter.def.json msgctxt "top_bottom_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 label" msgid "Bottom Pattern Initial Layer" -msgstr "" +msgstr "底層初期レイヤー" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 description" @@ -1051,22 +1047,22 @@ msgstr "第1層のプリントの底部のパターン。" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option lines" msgid "Lines" -msgstr "" +msgstr "直線" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" #: fdmprinter.def.json msgctxt "top_bottom_pattern_0 option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "skin_angles label" msgid "Top/Bottom Line Directions" -msgstr "" +msgstr "上層/底層ラインの向き" #: fdmprinter.def.json msgctxt "skin_angles description" @@ -1076,7 +1072,7 @@ msgstr "上/下のレイヤーが線またはジグザグパターンを使う #: fdmprinter.def.json msgctxt "wall_0_inset label" msgid "Outer Wall Inset" -msgstr "" +msgstr "外壁はめ込み" #: fdmprinter.def.json msgctxt "wall_0_inset description" @@ -1086,7 +1082,7 @@ msgstr "外壁の経路にはめ込む。外壁がノズルよりも小さく、 #: fdmprinter.def.json msgctxt "outer_inset_first label" msgid "Outer Before Inner Walls" -msgstr "" +msgstr "外壁優先" #: fdmprinter.def.json msgctxt "outer_inset_first description" @@ -1096,7 +1092,7 @@ msgstr "有効にすると、壁は外側から内側に順番に印刷します #: fdmprinter.def.json msgctxt "alternate_extra_perimeter label" msgid "Alternate Extra Wall" -msgstr "" +msgstr "代替予備壁" #: fdmprinter.def.json msgctxt "alternate_extra_perimeter description" @@ -1106,7 +1102,7 @@ msgstr "すべてのレイヤーごとに予備の壁を印刷します。この #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled label" msgid "Compensate Wall Overlaps" -msgstr "" +msgstr "壁補正" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_enabled description" @@ -1116,7 +1112,7 @@ msgstr "すでに壁が設置されている部品の壁の流れを補正しま #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled label" msgid "Compensate Outer Wall Overlaps" -msgstr "" +msgstr "外壁補正" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_0_enabled description" @@ -1126,7 +1122,7 @@ msgstr "すでに壁が設置されている場所にプリントされている #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled label" msgid "Compensate Inner Wall Overlaps" -msgstr "" +msgstr "内壁補正" #: fdmprinter.def.json msgctxt "travel_compensate_overlapping_walls_x_enabled description" @@ -1136,7 +1132,7 @@ msgstr "すでに壁が設置されている場所にプリントされている #: fdmprinter.def.json msgctxt "fill_perimeter_gaps label" msgid "Fill Gaps Between Walls" -msgstr "" +msgstr "隙間充填" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps description" @@ -1146,17 +1142,17 @@ msgstr "壁が入らない壁の隙間を埋める。" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option nowhere" msgid "Nowhere" -msgstr "" +msgstr "対象外" #: fdmprinter.def.json msgctxt "fill_perimeter_gaps option everywhere" msgid "Everywhere" -msgstr "" +msgstr "全対象" #: fdmprinter.def.json msgctxt "fill_outline_gaps label" msgid "Print Thin Walls" -msgstr "" +msgstr "薄壁印刷" # msgstr "薄い壁をプリントする" #: fdmprinter.def.json @@ -1167,7 +1163,7 @@ msgstr "ノズルサイズよりも細い壁を作ります" #: fdmprinter.def.json msgctxt "xy_offset label" msgid "Horizontal Expansion" -msgstr "" +msgstr "水平展開" #: fdmprinter.def.json msgctxt "xy_offset description" @@ -1177,7 +1173,7 @@ msgstr "各レイヤーのすべてのポリゴンに適用されるオフセッ #: fdmprinter.def.json msgctxt "xy_offset_layer_0 label" msgid "Initial Layer Horizontal Expansion" -msgstr "" +msgstr "初期層水平展開" # msgstr "初期レイヤー水平方向への展開" #: fdmprinter.def.json @@ -1188,7 +1184,7 @@ msgstr "最初のレイヤーのポリゴンに適用されるオフセットの #: fdmprinter.def.json msgctxt "z_seam_type label" msgid "Z Seam Alignment" -msgstr "" +msgstr "Zシーム合わせ" #: fdmprinter.def.json msgctxt "z_seam_type description" @@ -1198,40 +1194,38 @@ msgstr "レイヤーの経路始点。連続するレイヤー経路が同じポ #: fdmprinter.def.json msgctxt "z_seam_type option back" msgid "User Specified" -msgstr "" +msgstr "ユーザー指定" #: fdmprinter.def.json msgctxt "z_seam_type option shortest" msgid "Shortest" -msgstr "" +msgstr "最短" #: fdmprinter.def.json msgctxt "z_seam_type option random" msgid "Random" -msgstr "" +msgstr "ランダム" #: fdmprinter.def.json msgctxt "z_seam_type option sharpest_corner" msgid "Sharpest Corner" -msgstr "" +msgstr "鋭い角" # msgstr "最も鋭利な角" #: fdmprinter.def.json msgctxt "z_seam_x label" msgid "Z Seam X" -msgstr "" +msgstr "ZシームX" #: fdmprinter.def.json msgctxt "z_seam_x description" msgid "The X coordinate of the position near where to start printing each part in a layer." -msgstr "" -"レイヤー内の各印刷を開始するX座\n" -"標の位置。" +msgstr "レイヤー内の各印刷を開始するX座\n標の位置。" #: fdmprinter.def.json msgctxt "z_seam_y label" msgid "Z Seam Y" -msgstr "" +msgstr "ZシームY" #: fdmprinter.def.json msgctxt "z_seam_y description" @@ -1241,7 +1235,7 @@ msgstr "レイヤー内の各パーツの印刷を開始する場所の近くの #: fdmprinter.def.json msgctxt "z_seam_corner label" msgid "Seam Corner Preference" -msgstr "" +msgstr "シームコーナー設定" # msgstr "薄層のプレファレンス" #: fdmprinter.def.json @@ -1252,31 +1246,31 @@ msgstr "モデル輪郭のコーナーがシーム(縫い目)の位置に影 #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_none" msgid "None" -msgstr "" +msgstr "なし" # msgstr "なし" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_inner" msgid "Hide Seam" -msgstr "" +msgstr "シーム非表示" # msgstr "シームを非表示にする" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_outer" msgid "Expose Seam" -msgstr "" +msgstr "シーム表示" # msgstr "シームを表示する" #: fdmprinter.def.json msgctxt "z_seam_corner option z_seam_corner_any" msgid "Hide or Expose Seam" -msgstr "" +msgstr "シーム表示/非表示" # msgstr "シームを非表示または表示する" #: fdmprinter.def.json msgctxt "z_seam_relative label" msgid "Z Seam Relative" -msgstr "" +msgstr "相対Zシーム" # msgstr "Zシーム関連" #: fdmprinter.def.json @@ -1287,7 +1281,7 @@ msgstr "有効時は、Zシームは各パーツの真ん中に設定されま #: fdmprinter.def.json msgctxt "skin_no_small_gaps_heuristic label" msgid "Ignore Small Z Gaps" -msgstr "" +msgstr "小さいZギャップは無視" # msgstr "小さなZギャップを無視する" #: fdmprinter.def.json @@ -1298,7 +1292,7 @@ msgstr "モデルに垂直方向のギャップが小さくある場合、これ #: fdmprinter.def.json msgctxt "skin_outline_count label" msgid "Extra Skin Wall Count" -msgstr "" +msgstr "外側表面の数" # msgstr "余分な肌壁の本数" #: fdmprinter.def.json @@ -1309,7 +1303,7 @@ msgstr "上部/下部パターンの最も外側の部分を同心円の線で #: fdmprinter.def.json msgctxt "ironing_enabled label" msgid "Enable Ironing" -msgstr "" +msgstr "アイロン有効" # msgstr "アイロンを有効にする" #: fdmprinter.def.json @@ -1320,7 +1314,7 @@ msgstr "ノズルから吐出せずに上部表面を再度動く機能。表面 #: fdmprinter.def.json msgctxt "ironing_only_highest_layer label" msgid "Iron Only Highest Layer" -msgstr "" +msgstr "最上層のみアイロン" # msgstr "上層のみアイロンをかけます" #: fdmprinter.def.json @@ -1331,7 +1325,7 @@ msgstr "メッシュの最後のレイヤーでのみアイロンをかけます #: fdmprinter.def.json msgctxt "ironing_pattern label" msgid "Ironing Pattern" -msgstr "" +msgstr "アイロンパターン" # msgstr "アイロン時のパターン" #: fdmprinter.def.json @@ -1342,19 +1336,19 @@ msgstr "アイロンのパターン" #: fdmprinter.def.json msgctxt "ironing_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心" #: fdmprinter.def.json msgctxt "ironing_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" # msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "ironing_line_spacing label" msgid "Ironing Line Spacing" -msgstr "" +msgstr "アイロン線のスペース" # msgstr "アイロンラインの線隔" #: fdmprinter.def.json @@ -1365,7 +1359,7 @@ msgstr "アイロンライン同士の距離" #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "" +msgstr "アイロンフロー" # msgstr "アイロン時のフロー" #: fdmprinter.def.json @@ -1376,7 +1370,7 @@ msgstr "アイロン時にノズルから出しておくフィラメントの量 #: fdmprinter.def.json msgctxt "ironing_inset label" msgid "Ironing Inset" -msgstr "" +msgstr "アイロンインセット" # msgstr "アイロンを挿入する" #: fdmprinter.def.json @@ -1387,7 +1381,7 @@ msgstr "モデルの端からの距離。端までアイロンをすると、端 #: fdmprinter.def.json msgctxt "speed_ironing label" msgid "Ironing Speed" -msgstr "" +msgstr "アイロン速度" # msgstr "アイロン時のスピード" #: fdmprinter.def.json @@ -1398,7 +1392,7 @@ msgstr "上部表面通過時の速度" #: fdmprinter.def.json msgctxt "acceleration_ironing label" msgid "Ironing Acceleration" -msgstr "" +msgstr "アイロン加速度" # msgstr "アイロン時の加速" #: fdmprinter.def.json @@ -1409,7 +1403,7 @@ msgstr "アイロン時の加速度" #: fdmprinter.def.json msgctxt "jerk_ironing label" msgid "Ironing Jerk" -msgstr "" +msgstr "アイロンジャーク" # msgstr "ジャークをアイロンする" #: fdmprinter.def.json @@ -1420,7 +1414,7 @@ msgstr "アイロン時の最大加速度" #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" -msgstr "" +msgstr "インフィル" # msgstr "インフィル" #: fdmprinter.def.json @@ -1431,7 +1425,7 @@ msgstr "インフィル" #: fdmprinter.def.json msgctxt "infill_extruder_nr label" msgid "Infill Extruder" -msgstr "" +msgstr "インフィルエクストルーダー" # msgstr "インフィルエクストルーダー" #: fdmprinter.def.json @@ -1442,7 +1436,7 @@ msgstr "インフィル造形時に使われるExtruder。デュアルノズル #: fdmprinter.def.json msgctxt "infill_sparse_density label" msgid "Infill Density" -msgstr "" +msgstr "インフィル密度" #: fdmprinter.def.json msgctxt "infill_sparse_density description" @@ -1452,7 +1446,7 @@ msgstr "プリントのインフィルの密度を調整します。" #: fdmprinter.def.json msgctxt "infill_line_distance label" msgid "Infill Line Distance" -msgstr "" +msgstr "インフィルライン距離" #: fdmprinter.def.json msgctxt "infill_line_distance description" @@ -1462,97 +1456,97 @@ msgstr "造形されたインフィルラインの距離。この設定は、イ #: fdmprinter.def.json msgctxt "infill_pattern label" msgid "Infill Pattern" -msgstr "" +msgstr "インフィルパターン" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "印刷用インフィル材料のパターン。代替層のラインとジグザグの面詰めスワップ方向、材料コストを削減します。グリッド、トライアングル、トライ六角、キュービック、オクテット、クォーターキュービック、クロスと同心円のパターンは、すべてのレイヤーを完全に印刷されます。キュービック、クォーターキュービック、オクテットのインフィルは、各レイヤーを変更して各方向の強度をより均等な分布にします。" #: fdmprinter.def.json msgctxt "infill_pattern option grid" msgid "Grid" -msgstr "" +msgstr "グリッド" #: fdmprinter.def.json msgctxt "infill_pattern option lines" msgid "Lines" -msgstr "" +msgstr "ライン" #: fdmprinter.def.json msgctxt "infill_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "トライアングル" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "トライヘキサゴン" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" -msgstr "" +msgstr "キュービック" #: fdmprinter.def.json msgctxt "infill_pattern option cubicsubdiv" msgid "Cubic Subdivision" -msgstr "" +msgstr "キュービックサブディビジョン" #: fdmprinter.def.json msgctxt "infill_pattern option tetrahedral" msgid "Octet" -msgstr "" +msgstr "オクテット" # msgstr "オクテット" #: fdmprinter.def.json msgctxt "infill_pattern option quarter_cubic" msgid "Quarter Cubic" -msgstr "" +msgstr "クォーターキュービック" # msgstr "クォーターキュービック" #: fdmprinter.def.json msgctxt "infill_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心円" #: fdmprinter.def.json msgctxt "infill_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "3D同心円" #: fdmprinter.def.json msgctxt "infill_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "infill_pattern option cross" msgid "Cross" -msgstr "" +msgstr "クロス" # msgstr "クロス" #: fdmprinter.def.json msgctxt "infill_pattern option cross_3d" msgid "Cross 3D" -msgstr "" +msgstr "3Dクロス" # msgstr "クロス3D" #: fdmprinter.def.json msgctxt "zig_zaggify_infill label" msgid "Connect Infill Lines" -msgstr "" +msgstr "インフィルライン接合" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "内壁の形状に沿ったラインを使用してインフィルパターンと内壁が合うところで接合します。この設定を有効にすると、インフィルが壁により密着するようになり、垂直面の品質に対するインフィルの影響が軽減します。この設定を無効にすると、材料の使用量が減ります。" #: fdmprinter.def.json msgctxt "infill_angles label" msgid "Infill Line Directions" -msgstr "" +msgstr "インフィルラインの向き" # msgstr "インフィルラインの方向" #: fdmprinter.def.json @@ -1563,27 +1557,27 @@ msgstr "使用する整数線の方向のリスト。リストの要素は、レ #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "インフィルXオフセット" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "インフィルパターンはX軸に沿ってこの距離を移動します。" #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "インフィルYオフセット" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "インフィルパターンはY軸に沿ってこの距離を移動します。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" -msgstr "" +msgstr "キュービックサブディビジョンシェル" #: fdmprinter.def.json msgctxt "sub_div_rad_add description" @@ -1593,7 +1587,7 @@ msgstr "この立方体を細分するかどうかを決定するために、各 #: fdmprinter.def.json msgctxt "infill_overlap label" msgid "Infill Overlap Percentage" -msgstr "" +msgstr "インフィル公差量" # msgstr "インフィルのオーバーラップ率" #: fdmprinter.def.json @@ -1604,7 +1598,7 @@ msgstr "インフィルと壁が交差する量、わずかな交差によって #: fdmprinter.def.json msgctxt "infill_overlap_mm label" msgid "Infill Overlap" -msgstr "" +msgstr "インフィル公差" # msgstr "インフィルのオーバーラップ" #: fdmprinter.def.json @@ -1615,7 +1609,7 @@ msgstr "インフィルと壁が交差する量、わずかな交差によって #: fdmprinter.def.json msgctxt "skin_overlap label" msgid "Skin Overlap Percentage" -msgstr "" +msgstr "表面公差量" #: fdmprinter.def.json msgctxt "skin_overlap description" @@ -1625,7 +1619,7 @@ msgstr "表面と壁の交わる量。ラインの幅の%で設定。少しの #: fdmprinter.def.json msgctxt "skin_overlap_mm label" msgid "Skin Overlap" -msgstr "" +msgstr "表面公差" # msgstr "スキンオーバーラップ" #: fdmprinter.def.json @@ -1636,7 +1630,7 @@ msgstr "スキンと壁の間の交差した量 わずかなオーバーラッ #: fdmprinter.def.json msgctxt "infill_wipe_dist label" msgid "Infill Wipe Distance" -msgstr "" +msgstr "インフィル移動距離" # msgstr "インフィルWipe距離" #: fdmprinter.def.json @@ -1647,7 +1641,7 @@ msgstr "インフィルラインごとに挿入された移動距離は壁のイ #: fdmprinter.def.json msgctxt "infill_sparse_thickness label" msgid "Infill Layer Thickness" -msgstr "" +msgstr "インフィル層の厚さ" #: fdmprinter.def.json msgctxt "infill_sparse_thickness description" @@ -1657,7 +1651,7 @@ msgstr "インフィルマテリアルの層ごとの厚さ。この値は常に #: fdmprinter.def.json msgctxt "gradual_infill_steps label" msgid "Gradual Infill Steps" -msgstr "" +msgstr "インフィル半減回数" #: fdmprinter.def.json msgctxt "gradual_infill_steps description" @@ -1667,7 +1661,7 @@ msgstr "天井面の表面に近づく際にインフィル密度が半減する #: fdmprinter.def.json msgctxt "gradual_infill_step_height label" msgid "Gradual Infill Step Height" -msgstr "" +msgstr "インフィル半減高さ" #: fdmprinter.def.json msgctxt "gradual_infill_step_height description" @@ -1677,19 +1671,17 @@ msgstr "密度が半分に切り替わる前の所定のインフィルの高さ #: fdmprinter.def.json msgctxt "infill_before_walls label" msgid "Infill Before Walls" -msgstr "" +msgstr "インフィル優先" #: fdmprinter.def.json msgctxt "infill_before_walls description" msgid "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface." -msgstr "" -"壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\n" -"はじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" +msgstr "壁より前にインフィルをプリントします はじめに壁をプリントするとより精密な壁になりますが、オーバーハングのプリントは悪化します\nはじめにインフィルをプリントすると丈夫な壁になりますが、インフィルの模様が時折表面から透けて表れます" #: fdmprinter.def.json msgctxt "min_infill_area label" msgid "Minimum Infill Area" -msgstr "" +msgstr "最小インフィル領域" #: fdmprinter.def.json msgctxt "min_infill_area description" @@ -1699,7 +1691,7 @@ msgstr "これより小さいインフィルの領域を生成しないでくだ #: fdmprinter.def.json msgctxt "skin_preshrink label" msgid "Skin Removal Width" -msgstr "" +msgstr "表面除去幅" # msgstr "スキン除去幅" #: fdmprinter.def.json @@ -1710,7 +1702,7 @@ msgstr "取り除くスキンエリアの最大幅。この値より小さいす #: fdmprinter.def.json msgctxt "top_skin_preshrink label" msgid "Top Skin Removal Width" -msgstr "" +msgstr "上面除去幅" # msgstr "トップスキン除去幅" #: fdmprinter.def.json @@ -1721,7 +1713,7 @@ msgstr "取り除くスキンエリアの最大幅。この値より小さいす #: fdmprinter.def.json msgctxt "bottom_skin_preshrink label" msgid "Bottom Skin Removal Width" -msgstr "" +msgstr "底面除去幅" # msgstr "ボトムのスキン除去幅" #: fdmprinter.def.json @@ -1732,7 +1724,7 @@ msgstr "取り除くスキンエリアの最大幅。この値より小さいす #: fdmprinter.def.json msgctxt "expand_skins_expand_distance label" msgid "Skin Expand Distance" -msgstr "" +msgstr "表面展開距離" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" @@ -1742,7 +1734,7 @@ msgstr "スキンがインフィルまで到達する距離です。高い数値 #: fdmprinter.def.json msgctxt "top_skin_expand_distance label" msgid "Top Skin Expand Distance" -msgstr "" +msgstr "上面展開距離" # msgstr "トップのスキンの展開距離" #: fdmprinter.def.json @@ -1753,7 +1745,7 @@ msgstr "スキンがインフィルまで到達する距離です。高い数値 #: fdmprinter.def.json msgctxt "bottom_skin_expand_distance label" msgid "Bottom Skin Expand Distance" -msgstr "" +msgstr "底面展開距離" # msgstr "ボトムのスキンの展開距離" #: fdmprinter.def.json @@ -1764,7 +1756,7 @@ msgstr "スキンがインフィルまで到達する距離です。高い数値 #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion label" msgid "Maximum Skin Angle for Expansion" -msgstr "" +msgstr "表面展開最大角" #: fdmprinter.def.json msgctxt "max_skin_angle_for_expansion description" @@ -1774,7 +1766,7 @@ msgstr "この設定より大きい角を持つオブジェクトの上部また #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion label" msgid "Minimum Skin Width for Expansion" -msgstr "" +msgstr "表面展開最小角" #: fdmprinter.def.json msgctxt "min_skin_width_for_expansion description" @@ -1784,7 +1776,7 @@ msgstr "これより狭いスキン領域は展開されません。モデル表 #: fdmprinter.def.json msgctxt "material label" msgid "Material" -msgstr "" +msgstr "マテリアル" #: fdmprinter.def.json msgctxt "material description" @@ -1794,7 +1786,7 @@ msgstr "マテリアル" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature label" msgid "Auto Temperature" -msgstr "" +msgstr "自動温度" #: fdmprinter.def.json msgctxt "material_flow_dependent_temperature description" @@ -1804,7 +1796,7 @@ msgstr "その画層の平均流速で自動的にレイヤーごとに温度を #: fdmprinter.def.json msgctxt "default_material_print_temperature label" msgid "Default Printing Temperature" -msgstr "" +msgstr "デフォルト印刷温度" #: fdmprinter.def.json msgctxt "default_material_print_temperature description" @@ -1814,7 +1806,7 @@ msgstr "印刷中のデフォルトの温度。これはマテリアルの基本 #: fdmprinter.def.json msgctxt "material_print_temperature label" msgid "Printing Temperature" -msgstr "" +msgstr "印刷温度" #: fdmprinter.def.json msgctxt "material_print_temperature description" @@ -1824,7 +1816,7 @@ msgstr "印刷中の温度。" #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 label" msgid "Printing Temperature Initial Layer" -msgstr "" +msgstr "初期レイヤー印刷温度" #: fdmprinter.def.json msgctxt "material_print_temperature_layer_0 description" @@ -1834,7 +1826,7 @@ msgstr "最初のレイヤーを印刷する温度。初期レイヤーのみ特 #: fdmprinter.def.json msgctxt "material_initial_print_temperature label" msgid "Initial Printing Temperature" -msgstr "" +msgstr "初期印刷温度" #: fdmprinter.def.json msgctxt "material_initial_print_temperature description" @@ -1844,7 +1836,7 @@ msgstr "加熱中、印刷を開始することができる最低の温度。" #: fdmprinter.def.json msgctxt "material_final_print_temperature label" msgid "Final Printing Temperature" -msgstr "" +msgstr "最終印刷温度" #: fdmprinter.def.json msgctxt "material_final_print_temperature description" @@ -1854,7 +1846,7 @@ msgstr "印刷終了直前に冷却を開始する温度。" #: fdmprinter.def.json msgctxt "material_flow_temp_graph label" msgid "Flow Temperature Graph" -msgstr "" +msgstr "フロー温度グラフ" #: fdmprinter.def.json msgctxt "material_flow_temp_graph description" @@ -1864,7 +1856,7 @@ msgstr "マテリアルフロー(毎秒 3mm) と温度 (° c) をリンクしま #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed label" msgid "Extrusion Cool Down Speed Modifier" -msgstr "" +msgstr "押出クールダウン速度修飾子" #: fdmprinter.def.json msgctxt "material_extrusion_cool_down_speed description" @@ -1874,7 +1866,7 @@ msgstr "印刷中にノズルが冷える際の速度。同じ値が、加熱す #: fdmprinter.def.json msgctxt "material_bed_temperature label" msgid "Build Plate Temperature" -msgstr "" +msgstr "ビルドプレート温度" #: fdmprinter.def.json msgctxt "material_bed_temperature description" @@ -1884,7 +1876,7 @@ msgstr "加熱式ビルドプレート温度。これが 0 の場合、ベッド #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 label" msgid "Build Plate Temperature Initial Layer" -msgstr "" +msgstr "初期レイヤーのビルドプレート温度" #: fdmprinter.def.json msgctxt "material_bed_temperature_layer_0 description" @@ -1894,7 +1886,7 @@ msgstr "最初のレイヤー印刷時のビルドプレートの温度。" #: fdmprinter.def.json msgctxt "material_diameter label" msgid "Diameter" -msgstr "" +msgstr "直径" #: fdmprinter.def.json msgctxt "material_diameter description" @@ -1904,27 +1896,27 @@ msgstr "使用するフィラメントの太さの調整 この値を使用す #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "接着傾向" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "表面の接着傾向。" #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "表面エネルギー" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "表面エネルギー。" #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" -msgstr "" +msgstr "フロー" #: fdmprinter.def.json msgctxt "material_flow description" @@ -1934,7 +1926,7 @@ msgstr "流れの補修: 押出されるマテリアルの量は、この値か #: fdmprinter.def.json msgctxt "retraction_enable label" msgid "Enable Retraction" -msgstr "" +msgstr "引き戻し有効" #: fdmprinter.def.json msgctxt "retraction_enable description" @@ -1944,7 +1936,7 @@ msgstr "ノズルが印刷しないで良い領域を移動する際にフィラ #: fdmprinter.def.json msgctxt "retract_at_layer_change label" msgid "Retract at Layer Change" -msgstr "" +msgstr "レイヤー変更時に引き戻す" #: fdmprinter.def.json msgctxt "retract_at_layer_change description" @@ -1954,7 +1946,7 @@ msgstr "ノズルは次の層に移動するときフィラメントを引き戻 #: fdmprinter.def.json msgctxt "retraction_amount label" msgid "Retraction Distance" -msgstr "" +msgstr "引き戻し距離" #: fdmprinter.def.json msgctxt "retraction_amount description" @@ -1964,7 +1956,7 @@ msgstr "引き戻されるマテリアルの長さ" #: fdmprinter.def.json msgctxt "retraction_speed label" msgid "Retraction Speed" -msgstr "" +msgstr "引き戻し速度" #: fdmprinter.def.json #, fuzzy @@ -1975,7 +1967,7 @@ msgstr "フィラメントが引き戻される時のスピード" #: fdmprinter.def.json msgctxt "retraction_retract_speed label" msgid "Retraction Retract Speed" -msgstr "" +msgstr "引き戻し速度の取り消し" #: fdmprinter.def.json #, fuzzy @@ -1986,7 +1978,7 @@ msgstr "フィラメントが引き戻される時のスピード" #: fdmprinter.def.json msgctxt "retraction_prime_speed label" msgid "Retraction Prime Speed" -msgstr "" +msgstr "押し戻し速度の取り消し" #: fdmprinter.def.json #, fuzzy @@ -1997,7 +1989,7 @@ msgstr "フィラメントが引き戻される時のスピード" #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount label" msgid "Retraction Extra Prime Amount" -msgstr "" +msgstr "余分な押し戻し量の引き戻し" #: fdmprinter.def.json msgctxt "retraction_extra_prime_amount description" @@ -2007,7 +1999,7 @@ msgstr "マテリアルによっては、移動中に滲み出てきてしまう #: fdmprinter.def.json msgctxt "retraction_min_travel label" msgid "Retraction Minimum Travel" -msgstr "" +msgstr "引き戻し最小移動距離" #: fdmprinter.def.json msgctxt "retraction_min_travel description" @@ -2017,7 +2009,7 @@ msgstr "フィラメントを引き戻す際に必要な最小移動距離。こ #: fdmprinter.def.json msgctxt "retraction_count_max label" msgid "Maximum Retraction Count" -msgstr "" +msgstr "最大引き戻し回数" #: fdmprinter.def.json msgctxt "retraction_count_max description" @@ -2027,7 +2019,7 @@ msgstr "この設定は、決められた距離の中で起こる引き戻しの #: fdmprinter.def.json msgctxt "retraction_extrusion_window label" msgid "Minimum Extrusion Distance Window" -msgstr "" +msgstr "最小抽出距離範囲" #: fdmprinter.def.json msgctxt "retraction_extrusion_window description" @@ -2037,7 +2029,7 @@ msgstr "最大の引き戻し回数。この値は引き戻す距離と同じで #: fdmprinter.def.json msgctxt "material_standby_temperature label" msgid "Standby Temperature" -msgstr "" +msgstr "スタンバイ温度" #: fdmprinter.def.json msgctxt "material_standby_temperature description" @@ -2047,7 +2039,7 @@ msgstr "印刷していないノズルの温度(もう一方のノズルが印 #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount label" msgid "Nozzle Switch Retraction Distance" -msgstr "" +msgstr "ノズルスイッチ引き戻し距離" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_amount description" @@ -2057,7 +2049,7 @@ msgstr "引き込み量:引き込みを行わない場合は0に設定しま #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds label" msgid "Nozzle Switch Retraction Speed" -msgstr "" +msgstr "ノズルスイッチ引き戻し速度" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speeds description" @@ -2067,7 +2059,7 @@ msgstr "フィラメントを引き戻す速度。速度が早い程良いが早 #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed label" msgid "Nozzle Switch Retract Speed" -msgstr "" +msgstr "ノズルスイッチ引き込み速度" #: fdmprinter.def.json msgctxt "switch_extruder_retraction_speed description" @@ -2077,7 +2069,7 @@ msgstr "ノズル切り替え中のフィラメントの引き込み速度。" #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed label" msgid "Nozzle Switch Prime Speed" -msgstr "" +msgstr "ノズルスイッチ押し戻し速度" #: fdmprinter.def.json msgctxt "switch_extruder_prime_speed description" @@ -2087,7 +2079,7 @@ msgstr "ノズル スイッチ後にフィラメントが押し戻される速 #: fdmprinter.def.json msgctxt "speed label" msgid "Speed" -msgstr "" +msgstr "スピード" #: fdmprinter.def.json msgctxt "speed description" @@ -2097,7 +2089,7 @@ msgstr "スピード" #: fdmprinter.def.json msgctxt "speed_print label" msgid "Print Speed" -msgstr "" +msgstr "印刷速度" #: fdmprinter.def.json msgctxt "speed_print description" @@ -2107,7 +2099,7 @@ msgstr "印刷スピード" #: fdmprinter.def.json msgctxt "speed_infill label" msgid "Infill Speed" -msgstr "" +msgstr "インフィル速度" #: fdmprinter.def.json msgctxt "speed_infill description" @@ -2117,7 +2109,7 @@ msgstr "インフィルを印刷する速度" #: fdmprinter.def.json msgctxt "speed_wall label" msgid "Wall Speed" -msgstr "" +msgstr "ウォール速度" #: fdmprinter.def.json msgctxt "speed_wall description" @@ -2127,7 +2119,7 @@ msgstr "ウォールを印刷する速度" #: fdmprinter.def.json msgctxt "speed_wall_0 label" msgid "Outer Wall Speed" -msgstr "" +msgstr "外壁速度" #: fdmprinter.def.json msgctxt "speed_wall_0 description" @@ -2137,7 +2129,7 @@ msgstr "最も外側のウォールをプリントする速度。外側の壁を #: fdmprinter.def.json msgctxt "speed_wall_x label" msgid "Inner Wall Speed" -msgstr "" +msgstr "内壁速度" #: fdmprinter.def.json msgctxt "speed_wall_x description" @@ -2147,7 +2139,7 @@ msgstr "内側のウォールをプリントする速度 外壁より内壁を #: fdmprinter.def.json msgctxt "speed_roofing label" msgid "Top Surface Skin Speed" -msgstr "" +msgstr "最上面速度" # msgstr "トップサーフェススキンの速度" #: fdmprinter.def.json @@ -2158,7 +2150,7 @@ msgstr "上部表面プリント時の速度" #: fdmprinter.def.json msgctxt "speed_topbottom label" msgid "Top/Bottom Speed" -msgstr "" +msgstr "上面/底面速度" #: fdmprinter.def.json msgctxt "speed_topbottom description" @@ -2168,7 +2160,7 @@ msgstr "トップ/ボトムのレイヤーのプリント速度" #: fdmprinter.def.json msgctxt "speed_support label" msgid "Support Speed" -msgstr "" +msgstr "サポート速度" #: fdmprinter.def.json msgctxt "speed_support description" @@ -2178,7 +2170,7 @@ msgstr "サポート材をプリントする速度です。高速でサポート #: fdmprinter.def.json msgctxt "speed_support_infill label" msgid "Support Infill Speed" -msgstr "" +msgstr "サポートインフィル速度" #: fdmprinter.def.json msgctxt "speed_support_infill description" @@ -2188,7 +2180,7 @@ msgstr "サポート材のインフィルをプリントする速度 低速で #: fdmprinter.def.json msgctxt "speed_support_interface label" msgid "Support Interface Speed" -msgstr "" +msgstr "サポートインタフェース速度" #: fdmprinter.def.json msgctxt "speed_support_interface description" @@ -2198,7 +2190,7 @@ msgstr "ルーフとフロアのサポート材をプリントする速度。低 #: fdmprinter.def.json msgctxt "speed_support_roof label" msgid "Support Roof Speed" -msgstr "" +msgstr "サポートルーフ速度" # msgstr "サポートルーフの速度" #: fdmprinter.def.json @@ -2209,7 +2201,7 @@ msgstr "ルーフとフロアのサポート材をプリントする速度 こ #: fdmprinter.def.json msgctxt "speed_support_bottom label" msgid "Support Floor Speed" -msgstr "" +msgstr "サポートフロア速度" # msgstr "サポートフロアの速度" #: fdmprinter.def.json @@ -2220,7 +2212,7 @@ msgstr "フロアのサポートがプリントされる速度。低速で印刷 #: fdmprinter.def.json msgctxt "speed_prime_tower label" msgid "Prime Tower Speed" -msgstr "" +msgstr "プライムタワー印刷速度" #: fdmprinter.def.json msgctxt "speed_prime_tower description" @@ -2230,7 +2222,7 @@ msgstr "プライムタワーをプリントする速度です。異なるフィ #: fdmprinter.def.json msgctxt "speed_travel label" msgid "Travel Speed" -msgstr "" +msgstr "移動速度" #: fdmprinter.def.json msgctxt "speed_travel description" @@ -2240,7 +2232,7 @@ msgstr "移動中のスピード" #: fdmprinter.def.json msgctxt "speed_layer_0 label" msgid "Initial Layer Speed" -msgstr "" +msgstr "初期レイヤー速度" #: fdmprinter.def.json msgctxt "speed_layer_0 description" @@ -2250,7 +2242,7 @@ msgstr "一層目での速度。ビルトプレートへの接着を向上する #: fdmprinter.def.json msgctxt "speed_print_layer_0 label" msgid "Initial Layer Print Speed" -msgstr "" +msgstr "初期レイヤー印刷速度" #: fdmprinter.def.json msgctxt "speed_print_layer_0 description" @@ -2260,7 +2252,7 @@ msgstr "一層目をプリントする速度 ビルトプレートへの接着 #: fdmprinter.def.json msgctxt "speed_travel_layer_0 label" msgid "Initial Layer Travel Speed" -msgstr "" +msgstr "初期レイヤー移動速度" #: fdmprinter.def.json msgctxt "speed_travel_layer_0 description" @@ -2270,7 +2262,7 @@ msgstr "最初のレイヤーを印刷する際のトラベルスピード。低 #: fdmprinter.def.json msgctxt "skirt_brim_speed label" msgid "Skirt/Brim Speed" -msgstr "" +msgstr "スカート/ブリム速度" #: fdmprinter.def.json msgctxt "skirt_brim_speed description" @@ -2280,7 +2272,7 @@ msgstr "スカートとブリムのプリント速度 通常は一層目のス #: fdmprinter.def.json msgctxt "max_feedrate_z_override label" msgid "Maximum Z Speed" -msgstr "" +msgstr "最大Z速度" #: fdmprinter.def.json msgctxt "max_feedrate_z_override description" @@ -2290,7 +2282,7 @@ msgstr "ビルトプレートが移動する最高速度 この値を0に設 #: fdmprinter.def.json msgctxt "speed_slowdown_layers label" msgid "Number of Slower Layers" -msgstr "" +msgstr "遅いレイヤーの数" #: fdmprinter.def.json msgctxt "speed_slowdown_layers description" @@ -2300,7 +2292,7 @@ msgstr "最初の数層は印刷失敗の可能性を軽減させるために、 #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled label" msgid "Equalize Filament Flow" -msgstr "" +msgstr "フィラメント均一速度" #: fdmprinter.def.json msgctxt "speed_equalize_flow_enabled description" @@ -2310,7 +2302,7 @@ msgstr "通常より細いラインを高速プリントするので、時間当 #: fdmprinter.def.json msgctxt "speed_equalize_flow_max label" msgid "Maximum Speed for Flow Equalization" -msgstr "" +msgstr "均一フローの最大速度" #: fdmprinter.def.json msgctxt "speed_equalize_flow_max description" @@ -2320,7 +2312,7 @@ msgstr "吐出を均一にするための調整時の最高スピード" #: fdmprinter.def.json msgctxt "acceleration_enabled label" msgid "Enable Acceleration Control" -msgstr "" +msgstr "加速度制御を有効にする" #: fdmprinter.def.json msgctxt "acceleration_enabled description" @@ -2330,7 +2322,7 @@ msgstr "プリントヘッドのスピード調整の有効化 加速度の増 #: fdmprinter.def.json msgctxt "acceleration_print label" msgid "Print Acceleration" -msgstr "" +msgstr "印刷加速度" #: fdmprinter.def.json msgctxt "acceleration_print description" @@ -2340,7 +2332,7 @@ msgstr "印刷の加速スピードです。" #: fdmprinter.def.json msgctxt "acceleration_infill label" msgid "Infill Acceleration" -msgstr "" +msgstr "インフィル加速度" #: fdmprinter.def.json msgctxt "acceleration_infill description" @@ -2350,7 +2342,7 @@ msgstr "インフィルの印刷の加速スピード。" #: fdmprinter.def.json msgctxt "acceleration_wall label" msgid "Wall Acceleration" -msgstr "" +msgstr "ウォール加速度" #: fdmprinter.def.json msgctxt "acceleration_wall description" @@ -2360,7 +2352,7 @@ msgstr "ウォールをプリントする際の加速度。" #: fdmprinter.def.json msgctxt "acceleration_wall_0 label" msgid "Outer Wall Acceleration" -msgstr "" +msgstr "外壁加速度" #: fdmprinter.def.json msgctxt "acceleration_wall_0 description" @@ -2370,7 +2362,7 @@ msgstr "最も外側の壁をプリントする際の加速度" #: fdmprinter.def.json msgctxt "acceleration_wall_x label" msgid "Inner Wall Acceleration" -msgstr "" +msgstr "内壁加速度" #: fdmprinter.def.json msgctxt "acceleration_wall_x description" @@ -2380,7 +2372,7 @@ msgstr "内側のウォールがが出力される際のスピード。" #: fdmprinter.def.json msgctxt "acceleration_roofing label" msgid "Top Surface Skin Acceleration" -msgstr "" +msgstr "最上面加速度" # msgstr "トップ表面スキンの加速度" #: fdmprinter.def.json @@ -2391,7 +2383,7 @@ msgstr "上部表面プリント時の加速度" #: fdmprinter.def.json msgctxt "acceleration_topbottom label" msgid "Top/Bottom Acceleration" -msgstr "" +msgstr "上面/底面加速度" #: fdmprinter.def.json msgctxt "acceleration_topbottom description" @@ -2401,7 +2393,7 @@ msgstr "トップとボトムのレイヤーの印刷加速度。" #: fdmprinter.def.json msgctxt "acceleration_support label" msgid "Support Acceleration" -msgstr "" +msgstr "サポート加速度" #: fdmprinter.def.json msgctxt "acceleration_support description" @@ -2411,7 +2403,7 @@ msgstr "サポート材プリント時の加速スピード" #: fdmprinter.def.json msgctxt "acceleration_support_infill label" msgid "Support Infill Acceleration" -msgstr "" +msgstr "サポートインフィル加速度" #: fdmprinter.def.json msgctxt "acceleration_support_infill description" @@ -2421,7 +2413,7 @@ msgstr "インフィルのサポート材のプリント時の加速度。" #: fdmprinter.def.json msgctxt "acceleration_support_interface label" msgid "Support Interface Acceleration" -msgstr "" +msgstr "サポートインタフェース加速度" #: fdmprinter.def.json msgctxt "acceleration_support_interface description" @@ -2431,7 +2423,7 @@ msgstr "サポートの上面と下面が印刷される加速度。低加速度 #: fdmprinter.def.json msgctxt "acceleration_support_roof label" msgid "Support Roof Acceleration" -msgstr "" +msgstr "サポートルーフ加速度" # msgstr "サポートルーフの加速度" #: fdmprinter.def.json @@ -2442,7 +2434,7 @@ msgstr "サポートの上面がプリントされる加速度、低加速度で #: fdmprinter.def.json msgctxt "acceleration_support_bottom label" msgid "Support Floor Acceleration" -msgstr "" +msgstr "サポートフロア加速度" # msgstr "サポートフロアの加速度" #: fdmprinter.def.json @@ -2453,7 +2445,7 @@ msgstr "サポートのフロアが印刷される加速度。より低い加速 #: fdmprinter.def.json msgctxt "acceleration_prime_tower label" msgid "Prime Tower Acceleration" -msgstr "" +msgstr "プライムタワー加速度" #: fdmprinter.def.json msgctxt "acceleration_prime_tower description" @@ -2463,7 +2455,7 @@ msgstr "プライムタワーの印刷時のスピード。" #: fdmprinter.def.json msgctxt "acceleration_travel label" msgid "Travel Acceleration" -msgstr "" +msgstr "移動か速度" #: fdmprinter.def.json msgctxt "acceleration_travel description" @@ -2473,7 +2465,7 @@ msgstr "移動中の加速度。" #: fdmprinter.def.json msgctxt "acceleration_layer_0 label" msgid "Initial Layer Acceleration" -msgstr "" +msgstr "初期レイヤー加速度" #: fdmprinter.def.json msgctxt "acceleration_layer_0 description" @@ -2483,7 +2475,7 @@ msgstr "初期レイヤーの加速度。" #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 label" msgid "Initial Layer Print Acceleration" -msgstr "" +msgstr "初期レイヤー印刷加速度" #: fdmprinter.def.json msgctxt "acceleration_print_layer_0 description" @@ -2493,7 +2485,7 @@ msgstr "初期レイヤーの印刷中の加速度。" #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 label" msgid "Initial Layer Travel Acceleration" -msgstr "" +msgstr "初期レイヤー移動加速度" #: fdmprinter.def.json msgctxt "acceleration_travel_layer_0 description" @@ -2503,7 +2495,7 @@ msgstr "最初のレイヤー時の加速度" #: fdmprinter.def.json msgctxt "acceleration_skirt_brim label" msgid "Skirt/Brim Acceleration" -msgstr "" +msgstr "スカート/ブリム加速度" #: fdmprinter.def.json msgctxt "acceleration_skirt_brim description" @@ -2513,7 +2505,7 @@ msgstr "スカートとブリム印刷時の加速度。通常、初期レイヤ #: fdmprinter.def.json msgctxt "jerk_enabled label" msgid "Enable Jerk Control" -msgstr "" +msgstr "ジャーク制御を有効にする" #: fdmprinter.def.json msgctxt "jerk_enabled description" @@ -2523,7 +2515,7 @@ msgstr "X または Y 軸の速度が変更する際、プリントヘッドの #: fdmprinter.def.json msgctxt "jerk_print label" msgid "Print Jerk" -msgstr "" +msgstr "印刷ジャーク" #: fdmprinter.def.json msgctxt "jerk_print description" @@ -2533,7 +2525,7 @@ msgstr "プリントヘッドの最大瞬間速度の変更。" #: fdmprinter.def.json msgctxt "jerk_infill label" msgid "Infill Jerk" -msgstr "" +msgstr "インフィルジャーク" #: fdmprinter.def.json msgctxt "jerk_infill description" @@ -2543,7 +2535,7 @@ msgstr "インフィルの印刷時の瞬間速度の変更。" #: fdmprinter.def.json msgctxt "jerk_wall label" msgid "Wall Jerk" -msgstr "" +msgstr "ウォールジャーク" #: fdmprinter.def.json msgctxt "jerk_wall description" @@ -2553,7 +2545,7 @@ msgstr "ウォールのプリント時の最大瞬間速度を変更。" #: fdmprinter.def.json msgctxt "jerk_wall_0 label" msgid "Outer Wall Jerk" -msgstr "" +msgstr "外壁ジャーク" #: fdmprinter.def.json msgctxt "jerk_wall_0 description" @@ -2563,7 +2555,7 @@ msgstr "外側のウォールが出力される際の最大瞬間速度の変更 #: fdmprinter.def.json msgctxt "jerk_wall_x label" msgid "Inner Wall Jerk" -msgstr "" +msgstr "内壁ジャーク" #: fdmprinter.def.json msgctxt "jerk_wall_x description" @@ -2573,7 +2565,7 @@ msgstr "内側のウォールがプリントされれう際の最大瞬間速度 #: fdmprinter.def.json msgctxt "jerk_roofing label" msgid "Top Surface Skin Jerk" -msgstr "" +msgstr "最上面ジャーク" # msgstr "トップサーフェススキンジャーク" #: fdmprinter.def.json @@ -2584,7 +2576,7 @@ msgstr "上部表面プリント時の最大加速度" #: fdmprinter.def.json msgctxt "jerk_topbottom label" msgid "Top/Bottom Jerk" -msgstr "" +msgstr "上面/下面ジャーク" #: fdmprinter.def.json msgctxt "jerk_topbottom description" @@ -2594,7 +2586,7 @@ msgstr "トップとボトムのレイヤーを印刷する際の最大瞬間速 #: fdmprinter.def.json msgctxt "jerk_support label" msgid "Support Jerk" -msgstr "" +msgstr "サポートジャーク" #: fdmprinter.def.json msgctxt "jerk_support description" @@ -2604,7 +2596,7 @@ msgstr "サポート材の印刷時の最大瞬間速度の変更。" #: fdmprinter.def.json msgctxt "jerk_support_infill label" msgid "Support Infill Jerk" -msgstr "" +msgstr "サポートインフィルジャーク" #: fdmprinter.def.json msgctxt "jerk_support_infill description" @@ -2614,7 +2606,7 @@ msgstr "サポート材の印刷時、最大瞬間速度の変更。" #: fdmprinter.def.json msgctxt "jerk_support_interface label" msgid "Support Interface Jerk" -msgstr "" +msgstr "サポートインタフェースジャーク" #: fdmprinter.def.json msgctxt "jerk_support_interface description" @@ -2624,7 +2616,7 @@ msgstr "どのルーフとフロアのサポート部分を印刷するかによ #: fdmprinter.def.json msgctxt "jerk_support_roof label" msgid "Support Roof Jerk" -msgstr "" +msgstr "サポートルーフジャーク" # msgstr "サポートルーフのジャーク" #: fdmprinter.def.json @@ -2635,7 +2627,7 @@ msgstr "どのサポートのルーフ部分を印刷するかによって最大 #: fdmprinter.def.json msgctxt "jerk_support_bottom label" msgid "Support Floor Jerk" -msgstr "" +msgstr "サポートフロアジャーク" # msgstr "サポートフロアのジャーク" #: fdmprinter.def.json @@ -2646,7 +2638,7 @@ msgstr "どのサポートのフロア部分を印刷するかによって最大 #: fdmprinter.def.json msgctxt "jerk_prime_tower label" msgid "Prime Tower Jerk" -msgstr "" +msgstr "プライムタワージャーク" #: fdmprinter.def.json msgctxt "jerk_prime_tower description" @@ -2656,7 +2648,7 @@ msgstr "プライムタワーがプリントされる際の最大瞬間速度を #: fdmprinter.def.json msgctxt "jerk_travel label" msgid "Travel Jerk" -msgstr "" +msgstr "移動ジャーク" #: fdmprinter.def.json msgctxt "jerk_travel description" @@ -2666,7 +2658,7 @@ msgstr "移動する際の最大瞬時速度の変更。" #: fdmprinter.def.json msgctxt "jerk_layer_0 label" msgid "Initial Layer Jerk" -msgstr "" +msgstr "初期レイヤージャーク" #: fdmprinter.def.json msgctxt "jerk_layer_0 description" @@ -2676,7 +2668,7 @@ msgstr "初期レイヤーの最大瞬時速度の変更。" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 label" msgid "Initial Layer Print Jerk" -msgstr "" +msgstr "初期レイヤー印刷ジャーク" #: fdmprinter.def.json msgctxt "jerk_print_layer_0 description" @@ -2686,7 +2678,7 @@ msgstr "初期レイヤー印刷中の最大瞬時速度の変化。" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 label" msgid "Initial Layer Travel Jerk" -msgstr "" +msgstr "初期レイヤー移動ジャーク" #: fdmprinter.def.json msgctxt "jerk_travel_layer_0 description" @@ -2696,7 +2688,7 @@ msgstr "移動加速度は最初のレイヤーに適用されます。" #: fdmprinter.def.json msgctxt "jerk_skirt_brim label" msgid "Skirt/Brim Jerk" -msgstr "" +msgstr "スカート/ブリムジャーク" #: fdmprinter.def.json msgctxt "jerk_skirt_brim description" @@ -2706,7 +2698,7 @@ msgstr "スカートとブリムがプリントされる最大瞬時速度の変 #: fdmprinter.def.json msgctxt "travel label" msgid "Travel" -msgstr "" +msgstr "移動" #: fdmprinter.def.json msgctxt "travel description" @@ -2716,7 +2708,7 @@ msgstr "移動" #: fdmprinter.def.json msgctxt "retraction_combing label" msgid "Combing Mode" -msgstr "" +msgstr "コーミングモード" #: fdmprinter.def.json msgctxt "retraction_combing description" @@ -2726,22 +2718,22 @@ msgstr "コーミングは、走行時にすでに印刷された領域内にノ #: fdmprinter.def.json msgctxt "retraction_combing option off" msgid "Off" -msgstr "" +msgstr "オフ" #: fdmprinter.def.json msgctxt "retraction_combing option all" msgid "All" -msgstr "" +msgstr "すべて" #: fdmprinter.def.json msgctxt "retraction_combing option noskin" msgid "No Skin" -msgstr "" +msgstr "表面なし" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall label" msgid "Retract Before Outer Wall" -msgstr "" +msgstr "外壁の前に引き戻す" #: fdmprinter.def.json msgctxt "travel_retract_before_outer_wall description" @@ -2751,7 +2743,7 @@ msgstr "移動して外側のウォールをプリントする際、毎回引き #: fdmprinter.def.json msgctxt "travel_avoid_other_parts label" msgid "Avoid Printed Parts When Traveling" -msgstr "" +msgstr "移動は印刷したパーツを回避する" #: fdmprinter.def.json msgctxt "travel_avoid_other_parts description" @@ -2761,7 +2753,7 @@ msgstr "ノズルは、移動時に既に印刷されたパーツを避けます #: fdmprinter.def.json msgctxt "travel_avoid_distance label" msgid "Travel Avoid Distance" -msgstr "" +msgstr "移動回避距離" #: fdmprinter.def.json msgctxt "travel_avoid_distance description" @@ -2771,7 +2763,7 @@ msgstr "ノズルが既に印刷された部分を移動する際の間隔" #: fdmprinter.def.json msgctxt "start_layers_at_same_position label" msgid "Start Layers with the Same Part" -msgstr "" +msgstr "同じパーツでレイヤーを開始する" #: fdmprinter.def.json #, fuzzy @@ -2782,7 +2774,7 @@ msgstr "各レイヤーの印刷は決まった場所近い距離のポイント #: fdmprinter.def.json msgctxt "layer_start_x label" msgid "Layer Start X" -msgstr "" +msgstr "レイヤー始点X" #: fdmprinter.def.json msgctxt "layer_start_x description" @@ -2792,7 +2784,7 @@ msgstr "各レイヤーのプリントを開始する部分をしめすX座標 #: fdmprinter.def.json msgctxt "layer_start_y label" msgid "Layer Start Y" -msgstr "" +msgstr "レイヤー始点Y" #: fdmprinter.def.json msgctxt "layer_start_y description" @@ -2802,7 +2794,7 @@ msgstr "各レイヤーのプリントを開始する部分をしめすY座標 #: fdmprinter.def.json msgctxt "retraction_hop_enabled label" msgid "Z Hop When Retracted" -msgstr "" +msgstr "引き戻し時のZホップ" #: fdmprinter.def.json msgctxt "retraction_hop_enabled description" @@ -2812,7 +2804,7 @@ msgstr "引き戻しが完了すると、ビルドプレートが下降してノ #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides label" msgid "Z Hop Only Over Printed Parts" -msgstr "" +msgstr "印刷パーツに対するZホップ" #: fdmprinter.def.json msgctxt "retraction_hop_only_when_collides description" @@ -2822,7 +2814,7 @@ msgstr "走行時に印刷部品への衝突を避けるため、水平移動で #: fdmprinter.def.json msgctxt "retraction_hop label" msgid "Z Hop Height" -msgstr "" +msgstr "Zホップ高さ" #: fdmprinter.def.json msgctxt "retraction_hop description" @@ -2832,7 +2824,7 @@ msgstr "Zホップを実行するときの高さ。" #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch label" msgid "Z Hop After Extruder Switch" -msgstr "" +msgstr "エクストルーダースイッチ後のZホップ" #: fdmprinter.def.json msgctxt "retraction_hop_after_extruder_switch description" @@ -2842,7 +2834,7 @@ msgstr "マシーンが1つのエクストルーダーからもう一つのエ #: fdmprinter.def.json msgctxt "cooling label" msgid "Cooling" -msgstr "" +msgstr "冷却" #: fdmprinter.def.json msgctxt "cooling description" @@ -2852,7 +2844,7 @@ msgstr "冷却" #: fdmprinter.def.json msgctxt "cool_fan_enabled label" msgid "Enable Print Cooling" -msgstr "" +msgstr "印刷中の冷却を有効にする" #: fdmprinter.def.json msgctxt "cool_fan_enabled description" @@ -2862,7 +2854,7 @@ msgstr "印刷中の冷却ファンを有効にします。ファンは、短い #: fdmprinter.def.json msgctxt "cool_fan_speed label" msgid "Fan Speed" -msgstr "" +msgstr "ファン速度" #: fdmprinter.def.json msgctxt "cool_fan_speed description" @@ -2872,7 +2864,7 @@ msgstr "冷却ファンが回転する速度。" #: fdmprinter.def.json msgctxt "cool_fan_speed_min label" msgid "Regular Fan Speed" -msgstr "" +msgstr "標準ファン速度" #: fdmprinter.def.json #, fuzzy @@ -2883,7 +2875,7 @@ msgstr "しきい値に達する前のファンの回転スピード。プリン #: fdmprinter.def.json msgctxt "cool_fan_speed_max label" msgid "Maximum Fan Speed" -msgstr "" +msgstr "最大ファン速度" #: fdmprinter.def.json msgctxt "cool_fan_speed_max description" @@ -2893,7 +2885,7 @@ msgstr "最小積層時間でファンが回転する速度。しきい値に達 #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max label" msgid "Regular/Maximum Fan Speed Threshold" -msgstr "" +msgstr "標準/最大ファン速度のしきい値" #: fdmprinter.def.json msgctxt "cool_min_layer_time_fan_speed_max description" @@ -2903,7 +2895,7 @@ msgstr "通常速度と最速の間でしきい値を設定する積層時間。 #: fdmprinter.def.json msgctxt "cool_fan_speed_0 label" msgid "Initial Fan Speed" -msgstr "" +msgstr "初期ファン速度" #: fdmprinter.def.json #, fuzzy @@ -2914,7 +2906,7 @@ msgstr "プリント開始時にファンが回転する速度。後続のレイ #: fdmprinter.def.json msgctxt "cool_fan_full_at_height label" msgid "Regular Fan Speed at Height" -msgstr "" +msgstr "標準ファン速度時の高さ" #: fdmprinter.def.json msgctxt "cool_fan_full_at_height description" @@ -2924,7 +2916,7 @@ msgstr "通常速度でファンが回転するときの高さ。ここより下 #: fdmprinter.def.json msgctxt "cool_fan_full_layer label" msgid "Regular Fan Speed at Layer" -msgstr "" +msgstr "標準ファン速度時のレイヤー" #: fdmprinter.def.json msgctxt "cool_fan_full_layer description" @@ -2934,7 +2926,7 @@ msgstr "ファンが通常の速度で回転する時のレイヤー。通常速 #: fdmprinter.def.json msgctxt "cool_min_layer_time label" msgid "Minimum Layer Time" -msgstr "" +msgstr "最小レイヤー時間" #: fdmprinter.def.json msgctxt "cool_min_layer_time description" @@ -2944,7 +2936,7 @@ msgstr "一つのレイヤーに最低限費やす時間。1つの層に必ず #: fdmprinter.def.json msgctxt "cool_min_speed label" msgid "Minimum Speed" -msgstr "" +msgstr "最低速度" #: fdmprinter.def.json msgctxt "cool_min_speed description" @@ -2954,7 +2946,7 @@ msgstr "最遅印刷速度。印刷の速度が遅すぎると、ノズル内の #: fdmprinter.def.json msgctxt "cool_lift_head label" msgid "Lift Head" -msgstr "" +msgstr "ヘッド持ち上げ" #: fdmprinter.def.json msgctxt "cool_lift_head description" @@ -2964,7 +2956,7 @@ msgstr "レイヤーの最小プリント時間より早く印刷が終わった #: fdmprinter.def.json msgctxt "support label" msgid "Support" -msgstr "" +msgstr "サポート" #: fdmprinter.def.json msgctxt "support description" @@ -2974,7 +2966,7 @@ msgstr "サポート" #: fdmprinter.def.json msgctxt "support_enable label" msgid "Generate Support" -msgstr "" +msgstr "サポート開始" # msgstr "サポートを生成します。" #: fdmprinter.def.json @@ -2985,7 +2977,7 @@ msgstr "オーバーハングするモデルのサポートパーツの構造を #: fdmprinter.def.json msgctxt "support_extruder_nr label" msgid "Support Extruder" -msgstr "" +msgstr "サポート用エクストルーダー" #: fdmprinter.def.json msgctxt "support_extruder_nr description" @@ -2995,7 +2987,7 @@ msgstr "サポート材を印刷するためのエクストルーダー。複数 #: fdmprinter.def.json msgctxt "support_infill_extruder_nr label" msgid "Support Infill Extruder" -msgstr "" +msgstr "サポート用インフィルエクストルーダー" #: fdmprinter.def.json msgctxt "support_infill_extruder_nr description" @@ -3005,7 +2997,7 @@ msgstr "サポート材のインフィルを印刷に使用するためのエク #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 label" msgid "First Layer Support Extruder" -msgstr "" +msgstr "最初のレイヤー用サポートエクストルーダー" #: fdmprinter.def.json msgctxt "support_extruder_nr_layer_0 description" @@ -3015,7 +3007,7 @@ msgstr "サポートのインフィルの最初の層を印刷に使用するエ #: fdmprinter.def.json msgctxt "support_interface_extruder_nr label" msgid "Support Interface Extruder" -msgstr "" +msgstr "サポートインタフェースエクストルーダー" #: fdmprinter.def.json msgctxt "support_interface_extruder_nr description" @@ -3025,7 +3017,7 @@ msgstr "サポートのルーフおよび底面を印刷するために使用す #: fdmprinter.def.json msgctxt "support_roof_extruder_nr label" msgid "Support Roof Extruder" -msgstr "" +msgstr "サポートルーフエクストルーダー" # msgstr "サポートルーフエクストルーダー" #: fdmprinter.def.json @@ -3036,7 +3028,7 @@ msgstr "サポートのルーフ面をプリントする際のエクストルー #: fdmprinter.def.json msgctxt "support_bottom_extruder_nr label" msgid "Support Floor Extruder" -msgstr "" +msgstr "サポートフロアエクストルーダー" # msgstr "サポートフロアエクストルーダー" #: fdmprinter.def.json @@ -3047,7 +3039,7 @@ msgstr "サポートのフロア面をプリントする際に使用するエク #: fdmprinter.def.json msgctxt "support_type label" msgid "Support Placement" -msgstr "" +msgstr "サポート配置" #: fdmprinter.def.json msgctxt "support_type description" @@ -3057,17 +3049,17 @@ msgstr "サポート材の配置を調整します。配置はTouching Buildplat #: fdmprinter.def.json msgctxt "support_type option buildplate" msgid "Touching Buildplate" -msgstr "" +msgstr "ビルドプレートにタッチ" #: fdmprinter.def.json msgctxt "support_type option everywhere" msgid "Everywhere" -msgstr "" +msgstr "全対象" #: fdmprinter.def.json msgctxt "support_angle label" msgid "Support Overhang Angle" -msgstr "" +msgstr "サポートオーバーハング角度" #: fdmprinter.def.json msgctxt "support_angle description" @@ -3077,7 +3069,7 @@ msgstr "サポート材がつくオーバーハングの最小角度。0° の #: fdmprinter.def.json msgctxt "support_pattern label" msgid "Support Pattern" -msgstr "" +msgstr "サポートパターン" #: fdmprinter.def.json msgctxt "support_pattern description" @@ -3087,43 +3079,43 @@ msgstr "サポート材の形。サポート材の除去の方法を頑丈また #: fdmprinter.def.json msgctxt "support_pattern option lines" msgid "Lines" -msgstr "" +msgstr "ライン" #: fdmprinter.def.json msgctxt "support_pattern option grid" msgid "Grid" -msgstr "" +msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "トライアングル" #: fdmprinter.def.json msgctxt "support_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" #: fdmprinter.def.json msgctxt "support_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "3D同心円" #: fdmprinter.def.json msgctxt "support_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_pattern option cross" msgid "Cross" -msgstr "" +msgstr "クロス" # msgstr "クロス" #: fdmprinter.def.json msgctxt "support_connect_zigzags label" msgid "Connect Support ZigZags" -msgstr "" +msgstr "サポートジグザグ接続" #: fdmprinter.def.json msgctxt "support_connect_zigzags description" @@ -3133,7 +3125,7 @@ msgstr "ジグザグを接続します。ジグザグ形のサポート材の強 #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" -msgstr "" +msgstr "サポート密度" #: fdmprinter.def.json msgctxt "support_infill_rate description" @@ -3143,7 +3135,7 @@ msgstr "サポート材の密度を調整します。大きな値ではオーバ #: fdmprinter.def.json msgctxt "support_line_distance label" msgid "Support Line Distance" -msgstr "" +msgstr "サポートライン距離" #: fdmprinter.def.json msgctxt "support_line_distance description" @@ -3153,7 +3145,7 @@ msgstr "印刷されたサポート材の間隔。この設定は、サポート #: fdmprinter.def.json msgctxt "support_z_distance label" msgid "Support Z Distance" -msgstr "" +msgstr "サポートZ距離" #: fdmprinter.def.json msgctxt "support_z_distance description" @@ -3163,7 +3155,7 @@ msgstr "サポート材のトップ/ボトム部分と印刷物との距離。 #: fdmprinter.def.json msgctxt "support_top_distance label" msgid "Support Top Distance" -msgstr "" +msgstr "サポート上部距離" #: fdmprinter.def.json msgctxt "support_top_distance description" @@ -3173,7 +3165,7 @@ msgstr "サポートの上部から印刷物までの距離。" #: fdmprinter.def.json msgctxt "support_bottom_distance label" msgid "Support Bottom Distance" -msgstr "" +msgstr "サポート底部距離" #: fdmprinter.def.json msgctxt "support_bottom_distance description" @@ -3183,7 +3175,7 @@ msgstr "印刷物とサポート材底部までの距離。" #: fdmprinter.def.json msgctxt "support_xy_distance label" msgid "Support X/Y Distance" -msgstr "" +msgstr "サポートX/Y距離" #: fdmprinter.def.json msgctxt "support_xy_distance description" @@ -3193,7 +3185,7 @@ msgstr "印刷物からX/Y方向へのサポート材との距離" #: fdmprinter.def.json msgctxt "support_xy_overrides_z label" msgid "Support Distance Priority" -msgstr "" +msgstr "サポート距離優先順位" #: fdmprinter.def.json msgctxt "support_xy_overrides_z description" @@ -3203,17 +3195,17 @@ msgstr "X /Y方向のサポートの距離がZ方向のサポートの距離を #: fdmprinter.def.json msgctxt "support_xy_overrides_z option xy_overrides_z" msgid "X/Y overrides Z" -msgstr "" +msgstr "X/YがZを上書き" #: fdmprinter.def.json msgctxt "support_xy_overrides_z option z_overrides_xy" msgid "Z overrides X/Y" -msgstr "" +msgstr "ZがX/Yを上書き" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang label" msgid "Minimum Support X/Y Distance" -msgstr "" +msgstr "最小サポートX/Y距離" #: fdmprinter.def.json msgctxt "support_xy_distance_overhang description" @@ -3223,7 +3215,7 @@ msgstr "X/Y方向におけるオーバーハングからサポートまでの距 #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height label" msgid "Support Stair Step Height" -msgstr "" +msgstr "サポート階段高さ" #: fdmprinter.def.json msgctxt "support_bottom_stair_step_height description" @@ -3233,7 +3225,7 @@ msgstr "モデルにのっている階段状のサポートの底のステップ #: fdmprinter.def.json msgctxt "support_bottom_stair_step_width label" msgid "Support Stair Step Maximum Width" -msgstr "" +msgstr "サポート階段最大幅" # msgstr "階段状ステップサポートの最大幅" #: fdmprinter.def.json @@ -3244,7 +3236,7 @@ msgstr "モデルにのっている階段のような下部のサポートのス #: fdmprinter.def.json msgctxt "support_join_distance label" msgid "Support Join Distance" -msgstr "" +msgstr "サポート接合距離" #: fdmprinter.def.json msgctxt "support_join_distance description" @@ -3254,7 +3246,7 @@ msgstr "X/Y方向のサポート構造間の最大距離。別の構造がこの #: fdmprinter.def.json msgctxt "support_offset label" msgid "Support Horizontal Expansion" -msgstr "" +msgstr "サポート水平展開" #: fdmprinter.def.json msgctxt "support_offset description" @@ -3264,7 +3256,7 @@ msgstr "各レイヤーのサポート用ポリゴンに適用されるオフセ #: fdmprinter.def.json msgctxt "support_infill_sparse_thickness label" msgid "Support Infill Layer Thickness" -msgstr "" +msgstr "サポートインフィルレイヤー厚さ" # msgstr "サポートインフィルのレイヤーの厚さ" #: fdmprinter.def.json @@ -3275,7 +3267,7 @@ msgstr "サポートのインフィルの厚さ。この値はレイヤーの倍 #: fdmprinter.def.json msgctxt "gradual_support_infill_steps label" msgid "Gradual Support Infill Steps" -msgstr "" +msgstr "サポートインフィル半減回数" # msgstr "段階的なサポート インフィルステップ" #: fdmprinter.def.json @@ -3286,7 +3278,7 @@ msgstr "天井面より下に遠ざかる際にサポートのインフィル密 #: fdmprinter.def.json msgctxt "gradual_support_infill_step_height label" msgid "Gradual Support Infill Step Height" -msgstr "" +msgstr "サポートインフィル半減前の高さ" # msgstr "段階的なサポート インフィル ステップの高さ" #: fdmprinter.def.json @@ -3297,7 +3289,7 @@ msgstr "密度が半分に切り替える前の所定のサポートのインフ #: fdmprinter.def.json msgctxt "support_interface_enable label" msgid "Enable Support Interface" -msgstr "" +msgstr "サポートインタフェースを有効にする" #: fdmprinter.def.json msgctxt "support_interface_enable description" @@ -3307,7 +3299,7 @@ msgstr "モデルとサポートの間に密なインターフェースを生成 #: fdmprinter.def.json msgctxt "support_roof_enable label" msgid "Enable Support Roof" -msgstr "" +msgstr "サポートルーフを有効にする" # msgstr "サポートルーフの有効化" #: fdmprinter.def.json @@ -3318,7 +3310,7 @@ msgstr "サポートの上部とモデルの間に高密度の厚板を形成し #: fdmprinter.def.json msgctxt "support_bottom_enable label" msgid "Enable Support Floor" -msgstr "" +msgstr "サポートフロアを有効にする" # msgstr "サポートフロアを有効にします。" #: fdmprinter.def.json @@ -3329,7 +3321,7 @@ msgstr "サポートの上部とモデルの間に高密度の厚板を形成し #: fdmprinter.def.json msgctxt "support_interface_height label" msgid "Support Interface Thickness" -msgstr "" +msgstr "サポートインタフェース厚さ" #: fdmprinter.def.json msgctxt "support_interface_height description" @@ -3339,7 +3331,7 @@ msgstr "底面または上部のモデルと接触するサポートのインタ #: fdmprinter.def.json msgctxt "support_roof_height label" msgid "Support Roof Thickness" -msgstr "" +msgstr "サポートルーフ厚さ" #: fdmprinter.def.json msgctxt "support_roof_height description" @@ -3349,7 +3341,7 @@ msgstr "サポートのルーフの厚さ。これは、モデルの下につく #: fdmprinter.def.json msgctxt "support_bottom_height label" msgid "Support Floor Thickness" -msgstr "" +msgstr "サポートフロア厚さ" # msgstr "サポートのフロアの厚み" #: fdmprinter.def.json @@ -3360,7 +3352,7 @@ msgstr "サポート材の底部の厚さ。これは、サポートが置かれ #: fdmprinter.def.json msgctxt "support_interface_skip_height label" msgid "Support Interface Resolution" -msgstr "" +msgstr "サポートインタフェース解像度" #: fdmprinter.def.json msgctxt "support_interface_skip_height description" @@ -3370,7 +3362,7 @@ msgstr "サポートの上下にモデルがあるかどうか確認するには #: fdmprinter.def.json msgctxt "support_interface_density label" msgid "Support Interface Density" -msgstr "" +msgstr "サポートインタフェース密度" #: fdmprinter.def.json msgctxt "support_interface_density description" @@ -3380,7 +3372,7 @@ msgstr "サポート材のルーフとフロアの密度を調整します 大 #: fdmprinter.def.json msgctxt "support_roof_density label" msgid "Support Roof Density" -msgstr "" +msgstr "サポートルーフ密度" # msgstr "サポートルーフの密度" #: fdmprinter.def.json @@ -3391,7 +3383,7 @@ msgstr "サポート材のルーフの部分の密度を調整します 大き #: fdmprinter.def.json msgctxt "support_roof_line_distance label" msgid "Support Roof Line Distance" -msgstr "" +msgstr "サポートルーフライン距離" # msgstr "サポートルーフライン距離" #: fdmprinter.def.json @@ -3402,7 +3394,7 @@ msgstr "印刷されたサポートルーフ線間の距離。この設定は、 #: fdmprinter.def.json msgctxt "support_bottom_density label" msgid "Support Floor Density" -msgstr "" +msgstr "サポートフロア密度" # msgstr "サポートフロア密度" #: fdmprinter.def.json @@ -3413,7 +3405,7 @@ msgstr "サポート構造のフロアの密度です。高い値は、サポー #: fdmprinter.def.json msgctxt "support_bottom_line_distance label" msgid "Support Floor Line Distance" -msgstr "" +msgstr "サポートフロアライン距離" #: fdmprinter.def.json msgctxt "support_bottom_line_distance description" @@ -3423,7 +3415,7 @@ msgstr "印刷されたサポートのフロアのライン間の距離。この #: fdmprinter.def.json msgctxt "support_interface_pattern label" msgid "Support Interface Pattern" -msgstr "" +msgstr "サポートインタフェースパターン" #: fdmprinter.def.json msgctxt "support_interface_pattern description" @@ -3433,37 +3425,37 @@ msgstr "モデルとサポートのインタフェースが印刷されるパタ #: fdmprinter.def.json msgctxt "support_interface_pattern option lines" msgid "Lines" -msgstr "" +msgstr "ライン" #: fdmprinter.def.json msgctxt "support_interface_pattern option grid" msgid "Grid" -msgstr "" +msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_interface_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "トライアングル" #: fdmprinter.def.json msgctxt "support_interface_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" #: fdmprinter.def.json msgctxt "support_interface_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "3D同心円" #: fdmprinter.def.json msgctxt "support_interface_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_roof_pattern label" msgid "Support Roof Pattern" -msgstr "" +msgstr "サポートルーフパターン" # msgstr "ルーフのサポートのパターン" #: fdmprinter.def.json @@ -3474,43 +3466,43 @@ msgstr "サポートのルーフが印刷されるパターン" #: fdmprinter.def.json msgctxt "support_roof_pattern option lines" msgid "Lines" -msgstr "" +msgstr "ライン" # msgstr "線" #: fdmprinter.def.json msgctxt "support_roof_pattern option grid" msgid "Grid" -msgstr "" +msgstr "グリッド" # msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_roof_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "トライアングル" # msgstr "三角形" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心" #: fdmprinter.def.json msgctxt "support_roof_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "3D同心円" # msgstr "同心3D" #: fdmprinter.def.json msgctxt "support_roof_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" # msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_bottom_pattern label" msgid "Support Floor Pattern" -msgstr "" +msgstr "サポートフロアパターン" # msgstr "サポートフロアパターン" #: fdmprinter.def.json @@ -3521,43 +3513,43 @@ msgstr "サポートのフロアが印刷されるパターン。" #: fdmprinter.def.json msgctxt "support_bottom_pattern option lines" msgid "Lines" -msgstr "" +msgstr "ライン" # msgstr "線" #: fdmprinter.def.json msgctxt "support_bottom_pattern option grid" msgid "Grid" -msgstr "" +msgstr "グリッド" # msgstr "グリッド" #: fdmprinter.def.json msgctxt "support_bottom_pattern option triangles" msgid "Triangles" -msgstr "" +msgstr "トライアングル" # msgstr "三角形" #: fdmprinter.def.json msgctxt "support_bottom_pattern option concentric" msgid "Concentric" -msgstr "" +msgstr "同心円" # msgstr "同心円" #: fdmprinter.def.json msgctxt "support_bottom_pattern option concentric_3d" msgid "Concentric 3D" -msgstr "" +msgstr "3D同心円" # msgstr "コンセントリック3D" #: fdmprinter.def.json msgctxt "support_bottom_pattern option zigzag" msgid "Zig Zag" -msgstr "" +msgstr "ジグザグ" # msgstr "ジグザグ" #: fdmprinter.def.json msgctxt "support_use_towers label" msgid "Use Towers" -msgstr "" +msgstr "使用タワー" #: fdmprinter.def.json msgctxt "support_use_towers description" @@ -3567,7 +3559,7 @@ msgstr "特殊なタワーを使用して、小さなオーバーハングして #: fdmprinter.def.json msgctxt "support_tower_diameter label" msgid "Tower Diameter" -msgstr "" +msgstr "タワー直径" #: fdmprinter.def.json msgctxt "support_tower_diameter description" @@ -3577,7 +3569,7 @@ msgstr "特別な塔の直径。" #: fdmprinter.def.json msgctxt "support_minimal_diameter label" msgid "Minimum Diameter" -msgstr "" +msgstr "最小直径" #: fdmprinter.def.json msgctxt "support_minimal_diameter description" @@ -3587,7 +3579,7 @@ msgstr "特殊なサポート塔によって支持される小さな領域のX / #: fdmprinter.def.json msgctxt "support_tower_roof_angle label" msgid "Tower Roof Angle" -msgstr "" +msgstr "タワールーフ角度" #: fdmprinter.def.json msgctxt "support_tower_roof_angle description" @@ -3597,7 +3589,7 @@ msgstr "タワーの屋上の角度。値が高いほど尖った屋根が得ら #: fdmprinter.def.json msgctxt "platform_adhesion label" msgid "Build Plate Adhesion" -msgstr "" +msgstr "ビルドプレート密着性" #: fdmprinter.def.json msgctxt "platform_adhesion description" @@ -3607,7 +3599,7 @@ msgstr "密着性" #: fdmprinter.def.json msgctxt "prime_blob_enable label" msgid "Enable Prime Blob" -msgstr "" +msgstr "プライムボルブを有効にする" # msgstr "プライムブロブを有効にする" #: fdmprinter.def.json @@ -3618,7 +3610,7 @@ msgstr "印刷する前にフィラメントの小さな塊を作るかどうか #: fdmprinter.def.json msgctxt "extruder_prime_pos_x label" msgid "Extruder Prime X Position" -msgstr "" +msgstr "エクストルーダープライムX位置" #: fdmprinter.def.json msgctxt "extruder_prime_pos_x description" @@ -3628,7 +3620,7 @@ msgstr "プリント開始時のノズルの位置を表すX座標。" #: fdmprinter.def.json msgctxt "extruder_prime_pos_y label" msgid "Extruder Prime Y Position" -msgstr "" +msgstr "エクストルーダープライムY位置" #: fdmprinter.def.json msgctxt "extruder_prime_pos_y description" @@ -3638,7 +3630,7 @@ msgstr "プリント開始時にノズル位置を表すY座標。" #: fdmprinter.def.json msgctxt "adhesion_type label" msgid "Build Plate Adhesion Type" -msgstr "" +msgstr "ビルドプレート接着タイプ" #: fdmprinter.def.json msgctxt "adhesion_type description" @@ -3648,31 +3640,31 @@ msgstr "エクストルーダーとビルドプレートへの接着両方を改 #: fdmprinter.def.json msgctxt "adhesion_type option skirt" msgid "Skirt" -msgstr "" +msgstr "スカート" # msgstr "スカート" #: fdmprinter.def.json msgctxt "adhesion_type option brim" msgid "Brim" -msgstr "" +msgstr "ブリム" # msgstr "ブリム" #: fdmprinter.def.json msgctxt "adhesion_type option raft" msgid "Raft" -msgstr "" +msgstr "ラフト" # msgstr "ラフト" #: fdmprinter.def.json msgctxt "adhesion_type option none" msgid "None" -msgstr "" +msgstr "なし" # msgstr "なし" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr label" msgid "Build Plate Adhesion Extruder" -msgstr "" +msgstr "ビルドプレート接着エクストルーダー" #: fdmprinter.def.json msgctxt "adhesion_extruder_nr description" @@ -3682,7 +3674,7 @@ msgstr "スカート/ブリム/ラフトをプリントする際のエクスト #: fdmprinter.def.json msgctxt "skirt_line_count label" msgid "Skirt Line Count" -msgstr "" +msgstr "スカートライン数" #: fdmprinter.def.json msgctxt "skirt_line_count description" @@ -3692,19 +3684,19 @@ msgstr "複数のスカートラインを使用すると、小さなモデル形 #: fdmprinter.def.json msgctxt "skirt_gap label" msgid "Skirt Distance" -msgstr "" +msgstr "スカート距離" #: fdmprinter.def.json msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "スカートと印刷の最初の層の間の水平距離。\nこれは最小距離です。複数のスカートラインがこの距離から外側に展開されます。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" msgid "Skirt/Brim Minimum Length" -msgstr "" +msgstr "スカート/ブリム最小長さ" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length description" @@ -3714,7 +3706,7 @@ msgstr "スカートまたはブリム最短の長さ。この長さにすべて #: fdmprinter.def.json msgctxt "brim_width label" msgid "Brim Width" -msgstr "" +msgstr "ブリム幅" #: fdmprinter.def.json msgctxt "brim_width description" @@ -3724,7 +3716,7 @@ msgstr "モデルから最外線のブリムまでの距離。大きなブリム #: fdmprinter.def.json msgctxt "brim_line_count label" msgid "Brim Line Count" -msgstr "" +msgstr "ブリムライン数" #: fdmprinter.def.json msgctxt "brim_line_count description" @@ -3734,7 +3726,7 @@ msgstr "ブリムに使用される線数。ブリムの線数は、ビルドプ #: fdmprinter.def.json msgctxt "brim_outside_only label" msgid "Brim Only on Outside" -msgstr "" +msgstr "外側にブリムのみ印刷" #: fdmprinter.def.json msgctxt "brim_outside_only description" @@ -3744,7 +3736,7 @@ msgstr "モデルの外側のみにブリムを印刷します。これにより #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" -msgstr "" +msgstr "ラフトの余分なマージン" #: fdmprinter.def.json msgctxt "raft_margin description" @@ -3754,17 +3746,17 @@ msgstr "ラフトが有効になっている場合、モデルの周りに余分 #: fdmprinter.def.json msgctxt "raft_smoothing label" msgid "Raft Smoothing" -msgstr "" +msgstr "ラフト補整" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "この設定は、ラフトの輪郭の内側の角がどの程度丸められるかを制御します。内側の角は、ここで指定した値と等しい半径の半円に丸められます。この設定は、そのような円よりも小さいラフトの輪郭の穴を削除します。" #: fdmprinter.def.json msgctxt "raft_airgap label" msgid "Raft Air Gap" -msgstr "" +msgstr "ラフト間のラップ" #: fdmprinter.def.json msgctxt "raft_airgap description" @@ -3774,7 +3766,7 @@ msgstr "モデルの第一層のラフトと最終ラフト層の隙間。この #: fdmprinter.def.json msgctxt "layer_0_z_overlap label" msgid "Initial Layer Z Overlap" -msgstr "" +msgstr "初期レイヤーZのオーバーラップ" #: fdmprinter.def.json msgctxt "layer_0_z_overlap description" @@ -3784,7 +3776,7 @@ msgstr "エアギャップ内で失われたフィラメントを補うために #: fdmprinter.def.json msgctxt "raft_surface_layers label" msgid "Raft Top Layers" -msgstr "" +msgstr "ラフト最上層" #: fdmprinter.def.json msgctxt "raft_surface_layers description" @@ -3794,7 +3786,7 @@ msgstr "第2ラフト層の上の最上層の数。これらは、モデルが #: fdmprinter.def.json msgctxt "raft_surface_thickness label" msgid "Raft Top Layer Thickness" -msgstr "" +msgstr "ラフト最上層厚さ" #: fdmprinter.def.json msgctxt "raft_surface_thickness description" @@ -3804,7 +3796,7 @@ msgstr "トップラフト層の層厚。" #: fdmprinter.def.json msgctxt "raft_surface_line_width label" msgid "Raft Top Line Width" -msgstr "" +msgstr "ラフト最上ライン幅" #: fdmprinter.def.json msgctxt "raft_surface_line_width description" @@ -3814,7 +3806,7 @@ msgstr "ラフトの上面の線の幅。これらは細い線で、ラフトの #: fdmprinter.def.json msgctxt "raft_surface_line_spacing label" msgid "Raft Top Spacing" -msgstr "" +msgstr "ラフト最上面スペース" #: fdmprinter.def.json msgctxt "raft_surface_line_spacing description" @@ -3824,7 +3816,7 @@ msgstr "上のラフト層とラフト線の間の距離。間隔は線の幅と #: fdmprinter.def.json msgctxt "raft_interface_thickness label" msgid "Raft Middle Thickness" -msgstr "" +msgstr "ラフト中央厚さ" #: fdmprinter.def.json msgctxt "raft_interface_thickness description" @@ -3834,7 +3826,7 @@ msgstr "中間のラフト層の層の厚さ。" #: fdmprinter.def.json msgctxt "raft_interface_line_width label" msgid "Raft Middle Line Width" -msgstr "" +msgstr "ラフト中央ライン幅" #: fdmprinter.def.json msgctxt "raft_interface_line_width description" @@ -3844,7 +3836,7 @@ msgstr "中間ラフト層の線の幅。第2層をより押し出すと、ラ #: fdmprinter.def.json msgctxt "raft_interface_line_spacing label" msgid "Raft Middle Spacing" -msgstr "" +msgstr "ラフト中間スペース" #: fdmprinter.def.json msgctxt "raft_interface_line_spacing description" @@ -3854,7 +3846,7 @@ msgstr "中間ラフト層とラフト線の間の距離。中央の間隔はか #: fdmprinter.def.json msgctxt "raft_base_thickness label" msgid "Raft Base Thickness" -msgstr "" +msgstr "ラフトベース厚さ" #: fdmprinter.def.json msgctxt "raft_base_thickness description" @@ -3864,7 +3856,7 @@ msgstr "ベースラフト層の層厚さ。プリンタのビルドプレート #: fdmprinter.def.json msgctxt "raft_base_line_width label" msgid "Raft Base Line Width" -msgstr "" +msgstr "ラフトベースライン幅" #: fdmprinter.def.json msgctxt "raft_base_line_width description" @@ -3874,7 +3866,7 @@ msgstr "ベースラフト層の線幅。ビルドプレートの接着のため #: fdmprinter.def.json msgctxt "raft_base_line_spacing label" msgid "Raft Line Spacing" -msgstr "" +msgstr "ラフトラインスペース" #: fdmprinter.def.json msgctxt "raft_base_line_spacing description" @@ -3884,7 +3876,7 @@ msgstr "ベースラフト層のラフトライン間の距離。広い間隔は #: fdmprinter.def.json msgctxt "raft_speed label" msgid "Raft Print Speed" -msgstr "" +msgstr "ラフト印刷速度" #: fdmprinter.def.json msgctxt "raft_speed description" @@ -3894,7 +3886,7 @@ msgstr "ラフトが印刷される速度。" #: fdmprinter.def.json msgctxt "raft_surface_speed label" msgid "Raft Top Print Speed" -msgstr "" +msgstr "ラフト上層印刷速度" #: fdmprinter.def.json msgctxt "raft_surface_speed description" @@ -3904,7 +3896,7 @@ msgstr "トップラフト層が印刷される速度。この値はノズルが #: fdmprinter.def.json msgctxt "raft_interface_speed label" msgid "Raft Middle Print Speed" -msgstr "" +msgstr "ラフト中間印刷速度" #: fdmprinter.def.json msgctxt "raft_interface_speed description" @@ -3914,7 +3906,7 @@ msgstr "ミドルラフト層が印刷される速度。ノズルから出てく #: fdmprinter.def.json msgctxt "raft_base_speed label" msgid "Raft Base Print Speed" -msgstr "" +msgstr "ラフトベース印刷速度" #: fdmprinter.def.json msgctxt "raft_base_speed description" @@ -3924,7 +3916,7 @@ msgstr "ベースラフト層が印刷される速度。これは、ノズルか #: fdmprinter.def.json msgctxt "raft_acceleration label" msgid "Raft Print Acceleration" -msgstr "" +msgstr "ラフト印刷加速度" #: fdmprinter.def.json msgctxt "raft_acceleration description" @@ -3934,7 +3926,7 @@ msgstr "ラフト印刷時の加速度。" #: fdmprinter.def.json msgctxt "raft_surface_acceleration label" msgid "Raft Top Print Acceleration" -msgstr "" +msgstr "ラフト上層層印刷加速度" #: fdmprinter.def.json msgctxt "raft_surface_acceleration description" @@ -3944,7 +3936,7 @@ msgstr "ラフトのトップ印刷時の加速度" #: fdmprinter.def.json msgctxt "raft_interface_acceleration label" msgid "Raft Middle Print Acceleration" -msgstr "" +msgstr "ラフト中間層印刷加速度" #: fdmprinter.def.json msgctxt "raft_interface_acceleration description" @@ -3954,7 +3946,7 @@ msgstr "ラフトの中間層印刷時の加速度" #: fdmprinter.def.json msgctxt "raft_base_acceleration label" msgid "Raft Base Print Acceleration" -msgstr "" +msgstr "ラフトベース印刷加速度" #: fdmprinter.def.json msgctxt "raft_base_acceleration description" @@ -3964,7 +3956,7 @@ msgstr "ラフトの底面印刷時の加速度" #: fdmprinter.def.json msgctxt "raft_jerk label" msgid "Raft Print Jerk" -msgstr "" +msgstr "ラフト印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_jerk description" @@ -3974,7 +3966,7 @@ msgstr "ラフトが印刷時のジャーク。" #: fdmprinter.def.json msgctxt "raft_surface_jerk label" msgid "Raft Top Print Jerk" -msgstr "" +msgstr "ラフト上層印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_surface_jerk description" @@ -3984,7 +3976,7 @@ msgstr "トップラフト層印刷時のジャーク" #: fdmprinter.def.json msgctxt "raft_interface_jerk label" msgid "Raft Middle Print Jerk" -msgstr "" +msgstr "ラフト中間層印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_interface_jerk description" @@ -3994,7 +3986,7 @@ msgstr "ミドルラフト層印刷時のジャーク" #: fdmprinter.def.json msgctxt "raft_base_jerk label" msgid "Raft Base Print Jerk" -msgstr "" +msgstr "ラフトベース印刷ジャーク" #: fdmprinter.def.json msgctxt "raft_base_jerk description" @@ -4004,7 +3996,7 @@ msgstr "ベースラフト層印刷時のジャーク" #: fdmprinter.def.json msgctxt "raft_fan_speed label" msgid "Raft Fan Speed" -msgstr "" +msgstr "ラフトファン速度" #: fdmprinter.def.json msgctxt "raft_fan_speed description" @@ -4014,7 +4006,7 @@ msgstr "ラフト印刷時のファンの速度。" #: fdmprinter.def.json msgctxt "raft_surface_fan_speed label" msgid "Raft Top Fan Speed" -msgstr "" +msgstr "ラフト上層ファン速度" #: fdmprinter.def.json msgctxt "raft_surface_fan_speed description" @@ -4024,7 +4016,7 @@ msgstr "トップラフト印刷時のファンの速度。" #: fdmprinter.def.json msgctxt "raft_interface_fan_speed label" msgid "Raft Middle Fan Speed" -msgstr "" +msgstr "ラフト中間層ファン速度" #: fdmprinter.def.json msgctxt "raft_interface_fan_speed description" @@ -4034,7 +4026,7 @@ msgstr "ミドルラフト印刷時のファンの速度。" #: fdmprinter.def.json msgctxt "raft_base_fan_speed label" msgid "Raft Base Fan Speed" -msgstr "" +msgstr "ラフトベースファン速度" #: fdmprinter.def.json msgctxt "raft_base_fan_speed description" @@ -4044,7 +4036,7 @@ msgstr "ベースラフト層印刷時のファン速度" #: fdmprinter.def.json msgctxt "dual label" msgid "Dual Extrusion" -msgstr "" +msgstr "デュアルエクストルーダー" #: fdmprinter.def.json msgctxt "dual description" @@ -4054,7 +4046,7 @@ msgstr "デュアルエクストルーダーで印刷するための設定" #: fdmprinter.def.json msgctxt "prime_tower_enable label" msgid "Enable Prime Tower" -msgstr "" +msgstr "プライムタワーを有効にする" #: fdmprinter.def.json msgctxt "prime_tower_enable description" @@ -4064,7 +4056,7 @@ msgstr "印刷物の横にタワーを造形して、ノズル交換後にフィ #: fdmprinter.def.json msgctxt "prime_tower_size label" msgid "Prime Tower Size" -msgstr "" +msgstr "プライムタワーのサイズ" #: fdmprinter.def.json msgctxt "prime_tower_size description" @@ -4074,7 +4066,7 @@ msgstr "プライムタワーの幅。" #: fdmprinter.def.json msgctxt "prime_tower_min_volume label" msgid "Prime Tower Minimum Volume" -msgstr "" +msgstr "プライムタワー最小容積" #: fdmprinter.def.json msgctxt "prime_tower_min_volume description" @@ -4084,7 +4076,7 @@ msgstr "プライムタワーの各層の最小容積" #: fdmprinter.def.json msgctxt "prime_tower_wall_thickness label" msgid "Prime Tower Thickness" -msgstr "" +msgstr "プライムタワーの厚さ" #: fdmprinter.def.json msgctxt "prime_tower_wall_thickness description" @@ -4094,7 +4086,7 @@ msgstr "中空プライムタワーの厚さ。プライムタワーの半分を #: fdmprinter.def.json msgctxt "prime_tower_position_x label" msgid "Prime Tower X Position" -msgstr "" +msgstr "プライムタワーX位置" #: fdmprinter.def.json msgctxt "prime_tower_position_x description" @@ -4104,7 +4096,7 @@ msgstr "プライムタワーの位置のx座標。" #: fdmprinter.def.json msgctxt "prime_tower_position_y label" msgid "Prime Tower Y Position" -msgstr "" +msgstr "プライムタワーY位置" #: fdmprinter.def.json msgctxt "prime_tower_position_y description" @@ -4114,7 +4106,7 @@ msgstr "プライムタワーの位置のy座標。" #: fdmprinter.def.json msgctxt "prime_tower_flow label" msgid "Prime Tower Flow" -msgstr "" +msgstr "プライムタワーのフロー" #: fdmprinter.def.json msgctxt "prime_tower_flow description" @@ -4124,7 +4116,7 @@ msgstr "吐出量: マテリアルの吐出量はこの値の乗算で計算さ #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled label" msgid "Wipe Inactive Nozzle on Prime Tower" -msgstr "" +msgstr "プライムタワーノズル拭き取り" #: fdmprinter.def.json msgctxt "prime_tower_wipe_enabled description" @@ -4134,7 +4126,7 @@ msgstr "1本のノズルでプライムタワーを印刷した後、もう片 #: fdmprinter.def.json msgctxt "dual_pre_wipe label" msgid "Wipe Nozzle After Switch" -msgstr "" +msgstr "スイッチ後のノズル拭き取り" #: fdmprinter.def.json msgctxt "dual_pre_wipe description" @@ -4144,7 +4136,7 @@ msgstr "エクストルーダーを切り替えた後、最初に印刷したも #: fdmprinter.def.json msgctxt "prime_tower_purge_volume label" msgid "Prime Tower Purge Volume" -msgstr "" +msgstr "プライムタワーのパージ量" # msgstr "プライムタワーのパージ時のボリューム" #: fdmprinter.def.json @@ -4155,7 +4147,7 @@ msgstr "プライムタワーの上を拭くときにパージするフィラメ #: fdmprinter.def.json msgctxt "ooze_shield_enabled label" msgid "Enable Ooze Shield" -msgstr "" +msgstr "Ooze Shieldを有効にする" #: fdmprinter.def.json msgctxt "ooze_shield_enabled description" @@ -4165,7 +4157,7 @@ msgstr "モデルの周りに壁(ooze shield)を作る。これを生成す #: fdmprinter.def.json msgctxt "ooze_shield_angle label" msgid "Ooze Shield Angle" -msgstr "" +msgstr "Ooze Shield角度" #: fdmprinter.def.json msgctxt "ooze_shield_angle description" @@ -4175,7 +4167,7 @@ msgstr "壁(ooze shield)作成時の最大の角度。 0度は垂直であ #: fdmprinter.def.json msgctxt "ooze_shield_dist label" msgid "Ooze Shield Distance" -msgstr "" +msgstr "Ooze Shield距離" #: fdmprinter.def.json msgctxt "ooze_shield_dist description" @@ -4185,7 +4177,7 @@ msgstr "壁(ooze shield)の造形物からの距離" #: fdmprinter.def.json msgctxt "meshfix label" msgid "Mesh Fixes" -msgstr "" +msgstr "メッシュ修正" #: fdmprinter.def.json msgctxt "meshfix description" @@ -4195,7 +4187,7 @@ msgstr "カテゴリー_メッシュ修正" #: fdmprinter.def.json msgctxt "meshfix_union_all label" msgid "Union Overlapping Volumes" -msgstr "" +msgstr "重複量" #: fdmprinter.def.json msgctxt "meshfix_union_all description" @@ -4205,7 +4197,7 @@ msgstr "メッシュ内の重なり合うボリュームから生じる内部ジ #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes label" msgid "Remove All Holes" -msgstr "" +msgstr "全穴除去" #: fdmprinter.def.json msgctxt "meshfix_union_all_remove_holes description" @@ -4215,7 +4207,7 @@ msgstr "各レイヤーの穴を消し、外形のみを保持します。これ #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching label" msgid "Extensive Stitching" -msgstr "" +msgstr "強めのスティッチング" #: fdmprinter.def.json msgctxt "meshfix_extensive_stitching description" @@ -4225,7 +4217,7 @@ msgstr "強めのスティッチングは、穴をメッシュで塞いでデー #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons label" msgid "Keep Disconnected Faces" -msgstr "" +msgstr "スティッチできない部分を保持" #: fdmprinter.def.json msgctxt "meshfix_keep_open_polygons description" @@ -4235,17 +4227,17 @@ msgstr "通常、Curaはメッシュ内の小さな穴をスティッチし、 #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "最大解像度" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "スライス後の線分の最小サイズ。これを増やすと、メッシュの解像度が低くなります。これにより、プリンタが g コードの処理速度に追いつくことができ、処理できないメッシュの詳細を取り除いてスライス速度を速めます。" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" -msgstr "" +msgstr "重複メッシュのマージ" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap description" @@ -4255,7 +4247,7 @@ msgstr "触れているメッシュを少し重ねてください。これによ #: fdmprinter.def.json msgctxt "carve_multiple_volumes label" msgid "Remove Mesh Intersection" -msgstr "" +msgstr "重複メッシュの削除" #: fdmprinter.def.json msgctxt "carve_multiple_volumes description" @@ -4265,7 +4257,7 @@ msgstr "複数のメッシュが重なっている領域を削除します。こ #: fdmprinter.def.json msgctxt "alternate_carve_order label" msgid "Alternate Mesh Removal" -msgstr "" +msgstr "代替メッシュの削除" #: fdmprinter.def.json msgctxt "alternate_carve_order description" @@ -4275,17 +4267,17 @@ msgstr "交差するメッシュがどのレイヤーに属しているかを切 #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "空の最初のメッシュの削除" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "最初に印刷したレイヤーの下に空のレイヤーがある場合は取り除きます。この設定を無効にすると、スライストレランスが「排他」または「中間」に設定されている場合に最初のレイヤーが空になる原因になります。" #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" -msgstr "" +msgstr "特別モード" #: fdmprinter.def.json msgctxt "blackmagic description" @@ -4295,7 +4287,7 @@ msgstr "カテゴリー_ブラックマジック" #: fdmprinter.def.json msgctxt "print_sequence label" msgid "Print Sequence" -msgstr "" +msgstr "印刷頻度" #: fdmprinter.def.json msgctxt "print_sequence description" @@ -4305,17 +4297,17 @@ msgstr "すべてのモデルをレイヤーごとに印刷するか、1つの #: fdmprinter.def.json msgctxt "print_sequence option all_at_once" msgid "All at Once" -msgstr "" +msgstr "一度にすべて" #: fdmprinter.def.json msgctxt "print_sequence option one_at_a_time" msgid "One at a Time" -msgstr "" +msgstr "1つずつ" #: fdmprinter.def.json msgctxt "infill_mesh label" msgid "Infill Mesh" -msgstr "" +msgstr "インフィルメッシュ" #: fdmprinter.def.json msgctxt "infill_mesh description" @@ -4325,7 +4317,7 @@ msgstr "このメッシュを使用して、重なる他のメッシュのイン #: fdmprinter.def.json msgctxt "infill_mesh_order label" msgid "Infill Mesh Order" -msgstr "" +msgstr "インフィルメッシュの順序" #: fdmprinter.def.json msgctxt "infill_mesh_order description" @@ -4335,7 +4327,7 @@ msgstr "他のインフィルメッシュのインフィル内にあるインフ #: fdmprinter.def.json msgctxt "cutting_mesh label" msgid "Cutting Mesh" -msgstr "" +msgstr "メッシュ切断" # msgstr "メッシュの切断" #: fdmprinter.def.json @@ -4346,7 +4338,7 @@ msgstr "このメッシュの大きさをを他のメッシュ内に制限しま #: fdmprinter.def.json msgctxt "mold_enabled label" msgid "Mold" -msgstr "" +msgstr "型" # msgstr "モールド" #: fdmprinter.def.json @@ -4357,7 +4349,7 @@ msgstr "型を取るため印刷し、ビルドプレート上の同じような #: fdmprinter.def.json msgctxt "mold_width label" msgid "Minimal Mold Width" -msgstr "" +msgstr "最小型幅" # msgstr "最小のモールド幅" #: fdmprinter.def.json @@ -4368,7 +4360,7 @@ msgstr "型用とモデルの外側の最短距離。" #: fdmprinter.def.json msgctxt "mold_roof_height label" msgid "Mold Roof Height" -msgstr "" +msgstr "型ルーフ高さ" # msgstr "モールドの屋根の高さ" #: fdmprinter.def.json @@ -4379,7 +4371,7 @@ msgstr "型を印刷するためのモデルの水平部分上の高さ。" #: fdmprinter.def.json msgctxt "mold_angle label" msgid "Mold Angle" -msgstr "" +msgstr "型角度" # msgstr "モールドの角度" #: fdmprinter.def.json @@ -4390,7 +4382,7 @@ msgstr "型の外側の壁のオーバーハングの角度です。0度にす #: fdmprinter.def.json msgctxt "support_mesh label" msgid "Support Mesh" -msgstr "" +msgstr "サポートメッシュ" #: fdmprinter.def.json msgctxt "support_mesh description" @@ -4400,7 +4392,7 @@ msgstr "このメッシュを使用してサポート領域を指定します。 #: fdmprinter.def.json msgctxt "support_mesh_drop_down label" msgid "Drop Down Support Mesh" -msgstr "" +msgstr "サポートメッシュの下処理" # msgstr "ドロップダウンサポートメッシュ" #: fdmprinter.def.json @@ -4411,7 +4403,7 @@ msgstr "サポートメッシュの下のサポート材を全箇所に作りま #: fdmprinter.def.json msgctxt "anti_overhang_mesh label" msgid "Anti Overhang Mesh" -msgstr "" +msgstr "メッシュオーバーハング例外" #: fdmprinter.def.json msgctxt "anti_overhang_mesh description" @@ -4421,7 +4413,7 @@ msgstr "このメッシュを使用して、モデルのどの部分をオーバ #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode label" msgid "Surface Mode" -msgstr "" +msgstr "表面モード" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode description" @@ -4431,22 +4423,22 @@ msgstr "モデルを表面のみ、ボリューム、または緩い表面のボ #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option normal" msgid "Normal" -msgstr "" +msgstr "標準" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option surface" msgid "Surface" -msgstr "" +msgstr "表面" #: fdmprinter.def.json msgctxt "magic_mesh_surface_mode option both" msgid "Both" -msgstr "" +msgstr "両方" #: fdmprinter.def.json msgctxt "magic_spiralize label" msgid "Spiralize Outer Contour" -msgstr "" +msgstr "滑らかな外側輪郭" #: fdmprinter.def.json msgctxt "magic_spiralize description" @@ -4456,7 +4448,7 @@ msgstr "Z軸の外側のエッジの動きを滑らかにします。全体の #: fdmprinter.def.json msgctxt "smooth_spiralized_contours label" msgid "Smooth Spiralized Contours" -msgstr "" +msgstr "滑らかな輪郭" # msgstr "滑らかならせん状の輪郭" #: fdmprinter.def.json @@ -4467,7 +4459,7 @@ msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低 #: fdmprinter.def.json msgctxt "relative_extrusion label" msgid "Relative Extrusion" -msgstr "" +msgstr "相対押出" # msgstr "相対エクストルージョン" #: fdmprinter.def.json @@ -4478,7 +4470,7 @@ msgstr "絶対押出ではなく、相対押出を使用します。相対Eス #: fdmprinter.def.json msgctxt "experimental label" msgid "Experimental" -msgstr "" +msgstr "実験" #: fdmprinter.def.json msgctxt "experimental description" @@ -4488,7 +4480,7 @@ msgstr "実験的" #: fdmprinter.def.json msgctxt "optimize_wall_printing_order label" msgid "Optimize Wall Printing Order" -msgstr "" +msgstr "壁印刷順序の最適化" # msgstr "壁のプリントの順番を最適化する" #: fdmprinter.def.json @@ -4499,7 +4491,7 @@ msgstr "撤回と移動距離を減らすために、壁のプリント順序を #: fdmprinter.def.json msgctxt "support_skip_some_zags label" msgid "Break Up Support In Chunks" -msgstr "" +msgstr "接続部分のサポート分割" # msgstr "かたまりででサポートを割る" #: fdmprinter.def.json @@ -4510,7 +4502,7 @@ msgstr "サポートラインの接続部分をスキップし、サポート材 #: fdmprinter.def.json msgctxt "support_skip_zag_per_mm label" msgid "Support Chunk Size" -msgstr "" +msgstr "サポート分割サイズ" # msgstr "サポートのかたまりサイズ" #: fdmprinter.def.json @@ -4521,7 +4513,7 @@ msgstr "サポート毎行Nミリ時に、サポートの接続をわざと外 #: fdmprinter.def.json msgctxt "support_zag_skip_count label" msgid "Support Chunk Line Count" -msgstr "" +msgstr "サポート分割ライン数" # msgstr "サポートのかたまり線数" #: fdmprinter.def.json @@ -4532,7 +4524,7 @@ msgstr "毎行Nミリ時に、サポートの接続をわざとスキップし #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" -msgstr "" +msgstr "ドラフトシールドを有効にする" #: fdmprinter.def.json msgctxt "draft_shield_enabled description" @@ -4542,7 +4534,7 @@ msgstr "これにより、モデルの周囲に壁ができ、熱を閉じ込め #: fdmprinter.def.json msgctxt "draft_shield_dist label" msgid "Draft Shield X/Y Distance" -msgstr "" +msgstr "ドラフトシールドとX/Yの距離" #: fdmprinter.def.json msgctxt "draft_shield_dist description" @@ -4552,7 +4544,7 @@ msgstr "ドラフトシールドと造形物のX / Y方向の距離" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation label" msgid "Draft Shield Limitation" -msgstr "" +msgstr "ドラフトシールドの制限" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation description" @@ -4562,17 +4554,17 @@ msgstr "ドラフトシールドの高さを設定します。ドラフトシー #: fdmprinter.def.json msgctxt "draft_shield_height_limitation option full" msgid "Full" -msgstr "" +msgstr "制限なし" #: fdmprinter.def.json msgctxt "draft_shield_height_limitation option limited" msgid "Limited" -msgstr "" +msgstr "制限あり" #: fdmprinter.def.json msgctxt "draft_shield_height label" msgid "Draft Shield Height" -msgstr "" +msgstr "ドラフトシールドの高さ" #: fdmprinter.def.json msgctxt "draft_shield_height description" @@ -4582,7 +4574,7 @@ msgstr "ドラフトシールドの高さ制限。この高さを超えるとド #: fdmprinter.def.json msgctxt "conical_overhang_enabled label" msgid "Make Overhang Printable" -msgstr "" +msgstr "オーバーハング印刷可能" #: fdmprinter.def.json msgctxt "conical_overhang_enabled description" @@ -4592,7 +4584,7 @@ msgstr "最小限のサポートが必要となるように印刷モデルのジ #: fdmprinter.def.json msgctxt "conical_overhang_angle label" msgid "Maximum Model Angle" -msgstr "" +msgstr "最大モデル角度" #: fdmprinter.def.json msgctxt "conical_overhang_angle description" @@ -4602,7 +4594,7 @@ msgstr "印刷可能になったオーバーハングの最大角度。 0°の #: fdmprinter.def.json msgctxt "coasting_enable label" msgid "Enable Coasting" -msgstr "" +msgstr "コースティングを有効にする" #: fdmprinter.def.json msgctxt "coasting_enable description" @@ -4612,7 +4604,7 @@ msgstr "コースティングは、それぞれの造形ラインの最後の部 #: fdmprinter.def.json msgctxt "coasting_volume label" msgid "Coasting Volume" -msgstr "" +msgstr "コースティングのボリューム" #: fdmprinter.def.json msgctxt "coasting_volume description" @@ -4622,7 +4614,7 @@ msgstr "はみ出るフィラメントのボリューム。この値は、一般 #: fdmprinter.def.json msgctxt "coasting_min_volume label" msgid "Minimum Volume Before Coasting" -msgstr "" +msgstr "コースティング前の最小ボリューム" #: fdmprinter.def.json msgctxt "coasting_min_volume description" @@ -4632,7 +4624,7 @@ msgstr "コースティングに必要な最小の容積。より小さい押出 #: fdmprinter.def.json msgctxt "coasting_speed label" msgid "Coasting Speed" -msgstr "" +msgstr "コースティング速度" #: fdmprinter.def.json msgctxt "coasting_speed description" @@ -4642,7 +4634,7 @@ msgstr "コースティング中の移動速度。印刷時の経路の速度設 #: fdmprinter.def.json msgctxt "skin_alternate_rotation label" msgid "Alternate Skin Rotation" -msgstr "" +msgstr "レイヤー回転変更" #: fdmprinter.def.json msgctxt "skin_alternate_rotation description" @@ -4652,7 +4644,7 @@ msgstr "トップ/ボトムのレイヤーが印刷される方向を変更し #: fdmprinter.def.json msgctxt "cross_infill_pocket_size label" msgid "Cross 3D Pocket Size" -msgstr "" +msgstr "3Dクロスポケットのサイズ" # msgstr "クロス3Dポケットサイズ" #: fdmprinter.def.json @@ -4663,7 +4655,7 @@ msgstr "四方でクロス3Dパターンが交差するポケットの大きさ #: fdmprinter.def.json msgctxt "cross_infill_apply_pockets_alternatingly label" msgid "Alternate Cross 3D Pockets" -msgstr "" +msgstr "3Dクロスポケットの変更" # msgstr "クロス3Dポケットと交差させる" #: fdmprinter.def.json @@ -4674,7 +4666,7 @@ msgstr "四方がクロスする、クロス3Dパターン交差時には半分 #: fdmprinter.def.json msgctxt "spaghetti_infill_enabled label" msgid "Spaghetti Infill" -msgstr "" +msgstr "スパゲッティインフィル" # msgstr "スパゲッティ・インフィル" #: fdmprinter.def.json @@ -4685,7 +4677,7 @@ msgstr "時々インフィルを印刷してください、オブジェクト内 #: fdmprinter.def.json msgctxt "spaghetti_infill_stepped label" msgid "Spaghetti Infill Stepping" -msgstr "" +msgstr "スパゲッティインフィルの手順" # msgstr "スパゲッティのインフィルステッピング" #: fdmprinter.def.json @@ -4696,7 +4688,7 @@ msgstr "スパゲッティインフィルをプリントするか印刷の最後 #: fdmprinter.def.json msgctxt "spaghetti_max_infill_angle label" msgid "Spaghetti Maximum Infill Angle" -msgstr "" +msgstr "スパゲッティインフィル最大角度" # msgstr "スパゲッティの最大のインフィルの角度" #: fdmprinter.def.json @@ -4707,7 +4699,7 @@ msgstr "最大角度 w.r.t.-印刷範囲内がスパゲッティ・インフィ #: fdmprinter.def.json msgctxt "spaghetti_max_height label" msgid "Spaghetti Infill Maximum Height" -msgstr "" +msgstr "スパゲッティインフィル最大高さ" # msgstr "スパゲッティインフィルの最大高さ" #: fdmprinter.def.json @@ -4718,7 +4710,7 @@ msgstr "内部空間の上から結合して埋め込むことができる最大 #: fdmprinter.def.json msgctxt "spaghetti_inset label" msgid "Spaghetti Inset" -msgstr "" +msgstr "スパゲッティインフィルのオフセット" # msgstr "スパゲティをセットする" #: fdmprinter.def.json @@ -4729,7 +4721,7 @@ msgstr "スパゲッティ・インフィルがプリントされる壁からの #: fdmprinter.def.json msgctxt "spaghetti_flow label" msgid "Spaghetti Flow" -msgstr "" +msgstr "スパゲッティインフィルフロー" # msgstr "スパゲッティのフロー" #: fdmprinter.def.json @@ -4740,7 +4732,7 @@ msgstr "スパゲッティ・インフィルの密度を調整します。イン #: fdmprinter.def.json msgctxt "spaghetti_infill_extra_volume label" msgid "Spaghetti Infill Extra Volume" -msgstr "" +msgstr "スパゲッティインフィル余剰調整" # msgstr "スパゲッティ・インフィルの余分量" #: fdmprinter.def.json @@ -4751,7 +4743,7 @@ msgstr "スパゲッティをプリントする際に毎回行なう吐出量の #: fdmprinter.def.json msgctxt "support_conical_enabled label" msgid "Enable Conical Support" -msgstr "" +msgstr "円錐サポートを有効にする" #: fdmprinter.def.json msgctxt "support_conical_enabled description" @@ -4761,7 +4753,7 @@ msgstr "実験的機能:オーバーハング部分よりも底面のサポー #: fdmprinter.def.json msgctxt "support_conical_angle label" msgid "Conical Support Angle" -msgstr "" +msgstr "円錐サポートの角度" #: fdmprinter.def.json msgctxt "support_conical_angle description" @@ -4771,7 +4763,7 @@ msgstr "円錐形のサポートの傾きの角度。 0度は垂直であり、9 #: fdmprinter.def.json msgctxt "support_conical_min_width label" msgid "Conical Support Minimum Width" -msgstr "" +msgstr "円錐サポートの最大幅" #: fdmprinter.def.json msgctxt "support_conical_min_width description" @@ -4781,7 +4773,7 @@ msgstr "円錐形のサポート領域のベースが縮小される最小幅。 #: fdmprinter.def.json msgctxt "infill_hollow label" msgid "Hollow Out Objects" -msgstr "" +msgstr "オブジェクトの空洞化" #: fdmprinter.def.json msgctxt "infill_hollow description" @@ -4791,7 +4783,7 @@ msgstr "すべてのインフィルを取り除き、オブジェクトの内部 #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled label" msgid "Fuzzy Skin" -msgstr "" +msgstr "ファジースキン" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_enabled description" @@ -4801,7 +4793,7 @@ msgstr "外壁を印刷する際に振動が起こり、表面が粗くてぼや #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness label" msgid "Fuzzy Skin Thickness" -msgstr "" +msgstr "ファジースキンの厚さ" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_thickness description" @@ -4811,7 +4803,7 @@ msgstr "振動が起こる幅。内壁は変更されていないので、これ #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density label" msgid "Fuzzy Skin Density" -msgstr "" +msgstr "ファジースキンの密度" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_density description" @@ -4821,7 +4813,7 @@ msgstr "レイヤー内の各ポリゴンに導入されたポイントの平均 #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist label" msgid "Fuzzy Skin Point Distance" -msgstr "" +msgstr "ファジースキン点間距離" #: fdmprinter.def.json msgctxt "magic_fuzzy_skin_point_dist description" @@ -4831,27 +4823,27 @@ msgstr "各線分に導入されたランダム点間の平均距離。ポリゴ #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "流量補正時の最大抽出オフセット" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "補正の最大距離をミリ単位で指定します。" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "流量補正要因" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "流量を距離に変換する際の要因。" #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" -msgstr "" +msgstr "ワイヤ印刷" #: fdmprinter.def.json msgctxt "wireframe_enabled description" @@ -4861,7 +4853,7 @@ msgstr "薄い空気中に印刷し、疎なウエブ構造で外面のみを印 #: fdmprinter.def.json msgctxt "wireframe_height label" msgid "WP Connection Height" -msgstr "" +msgstr "WPの高さ" #: fdmprinter.def.json msgctxt "wireframe_height description" @@ -4871,7 +4863,7 @@ msgstr "2つの水平なパーツ間の、上向きおよび斜め下向きの #: fdmprinter.def.json msgctxt "wireframe_roof_inset label" msgid "WP Roof Inset Distance" -msgstr "" +msgstr "WPルーフ距離のオフセット" #: fdmprinter.def.json msgctxt "wireframe_roof_inset description" @@ -4881,7 +4873,7 @@ msgstr "ルーフから内側に輪郭を描くときの距離。ワイヤ印刷 #: fdmprinter.def.json msgctxt "wireframe_printspeed label" msgid "WP Speed" -msgstr "" +msgstr "WP速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed description" @@ -4891,7 +4883,7 @@ msgstr "マテリアルを押し出すときにノズルが動く速度。ワイ #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom label" msgid "WP Bottom Printing Speed" -msgstr "" +msgstr "WP底面印字速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_bottom description" @@ -4901,7 +4893,7 @@ msgstr "ブルドプラットフォームに接触する第1層の印刷速度 #: fdmprinter.def.json msgctxt "wireframe_printspeed_up label" msgid "WP Upward Printing Speed" -msgstr "" +msgstr "WP上向き印字速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_up description" @@ -4911,7 +4903,7 @@ msgstr "薄い空気の中で上向きに線を印刷する速度。ワイヤ印 #: fdmprinter.def.json msgctxt "wireframe_printspeed_down label" msgid "WP Downward Printing Speed" -msgstr "" +msgstr "WP下向き印字速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_down description" @@ -4921,7 +4913,7 @@ msgstr "斜め下方に線を印刷する速度。ワイヤ印刷のみに適用 #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat label" msgid "WP Horizontal Printing Speed" -msgstr "" +msgstr "WP水平印字速度" #: fdmprinter.def.json msgctxt "wireframe_printspeed_flat description" @@ -4931,7 +4923,7 @@ msgstr "モデルの水平輪郭を印刷する速度。ワイヤ印刷のみに #: fdmprinter.def.json msgctxt "wireframe_flow label" msgid "WP Flow" -msgstr "" +msgstr "WPフロー" #: fdmprinter.def.json msgctxt "wireframe_flow description" @@ -4941,7 +4933,7 @@ msgstr "流れ補正:押出されたマテリアルの量はこの値の乗算 #: fdmprinter.def.json msgctxt "wireframe_flow_connection label" msgid "WP Connection Flow" -msgstr "" +msgstr "WP接続フロー" #: fdmprinter.def.json msgctxt "wireframe_flow_connection description" @@ -4951,7 +4943,7 @@ msgstr "上下に動くときの吐出補正。ワイヤ印刷のみに適用さ #: fdmprinter.def.json msgctxt "wireframe_flow_flat label" msgid "WP Flat Flow" -msgstr "" +msgstr "WPフラットフロー" #: fdmprinter.def.json msgctxt "wireframe_flow_flat description" @@ -4961,7 +4953,7 @@ msgstr "フラットラインを印刷する際の吐出補正。ワイヤ印刷 #: fdmprinter.def.json msgctxt "wireframe_top_delay label" msgid "WP Top Delay" -msgstr "" +msgstr "WP上面遅延" #: fdmprinter.def.json msgctxt "wireframe_top_delay description" @@ -4971,7 +4963,7 @@ msgstr "上向きの線が硬くなるように、上向きの動きの後の時 #: fdmprinter.def.json msgctxt "wireframe_bottom_delay label" msgid "WP Bottom Delay" -msgstr "" +msgstr "WP底面遅延" #: fdmprinter.def.json msgctxt "wireframe_bottom_delay description" @@ -4981,7 +4973,7 @@ msgstr "下降後の遅延時間。ワイヤ印刷のみに適用されます。 #: fdmprinter.def.json msgctxt "wireframe_flat_delay label" msgid "WP Flat Delay" -msgstr "" +msgstr "WP水平遅延" #: fdmprinter.def.json msgctxt "wireframe_flat_delay description" @@ -4991,7 +4983,7 @@ msgstr "2つの水平セグメント間の遅延時間。このような遅延 #: fdmprinter.def.json msgctxt "wireframe_up_half_speed label" msgid "WP Ease Upward" -msgstr "" +msgstr "WP低速移動距離" #: fdmprinter.def.json msgctxt "wireframe_up_half_speed description" @@ -5003,7 +4995,7 @@ msgstr "半分の速度で押出される上方への移動距離。過度にマ #: fdmprinter.def.json msgctxt "wireframe_top_jump label" msgid "WP Knot Size" -msgstr "" +msgstr "WPノットサイズ" #: fdmprinter.def.json msgctxt "wireframe_top_jump description" @@ -5013,7 +5005,7 @@ msgstr "上向きの線の上端に小さな結び目を作成し、連続する #: fdmprinter.def.json msgctxt "wireframe_fall_down label" msgid "WP Fall Down" -msgstr "" +msgstr "WP落下距離" #: fdmprinter.def.json msgctxt "wireframe_fall_down description" @@ -5023,7 +5015,7 @@ msgstr "上向き押出後にマテリアルが落下する距離。この距離 #: fdmprinter.def.json msgctxt "wireframe_drag_along label" msgid "WP Drag Along" -msgstr "" +msgstr "WP引きづり距離" #: fdmprinter.def.json msgctxt "wireframe_drag_along description" @@ -5033,7 +5025,7 @@ msgstr "斜め下方への押出に伴い上向き押出しているマテリア #: fdmprinter.def.json msgctxt "wireframe_strategy label" msgid "WP Strategy" -msgstr "" +msgstr "WPストラテジー" #: fdmprinter.def.json msgctxt "wireframe_strategy description" @@ -5043,22 +5035,22 @@ msgstr "各接続ポイントで2つの連続したレイヤーが密着して #: fdmprinter.def.json msgctxt "wireframe_strategy option compensate" msgid "Compensate" -msgstr "" +msgstr "補正" #: fdmprinter.def.json msgctxt "wireframe_strategy option knot" msgid "Knot" -msgstr "" +msgstr "ノット" #: fdmprinter.def.json msgctxt "wireframe_strategy option retract" msgid "Retract" -msgstr "" +msgstr "引き戻し" #: fdmprinter.def.json msgctxt "wireframe_straight_before_down label" msgid "WP Straighten Downward Lines" -msgstr "" +msgstr "WP下向き直線ライン" #: fdmprinter.def.json msgctxt "wireframe_straight_before_down description" @@ -5068,7 +5060,7 @@ msgstr "水平方向の直線部分で覆われた斜めに下降線の割合で #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down label" msgid "WP Roof Fall Down" -msgstr "" +msgstr "WPルーフ落下距離" #: fdmprinter.def.json msgctxt "wireframe_roof_fall_down description" @@ -5078,7 +5070,7 @@ msgstr "水平ルーフが ”薄い空気”に印刷され落ちる距離。 #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along label" msgid "WP Roof Drag Along" -msgstr "" +msgstr "WPルーフ引きずり距離" #: fdmprinter.def.json msgctxt "wireframe_roof_drag_along description" @@ -5088,7 +5080,7 @@ msgstr "ルーフの外側の輪郭に戻る際に引きずる内側ラインの #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay label" msgid "WP Roof Outer Delay" -msgstr "" +msgstr "WPルーフ外側処理時間" #: fdmprinter.def.json msgctxt "wireframe_roof_outer_delay description" @@ -5098,7 +5090,7 @@ msgstr "トップレイヤーにある穴の外側に掛ける時間。長い時 #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance label" msgid "WP Nozzle Clearance" -msgstr "" +msgstr "WPノズル隙間" #: fdmprinter.def.json msgctxt "wireframe_nozzle_clearance description" @@ -5108,7 +5100,7 @@ msgstr "ノズルと水平方向に下向きの線間の距離。大きな隙間 #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" -msgstr "" +msgstr "コマンドライン設定" #: fdmprinter.def.json msgctxt "command_line_settings description" @@ -5118,17 +5110,17 @@ msgstr "CuraエンジンがCuraフロントエンドから呼び出されない #: fdmprinter.def.json msgctxt "center_object label" msgid "Center object" -msgstr "" +msgstr "オブジェクト中心配置" #: fdmprinter.def.json msgctxt "center_object description" msgid "Whether to center the object on the middle of the build platform (0,0), instead of using the coordinate system in which the object was saved." -msgstr "オブジェクトが保存された座標系を使用する代わりにビルドプラットフォームの中間(0,0)にオブジェクトを配置するかどうか。" +msgstr "オブジェクトが保存された座標系を使用する代わりにビルドプラットフォームの中間(0,0)にオブジェクトを配置するかどうか。" #: fdmprinter.def.json msgctxt "mesh_position_x label" msgid "Mesh position x" -msgstr "" +msgstr "メッシュ位置X" #: fdmprinter.def.json msgctxt "mesh_position_x description" @@ -5138,7 +5130,7 @@ msgstr "オブジェクトの x 方向に適用されたオフセット。" #: fdmprinter.def.json msgctxt "mesh_position_y label" msgid "Mesh position y" -msgstr "" +msgstr "メッシュ位置Y" #: fdmprinter.def.json msgctxt "mesh_position_y description" @@ -5148,7 +5140,7 @@ msgstr "オブジェクトのY 方向適用されたオフセット。" #: fdmprinter.def.json msgctxt "mesh_position_z label" msgid "Mesh position z" -msgstr "" +msgstr "メッシュ位置Z" #: fdmprinter.def.json msgctxt "mesh_position_z description" @@ -5158,7 +5150,7 @@ msgstr "オブジェクトの z 方向に適用されたオフセット。この #: fdmprinter.def.json msgctxt "mesh_rotation_matrix label" msgid "Mesh Rotation Matrix" -msgstr "" +msgstr "メッシュ回転マトリックス" #: fdmprinter.def.json msgctxt "mesh_rotation_matrix description" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index d45dec3bb9..4204b5a80a 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-11-14 22:13+0900\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ko_KR\n" @@ -93,7 +93,7 @@ msgstr "Doodle3D Connect에 파일 전송" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Connect 열기..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -143,7 +143,7 @@ msgstr "프린터가 사용 중이거나 연결되어 있지 않아 새 작업 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "프린터 사용 불가" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -595,7 +595,7 @@ msgstr "네트워크를 통해 연결" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "{machine_name}의 새로운 기능을 사용할 수 있습니다! 프린터의 펌웨어를 업데이트하는 것이 좋습니다." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -606,7 +606,7 @@ msgstr "새로운 펌웨어를 사용할 수 있습니다." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "업데이트 방법" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -641,7 +641,7 @@ msgstr "시작하는 도중 오류가 발생했습니다!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "시뮬레이션 보기" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -651,7 +651,7 @@ msgstr "와이어 인쇄가 활성화되어있을 때 Cura는 레이어를 정 #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "시뮬레이션 보기" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -732,7 +732,7 @@ msgstr "현재 설정으로 슬라이스 할 수 없습니다. 다음 설정에 #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "일부 모델별 설정으로 인해 슬라이스할 수 없습니다. 하나 이상의 모델에서 다음 설정에 오류가 있습니다. {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -767,25 +767,25 @@ msgstr "모델 별 설정 구성" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "설치" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Siemens NX 플러그인 파일을 복사하지 못했습니다. UGII_USER_DIR을 확인하십시오. 디렉터리에 할당되지 않았습니다." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Cura 플러그인을 성공적으로 설치했습니다." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Siemens NX 플러그인 파일을 복사하지 못했습니다. UGII_USER_DIR을 확인하십시오." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Siemens NX 플러그인을 설치하지 못했습니다. Siemens NX의 환경 변수 UGII_USER_DIR을 설정할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -948,7 +948,7 @@ msgstr "다른" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "알 수 없음" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1013,12 +1013,12 @@ msgstr "맞춤 소재" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "전역" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "재정의되지 않음" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1067,7 +1067,7 @@ msgstr "프로파일을 ?에 내보냅니다" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "내보내기 완료" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1139,85 +1139,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    치명적인 예외가 발생했습니다. 문제를 해결할 수 있도록 이 충돌 보고서를 보내주십시오.

    \n

    \"보고서 전송\" 버튼을 사용하면 버그 보고서가 서버에 자동으로 보고됩니다.

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "시스템 정보" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "알 수 없음" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura 버전: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "플랫폼: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt 버전: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt 버전: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL 버전: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL 공급업체: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL Renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "예외 역추적" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "로그" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "사용자 설명" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "보고서 전송" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1255,7 +1255,7 @@ msgstr "G 코드가 로드되어 있으면 다른 파일을 열 수 없습니다 #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "선택한 모델이 너무 작아서 로드할 수 없습니다." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1516,10 +1516,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n" -"\n" -"아래 목록에서 프린터를 선택하십시오" +msgstr ":네트워크를 통해 프린터로 직접 인쇄하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n\n아래 목록에서 프린터를 선택하십시오" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1633,7 +1630,7 @@ msgstr "?은 연결된 Ultimaker 3에 연결된 프린터 그룹을 호스트하 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "인쇄 작업 페이지를 기본 웹 브라우저로 엽니다." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1668,7 +1665,7 @@ msgstr "프린터와의 연결이 끊어졌습니다" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "해제됨" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1683,12 +1680,12 @@ msgstr "끝마친" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "일시 중지됨" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "다시 시작" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1830,12 +1827,12 @@ msgstr "라인 유형" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "이송 속도" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "레이어 두께" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1885,12 +1882,12 @@ msgstr "내벽" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "최소" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "최대" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2123,12 +2120,12 @@ msgstr "표시 설정 :" #: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" -msgstr "" +msgstr "%1/%2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "프로젝트를 로드하면 빌드 플레이트의 모든 모델이 지워집니다." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2171,7 +2168,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "이 플러그인에는 라이선스가 포함되어 있습니다.\n이 플러그인을 설치하려면 이 라이선스를 수락해야 합니다.\n아래의 약관에 동의하시겠습니까?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2186,7 +2183,7 @@ msgstr "거절" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "사용자 계약" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2436,9 +2433,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"일부 프로필 설정을 사용자 지정했습니다.\n" -"이러한 설정을 유지하거나 삭제 하시겠습니까?" +msgstr "일부 프로필 설정을 사용자 지정했습니다.\n이러한 설정을 유지하거나 삭제 하시겠습니까?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3069,7 +3064,7 @@ msgstr "Cura 소개" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "버전: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3081,9 +3076,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\n" -"Cura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" +msgstr "Cura는 커뮤니티와 공동으로 Ultimaker B.V.에 의해 개발되었습니다\nCura는 다음 오픈 소스 프로젝트를 자랑스럽게 사용합니다" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3168,7 +3161,7 @@ msgstr "다각형 클리핑 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Python HTTP 라이브러리" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3188,7 +3181,7 @@ msgstr "윤곽:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "프로필을 사용할 수 없음" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3196,10 +3189,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n" -"\n" -"프로파일 매니저를 열려면 클릭하십시오." +msgstr "일부 설정 / 대체 값은 프로파일에 저장된 값과 다릅니다.\n\n프로파일 매니저를 열려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3237,10 +3227,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n" -"\n" -"이 설정을 표시하려면 클릭하십시오." +msgstr "일부 숨겨진 설정은 정상 계산 값과 다른 값을 사용합니다.\n\n이 설정을 표시하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3268,10 +3255,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"이 설정에는 프로필과 다른 값이 있습니다.\n" -"\n" -"프로필 값을 복원하려면 클릭하십시오." +msgstr "이 설정에는 프로필과 다른 값이 있습니다.\n\n프로필 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3279,10 +3263,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n" -"\n" -"계산 된 값을 복원하려면 클릭하십시오." +msgstr "이 설정은 일반적으로 계산되지만 현재는 절대 값이 설정되어 있습니다.\n\n계산 된 값을 복원하려면 클릭하십시오." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3294,65 +3275,59 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"인쇄 설정 사용 안 함\n" -"G 코드 파일은 수정할 수 없습니다" +msgstr "인쇄 설정 사용 안 함\nG 코드 파일은 수정할 수 없습니다" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "시간 사양
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "비용 사양" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "총계:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality." -msgstr "" -"권장 인쇄 설정\n" -"선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." +msgstr "권장 인쇄 설정\n선택한 프린터, 재질 및 품질에 대한 권장 설정으로 인쇄하십시오." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process." -msgstr "" -"사용자 정의 인쇄 설정\n" -"마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." +msgstr "사용자 정의 인쇄 설정\n마지막 스플 라이스 프로세스의 모든 비트를 미세하게 제어하여 인쇄하십시오." #: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" @@ -3467,27 +3442,27 @@ msgstr "인쇄하기 전에 베드를 미리 가열하십시오. 가열되는 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "프린터 제어" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "조그 위치" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "조그 거리" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3532,7 +3507,7 @@ msgstr "그만두다" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "카메라 위치 재설정(&R)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3774,7 +3749,7 @@ msgstr "모델로 모두 가져 오기" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3931,7 +3906,7 @@ msgstr "층 높이" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "사용자 지정 프로필이 현재 활성 상태입니다. 품질 슬라이더를 실행하려면 사용자 지정 탭에서 기본 품질 프로필을 선택하십시오." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3951,7 +3926,7 @@ msgstr "빨리" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "일부 프로필 설정을 수정했습니다. 이러한 설정을 변경하려면 사용자 지정 모드로 이동하십시오." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4001,9 +3976,7 @@ msgstr "테두리 또는 raft 인쇄를 사용합니다. 이렇게하면 개체 #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "Need help improving your prints?
    Read the Ultimaker Troubleshooting Guides" -msgstr "" -"인쇄물 개선에 도움이 필요하십니까?\n" -"Ultimaker 문제 해결 가이드 읽기" +msgstr "인쇄물 개선에 도움이 필요하십니까?\nUltimaker 문제 해결 가이드 읽기" #: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 msgctxt "@label %1 is filled in with the name of an extruder" @@ -4045,7 +4018,7 @@ msgstr "자재" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "호환성 확인" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4185,12 +4158,12 @@ msgstr "SolidWorks 통합" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "시뮬레이션 보기를 제공합니다." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "시뮬레이션 보기" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4275,12 +4248,12 @@ msgstr "버전 업그레이드 2.7에서 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Cura 3.0에서 Cura 3.1로 구성을 업그레이드합니다." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "3.0에서 3.1로 버전 업그레이드" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4345,12 +4318,12 @@ msgstr "모델 별 설정 도구" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Siemens NX에서 'Cura로 내보내기' 버튼을 설치할 수 있습니다." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4415,12 +4388,12 @@ msgstr "3MF 기록기" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "사용자에게 라이선스에 동의하는지 한 번 묻습니다." #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "사용자 계약" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po index 3e5890b31b..2d9cffc0dc 100644 --- a/resources/i18n/ko_KR/fdmextruder.def.json.po +++ b/resources/i18n/ko_KR/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-20 14:31+0900\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ko_KR\n" @@ -41,7 +41,7 @@ msgstr "인쇄에 사용되는 압출기 트레인. 이것은 다중 압출에 #: fdmextruder.def.json msgctxt "machine_nozzle_id label" msgid "Nozzle ID" -msgstr "" +msgstr "노즐 ID" #: fdmextruder.def.json msgctxt "machine_nozzle_id description" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 949b0fee5c..0af3a1bb27 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-11-15 21:07+0900\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Brule\n" "Language-Team: Brule\n" "Language: ko_KR\n" @@ -610,27 +610,27 @@ msgstr "초기 레이어의 높이 (mm)입니다. 두꺼운 초기 레이어는 #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "슬라이싱 허용 오차" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "레이어를 대각선 서피스로 슬라이스하는 방법 레이어 영역은 레이어의 중앙이 서피스와 교차하는 부분(중간)을 기준으로 생성됩니다. 또는 각 레이어에 레이어의 높이 전체의 볼륨에 들어가는 영역(배타)이나 레이어 안의 어느 지점에 들어가는 영역(중복)이 있을 수 있습니다. 배타는 가장 많은 디테일을 포함하고, 중복은 베스트 피트를 만들 수 있으며, 중간은 처리 시간이 가장 짧습니다." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "중간" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "배타" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "중복" #: fdmprinter.def.json msgctxt "line_width label" @@ -785,7 +785,7 @@ msgstr "내관" #: fdmprinter.def.json msgctxt "wall_extruder_nr label" msgid "Wall Extruder" -msgstr "" +msgstr "벽 압출기" #: fdmprinter.def.json msgctxt "wall_extruder_nr description" @@ -805,7 +805,7 @@ msgstr "외벽 인쇄에 사용되는 압출기 트레인. 이것은 다중 압 #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "내벽 압출기" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1385,7 +1385,7 @@ msgstr "충진 패턴" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "프린트 충진 재료의 패턴입니다. 선과 갈지자형 충진이 레이어를 하나 걸러서 방향을 바꾸므로 재료비가 절감됩니다. 격자, 삼각형, 삼육각형, 입방체, 옥텟, 4분 입방체, 십자, 동심원 패턴이 레이어마다 완전히 인쇄됩니다. 입방체, 4분 입방체, 옥텟 충진이 레이어마다 변경되므로 각 방향으로 힘이 더 균등하게 분산됩니다." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1405,7 +1405,7 @@ msgstr "삼각형" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "삼육각형" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1460,7 +1460,7 @@ msgstr "충진 선 연결" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "내벽의 형태를 따라가는 선을 사용하여 충진 패턴과 내벽이 만나는 끝을 연결합니다. 이 설정을 사용하면 충진이 벽에 더 잘 점착되어 충진이 수직 서피스의 품질에 미치는 영향을 줄일 수 있습니다. 이 설정을 해제하면 사용되는 재료의 양이 줄어듭니다." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1475,22 +1475,22 @@ msgstr "사용할 정수선 방향 목록. 목록의 요소는 레이어가 진 #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "충진 X 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "충진 패턴이 X축을 따라 이 거리만큼 이동합니다." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "충진 Y 오프셋" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "충진 패턴이 Y축을 따라 이 거리만큼 이동합니다." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1805,22 +1805,22 @@ msgstr "사용 된 필라멘트의 직경을 조정합니다. 이 값을 사용 #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "점착 기질" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "서피스의 점착 기질입니다." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "서피스 에너지" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "서피스의 에너지입니다." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3552,7 +3552,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "프린트의 스커트와 첫 번째 레이어 사이의 수직 거리입니다.\n이는 최소 거리입니다. 여러 개의 스커트 선이 이 거리에서 바깥쪽으로 연장됩니다." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3612,7 +3612,7 @@ msgstr "Raft 부드럽게하기" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "이 설정은 래프트 윤곽의 안쪽 구석의 곡률을 제어합니다. 안쪽 구석이 여기에 지정된 값과 동일한 반경으로 반원 모양으로 휘어집니다. 또한 이 설정을 사용하면 래프트 윤곽에서 그러한 원보다 작은 구멍이 제거됩니다." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4087,12 +4087,12 @@ msgstr "일반적으로 큐라(Cura)는 메쉬의 작은 구멍을 꿰매 붙이 #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "최대 해상도" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "슬라이딩 후의 선분의 최소 크기입니다. 이 값을 높이면 메쉬의 해상도가 낮아집니다. 그러면 프린터가 G 코드를 처리하는 데 필요한 속도를 유지할 수 있으며 처리할 수 없는 메쉬의 디테일이 제거되므로 슬라이드 속도가 높아집니다." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4127,12 +4127,12 @@ msgstr "교차하는 메쉬로 교차하는 볼륨으로 전환하면 겹치는 #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "비어 있는 첫 번째 레이어 제거" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "첫 번째로 인쇄된 레이어 바로 아래의 비어 있는 레이어를 제거합니다(있는 경우). 이 설정을 해제하면 슬라이딩 허용 오차 설정을 배타 또는 중간으로 설정할 경우 첫 번째 레이어가 비어 있게 될 수 있습니다." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4662,22 +4662,22 @@ msgstr "각 선분에 도입 된 임의의 점 사이의 평균 거리입니다. #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "압출 속도 보상 최대 압출 오프셋" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "최대 보상 거리입니다(단위: mm)." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "압출 속도 보상 배율" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "압출 속도를 거리로 변환하는 증배율입니다." #: fdmprinter.def.json msgctxt "wireframe_enabled label" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 460eddc9b3..aa97269aa9 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -91,7 +91,7 @@ msgstr "Het bestand is naar Doodle3D Connect verzonden" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Connect openen ..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "Er kan geen nieuwe taak worden gestart omdat de printer bezig is of niet #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Printer is niet beschikbaar" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Verbinding Maken via Netwerk" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Er zijn nieuwe functies beschikbaar voor uw {machine_name}! Het wordt aanbevolen de firmware van uw printer bij te werken." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Nieuwe firmware voor %s beschikbaar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Instructies voor bijwerken" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "Er is een fout opgetreden tijdens het starten van %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Simulatieweergave" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Als draadprinten is ingeschakeld, geeft Cura lagen niet nauwkeurig weer" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Simulatieweergave" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Met de huidige instellingen is slicing niet mogelijk. De volgende instel #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Slicing is niet mogelijk vanwege enkele instellingen per model. De volgende instellingen bevatten fouten voor een of meer modellen: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Instellingen per Model configureren" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Installeren" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Kan de bestanden voor de Siemens NX-invoegtoepassingen niet kopiëren. Controleer uw UGII_USER_DIR. Deze is niet ingesteld op een map." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "De Siemens NX Cura-invoegtoepassing is geïnstalleerd." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Kan de bestanden voor de Siemens NX-invoegtoepassingen niet installeren. Controleer uw UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Kan de Siemens NX-invoegtoepassing niet installeren. Het instellen van de omgevingsvariabele UGII_USER_DIR voor Siemens NX is mislukt." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Overig(e)" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Onbekend" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Aangepast materiaal" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Algemeen" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Niet overschreven" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Het profiel is geëxporteerd als {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "De export is voltooid" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Er is een fatale uitzondering opgetreden. Stuur ons het Crashrapport om het probleem op te lossen

    \n

    Druk op de knop \"Rapport verzenden\" om het foutenrapport automatisch naar onze servers te verzenden

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Systeeminformatie" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Onbekend" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura-versie: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Platform: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt-versie: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt-versie: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL-versie: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL-leverancier: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL-renderer: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Traceback van uitzondering" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Logboeken" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Gebruikersbeschrijving" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Rapport verzenden" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "Kan geen ander bestand openen als G-code wordt geladen. Het importeren v #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Het geselecteerde model is te klein om te laden." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n" -"\n" -"Selecteer uw printer in de onderstaande lijst:" +msgstr "Als u rechtstreeks via het netwerk wilt printen naar de printer, moet u ervoor zorgen dat de printer met een netwerkkabel is verbonden met het netwerk of moet u verbinding maken met de printer via het wifi-netwerk. Als u geen verbinding maakt tussen Cura en de printer, kunt u een USB-station gebruiken om g-code-bestanden naar de printer over te zetten.\n\nSelecteer uw printer in de onderstaande lijst:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1 is niet ingesteld voor het hosten van een groep aangesloten Ultimaker #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Hiermee opent u de pagina met printtaken in uw standaard webbrowser." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Verbinding met de printer is verbroken" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Uitgeschakeld" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Gereed" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Gepauzeerd" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Hervatten" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Lijntype" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Doorvoersnelheid" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Laagdikte" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "Binnenwand" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "max." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 van %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Als u een project laadt, worden alle modellen van het platform gewist" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Deze invoegtoepassing bevat een licentie.\nU moet akkoord gaan met deze licentie om deze invoegtoepassing te mogen installeren.\nGaat u akkoord met de onderstaande voorwaarden?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Nee, ik ga niet akkoord" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Gebruikersovereenkomst" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"U hebt enkele profielinstellingen aangepast.\n" -"Wilt u deze instellingen behouden of verwijderen?" +msgstr "U hebt enkele profielinstellingen aangepast.\nWilt u deze instellingen behouden of verwijderen?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "Over Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "versie: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\n" -"Cura maakt met trots gebruik van de volgende opensourceprojecten:" +msgstr "Cura is ontwikkeld door Ultimaker B.V. in samenwerking met de community.\nCura maakt met trots gebruik van de volgende opensourceprojecten:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Bibliotheek met veelhoeken" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Python HTTP-bibliotheek" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Profiel:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Er is geen profiel beschikbaar" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n" -"\n" -"Klik om het profielbeheer te openen." +msgstr "Sommige waarden of aanpassingen van instellingen zijn anders dan de waarden die in het profiel zijn opgeslagen.\n\nKlik om het profielbeheer te openen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n" -"\n" -"Klik om deze instellingen zichtbaar te maken." +msgstr "Een aantal verborgen instellingen gebruiken andere waarden dan hun normale berekende waarde.\n\nKlik om deze instellingen zichtbaar te maken." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Deze instelling heeft een andere waarde dan in het profiel.\n" -"\n" -"Klik om de waarde van het profiel te herstellen." +msgstr "Deze instelling heeft een andere waarde dan in het profiel.\n\nKlik om de waarde van het profiel te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n" -"\n" -"Klik om de berekende waarde te herstellen." +msgstr "Deze instelling wordt normaliter berekend, maar is nu ingesteld op een absolute waarde.\n\nKlik om de berekende waarde te herstellen." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Instelling voor printen uitgeschakeld\n" -"G-code-bestanden kunnen niet worden aangepast" +msgstr "Instelling voor printen uitgeschakeld\nG-code-bestanden kunnen niet worden aangepast" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00u 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Tijdspecificatie
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Kostenspecificatie" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1 m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Totaal:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1 m / ~ %2 g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Verwarm het bed voordat u gaat printen. U kunt doorgaan met het aanpasse #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Printerbediening" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Jog-positie" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Jog-afstand" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "&Afsluiten" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "Camerapositie he&rstellen" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Allemaal als model importeren" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Laaghoogte" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Er is momenteel een aangepast profiel actief. Als u de kwaliteitsschuifregelaar wilt gebruiken, kiest u een standaard kwaliteitsprofiel op het tabblad Aangepast" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Sneller" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "U hebt enkele profielinstellingen aangepast. Ga naar de aangepaste modus als u deze wilt wijzigen" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Materiaal" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Compatibiliteit controleren" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "SolidWorks-integratie" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Hiermee geeft u de simulatieweergave weer." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Simulatieweergave" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "Versie-upgrade van 2.7 naar 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Hiermee worden configuraties bijgewerkt van Cura 3.0 naar Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Versie-upgrade van 3.0 naar 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Gereedschap voor Instellingen per Model" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Hiermee kunt u een knop voor 'exporteren naar Cura' installeren in Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "3MF-schrijver" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Vraag de gebruiker één keer of deze akkoord gaat met de licentie" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/nl_NL/fdmextruder.def.json.po b/resources/i18n/nl_NL/fdmextruder.def.json.po index ba3027de2c..63bd64cd8c 100644 --- a/resources/i18n/nl_NL/fdmextruder.def.json.po +++ b/resources/i18n/nl_NL/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:30+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 0aeb2b9d5a..81f03fc350 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Dutch\n" "Language: nl_NL\n" @@ -608,27 +608,27 @@ msgstr "De hoogte van de eerste laag in mm. Met een dikkere eerste laag hecht he #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Slicetolerantie" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Geeft aan hoe lagen met een diagonaal oppervlak worden geslicet. De gebieden van een laag kunnen worden gegenereerd op basis van de locatie waar het midden van de laag het oppervlak snijdt (Midden). Daarnaast kan elke laag gebieden hebben die over de gehele hoogte van de laag binnen het volume vallen (Exclusief), of kan een laag gebieden hebben die overal binnen de laag vallen (Inclusief). Met Exclusief worden de meeste details behouden, met Inclusief verkrijgt u de beste pasvorm en met Midden is de verwerkingstijd het kortst." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Midden" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exclusief" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusief" #: fdmprinter.def.json msgctxt "line_width label" @@ -803,7 +803,7 @@ msgstr "De extruder train die voor het printen van de buitenwand wordt gebruikt. #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Extruder binnenwand" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1383,7 +1383,7 @@ msgstr "Vulpatroon" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Het patroon van het vulmateriaal van de print. De lijn- en zigzagvulling veranderen per vullaag van richting, waardoor wordt bespaard op materiaalkosten. De raster-, driehoeks-, tri-hexagonale, kubische, achtvlaks-, afgeknotte kubus-, kruis- en concentrische patronen worden elke laag volledig geprint. Kubische, afgeknotte kubus- en achtvlaksvullingen veranderen elke laag voor een meer gelijke krachtsverdeling in elke richting." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1403,7 +1403,7 @@ msgstr "Driehoeken" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Tri-hexagonaal" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1458,7 +1458,7 @@ msgstr "Vullijnen verbinden" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Verbindt de uiteinden waar het vulpatroon bij de binnenwand komt, met een lijn die de vorm van de binnenwand volgt. Als u deze instelling inschakelt, kan de vulling beter hechten aan de wanden en wordt de invloed van de vulling op de kwaliteit van de verticale oppervlakken kleiner. Als u deze instelling uitschakelt, wordt er minder materiaal gebruikt." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1473,22 +1473,22 @@ msgstr "Een lijst met gehele getallen voor lijnrichtingen die moet worden gebrui #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Vulling X-offset" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Het vulpatroon wordt over deze afstand verplaatst over de X-as." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Vulling Y-offset" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Het vulpatroon wordt over deze afstand verplaatst over de Y-as." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1803,22 +1803,22 @@ msgstr "Bepaalt de diameter van het gebruikte filament. Pas deze waarde aan de d #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Hechtingsgevoeligheid" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Hechtingsgevoeligheid van het oppervlak." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Oppervlakte-energie" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Oppervlakte-energie." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3550,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "De horizontale afstand tussen de skirt en de eerste laag van de print.\nDit is de minimumafstand. Als u meerdere skirtlijnen print, worden deze vanaf deze afstand naar buiten geprint." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3610,7 +3610,7 @@ msgstr "Raft effenen" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Deze instelling bepaalt hoeveel binnenhoeken in de raftcontour worden afgerond. Naar binnen gebogen hoeken worden tot een halve cirkel afgerond met een straal die gelijk is aan de hier opgegeven waarde. Met deze instellingen worden ook gaten in de raftcontour verwijderd die kleiner zijn dan een dergelijke cirkel." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4085,12 +4085,12 @@ msgstr "Normaal probeert Cura kleine gaten in het raster te hechten en delen van #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Maximale resolutie" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Het minimale formaat van een lijnsegment na het slicen. Als u deze waarde verhoogt, wordt het raster met een lagere resolutie geprint. Hiermee kan de printer de verwerkingssnelheid van de G-code bijhouden en wordt de slicesnelheid verhoogd doordat details van het raster worden verwijderd die niet kunnen worden verwerkt." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4125,12 +4125,12 @@ msgstr "Schakel naar de rastersnijpuntvolumes die bij elke laag horen, zodat de #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Lege eerste lagen verwijderen" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Hiermee worden de lege lagen onder de eerste geprinte laag verwijderd, indien aanwezig. Als u deze instelling uitschakelt, kunnen lege eerste lagen ontstaan als de Slicetolerantie is ingesteld op Exclusief of Midden." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4660,22 +4660,22 @@ msgstr "De gemiddelde afstand tussen de willekeurig geplaatste punten op elk lij #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Doorvoercompensatie voor maximale extrusieoffset" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "De maximale afstand in mm die moet worden gecompenseerd." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Doorvoercompensatiefactor" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "De vermenigvuldigingsfactor voor de vertaling doorvoer -> afstand." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4827,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\n" -"Hierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." +msgstr "De afstand van een opwaartse beweging waarbij de doorvoersnelheid wordt gehalveerd.\nHierdoor ontstaat een betere hechting aan voorgaande lagen, zonder dat het materiaal in die lagen te zeer wordt verwarmd. Alleen van toepassing op Draadprinten." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po old mode 100755 new mode 100644 index 28f3ceae2c..bd125277a5 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-23 10:40+0300\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" "Language: ru_RU\n" @@ -93,7 +93,7 @@ msgstr "Файл отправлен через Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Открыть Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -143,7 +143,7 @@ msgstr "Невозможно запустить новое задание, по #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Принтер недоступен" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -595,7 +595,7 @@ msgstr "Подключиться через сеть" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Для {machine_name} доступны новые функции! Рекомендуется обновить встроенное программное обеспечение принтера." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -606,7 +606,7 @@ msgstr "Доступна новая прошивка %s" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Порядок обновления" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -641,7 +641,7 @@ msgstr "Ошибка при запуске %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Вид моделирования" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -651,7 +651,7 @@ msgstr "Cura не аккуратно отображает слои при исп #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Вид моделирования" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -732,7 +732,7 @@ msgstr "Не могу выполнить слайсинг на текущих н #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Не удалось выполнить слайсинг из-за настроек модели. Следующие настройки ошибочны для одной или нескольких моделей: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -767,25 +767,25 @@ msgstr "Правка параметров модели" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Установить" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Не удалось скопировать файлы плагинов Siemens NX. Проверьте переменную среды UGII_USER_DIR. Ей не назначен каталог." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Плагин Siemens NX Cura успешно установлен." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Не удалось скопировать файлы плагинов Siemens NX. Проверьте переменную среды UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Не удалось установить плагин Siemens NX. Не удалось установить переменную среды UGII_USER_DIR для Siemens NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -948,7 +948,7 @@ msgstr "Другое" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Неизвестно" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1013,12 +1013,12 @@ msgstr "Собственный материал" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Общие" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Не переопределен" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1067,7 +1067,7 @@ msgstr "Экспортирование профиля в {0}A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Произошло критическое исключение. Отправьте нам этот отчёт о сбое, чтобы мы могли устранить проблему

    \n

    Нажмите кнопку «Отправить отчёт», чтобы автоматически отправить отчёт об ошибке на наш сервер

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Информация о системе" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Неизвестно" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Версия Cura: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Платформа: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Версия Qt: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Версия PyQt: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Версия OpenGL: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Поставщик OpenGL: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • Средство визуализации OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Диагностика исключения" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Журналы" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Описание пользователя" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Отправить отчёт" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1255,7 +1255,7 @@ msgstr "Невозможно открыть любой другой файл, е #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Выбранная модель слишком мала для загрузки." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1516,10 +1516,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n" -"\n" -"Укажите ваш принтер в списке ниже:" +msgstr "Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш принтер подключен к сети с помощью кабеля или через WiFi. Если вы не подключили Cura к вашему принтеру, вы по прежнему можете использовать USB флешку для переноса G-Code файлов на ваш принтер.\n\nУкажите ваш принтер в списке ниже:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1633,7 +1630,7 @@ msgstr "%1 не настроен для управления группой по #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Открытие страницы заданий печати в веб-браузере по умолчанию." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1668,7 +1665,7 @@ msgstr "Потеряно соединение с принтером" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Отключено" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1683,12 +1680,12 @@ msgstr "Завершено" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Приостановлено" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Возобновляется" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1830,12 +1827,12 @@ msgstr "Тип линии" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Скорость подачи" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Толщина слоя" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1885,12 +1882,12 @@ msgstr "Внутренняя стенка" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "мин." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "макс." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2130,7 +2127,7 @@ msgstr "%1 из %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Загрузка проекта приведет к удалению всех моделей на рабочем столе." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2173,7 +2170,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Этот плагин содержит лицензию.\nЧтобы установить этот плагин, необходимо принять условия лицензии.\nПринять приведенные ниже условия?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2188,7 +2185,7 @@ msgstr "Отклонить" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Пользовательское соглашение" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2438,9 +2435,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Вы изменили некоторые параметры профиля.\n" -"Желаете сохранить их или вернуть к прежним значениям?" +msgstr "Вы изменили некоторые параметры профиля.\nЖелаете сохранить их или вернуть к прежним значениям?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3071,7 +3066,7 @@ msgstr "О Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "версия: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3083,9 +3078,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura разработана компанией Ultimaker B.V. совместно с сообществом.\n" -"Cura использует следующие проекты с открытым исходным кодом:" +msgstr "Cura разработана компанией Ultimaker B.V. совместно с сообществом.\nCura использует следующие проекты с открытым исходным кодом:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3170,7 +3163,7 @@ msgstr "Библиотека обрезки полигонов" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Библиотека Python HTTP" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3190,7 +3183,7 @@ msgstr "Профиль:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "отсутствуют доступные профили" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3198,10 +3191,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Значения некоторых параметров отличаются от значений профиля.\n" -"\n" -"Нажмите для открытия менеджера профилей." +msgstr "Значения некоторых параметров отличаются от значений профиля.\n\nНажмите для открытия менеджера профилей." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3239,10 +3229,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n" -"\n" -"Щёлкните. чтобы сделать эти параметры видимыми." +msgstr "Некоторые из скрытых параметров используют значения, отличающиеся от их вычисленных значений.\n\nЩёлкните. чтобы сделать эти параметры видимыми." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3270,10 +3257,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Значение этого параметра отличается от значения в профиле.\n" -"\n" -"Щёлкните для восстановления значения из профиля." +msgstr "Значение этого параметра отличается от значения в профиле.\n\nЩёлкните для восстановления значения из профиля." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3281,10 +3265,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n" -"\n" -"Щёлкните для восстановления вычисленного значения." +msgstr "Обычно это значение вычисляется, но в настоящий момент было установлено явно.\n\nЩёлкните для восстановления вычисленного значения." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3296,51 +3277,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Настройка принтера отключена\n" -"G-code файлы нельзя изменять" +msgstr "Настройка принтера отключена\nG-code файлы нельзя изменять" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00 ч 00 мин" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Формат отображения времени
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Настройка расчета стоимости" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1 м" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1 г" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Итого:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1 м / ~ %2 г / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1 м / ~ %2 г" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3467,27 +3446,27 @@ msgstr "Нагрев горячего стола перед печатью. Вы #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Управление принтером" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Положение толчковой подачи" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Расстояние толчковой подачи" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3532,7 +3511,7 @@ msgstr "Выход" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Сбросить положение камеры" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3777,7 +3756,7 @@ msgstr "Импортировать всё как модели" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3934,7 +3913,7 @@ msgstr "Высота слоя" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "В настоящее время активен пользовательский профиль. Чтобы включить ползунок качества, на вкладке «Пользовательские» выберите профиль качества по умолчанию" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3954,7 +3933,7 @@ msgstr "Быстрее" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "В некоторые настройки профиля были внесены изменения. Если их необходимо изменить, перейдите в пользовательский режим." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4047,7 +4026,7 @@ msgstr "Материал" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Проверить совместимость" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4187,12 +4166,12 @@ msgstr "Интеграция с SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Открытие вида моделирования." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Вид моделирования" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4272,17 +4251,17 @@ msgstr "Обновляет конфигурацию Cura 2.7 до Cura 3.0." #: VersionUpgrade/VersionUpgrade27to30/plugin.json msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" -msgstr "" +msgstr "Обновление версии с 2.7 до 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Обновление конфигураций с Cura 3.0 до Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Обновление версии с 3.0 до 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4347,12 +4326,12 @@ msgstr "Инструмент для настройки каждой модели #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Позволяет установить кнопку «Экспортировать в Cura» в Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4417,12 +4396,12 @@ msgstr "Запись 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Запрашивает согласие пользователя с условиями лицензии" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/ru_RU/fdmextruder.def.json.po b/resources/i18n/ru_RU/fdmextruder.def.json.po index 7d44d19ee0..895544cc45 100644 --- a/resources/i18n/ru_RU/fdmextruder.def.json.po +++ b/resources/i18n/ru_RU/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-09 19:26+0300\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" "Language: ru_RU\n" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po old mode 100755 new mode 100644 index 6172a55199..fdeefe1154 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-23 11:19+0300\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Ruslan Popov \n" "Language-Team: Ruslan Popov\n" "Language: ru_RU\n" @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены при старте печати, разделённые \n" -"." +msgstr "Команды в G-коде, которые будут выполнены при старте печати, разделённые \n." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"Команды в G-коде, которые будут выполнены в конце печати, разделённые \n" -"." +msgstr "Команды в G-коде, которые будут выполнены в конце печати, разделённые \n." #: fdmprinter.def.json msgctxt "material_guid label" @@ -614,27 +610,27 @@ msgstr "Высота первого слоя в миллиметрах. Боле #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Допуск слайсинга" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Способ выполнения слайсинга слоев диагональными поверхностями. Области слоя можно создать на основе места пересечения середины слоя и поверхности (Середина). Кроме того, каждый слой может иметь области, попадающие в объем по высоте слоя (Исключение), или слой имеет области, попадающие в любое место слоя (Включение). Способ «Исключение» сохраняет больше деталей. Способ «Включение» обеспечивает наилучшую подгонку. Способ «Середина» требует минимального времени для обработки." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Середина" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Исключение" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Включение" #: fdmprinter.def.json msgctxt "line_width label" @@ -809,7 +805,7 @@ msgstr "Этот экструдер используется для печати #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Экструдер внутренней стенки" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1389,7 +1385,7 @@ msgstr "Шаблон заполнения" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Шаблон заполняющего материала печати. Линейное и зигзагообразное заполнение меняет направление на чередующихся слоях, снижая расходы на материал. Шаблоны «сетка», «треугольник», «шестигранник из треугольников», «куб», «восьмигранник», «четверть куба», «крестовое», «концентрическое» полностью печатаются в каждом слое. Шаблоны заполнения «куб», «четверть куба», «восьмигранник» меняются в каждом слое, чтобы обеспечить более равномерное распределение прочности в каждом направлении." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1409,7 +1405,7 @@ msgstr "Треугольник" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Шестигранник из треугольников" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1464,7 +1460,7 @@ msgstr "Соединять линии заполнения" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Соединение мест пересечения шаблона заполнения и внутренних стенок с использованием линии, повторяющей контур внутренней стенки. Использование этой функции улучшает сцепление заполнения со стенками и снижает влияние заполнения на качество вертикальных поверхностей. Отключение этой функции снижает расход материала." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1479,22 +1475,22 @@ msgstr "Список направлений линии при печати сл #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Смещение заполнения по X" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Расстояние смещения шаблона заполнения по оси X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Смещение заполнения по Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Расстояние смещения шаблона заполнения по оси Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1809,22 +1805,22 @@ msgstr "Укажите диаметр используемой нити." #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Тенденция к прилипанию" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Тенденция к прилипанию к поверхности." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Поверхностная энергия" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Поверхностная энергия." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3556,7 +3552,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "Горизонтальное расстояние между юбкой и первым слоем печати.\nМинимальное расстояние. Несколько линий юбки будут расширяться от этого расстояния." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3616,7 +3612,7 @@ msgstr "Сглаживание подложки" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Этот параметр регулирует величину скругления внутренних углов контура подложки. Внутренние углы скругляются до полукруга с радиусом, равным установленному здесь значению. Этот параметр также приводит к удалению отверстий в контуре подложки, которые меньше такого круга." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4091,12 +4087,12 @@ msgstr "Обычно Cura пытается закрыть небольшие о #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Максимальное разрешение" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Минимальный размер сегмента линии после слайсинга. Увеличение значения этого параметра понизит разрешение модели. Это может позволить принтеру поддерживать скорость обработки кода G и увеличит скорость слайсинга за счет удаления деталей модели, которые он в любом случае не сможет обработать." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4131,12 +4127,12 @@ msgstr "Чередует какой из объектов, пересекающ #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Удалить первые пустые слои" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Удаление пустых слоёв под первым печатаемым слоем, если они имеются. Отключение этой функции может привести к созданию первых пустых слоев, если для параметра «Допуск слайсинга» установлено значение «Включение» или «Середина»." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4666,22 +4662,22 @@ msgstr "Среднее расстояние между случайными то #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Макс. смещение экструзии для компенсации расхода" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Максимальное компенсируемое расстояние в миллиметрах." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Коэффициент компенсации расхода" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Коэффициент перевода расхода в расстояние." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4833,9 +4829,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\n" -"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." +msgstr "Расстояние движения вверх, при котором выдавливание идёт на половине скорости.\nЭто может улучшить прилипание к предыдущим слоям, не перегревая материал тех слоёв. Применяется только при каркасной печати." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 8c5a8439e2..29b23081fe 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -91,7 +91,7 @@ msgstr "Doodle3D Connect’e dosya gönderildi" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Connect'i aç.." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -141,7 +141,7 @@ msgstr "Yazıcı meşgul veya bağlı olmadığı için yeni bir işlem başlat #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Yazıcı Mevcut Değil" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -593,7 +593,7 @@ msgstr "Ağ ile Bağlan" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "{machine_name} adlı cihazınız için yeni özellikler var! Yazıcınızın fabrika yazılımını güncellemeniz önerilir." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -604,7 +604,7 @@ msgstr "Yeni %s bellenimi mevcut" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Nasıl güncellenir" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -639,7 +639,7 @@ msgstr "%s başlatılırken hata oluştu!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Simülasyon görünümü" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -649,7 +649,7 @@ msgstr "Tel Yazma etkinleştirildiğinde, Cura katmanları doğru olarak görün #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Simülasyon Görünümü" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -730,7 +730,7 @@ msgstr "Geçerli ayarlarla dilimlenemiyor. Şu ayarlarda hata var: {0}" #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Modele özgü ayarlar nedeniyle dilimlenemedi. Şu ayarlar bir veya daha fazla modelde hataya yol açıyor: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -765,25 +765,25 @@ msgstr "Model Başına Ayarları Yapılandır" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Yükle" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Siemens NX eklenti dosyaları kopyalanamadı. Lütfen UGII_USER_DIR ayarınızı kontrol edin. Bir dizine ayarlı değil." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Cura eklentisi başarıyla yüklendi." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Siemens NX eklenti dosyaları kopyalanamadı. Lütfen UGII_USER_DIR ayarınızı kontrol edin." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Siemens NX eklentisi yüklenemedi. Siemens NX ortam değişkeni UGII_USER_DIR ayarlanamadı." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -946,7 +946,7 @@ msgstr "Diğer" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Bilinmiyor" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1011,12 +1011,12 @@ msgstr "Özel Malzeme" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Genel" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Geçersiz kılınmadı" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1065,7 +1065,7 @@ msgstr "Profil {0} dosyasına aktarıldı" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Dışa aktarma başarılı" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1137,85 +1137,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    Çok ciddi bir istisna oluştu. Lütfen sorunu çözmek için bize Çökme Raporu'nu gönderin

    \n

    Sunucularımıza otomatik olarak bir hata raporu yüklemek için lütfen \"Rapor gönder\" düğmesini kullanın

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Sistem bilgileri" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Bilinmiyor" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura sürümü: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Platform: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt sürümü: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt sürümü: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL Sürümü: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL Satıcısı: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL Oluşturucusu: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "İstisna geri izleme" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Günlükler" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Kullanıcı açıklaması" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Rapor gönder" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1253,7 +1253,7 @@ msgstr "G-code yüklenirken başka bir dosya açılamaz. {0} içe aktarma atland #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "Seçilen model yüklenemeyecek kadar küçüktü." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1514,10 +1514,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n" -"\n" -"Aşağıdaki listeden yazıcınızı seçin:" +msgstr "Yazıcınıza ağ üzerinden doğrudan bağlamak için, lütfen yazıcınızın ağ kablosu kullanan bir ağa bağlı olduğundan emin olun veya yazıcınızı WiFi ağına bağlayın. Cura'ya yazıcınız ile bağlanamıyorsanız g-code dosyalarını yazıcınıza aktarmak için USB sürücüsü kullanabilirsiniz.\n\nAşağıdaki listeden yazıcınızı seçin:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1631,7 +1628,7 @@ msgstr "%1, bağlı Ultimaker 3 yazıcı grubunu barındırmak için ayarlı de #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Yazdırma işlerini varsayılan web tarayıcınızda açar." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1666,7 +1663,7 @@ msgstr "Yazıcı bağlantısı koptu" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Devre dışı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1681,12 +1678,12 @@ msgstr "Tamamlandı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Duraklatıldı" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Devam ediliyor" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1828,12 +1825,12 @@ msgstr "Çizgi Tipi" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Besleme hızı" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Katman kalınlığı" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1883,12 +1880,12 @@ msgstr "İç Duvar" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "min" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "maks" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 / %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Bir projenin yüklenmesi derleme levhasındaki tüm modelleri siler." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "Bu eklenti bir lisans içerir.\nBu eklentiyi yüklemek için bu lisansı kabul etmeniz gerekir.\nAşağıdaki koşulları kabul ediyor musunuz?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "Reddet" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Kullanıcı Anlaşması" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"Bazı profil ayarlarını özelleştirdiniz.\n" -"Bu ayarları kaydetmek veya iptal etmek ister misiniz?" +msgstr "Bazı profil ayarlarını özelleştirdiniz.\nBu ayarları kaydetmek veya iptal etmek ister misiniz?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "Cura hakkında" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "sürüm: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\n" -"Cura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" +msgstr "Cura, topluluk iş birliği ile Ultimaker B.V. tarafından geliştirilmiştir.\nCura aşağıdaki açık kaynak projelerini gururla kullanmaktadır:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "Poligon kırpma kitaplığı" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Python HTTP kitaplığı" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "Profil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Hiçbir Profil Yok" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n" -"\n" -"Profil yöneticisini açmak için tıklayın." +msgstr "Bazı ayar/geçersiz kılma değerleri profilinizde saklanan değerlerden farklıdır.\n\nProfil yöneticisini açmak için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n" -"\n" -"Bu ayarları görmek için tıklayın." +msgstr "Gizlenen bazı ayarlar normal hesaplanan değerden farklı değerler kullanır.\n\nBu ayarları görmek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"Bu ayarın değeri profilden farklıdır.\n" -"\n" -"Profil değerini yenilemek için tıklayın." +msgstr "Bu ayarın değeri profilden farklıdır.\n\nProfil değerini yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n" -"\n" -"Hesaplanan değeri yenilemek için tıklayın." +msgstr "Bu ayar normal olarak yapılır ama şu anda mutlak değer ayarı var.\n\nHesaplanan değeri yenilemek için tıklayın." #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"Yazdırma Ayarı devre dışı\n" -"G-code dosyaları üzerinde değişiklik yapılamaz" +msgstr "Yazdırma Ayarı devre dışı\nG-code dosyaları üzerinde değişiklik yapılamaz" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00sa 00dk" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Zaman koşulları
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Maliyet koşulları" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1 m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Toplam:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1 m / ~ %2 g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1 m / ~ %2 g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3461,27 +3440,27 @@ msgstr "Yazdırma öncesinde yatağı ısıt. Isıtma sırasında yazdırma işi #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Yazıcı kontrolü" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Jog Konumu" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Jog Mesafesi" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3526,7 +3505,7 @@ msgstr "&Çıkış" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Kamera konumunu sıfırla" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3768,7 +3747,7 @@ msgstr "Tümünü model olarak içe aktar" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3925,7 +3904,7 @@ msgstr "Katman Yüksekliği" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Özel bir profil şu anda aktif. Kalite kaydırıcısını etkinleştirmek için Özel sekmesinde varsayılan bir kalite seçin" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3945,7 +3924,7 @@ msgstr "Daha Hızlı" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Bazı profil ayarlarını değiştirdiniz. Bunları değişiklikleri kaydetmek istiyorsanız, özel moda gidin." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4037,7 +4016,7 @@ msgstr "Malzeme" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Uyumluluğu kontrol et" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4177,12 +4156,12 @@ msgstr "SolidWorks Entegrasyonu" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Simülasyon görünümünü sunar." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Simülasyon Görünümü" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4267,12 +4246,12 @@ msgstr "2.7’den 3.0’a Sürüm Yükseltme" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Yapılandırmaları Cura 3.0'dan Cura 3.1'e yükseltir." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "3.0'dan 3.1'e Sürüm Yükseltme" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4337,12 +4316,12 @@ msgstr "Model Başına Ayarlar Aracı" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Siemens NX'de bir \"Cura'ya dışa aktar\" düğmesi kurmanıza yardımcı olur." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX Integration" #: 3MFReader/plugin.json msgctxt "description" @@ -4407,12 +4386,12 @@ msgstr "3MF Yazıcı" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Kullanıcıya bir kez lisansımızı kabul edip etmediğini sorun" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "UserAgreement" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/tr_TR/fdmextruder.def.json.po b/resources/i18n/tr_TR/fdmextruder.def.json.po index 2a90c14cfe..0bb7de91ac 100644 --- a/resources/i18n/tr_TR/fdmextruder.def.json.po +++ b/resources/i18n/tr_TR/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-11 14:30+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index 072041b428..f0c2bad612 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: Turkish\n" "Language: tr_TR\n" @@ -56,9 +56,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"​\n" -" ile ayrılan, başlangıçta yürütülecek G-code komutları." +msgstr "​\n ile ayrılan, başlangıçta yürütülecek G-code komutları." #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -70,9 +68,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"​\n" -" ile ayrılan, bitişte yürütülecek Gcode komutları." +msgstr "​\n ile ayrılan, bitişte yürütülecek Gcode komutları." #: fdmprinter.def.json msgctxt "material_guid label" @@ -612,27 +608,27 @@ msgstr "İlk katmanın milimetre cinsinden yüksekliği. Kalın ilk katmanlar ya #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Dilimleme Toleransı" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Çapraz yüzeylerle katman dilimleme yolları. Bir katmanın alanları katmanın ortasının yüzeyle kesiştiği yere (Ortalayıcı) göre oluşturulabilir. Diğer bir yol da her katmanın yüksekliği boyunca hacim içinde kalan alanları (Dışlayıcı) veya katmanın içinde herhangi bir yerde kalan alanları (Kapsayıcı) almasıdır. Dışlayıcı seçenek en çok ayrıntıyı tutar; Kapsayıcı seçenek en iyi şekilde oturur; Ortalayıcı ise en kısa sürede işlenir." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Ortalayıcı" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Dışlayıcı" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Kapsayıcı" #: fdmprinter.def.json msgctxt "line_width label" @@ -807,7 +803,7 @@ msgstr "Dış Duvarı yazdırmak için kullanılan ekstruder dişli çarkı. Ço #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "İç Duvar Ekstrüderi" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1387,7 +1383,7 @@ msgstr "Dolgu Şekli" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "Baskının dolgu malzemesinin şeklidir. Hat ve zikzak dolgu, farklı katmanlar üzerinde yön değiştirerek malzeme maliyetini azaltır. Izgara, üçgen, üçlü altıgen, kübik, sekizlik, çeyrek kübik, çapraz ve eşmerkezli şekiller, her katmana tam olarak basılır. Kübik, çeyrek kübik ve sekizlik dolgu, her yönde daha eşit bir kuvvet dağılımı sağlamak için her katmanda değişir." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1407,7 +1403,7 @@ msgstr "Üçgenler" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Üçlü Altıgen" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1462,7 +1458,7 @@ msgstr "Dolgu Hatlarını Bağlayın" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "İç duvarın şeklini takip eden bir hattı kullanarak dolgu şeklinin iç duvarla buluştuğu noktada uçları bağlar. Bu ayarın etkinleştirilmesi, dolgunun duvarlara daha iyi yapışmasını sağlayabilir ve dolgunun dikey yüzeylerin kalitesinin etkilerini azaltabilir. Bu ayarın devre dışı bırakılması, kullanılan malzemenin miktarını azaltır." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1477,22 +1473,22 @@ msgstr "Kullanılacak tam sayı hat yönü listesi. Listedeki öğeler, katmanla #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Dolgu X Kayması" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "Dolgu şekli X ekseni boyunca bu mesafe kadar kaydırılır." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Dolgu Y Kayması" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "Dolgu şekli Y ekseni boyunca bu mesafe kadar kaydırılır." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1807,22 +1803,22 @@ msgstr "Kullanılan filamanın çapını ayarlar. Bu değeri kullanılan filaman #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Yapışma Eğilimi" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Yüzeye yapışma eğilimi." #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Yüzey Enerjisi" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Yüzey enerjisi." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3554,7 +3550,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "Baskının eteği ve ilk katmanı arasındaki yatay mesafe.\nMinimum mesafedir. Bu mesafeden çok sayıda etek hattı dışarı doğru uzanır." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3614,7 +3610,7 @@ msgstr "Radye Düzeltme" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Bu ayar, radye ana hattında yer alan iç köşelerin ne kadar yuvarlanacağını kontrol eder. İç köşeler, burada belirtilen değere eşit yarıçapa sahip yarım daire şeklinde yuvarlanır. Ayrıca bu ayar, söz konusu daireden daha küçük olan radye ana hattındaki delikleri ortadan kaldırır." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4089,12 +4085,12 @@ msgstr "Normal koşullarda, Cura ağdaki küçük boşlukları diker ve büyük #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Maksimum Çözünürlük" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "Bir çizginin dilimlemeden sonraki minimum boyutu. Bu değer artırıldıktan sonra örgünün çözünürlüğü düşer. Bu, yazıcının g-kodunu işlemek için gereken hıza yetişmesine olanak tanır ve örtünün zaten işlenemeyecek ayrıntılarını kaldırarak dilimleme hızını artırır." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4129,12 +4125,12 @@ msgstr "Çakışan bileşimlerin birbirine karışması için her bir katmanda b #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Boş İlk Katmanları Kaldır" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Basılan ilk katmanın altındaki varsa boş katmanları kaldır. Bu ayarın devre dışı bırakılması, Dilimleme Toleransı Dışlayıcı veya Ortalayıcı olarak ayarlanmışsa, boş ilk katmanlar oluşmasına neden olabilir." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4664,22 +4660,22 @@ msgstr "Her bir hat dilimine tanıtılan rastgele noktalar arasındaki ortalama #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Akış hızı dengelemesi maksimum ekstrüzyon kayması" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "Dengelenecek, mm cinsinden maksimum mesafe." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Akış hızı dengeleme çarpanı" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "Akış hızından -> mesafeye dönüştürme için çarpan." #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4831,9 +4827,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\n" -"Bu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." +msgstr "Yarı hızda sıkıştırılmış yukarı doğru hareket mesafesi.\nBu katmanlarda malzemeyi çok fazla ısıtmayarak önceki katmanlarda daha iyi yapışma sağlayabilir. Sadece kablo yazdırmaya uygulanır." #: fdmprinter.def.json msgctxt "wireframe_top_jump label" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 8857f5b7b0..a3c4401d93 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" @@ -93,7 +93,7 @@ msgstr "已发送至 Doodle3D Connect 的文件" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "打开 Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -143,7 +143,7 @@ msgstr "无法启动新作业,因为打印机处于忙碌状态或未连接。 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "打印机不可用" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -595,7 +595,7 @@ msgstr "通过网络连接" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "您的 {machine_name} 有新功能可用! 建议您更新打印机上的固件。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -606,7 +606,7 @@ msgstr "新 %s 固件可用" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "如何更新" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -641,7 +641,7 @@ msgstr "启动 %s 时发生错误!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "仿真视图" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -651,7 +651,7 @@ msgstr "当单线打印(Wire Printing)功能开启时,Cura 将无法准确 #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "仿真视图" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -732,7 +732,7 @@ msgstr "无法使用当前设置进行切片。以下设置存在错误:{0}" #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "因部分特定模型设置而无法切片。 以下设置在一个或多个模型上存在错误: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -767,25 +767,25 @@ msgstr "设置对每个模型的单独设定" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "安装" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "复制 Siemens NX 插件文件失败。 请检查您的 UGII_USER_DIR。 未将其设置到目录中。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "已成功安装 Siemens NX Cura 插件。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "复制 Siemens NX 插件文件失败。 请检查您的 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "安装 Siemens NX 插件失败。 无法为 Siemens NX 设置环境变量 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -948,7 +948,7 @@ msgstr "其它" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "未知" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1013,12 +1013,12 @@ msgstr "自定义材料" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "全局" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "未覆盖" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1029,7 +1029,7 @@ msgstr "所选材料与所选机器或配置不兼容。" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" -msgstr "" +msgstr "不兼容材料" #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:status Has a cancel button next to it." @@ -1067,7 +1067,7 @@ msgstr "配置文件已导出至: {0} " #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "导出成功" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1139,85 +1139,85 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "" +msgstr "

    发生了致命错误。 请将这份错误报告发送给我们以便修复问题

    \n

    请使用“发送报告”按钮将错误报告自动发布到我们的服务器

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "系统信息" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "未知" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura 版本: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "平台: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt 版本: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt 版本: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL 版本: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL 供应商: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL 渲染器: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "异常追溯" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "日志" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "用户说明" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "发送报告" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1255,7 +1255,7 @@ msgstr "如果加载 G-code,则无法打开其他任何文件。{0} 已跳过 #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "所选模型过小,无法加载。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1516,10 +1516,7 @@ msgid "" "To print directly to your printer over the network, please make sure your printer is connected to the network using a network cable or by connecting your printer to your WIFI network. If you don't connect Cura with your printer, you can still use a USB drive to transfer g-code files to your printer.\n" "\n" "Select your printer from the list below:" -msgstr "" -"要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n" -"\n" -"从以下列表中选择您的打印机:" +msgstr "要通过网络向打印机发送打印请求,请确保您的打印机已通过网线或 WIFI 连接到网络。若您不能连接 Cura 与打印机,您仍然可以使用 USB 设备将 G-code 文件传输到打印机。\n\n从以下列表中选择您的打印机:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 @@ -1633,7 +1630,7 @@ msgstr "%1 未设置为运行一组连接的 Ultimaker 3 打印机" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "使用默认 Web 浏览器打开打印作业页面。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1668,7 +1665,7 @@ msgstr "与打印机的连接中断" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "已禁用" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1683,12 +1680,12 @@ msgstr "已完成" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "已暂停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "恢复" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1830,12 +1827,12 @@ msgstr "走线类型" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "进给速度" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "层厚度" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1885,12 +1882,12 @@ msgstr "内壁" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "最小" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "最大" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2126,7 +2123,7 @@ msgstr "%1 / %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "加载项目将清除打印平台上的所有模型。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2169,7 +2166,7 @@ msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" -msgstr "" +msgstr "该插件包含一个许可。\n您需要接受此许可才能安装此插件。\n是否同意下列条款?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2184,7 +2181,7 @@ msgstr "拒绝" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "用户协议" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -2434,9 +2431,7 @@ msgctxt "@text:window" msgid "" "You have customized some profile settings.\n" "Would you like to keep or discard those settings?" -msgstr "" -"您已自定义某些配置文件设置。\n" -"您想保留或舍弃这些设置吗?" +msgstr "您已自定义某些配置文件设置。\n您想保留或舍弃这些设置吗?" #: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 msgctxt "@title:column" @@ -3067,7 +3062,7 @@ msgstr "关于 Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "版本: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3079,9 +3074,7 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "" -"Cura 由 Ultimaker B.V. 与社区合作开发。\n" -"Cura 使用以下开源项目:" +msgstr "Cura 由 Ultimaker B.V. 与社区合作开发。\nCura 使用以下开源项目:" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 msgctxt "@label" @@ -3166,7 +3159,7 @@ msgstr "多边形剪辑库" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Python HTTP 库" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3186,7 +3179,7 @@ msgstr "配置文件:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "没有配置文件可用" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3194,10 +3187,7 @@ msgid "" "Some setting/override values are different from the values stored in the profile.\n" "\n" "Click to open the profile manager." -msgstr "" -"某些设置/重写值与存储在配置文件中的值不同。\n" -"\n" -"点击打开配置文件管理器。" +msgstr "某些设置/重写值与存储在配置文件中的值不同。\n\n点击打开配置文件管理器。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" @@ -3235,10 +3225,7 @@ msgid "" "Some hidden settings use values different from their normal calculated value.\n" "\n" "Click to make these settings visible." -msgstr "" -"一些隐藏设置正在使用有别于一般设置的计算值。\n" -"\n" -"单击以使这些设置可见。" +msgstr "一些隐藏设置正在使用有别于一般设置的计算值。\n\n单击以使这些设置可见。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 msgctxt "@label Header for list of settings." @@ -3266,10 +3253,7 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "" -"此设置的值与配置文件不同。\n" -"\n" -"单击以恢复配置文件的值。" +msgstr "此设置的值与配置文件不同。\n\n单击以恢复配置文件的值。" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 msgctxt "@label" @@ -3277,10 +3261,7 @@ msgid "" "This setting is normally calculated, but it currently has an absolute value set.\n" "\n" "Click to restore the calculated value." -msgstr "" -"此设置通常可被自动计算,但其当前已被绝对定义。\n" -"\n" -"单击以恢复自动计算的值。" +msgstr "此设置通常可被自动计算,但其当前已被绝对定义。\n\n单击以恢复自动计算的值。" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" @@ -3292,51 +3273,49 @@ msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" "G-code files cannot be modified" -msgstr "" -"打印设置已禁用\n" -"G-code 文件无法被修改" +msgstr "打印设置已禁用\nG-code 文件无法被修改" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00 小时 00 分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "时间规范
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "成本规定" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "总计:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3459,27 +3438,27 @@ msgstr "打印前请预热热床。您可以在热床加热时继续调整相关 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "打印机控制" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "垛齐位置" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "垛齐距离" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3524,7 +3503,7 @@ msgstr "退出(&Q)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "重置摄像头位置(&R)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3763,7 +3742,7 @@ msgstr "导入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3920,7 +3899,7 @@ msgstr "层高" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "自定义配置文件目前处于活动状态。 如要启用质量滑块,请在“自定义”选项卡中选择一个默认质量配置文件" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3940,7 +3919,7 @@ msgstr "更快" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "您已修改部分配置文件设置。 如果您想对其进行更改,请转至自定义模式。" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4031,7 +4010,7 @@ msgstr "材料" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "检查兼容性" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4171,12 +4150,12 @@ msgstr "SolidWorks 集成" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "提供仿真视图" #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "仿真视图" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4261,12 +4240,12 @@ msgstr "版本自 2.7 升级到 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "将配置从 Cura 3.0 版本升级至 3.1 版本。" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "版本自 3.0 升级到 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4331,12 +4310,12 @@ msgstr "单一模型设置工具" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "帮助您在 Siemens NX 中安装一个“导出至 Cura”按钮。" #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Siemens NX 集成" #: 3MFReader/plugin.json msgctxt "description" @@ -4401,12 +4380,12 @@ msgstr "3MF 写入器" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "询问用户一次是否同意我们的许可" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "用户协议" #: UltimakerMachineActions/plugin.json msgctxt "description" diff --git a/resources/i18n/zh_CN/fdmextruder.def.json.po b/resources/i18n/zh_CN/fdmextruder.def.json.po index e6e4c21306..15166711f2 100644 --- a/resources/i18n/zh_CN/fdmextruder.def.json.po +++ b/resources/i18n/zh_CN/fdmextruder.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-08-28 11:00+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 3d191eec96..76bb1c09e7 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -2,13 +2,13 @@ # Copyright (C) 2017 Ultimaker # This file is distributed under the same license as the Cura package. # Ruben Dulek , 2017. -# +# msgid "" msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-09-27 12:27+0200\n" +"PO-Revision-Date: 2017-11-30 13:05+0100\n" "Last-Translator: Bothof \n" "Language-Team: PCDotFan , Bothof \n" "Language: zh_CN\n" @@ -58,9 +58,7 @@ msgctxt "machine_start_gcode description" msgid "" "Gcode commands to be executed at the very start - separated by \n" "." -msgstr "" -"在开始后执行的 G-code 命令 - 以 \n" -" 分行" +msgstr "在开始后执行的 G-code 命令 - 以 \n 分行" #: fdmprinter.def.json msgctxt "machine_end_gcode label" @@ -72,9 +70,7 @@ msgctxt "machine_end_gcode description" msgid "" "Gcode commands to be executed at the very end - separated by \n" "." -msgstr "" -"在结束前执行的 G-code 命令 - 以 \n" -" 分行" +msgstr "在结束前执行的 G-code 命令 - 以 \n 分行" #: fdmprinter.def.json msgctxt "material_guid label" @@ -614,27 +610,27 @@ msgstr "起始层高(以毫米为单位)。起始层越厚,与打印平台 #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "切片公差" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "如何对带有对角线表面的层进行切片。层面积可以根据层的中心与表面(中间)相交的位置生成。或者每一层的面积可以为落在整个层高度中成形体积内的面积 (Exclusive),或者为落在层中任何位置的面积 (Inclusive)。Exclusive 保留大部分细节,Inclusive 可实现最佳匹配,而 Middle 需要的处理的时间最少。" #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Middle" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exclusive" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusive" #: fdmprinter.def.json msgctxt "line_width label" @@ -809,7 +805,7 @@ msgstr "用于打印外壁的挤出机组。 用于多重挤出。" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "内壁挤出机" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1389,7 +1385,7 @@ msgstr "填充图案" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "打印填充材料的图案。线条和锯齿形填充在交替层上交换方向,从而降低材料成本。网格、三角形、内六角、立方体、八角形、四面体、交叉和同心图案在每层完整打印。立方体、四面体和八角形填充随每层变化,以在各个方向提供更均衡的强度分布。" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1409,7 +1405,7 @@ msgstr "三角形" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "内六角" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1464,7 +1460,7 @@ msgstr "连接填充走线" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "使用沿内壁形状的走线连接填充图案与内壁相接的各端。启用此设置会使填充更好地粘着在壁上,减少填充物效果对垂直表面质量的影响。禁用此设置可减少使用的材料量。" #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1479,22 +1475,22 @@ msgstr "要使用的整数走线方向列表。 列表中的元素随层的进 #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "填充 X 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "填充图案沿 X 轴偏移此距离。" #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "填充 Y 轴偏移量" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "填充图案沿 Y 轴偏移此距离。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1809,22 +1805,22 @@ msgstr "调整所用耗材的直径。 将此值与所用耗材的直径匹配 #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "附着倾向" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "表面附着倾向。" #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "表面能" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "表面能。" #: fdmprinter.def.json msgctxt "material_flow label" @@ -3556,7 +3552,7 @@ msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." -msgstr "" +msgstr "skirt 和打印第一层之间的水平距离。\n这是最小距离。多个 skirt 走线将从此距离向外延伸。" #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3616,7 +3612,7 @@ msgstr "Raft 平滑度" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "该设置控制 Raft 轮廓中的内角呈圆形的程度。内向角被设置为半圆形,半径等于此处的值。此设置还会移除 raft 轮廓中小于此半圆形的孔。" #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4091,12 +4087,12 @@ msgstr "一般情况下,Cura 会尝试缝合网格中的小孔,并移除有 #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "最大分辨率" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "走线部分在切片后的最小尺寸。如果提高此值,网格的分辨率将降低。这可让打印机保持处理 g-code 所需的速度,并将通过移除无法处理的网格细节提高切片速度。" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4131,12 +4127,12 @@ msgstr "切换为与每个层相交的网格相交体积,以便重叠的网格 #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "移除空白第一层" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "移除第一个打印层下方的空白层(如果存在)。如果“切片公差”设置被设为“独占”或“中间”,禁用此设置可能导致空白第一层。" #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4666,22 +4662,22 @@ msgstr "在每个走线部分引入的随机点之间的平均距离。 注意 #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "流量补偿最大挤出偏移值" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "以毫米为单位的最大补偿距离。" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "流量补偿因子" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "流量的倍增因子-> 距离转换。" #: fdmprinter.def.json msgctxt "wireframe_enabled label" @@ -4833,9 +4829,7 @@ msgctxt "wireframe_up_half_speed description" msgid "" "Distance of an upward move which is extruded with half speed.\n" "This can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing." -msgstr "" -"以半速挤出的上行移动的距离。\n" -"这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" +msgstr "以半速挤出的上行移动的距离。\n这会与之前的层产生更好的附着,而不会将这些层中的材料过度加热。 仅应用于单线打印。" #: fdmprinter.def.json msgctxt "wireframe_top_jump label" From 4b0ff6e5f471c9309e7819d38d28674dbc11a896 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 30 Nov 2017 15:16:09 +0100 Subject: [PATCH 437/764] Prevent start & end gcode snippets being double encoded --- plugins/CuraEngineBackend/StartSliceJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 4d25238a32..876b4685cc 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -225,10 +225,10 @@ class StartSliceJob(Job): try: # any setting can be used as a token fmt = GcodeStartEndFormatter() - return str(fmt.format(value, **settings)).encode("utf-8") + return str(fmt.format(value, **settings)) except: Logger.logException("w", "Unable to do token replacement on start/end gcode") - return str(value).encode("utf-8") + return str(value) ## Create extruder message from stack def _buildExtruderMessage(self, stack): From 3abf067d25079520d3cf8ddffd216bce5c467cb5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 30 Nov 2017 15:24:51 +0100 Subject: [PATCH 438/764] Fix loading .curaproject files with stack setups from earlier versions - CURA-4646 --- cura/Settings/ContainerManager.py | 13 +++- cura/Settings/CuraContainerRegistry.py | 74 ++++++++++--------- .../VersionUpgrade30to31.py | 8 ++ 3 files changed, 58 insertions(+), 37 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 85aed93cf6..5857012e0e 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -61,7 +61,17 @@ class ContainerManager(QObject): return "" container = containers[0] + new_container = self.duplicateContainerInstance(container) + return new_container.getId() + ## Create a duplicate of the given container instance + # + # This will create and add a duplicate of the container that was passed. + # + # \param container \type{ContainerInterface} The container to duplicate. + # + # \return The duplicated container, or None if duplication failed. + def duplicateContainerInstance(self, container): new_container = None new_name = self._container_registry.uniqueName(container.getName()) # Only InstanceContainer has a duplicate method at the moment. @@ -73,10 +83,11 @@ class ContainerManager(QObject): new_container.deserialize(container.serialize()) new_container.setName(new_name) + # TODO: we probably don't want to add it to the registry here! if new_container: self._container_registry.addContainer(new_container) - return new_container.getId() + return new_container ## Change the name of a specified container to a new name. # diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7ffed279fc..74cda08062 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -205,53 +205,55 @@ class CuraContainerRegistry(ContainerRegistry): # Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. Logger.log("e", "Failed to import profile from %s: %s while using profile reader. Got exception %s", file_name,profile_reader.getPluginId(), str(e)) return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, str(e))} - if profile_or_list: # Success! + + if profile_or_list: name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) + + # Ensure it is always a list of profiles if type(profile_or_list) is not list: - profile = profile_or_list + profile_or_list = [profile_or_list] - result = self._configureProfile(profile, name_seed, new_name) - if result is not None: - return {"status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, result)} + if len(profile_or_list) == 1: + # If there is only 1 stack file it means we're loading a legacy (pre-3.1) .curaprofile. + # In that case we find the per-extruder settings and put those in a new quality_changes container + # so that it is compatible with the new stack setup. + profile = profile_or_list[0] + extruder_stack_quality_changes_container = ContainerManager.getInstance().duplicateContainerInstance(profile) + extruder_stack_quality_changes_container.addMetaDataEntry("extruder", "fdmextruder") - return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName())} - else: - profile_index = -1 - global_profile = None - - for profile in profile_or_list: - if profile_index >= 0: - if len(machine_extruders) > profile_index: - extruder_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_extruders[profile_index].getBottom()) - # Ensure the extruder profiles get non-conflicting names - # NB: these are not user-facing - if "extruder" in profile.getMetaData(): - profile.setMetaDataEntry("extruder", extruder_id) - else: - profile.addMetaDataEntry("extruder", extruder_id) - profile_id = (extruder_id + "_" + name_seed).lower().replace(" ", "_") - elif profile_index == 0: - # Importing a multiextrusion profile into a single extrusion machine; merge 1st extruder profile into global profile - profile._id = self.uniqueName("temporary_profile") - self.addContainer(profile) - ContainerManager.getInstance().mergeContainers(global_profile.getId(), profile.getId()) - self.removeContainer(profile.getId()) - break - else: - # The imported composite profile has a profile for an extruder that this machine does not have. Ignore this extruder-profile - break + for quality_changes_setting_key in extruder_stack_quality_changes_container.getAllKeys(): + settable_per_extruder = extruder_stack_quality_changes_container.getProperty(quality_changes_setting_key, "settable_per_extruder") + if settable_per_extruder: + profile.removeInstance(quality_changes_setting_key, postpone_emit = True) else: - global_profile = profile - profile_id = (global_container_stack.getBottom().getId() + "_" + name_seed).lower().replace(" ", "_") + extruder_stack_quality_changes_container.removeInstance(quality_changes_setting_key, postpone_emit = True) + # We add the new container to the profile list so things like extruder positions are taken care of + # in the next code segment. + profile_or_list.append(extruder_stack_quality_changes_container) + + # Import all profiles + for profile_index, profile in enumerate(profile_or_list): + if profile_index == 0: + # This is assumed to be the global profile + profile_id = (global_container_stack.getBottom().getId() + "_" + name_seed).lower().replace(" ", "_") result = self._configureProfile(profile, profile_id, new_name) if result is not None: - return {"status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "Failed to import profile from {0}: {1}", file_name, result)} + return {"status": "error", "message": catalog.i18nc( + "@info:status Don't translate the XML tags or !", + "Failed to import profile from {0}: {1}", + file_name, result)} - profile_index += 1 + elif len(machine_extruders) > profile_index: + # This is assumed to be an extruder profile + extruder_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_extruders[profile_index - 1].getBottom()) + if not profile.getMetaDataEntry("extruder"): + profile.addMetaDataEntry("extruder", extruder_id) + else: + profile.setMetaDataEntry("extruder", extruder_id) - return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} + return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} # If it hasn't returned by now, none of the plugins loaded the profile successfully. return {"status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type or is corrupted.", file_name)} diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c496a66b29..bacd3f73d5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -203,6 +203,14 @@ class VersionUpgrade30to31(VersionUpgrade): def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) machine_name = os.path.os.path.basename(filename).replace(".inst.cfg", "").replace(suffix, "") + + # Why is this here?! + # When we load a .curaprofile file the deserialize will trigger a version upgrade, creating a dangling file. + # This file can be recognized by it's lack of a machine name in the target filename. + # So when we detect that situation here, we don't create the file and return. + if machine_name == "": + return + new_filename = machine_name + "_" + "fdmextruder" + suffix extruder_quality_changes_parser = configparser.ConfigParser() From 9564bb645f8c0ca54c9e8ea950ced71320f2cd58 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 30 Nov 2017 15:54:24 +0100 Subject: [PATCH 439/764] Remove test code --- resources/qml/Sidebar.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index e02bb00c0a..bed5b4c873 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -350,12 +350,12 @@ Rectangle var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) // A message is created and displayed when the user hover the time label - var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); + var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); for(var feature in print_time) { if(!print_time[feature].isTotalDurationZero) { - tooltip_html += "" + + tooltip_html += "" + "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + ""; From d76081ae1dc5a4f43bc4ad30fa678637595cd1e2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 30 Nov 2017 16:24:46 +0100 Subject: [PATCH 440/764] Only restore global profile based on extruders that are actually in use when loading legacy project file --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 24 +++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 9f03c9ae3d..129ed43244 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -449,6 +449,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stacks = [] extruder_stacks_added = [] container_stacks_added = [] + machine_extruder_count = None containers_added = [] @@ -636,6 +637,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # The ID already exists, but nothing in the values changed, so do nothing. pass quality_and_definition_changes_instance_containers.append(instance_container) + + if container_type == "definition_changes": + definition_changes_extruder_count = instance_container.getProperty("machine_extruder_count", "value") + if definition_changes_extruder_count is not None: + machine_extruder_count = definition_changes_extruder_count + else: existing_container = self._container_registry.findInstanceContainers(id = container_id) if not existing_container: @@ -794,8 +801,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if stack.quality.getId() in ("empty", "empty_quality"): has_not_supported = True break + + # We filter out extruder stacks that are not actually used, for example the UM3 and custom FDM printer extruder count setting. + extruder_stacks_in_use = extruder_stacks + if machine_extruder_count is not None: + extruder_stacks_in_use = extruder_stacks[:machine_extruder_count] + available_quality = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_stack, - extruder_stacks) + extruder_stacks_in_use) if not has_not_supported: has_not_supported = not available_quality @@ -803,10 +816,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if has_not_supported: empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] - for stack in [global_stack] + extruder_stacks: + for stack in [global_stack] + extruder_stacks_in_use: stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] - for stack in [global_stack] + extruder_stacks: + for stack in [global_stack] + extruder_stacks_in_use: stack.replaceContainer(_ContainerIndexes.QualityChanges, empty_quality_changes_container) quality_has_been_changed = True @@ -839,7 +852,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): global_stack.quality = containers[0] global_stack.qualityChanges = empty_quality_changes_container # also find the quality containers for the extruders - for extruder_stack in extruder_stacks: + for extruder_stack in extruder_stacks_in_use: search_criteria = {"id": preferred_quality_id, "type": "quality", "definition": definition_id} @@ -868,8 +881,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if len(extruder_stacks) == 1: extruder_stack = extruder_stacks[0] - search_criteria = {"type": "quality", - "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} + search_criteria = {"type": "quality", "quality_type": global_stack.quality.getMetaDataEntry("quality_type")} search_criteria["definition"] = global_stack.definition.getId() if not parseBool(global_stack.getMetaDataEntry("has_machine_quality", "False")): search_criteria["definition"] = "fdmprinter" From 31104bcdc4956e5b8b51200c708f107b44090c0e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 30 Nov 2017 16:22:10 +0100 Subject: [PATCH 441/764] Corrections to Dutch translation Not all too bad this time. Contributes to issue CURA-4601. --- resources/i18n/nl_NL/cura.po | 10 +++++----- resources/i18n/nl_NL/fdmprinter.def.json.po | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index aa97269aa9..b391b29b10 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -91,7 +91,7 @@ msgstr "Het bestand is naar Doodle3D Connect verzonden" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "Connect openen ..." +msgstr "Connect openen..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -2123,7 +2123,7 @@ msgstr "%1 van %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "Als u een project laadt, worden alle modellen van het platform gewist" +msgstr "Als u een project laadt, worden alle modellen van het platform gewist." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -3924,7 +3924,7 @@ msgstr "Sneller" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "U hebt enkele profielinstellingen aangepast. Ga naar de aangepaste modus als u deze wilt wijzigen" +msgstr "U hebt enkele profielinstellingen aangepast. Ga naar de aangepaste modus als u deze wilt wijzigen." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4316,12 +4316,12 @@ msgstr "Gereedschap voor Instellingen per Model" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "Hiermee kunt u een knop voor 'exporteren naar Cura' installeren in Siemens NX." +msgstr "Hiermee kunt u een knop installeren in Siemens NX om te 'exporteren naar Cura'." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "Siemens NX Integration" +msgstr "Siemens NX Integratie" #: 3MFReader/plugin.json msgctxt "description" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 81f03fc350..8d25da1379 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -3610,7 +3610,7 @@ msgstr "Raft effenen" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "Deze instelling bepaalt hoeveel binnenhoeken in de raftcontour worden afgerond. Naar binnen gebogen hoeken worden tot een halve cirkel afgerond met een straal die gelijk is aan de hier opgegeven waarde. Met deze instellingen worden ook gaten in de raftcontour verwijderd die kleiner zijn dan een dergelijke cirkel." +msgstr "Bepaalt hoeveel binnenhoeken in de raftcontour worden afgerond. Naar binnen gebogen hoeken worden tot een halve cirkel afgerond met een straal die gelijk is aan de hier opgegeven waarde. Met deze instellingen worden ook gaten in de raftcontour verwijderd die kleiner zijn dan een dergelijke cirkel." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4090,7 +4090,7 @@ msgstr "Maximale resolutie" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "Het minimale formaat van een lijnsegment na het slicen. Als u deze waarde verhoogt, wordt het raster met een lagere resolutie geprint. Hiermee kan de printer de verwerkingssnelheid van de G-code bijhouden en wordt de slicesnelheid verhoogd doordat details van het raster worden verwijderd die niet kunnen worden verwerkt." +msgstr "Het minimale formaat van een lijnsegment na het slicen. Als u deze waarde verhoogt, wordt het model met een lagere resolutie geprint. Hiermee kan de printer de verwerkingssnelheid van de G-code bijhouden en wordt de slicesnelheid verhoogd doordat details van het raster worden verwijderd die niet kunnen worden verwerkt." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4660,7 +4660,7 @@ msgstr "De gemiddelde afstand tussen de willekeurig geplaatste punten op elk lij #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "Doorvoercompensatie voor maximale extrusieoffset" +msgstr "Maximale extrusieoffset voor doorvoercompensatie" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" From 93159c8986c99ef43cd249c69502782ba16d085f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 30 Nov 2017 16:32:25 +0100 Subject: [PATCH 442/764] Corrections to translations Made by Vandrasc. Contributes to issue CURA-4601. --- resources/i18n/es_ES/cura.po | 4 ++-- resources/i18n/it_IT/cura.po | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index ae16570127..48459b5746 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -1137,7 +1137,7 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " +msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" @@ -1825,7 +1825,7 @@ msgstr "Tipo de línea" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "Velocidad de alimentación" +msgstr "Velocidad" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 8a37f992dd..e4a7d1c75d 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -1825,7 +1825,7 @@ msgstr "Tipo di linea" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "Velocità di alimentazione" +msgstr "Velocità" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" @@ -1885,7 +1885,7 @@ msgstr "min." #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "max" +msgstr "max." #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" From 7e4ed8a25703416183c1ee3453be2c97d4e4d895 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 30 Nov 2017 17:37:16 +0100 Subject: [PATCH 443/764] CURA-4646 Fix save containers also for the extruders --- cura/Settings/CuraContainerRegistry.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 74cda08062..096406fc3a 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -238,12 +238,6 @@ class CuraContainerRegistry(ContainerRegistry): if profile_index == 0: # This is assumed to be the global profile profile_id = (global_container_stack.getBottom().getId() + "_" + name_seed).lower().replace(" ", "_") - result = self._configureProfile(profile, profile_id, new_name) - if result is not None: - return {"status": "error", "message": catalog.i18nc( - "@info:status Don't translate the XML tags or !", - "Failed to import profile from {0}: {1}", - file_name, result)} elif len(machine_extruders) > profile_index: # This is assumed to be an extruder profile @@ -252,6 +246,14 @@ class CuraContainerRegistry(ContainerRegistry): profile.addMetaDataEntry("extruder", extruder_id) else: profile.setMetaDataEntry("extruder", extruder_id) + profile_id = (extruder_id + "_" + name_seed).lower().replace(" ", "_") + + result = self._configureProfile(profile, profile_id, new_name) + if result is not None: + return {"status": "error", "message": catalog.i18nc( + "@info:status Don't translate the XML tags or !", + "Failed to import profile from {0}: {1}", + file_name, result)} return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} From 14c84d835a5eae6d3f0e8cb2542b7c86ac01a32e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 1 Dec 2017 09:55:38 +0100 Subject: [PATCH 444/764] Make quality switching clear CURA-4650 --- cura/Settings/MachineManager.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7237aa5674..f1bb8b6648 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -733,6 +733,9 @@ class MachineManager(QObject): old_material = self._active_container_stack.material old_quality = self._active_container_stack.quality + old_quality_type = None + if old_quality and old_quality.getId() != self._empty_quality_container.getId(): + old_quality_type = old_quality.getMetaDataEntry("quality_type") old_quality_changes = self._active_container_stack.qualityChanges if not old_material: Logger.log("w", "While trying to set the active material, no material was found to replace it.") @@ -773,13 +776,28 @@ class MachineManager(QObject): quality_manager.getWholeMachineDefinition(global_stack.definition), [material_container]) - if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): + if not candidate_quality or candidate_quality.getId() == self._empty_quality_changes_container: Logger.log("d", "Attempting to find fallback quality") # Fall back to a quality (which must be compatible with all other extruders) new_qualities = quality_manager.findAllUsableQualitiesForMachineAndExtruders( self._global_container_stack, ExtruderManager.getInstance().getExtruderStacks()) - if new_qualities: - new_quality_id = new_qualities[0].getId() # Just pick the first available one + + quality_types = sorted([q.getMetaDataEntry("quality_type") for q in new_qualities], reverse = True) + quality_type_to_use = None + if quality_types: + # try to use the same quality as before, otherwise the first one in the quality_types + quality_type_to_use = quality_types[0] + if old_quality_type is not None and old_quality_type in quality_type_to_use: + quality_type_to_use = old_quality_type + + new_quality = None + for q in new_qualities: + if quality_type_to_use is not None and q.getMetaDataEntry("quality_type") == quality_type_to_use: + new_quality = q + break + + if new_quality is not None: + new_quality_id = new_quality.getId() # Just pick the first available one else: Logger.log("w", "No quality profile found that matches the current machine and extruders.") else: From c0e7446f2aeca4484e9f05bad459dafdcc8bf795 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 10:44:56 +0100 Subject: [PATCH 445/764] Correct label of Save Project menu item Capital P. Ellipses to indicate that a modal window is coming. Ampersand to enable the hotkey. --- resources/qml/Cura.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 1c391ddaf9..e144048af7 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -116,7 +116,7 @@ UM.MainWindow MenuItem { id: saveWorkspaceMenu - text: catalog.i18nc("@title:menu menubar:file","Save project") + text: catalog.i18nc("@title:menu menubar:file","Save &Project...") onTriggered: { if(UM.Preferences.getValue("cura/dialog_on_project_save")) From 7de43e71e03ff23e41171ae2ea2590e226a74ef0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 1 Dec 2017 11:05:15 +0100 Subject: [PATCH 446/764] Fix legacy profile upgrade CURA-4075 Only for single-extrusion machines just like before. --- .../LegacyProfileReader.py | 25 +++++++++++++++---- .../VersionUpgrade21to22/Profile.py | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 3d680f2b97..ca04ec4b36 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import configparser # For reading the legacy profile INI files. +import io import json # For reading the Dictionary of Doom. import math # For mathematical operations included in the Dictionary of Doom. import os.path # For concatenating the path to the plugin and the relative path to the Dictionary of Doom. @@ -80,8 +81,7 @@ class LegacyProfileReader(ProfileReader): parser = configparser.ConfigParser(interpolation = None) try: - with open(file_name) as f: - parser.readfp(f) # Parse the INI file. + parser.read([file_name]) # Parse the INI file. except Exception as e: Logger.log("e", "Unable to open legacy profile %s: %s", file_name, str(e)) return None @@ -138,7 +138,22 @@ class LegacyProfileReader(ProfileReader): if len(profile.getAllKeys()) == 0: Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.") - profile.setDirty(True) - profile.addMetaDataEntry("type", "quality_changes") + + + # We need to downgrade the container to version 1 (in Cura 2.1) so the upgrade system can correctly upgrade + # it to the latest version. + profile.addMetaDataEntry("type", "profile") + # don't know what quality_type it is based on, so use "normal" by default profile.addMetaDataEntry("quality_type", "normal") - return profile \ No newline at end of file + profile.setDirty(True) + + parser = configparser.ConfigParser(interpolation=None) + data = profile.serialize() + parser.read_string(data) + parser["general"]["version"] = "1" + stream = io.StringIO() + parser.write(stream) + data = stream.getvalue() + profile.deserialize(data) + + return profile diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py index 4316d5cafb..becf29c242 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py @@ -98,7 +98,7 @@ class Profile: config.add_section("metadata") config.set("metadata", "quality_type", "normal") #This feature doesn't exist in 2.1 yet, so we don't know the actual quality type. For now, always base it on normal. - config.set("metadata", "type", "quality_changes") + config.set("metadata", "type", "quality") if self._weight: config.set("metadata", "weight", str(self._weight)) if self._machine_variant_name: From 7b4cb1124082854a39d201050edb48ece00f1b9d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 1 Dec 2017 11:05:15 +0100 Subject: [PATCH 447/764] Fix legacy profile upgrade CURA-4075 Only for single-extrusion machines just like before. --- .../LegacyProfileReader.py | 25 +++++++++++++++---- .../VersionUpgrade21to22/Profile.py | 2 +- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 3d680f2b97..ca04ec4b36 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import configparser # For reading the legacy profile INI files. +import io import json # For reading the Dictionary of Doom. import math # For mathematical operations included in the Dictionary of Doom. import os.path # For concatenating the path to the plugin and the relative path to the Dictionary of Doom. @@ -80,8 +81,7 @@ class LegacyProfileReader(ProfileReader): parser = configparser.ConfigParser(interpolation = None) try: - with open(file_name) as f: - parser.readfp(f) # Parse the INI file. + parser.read([file_name]) # Parse the INI file. except Exception as e: Logger.log("e", "Unable to open legacy profile %s: %s", file_name, str(e)) return None @@ -138,7 +138,22 @@ class LegacyProfileReader(ProfileReader): if len(profile.getAllKeys()) == 0: Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.") - profile.setDirty(True) - profile.addMetaDataEntry("type", "quality_changes") + + + # We need to downgrade the container to version 1 (in Cura 2.1) so the upgrade system can correctly upgrade + # it to the latest version. + profile.addMetaDataEntry("type", "profile") + # don't know what quality_type it is based on, so use "normal" by default profile.addMetaDataEntry("quality_type", "normal") - return profile \ No newline at end of file + profile.setDirty(True) + + parser = configparser.ConfigParser(interpolation=None) + data = profile.serialize() + parser.read_string(data) + parser["general"]["version"] = "1" + stream = io.StringIO() + parser.write(stream) + data = stream.getvalue() + profile.deserialize(data) + + return profile diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py index 4316d5cafb..becf29c242 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py @@ -98,7 +98,7 @@ class Profile: config.add_section("metadata") config.set("metadata", "quality_type", "normal") #This feature doesn't exist in 2.1 yet, so we don't know the actual quality type. For now, always base it on normal. - config.set("metadata", "type", "quality_changes") + config.set("metadata", "type", "quality") if self._weight: config.set("metadata", "weight", str(self._weight)) if self._machine_variant_name: From e7ac2e37b41b5793490af0b58863dd02368cbdbe Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 1 Dec 2017 13:17:36 +0100 Subject: [PATCH 448/764] Fix an error when closing USB connection. This error raised several times in the crash reports in the stats. --- plugins/USBPrinting/USBPrinterOutputDevice.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 3b9603cc1b..abdb568cb2 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -394,7 +394,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._listen_thread.join() except: pass - self._serial.close() + if self._serial is not None: # Avoid a race condition when a thread can change the value of self._serial to None + self._serial.close() self._listen_thread = threading.Thread(target = self._listen) self._listen_thread.daemon = True From 5202c8584cc36ddd2cec20271cb8496d52da4a74 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Fri, 1 Dec 2017 13:26:38 +0100 Subject: [PATCH 449/764] Update_ChangeLog_3.1_CURA-4656 --- plugins/ChangeLogPlugin/ChangeLog.txt | 61 ++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index d7d68e04a2..63ecb37564 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,3 +1,60 @@ +[3.1.0] +*Profile added for 0.25 mm print core +This new print core gives extra fine line widths which gives prints extra definition and surface quality. + +*Profile added for Breakaway material +New material profile for Breakaway material, a new dry post processing support material, which can be used for models with flat surface area overhangs. + +*Layer view +The existing Layer View has been updated in order to see a live simulation of all the paths within a layer. + +*Quick camera controls +New buttons have been added to the interface that can quickly reposition the camera view of the buildplate. + +*Increased processing speeds and performance +A 5-10% speed increase when calculating normals, loading models and slicing. + +*Jogging +It allows the printhead to be moved with on-screen controls. Contributed by fieldOfView. + +*Large model loading +A new feature has been added which unloads the layer view when switching to solid mode, speeding Ultimaker Cura back up without losing your G-code/layer view information. + +*Scripts folder +A scripts folder is now available in the Ultimaker Cura configuration folder. This folder can be loaded with post processing plugins scripts, which will automatically show in Ultimaker Cura. Contributed by fieldOfView. + +*Optimized workflow for crash reporting +Crash reports are automatically generated and allow the user, in case of a crash, to easily send their report with a description to developers. + +*Floating models enabled +In previous releases, models were dropped to the build plate when support was disabled. Models now float when the setting is enabled (even if creates an impossible-to-print situation). This can be used to stack separate models on top of each other. + +*Slicing tolerance +A new setting that affects the intersect point to influence the dimensional accuracy for diagonal surfaces. The user can select the behaviour: ‘Inclusive’ makes gaps narrower, ‘Exclusive’ makes gaps wider, and ‘Middle’ is the fastest to process. This can be used to create better tolerances for printed screw holes. Contributed by BagelOrb. + +*Optimized zig zag patterns +Zig zag patterns now print more consistently. Lines now have a 5 micron tolerance in which they are printed any way, resulting in longer connected lines. Contributed by smartavionics. + +*Aligned z-seam inner wall moves +Inner wall travel moves are aligned with the z-seam. This reduces the number of travel moves and reduces the chance of more unwanted seams. + +*Relative positioning of infill patterns +Infill patterns are now positioned relative to the center of loaded models and an offset can be applied to control the infill more precisely and adjust it to preference or strength. Contributed by smartavionics. + +*Line resolution +Enables the user to specify the minimum allowed distance value between two points in G-code to create lower or higher resolution polygons. + +*Custom mode changes +If profile settings have been modified in recommended mode under custom mode, a reset icon will appear to notify the user. Click the icon to show the changes that have been made, and revert back to the default profile settings. + +*Bugfixes +- Fix for layer numbers being displayed incorrectly when switching between solid and layer mode +- Fix for Ultimaker Cura engine crashes on certain models +- Fix for Uninstalling previous versions of Cura on Windows platforms +- Fix for displaying visible settings +- Fix for loading legacy profiles +- Fix for importing custom single extrusion profile + [3.0.4] *Bug fixes - Fixed OpenGL issue that prevents Cura from starting. @@ -571,10 +628,10 @@ The new GUI allows custom profiles to load easily and intuitively, directly from *3MF File Loading Support We’re happy to report we now support loading 3MF files. This is a new file format similar to AMF, but freely available. -*Intuitive Cut-Off Object Bottom +*Intuitive Cut-Off Object Bottom We’ve added a feature that allows you to move objects below the build plate. You can either correct a model with a rough bottom, or print only a part of an object. Please note that the implementation differs greatly from the old one when it was just a setting. -*64-bit Windows Builds +*64-bit Windows Builds An optimized 64-bit Windows Cura version is now available. This allows you to load larger model files. *Automatic calculations From c039535ee350ad9be06df6873a769d4eb9f115d4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 13:57:10 +0100 Subject: [PATCH 450/764] Fix retraction window of PLA and Nylon of 0.25mm profiles This was probably caused by having wrong default profiles. We're checking the rest of the settings again now just to be sure, because this probably has more implications elsewhere too. --- .../quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg | 1 - 2 files changed, 2 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg index fda770266e..ff16fff8f1 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg @@ -24,7 +24,6 @@ raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 3) raft_jerk = =jerk_layer_0 raft_margin = 10 raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) -retraction_extrusion_window = =retraction_amount retraction_min_travel = =line_width * 2 skin_overlap = 50 speed_print = 70 diff --git a/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg index d3772448cf..c1a93e12b0 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg @@ -21,7 +21,6 @@ machine_nozzle_heat_up_speed = 2.0 material_final_print_temperature = =max(-273.15, material_print_temperature - 15) material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) material_print_temperature = 190 -retraction_extrusion_window = =retraction_amount retraction_hop = 0.2 skin_overlap = 5 speed_layer_0 = 30 From 21d61ce21eeae704cd38059c9de099738a4e61ff Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 1 Dec 2017 14:26:53 +0100 Subject: [PATCH 451/764] Fix an error that makes Cura crash when introducing commas in the textfields in the ImageReader panel. Now it's possible to use commas xor dots for separating decimal values. --- plugins/ImageReader/ConfigUI.qml | 8 ++++---- plugins/ImageReader/ImageReaderUI.py | 13 +++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml index d2caec0220..d829f46459 100644 --- a/plugins/ImageReader/ConfigUI.qml +++ b/plugins/ImageReader/ConfigUI.qml @@ -43,7 +43,7 @@ UM.Dialog TextField { id: peak_height objectName: "Peak_Height" - validator: DoubleValidator {notation: DoubleValidator.StandardNotation; bottom: -500; top: 500;} + validator: RegExpValidator {regExp: /^-?\d{1,3}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onPeakHeightChanged(text) } } @@ -66,7 +66,7 @@ UM.Dialog TextField { id: base_height objectName: "Base_Height" - validator: DoubleValidator {notation: DoubleValidator.StandardNotation; bottom: 0; top: 500;} + validator: RegExpValidator {regExp: /^\d{1,3}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onBaseHeightChanged(text) } } @@ -90,7 +90,7 @@ UM.Dialog id: width objectName: "Width" focus: true - validator: DoubleValidator {notation: DoubleValidator.StandardNotation; bottom: 1; top: 500;} + validator: RegExpValidator {regExp: /^[1-9]\d{0,2}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onWidthChanged(text) } } @@ -113,7 +113,7 @@ UM.Dialog id: depth objectName: "Depth" focus: true - validator: DoubleValidator {notation: DoubleValidator.StandardNotation; bottom: 1; top: 500;} + validator: RegExpValidator {regExp: /^[1-9]\d{0,2}([\,|\.]\d*)?$/} width: 180 * screenScaleFactor onTextChanged: { manager.onDepthChanged(text) } } diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py index 40ea15f7a0..a7909f131b 100644 --- a/plugins/ImageReader/ImageReaderUI.py +++ b/plugins/ImageReader/ImageReaderUI.py @@ -107,7 +107,7 @@ class ImageReaderUI(QObject): def onWidthChanged(self, value): if self._ui_view and not self._disable_size_callbacks: if len(value) > 0: - self._width = float(value) + self._width = float(value.replace(",", ".")) else: self._width = 0 @@ -120,7 +120,7 @@ class ImageReaderUI(QObject): def onDepthChanged(self, value): if self._ui_view and not self._disable_size_callbacks: if len(value) > 0: - self._depth = float(value) + self._depth = float(value.replace(",", ".")) else: self._depth = 0 @@ -132,14 +132,14 @@ class ImageReaderUI(QObject): @pyqtSlot(str) def onBaseHeightChanged(self, value): if (len(value) > 0): - self.base_height = float(value) + self.base_height = float(value.replace(",", ".")) else: self.base_height = 0 @pyqtSlot(str) def onPeakHeightChanged(self, value): if (len(value) > 0): - self.peak_height = float(value) + self.peak_height = float(value.replace(",", ".")) else: self.peak_height = 0 @@ -149,7 +149,4 @@ class ImageReaderUI(QObject): @pyqtSlot(int) def onImageColorInvertChanged(self, value): - if (value == 1): - self.image_color_invert = True - else: - self.image_color_invert = False + self.image_color_invert = (value == 1) From fb9645d18563b3f28c14881074d65cf8e213484e Mon Sep 17 00:00:00 2001 From: Dinow Date: Wed, 22 Nov 2017 23:34:46 +0800 Subject: [PATCH 452/764] import from 3.0 --- resources/i18n/zh_TW/cura.po | 4624 +++++++++++++ resources/i18n/zh_TW/fdmextruder.def.json.po | 210 + resources/i18n/zh_TW/fdmprinter.def.json.po | 6094 ++++++++++++++++++ 3 files changed, 10928 insertions(+) create mode 100644 resources/i18n/zh_TW/cura.po create mode 100644 resources/i18n/zh_TW/fdmextruder.def.json.po create mode 100644 resources/i18n/zh_TW/fdmprinter.def.json.po diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po new file mode 100644 index 0000000000..5cf77c1bbe --- /dev/null +++ b/resources/i18n/zh_TW/cura.po @@ -0,0 +1,4624 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-25 08:53+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 2.0.4\n" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Print aborted" +msgstr "列印已取消" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Blocked" +msgstr "暫停" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Action required" +msgstr "需要採取的動作" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label:status" +msgid "Can't start print" +msgstr "無法開始列印" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" + +#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +msgctxt "@label" +msgid "Finishes at: " +msgstr "完成時間:" + +#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" + +#: Manually added for +#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" + +#: Manually added for +#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +msgctxt "@info:status" +msgid "Print finished" +msgstr "列印已完成" + +#: Manually added for resources/Cura/Cura.qml +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "外掛(&l)" + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "瀏覽外掛..." + +#: Manually added for resources/Cura/Actions.qml +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "安裝外掛..." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "透視檢視" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "X3D 檔案" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "GCode 檔案" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "使用 Doodle3D 無線網路盒列印" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "使用 Doodle3D 無線網路盒列印" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "正在連接 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +msgctxt "@action:button" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "正在向 Doodle3D Connect 發送資料" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "無法向 Doodle3D Connect 發送資料。請確認是否有另一項列印作業正在進行?" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "正在儲存資料到 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "檔案已被傳送到 Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect.." +msgstr "開啟連線..." + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "開啟 Doodle3D Connect 的網路介面" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "顯示更新日誌" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "合併有效設定" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "列印參數已被合併並啟用。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "透過 USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "透過 USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "透過 USB 連接" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +msgctxt "@info:title" +msgid "Print Details" +msgstr "列印細項設定" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "" +"This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "" +"此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "USB 連線列印" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +msgctxt "@info:status" +msgid "" +"Unable to start a new job because the printer does not support usb printing." +msgstr "無法啟動新作業,因為該印表機不支援 USB 連線列印。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +msgctxt "@info:title" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "無法更新韌體,因為沒有連接印表機。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "在 %s 無法找到印表機所需的韌體。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "印表機韌體" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "儲存至行動裝置" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "儲存到行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "正在儲存到行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "儲存中" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "無法儲存到 {0}{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "嘗試寫入到 {device} 時無法找到檔名。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "無法儲存到行動裝置 {0}:{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +msgctxt "@info:title" +msgid "Error" +msgstr "錯誤" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "儲存到行動裝置 {0}:{1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "檔案已儲存" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "卸載" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "卸載行動裝置 {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "已卸載 {0}。現在你可以安全地移除行動裝置。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "安全移除硬體" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "無法卸載 {0},可能有其它程式正在使用行動裝置。" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "行動裝置" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "" +"Access to the printer requested. Please approve the request on the printer" +msgstr "已發送印表機存取請求,請在印表機上批准該請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:title" +msgid "Connection status" +msgstr "連線狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "連線狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@action:button" +msgid "Retry" +msgstr "重試" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "重新發送存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "印表機接受了存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "無法使用本印表機進行列印,無法發送列印作業。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "請求存取" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "向印表機發送存取請求" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +msgctxt "@info:status" +msgid "" +"Connected over the network. Please approve the access request on the printer." +msgstr "已透過網路連接。請在印表機上接受存取請求。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "已透過網路連接。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "已透過網路連接,但沒有印表機的控制權限。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "存取請求被印表機上拒絕。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "存取請求超時失敗。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "網路連接中斷。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +msgctxt "@info:status" +msgid "" +"The connection with the printer was lost. Check your printer to see if it is " +"connected." +msgstr "與印表機的連接中斷,請檢查印表機是否已連接。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#, python-format +msgctxt "@info:status" +msgid "" +"Unable to start a new print job, printer is busy. Current printer status is " +"%s." +msgstr "印表機無法啟動新的列印作業,目前的印表機狀態為 %s。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "印表機狀態" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "無法啟動新的列印作業。插槽 {0} 中未載入列印頭。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "無法啟動新的列印作業。插槽 {0} 中未載入耗材。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "線軸 {0} 上沒有足夠的耗材。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "不同的列印頭(Cura:{0},印表機: 為擠出機 {2} 選擇了 {1})" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "你為擠出機 {2} 選擇了不同的耗材(Cura:{0},印表機:{1})" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#, python-brace-format +msgctxt "@label" +msgid "" +"PrintCore {0} is not properly calibrated. XY calibration needs to be " +"performed on the printer." +msgstr "列印頭 {0} 未正確校準。需要在印表機上執行 XY 校正。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "你確定要使用所選設定進行列印嗎?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer " +"and Cura. For the best result, always slice for the PrintCores and materials " +"that are inserted in your printer." +msgstr "" +"印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列" +"印頭和耗材設定進行切片。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "設定不匹配" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "正在向印表機發送資料" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "發送資料中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "無法向印表機發送資料。請確認是否有另一項列印作業正在進行?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "中斷列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "列印已中斷。請檢查印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "暫停列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "繼續列印..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "與你的印表機同步" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "你想在 Cura 中使用目前的印表機設定嗎?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +msgctxt "@label" +msgid "" +"The PrintCores and/or materials on your printer differ from those within " +"your current project. For the best result, always slice for the PrintCores " +"and materials that are inserted in your printer." +msgstr "" +"印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印" +"表機的列印頭和耗材設定進行切片。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "透過網路連接" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +msgid "" +"This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "" +"This printer is the host for a group of {count} connected Ultimaker 3 " +"printers." +msgstr "這台印表機是 {count} 台連線的 Ultimaker 3 印表機群組的主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#, python-brace-format +msgid "" +"{printer_name} has finished printing '{job_name}'. Please collect the print " +"and confirm clearing the build plate." +msgstr "" +"{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#, python-brace-format +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the " +"printer's configuration to match the job, for it to start printing." +msgstr "" +"{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業," +"以便開始列印。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "前一列印作業傳送中,暫停傳送新列印作業。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +msgctxt "@info:status" +msgid "" +"Unable to send new print job: this 3D printer is not (yet) set up to host a " +"group of connected Ultimaker 3 printers." +msgstr "" +"無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的" +"主機。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "傳送 {file_name} 到群組 {cluster_name} 中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} 已傳送到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "顯示列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "使用瀏覽器開啟列印作業介面。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "無法傳送列印作業到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#, python-brace-format +msgctxt "" +"@info Don't translate {machine_name}, since it gets replaced by a printer " +"name!" +msgid "" +"To ensure that your {machine_name} is equipped with the latest features it " +"is recommended to update the firmware regularly. This can be done on the " +"{machine_name} (when connected to the network) or via USB." +msgstr "" +"為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " +"{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "有新 %s 韌體可用" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "下載" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +msgctxt "@info" +msgid "Could not access update information." +msgstr "無法存取升級資訊。" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "" +"Errors appeared while opening your SolidWorks file! Please " +"check, whether it is possible to open your file in SolidWorks itself without " +"any problems as well!" +msgstr "" +"開啟 SolidWorks 檔案時發生錯誤! 請檢查能否在 SolidWorks 中正常開" +"啟檔案而不出現任何問題!" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "SolidWorks 零件檔案" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "SolidWorks 組件檔案" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr "啟動 %s 時發生錯誤!" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "修改 G-Code 檔案" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "" +"Cura collects anonymised slicing statistics. You can disable this in the " +"preferences." +msgstr "Cura 收集匿名切片統計資料。你可以在偏好設定中關閉此選項。" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "收集資料中" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "關閉此通知" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Cura 15.04 列印參數" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "G-code 檔案" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" +"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" +"(Layers)" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 +msgctxt "@info:title" +msgid "Layer View" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "JPG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "JPEG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "PNG 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "BMP 圖片" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "GIF 圖片" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "" +"Unable to slice with the current material as it is incompatible with the " +"selected machine or configuration." +msgstr "無法使用目前耗材切片,因為它與所選機器或設定不相容。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "無法切片" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice with the current settings. The following settings have " +"errors: {0}" +msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +msgctxt "@info:status" +msgid "" +"Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "無法切片(原因:換料塔或主位置無效)。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +msgctxt "@info:status" +msgid "" +"Nothing to slice because none of the models fit the build volume. Please " +"scale or rotate models to fit." +msgstr "" +"沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列" +"印範圍。" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "正在處理層" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +msgctxt "@info:title" +msgid "Information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "單一模型設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "設定對每個模型的單獨設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "推薦" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +msgctxt "@title:tab" +msgid "Custom" +msgstr "自訂選項" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +msgctxt "@label" +msgid "Nozzle" +msgstr "噴頭" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 +msgctxt "@menuitem" +msgid "Browse plugins" +msgstr "瀏覽外掛" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "無法從 {0} 取得外掛 ID" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +msgctxt "@info:tile" +msgid "Warning" +msgstr "警告" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "外掛瀏覽器" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "G 檔案" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "正在解析 G-code" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "G-code 細項設定" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +msgctxt "@info:generic" +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration " +"before sending the file to it. The g-code representation may not be accurate." +msgstr "" +"發送檔案之前,請確保 G-code 適用於目前印表機和印表機設定。目前 G-code 檔案可" +"能不準確。" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Cura 列印參數" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Cura 專案 3MF 檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "選擇升級" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "調平列印平台" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "外壁" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Skin" +msgstr "表層" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Infill" +msgstr "填充" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "支撐填充" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "支撐介面" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support" +msgstr "支撐" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "外圍" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Travel" +msgstr "移動" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "回抽" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Other" +msgstr "其它" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "預切片檔案 {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "未載入耗材" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "未知耗材" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "正在為物件尋找新位置" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "尋找位置中" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "無法在列印範圍內放下全部物件" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "無法找到位置" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "檔案已經存在" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "" +"The file {0} already exists. Are you sure you want to " +"overwrite it?" +msgstr "檔案 {0} 已存在。你確定要覆蓋掉它嗎?" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "自訂" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "自訂耗材" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +msgctxt "@info:status" +msgid "" +"The selected material is incompatible with the selected machine or " +"configuration." +msgstr "所選耗材與所選機器或設定不相容。" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "不相容的耗材" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "" +"The selected material diameter causes the material to become incompatible " +"with the current printer." +msgstr "所選耗材直徑導致耗材與目前印表機不相容。" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "復原" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "復原更改耗材直徑。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to export profile to {0}: {1}" +msgstr "無法將列印參數匯出至 {0}{1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "" +"Failed to export profile to {0}: Writer plugin reported " +"failure." +msgstr "無法將列印參數匯出至 {0}:寫入器外掛報告故障。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "列印參數已匯出至:{0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +msgctxt "@info:title" +msgid "Export Details" +msgstr "匯出細項設定" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to import profile from {0}: {1}" +msgstr "無法從 {0} 匯入列印參數:{1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "已成功匯入列印參數 {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "列印參數 {0} 檔案類型未知或已損壞。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +msgctxt "@label" +msgid "Custom profile" +msgstr "自訂列印參數" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "列印參數缺少列印品質類型定義。" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "無法為目前設定找到品質類型 {0}。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print " +"Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "" +"由於「列印序列」設定的值,成形列印範圍高度已被減少,以防止龍門與列印模型相衝" +"突。" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "列印範圍" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "正在複製並放置模型" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "擺放物件中" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "錯誤報告" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 +msgctxt "@label" +msgid "" +"

    A fatal exception has occurred that we could not recover from!

    \n" +"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" +"issues

    \n" +" " +msgstr "" +"

    發生了致命錯誤,我們無法繼續!

    \n" +"

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "開啟網頁" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "正在載入印表機..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "正在設定場景..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "正在載入介面…" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#, python-format +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be " +"translated; just translate the format of ##x##x## mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +msgctxt "@title:tab" +msgid "Printer" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +msgctxt "@label" +msgid "Printer Settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +msgctxt "@label" +msgid "X (Width)" +msgstr "X (寬度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (深度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (高度)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +msgctxt "@label" +msgid "Build plate shape" +msgstr "列印平台形狀" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "原點位於中心" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "熱床" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "GCode 類型" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "列印頭設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +msgctxt "@label" +msgid "X min" +msgstr "X 最小值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "" +"列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +msgctxt "@label" +msgid "Y min" +msgstr "Y 最小值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "" +"列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +msgctxt "@label" +msgid "X max" +msgstr "X 最大值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "" +"列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +msgctxt "@label" +msgid "Y max" +msgstr "Y 最大值" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "" +"列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" +"撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +msgctxt "@label" +msgid "Gantry height" +msgstr "龍門高度" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes). Used to prevent collisions between previous prints and the " +"gantry when printing \"One at a Time\"." +msgstr "" +"噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列" +"印品與龍門發生碰撞。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "擠出機數目" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact " +"diameter will be overridden by the material and/or the profile." +msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +msgctxt "@label" +msgid "Material diameter" +msgstr "耗材直徑" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +msgctxt "@label" +msgid "Nozzle size" +msgstr "噴頭孔徑" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +msgctxt "@label" +msgid "Start Gcode" +msgstr "起始 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "將在開始時執行的 Gcode 命令。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +msgctxt "@label" +msgid "End Gcode" +msgstr "結束 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "將在結束時執行的 Gcode 命令。" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "噴頭設定" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "噴頭偏移 X" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "噴頭偏移 Y" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "擠出機起始 Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "擠出機結束 Gcode" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "更新日誌" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "關閉" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "韌體更新" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "韌體更新已完成。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "正在開始韌體更新。可能需要花費一些時間,請耐心等待。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "更新韌體中..." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "由於未知錯誤,韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "由於通訊錯誤,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "由於輸入/輸出錯誤,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "由於韌體遺失,導致韌體更新失敗。" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "未知錯誤代碼: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "連接到網路印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your " +"printer is connected to the network using a network cable or by connecting " +"your printer to your WIFI network. If you don't connect Cura with your " +"printer, you can still use a USB drive to transfer g-code files to your " +"printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"要透過網路列印,請確認你的印表機已透過網路線或 WIFI 連接到網路。若你無法讓 " +"Cura 與印表機連線,你仍然可以使用 USB 裝置將 G-code 檔案傳輸到印表機。\n" +"\n" +"從以下列表中選擇你的印表機:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "增加" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "編輯" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "移除" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "刷新" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +msgctxt "@label" +msgid "" +"If your printer is not listed, read the network printing " +"troubleshooting guide" +msgstr "如果你的印表機未被列出,請閱讀網路列印故障排除指南" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +msgctxt "@label" +msgid "Type" +msgstr "類型" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Extended" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 +msgctxt "@label" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +msgctxt "@label" +msgid "Firmware version" +msgstr "韌體版本" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +msgctxt "@label" +msgid "Address" +msgstr "位址" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "該網路位址的印表機尚無回應。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "連接" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "印表機網路位址" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "輸入印表機在網路上的 IP 位址或主機名。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +msgctxt "@action:button" +msgid "Ok" +msgstr "確定" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "連接到印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "將印表機設定載入 Cura" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "啟用設定" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 +msgctxt "@label" +msgid "" +"This printer is not set up to host a group of connected Ultimaker 3 printers" +msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 +msgctxt "@label" +msgid "" +"This printer is the host for a group of %1 connected Ultimaker 3 printers" +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 +msgctxt "@label:status" +msgid "Printing" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 +msgctxt "@label:status" +msgid "Reserved" +msgstr "保留" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 +msgctxt "@label:status" +msgid "Finished" +msgstr "已完成" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 +msgctxt "@label:status" +msgid "Preparing" +msgstr "正在準備" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 +msgctxt "@label:status" +msgid "Available" +msgstr "可用" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 +msgctxt "@label" +msgid "Completed on: " +msgstr "完成時間:" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 +msgctxt "@label" +msgid "Clear build plate" +msgstr "清空列印平台" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 +msgctxt "@label" +msgid "Preparing to print" +msgstr "準備列印中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "不接受列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "使用你的預設瀏覽器開啟列印作業頁面。" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "檢視列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 +msgctxt "@label" +msgid "PRINTER GROUP" +msgstr "印表機群組" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 +msgctxt "@title" +msgid "Print jobs" +msgstr "列印作業" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 +msgctxt "@label" +msgid "Printing" +msgstr "列印中" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 +msgctxt "@label" +msgid "Queued" +msgstr "已排入佇列" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "等待設定更動" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 +msgctxt "@label:title" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 +msgctxt "@action:button" +msgid "View printers" +msgstr "檢視印表機" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Cura SolidWorks 外掛設定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "預設的匯出 STL 品質:" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "總是使用精細品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "總是使用粗糙品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "確定" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "匯入 SolidWorks 檔案為 STL..." + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "匯出 STL 的品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "品質" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "粗糙" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "精細" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "記住我的選擇" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "後處理外掛" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "後處理腳本" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "添加一個腳本" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "更改目前啟用的後處理腳本" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 +msgctxt "@label" +msgid "Color scheme" +msgstr "顏色方案" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "耗材顏色" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "線條類型" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "相容模式" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 +msgctxt "@label" +msgid "Show Travels" +msgstr "顯示移動軌跡" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 +msgctxt "@label" +msgid "Show Helpers" +msgstr "顯示輔助結構" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 +msgctxt "@label" +msgid "Show Shell" +msgstr "顯示外殼" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 +msgctxt "@label" +msgid "Show Infill" +msgstr "顯示填充" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "只顯示頂層" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "顯示頂端 5 層列印細節" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "頂 / 底層" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 +msgctxt "@label" +msgid "Inner Wall" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "轉換圖片..." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "每個像素與底板的最大距離。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "高度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "距離列印平台的底板高度,以毫米為單位。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "底板 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "列印平台寬度,以毫米為單位。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "寬度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "列印平台深度,以毫米為單位" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "深度 (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels " +"represent low points on the mesh. Change this option to reverse the behavior " +"such that black pixels represent high points on the mesh and white pixels " +"represent low points on the mesh." +msgstr "" +"預設情況下,白色像素表示網格上的高點,黑色像素表示網格上的低點。更改此選項將" +"以相反方式呈現,黑色像素表示網格上的高點,白色像素表示網格上的低點。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "顏色越淺高度越高" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "顏色越深高度越高" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "影像平滑程度。" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "平滑" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "選擇設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "選擇對此模型的自訂設定" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "篩選…" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "顯示全部" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "開啟專案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "更新已有設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "新建" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "摘要 - Cura 專案" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "印表機設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "如何解決機器的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +msgctxt "@action:label" +msgid "Type" +msgstr "類型" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +msgctxt "@action:label" +msgid "Name" +msgstr "名稱" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "列印參數設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "如何解决列印參數中的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "不在列印參數中" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "%1 覆寫" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "衍生自" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "%1, %2 覆寫" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +msgctxt "@action:label" +msgid "Material settings" +msgstr "耗材設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "如何解决耗材的設定衝突?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "參數顯示設定" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +msgctxt "@action:label" +msgid "Mode" +msgstr "模式" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "可見設定:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%1 / %2" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "載入專案時將清除列印平台上的所有模型" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +msgctxt "@action:button" +msgid "Open" +msgstr "開啟" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "查找與更新外掛" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "你可以在這裡找到第三方外掛列表。" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "升級" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "已安裝" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "外掛授權協議" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +" plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "" +" 外掛內含一份授權\n" +"你必需同意此份授權協議才能安裝此外掛。\n" +"是否同意下列條款?" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "接受" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "拒絕" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "選擇印表機更新檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "請選擇適用於 Ultimaker 2 的更新檔案。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Olsson Block" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "列印平台調平" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your " +"buildplate. When you click 'Move to Next Position' the nozzle will move to " +"the different positions that can be adjusted." +msgstr "" +"為了確保列印品質出色,你現在可以開始調整你的列印平台。當你點擊「移動到下一個" +"位置」時,噴頭將移動到不同的可調節位置。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the " +"print build plate height. The print build plate height is right when the " +"paper is slightly gripped by the tip of the nozzle." +msgstr "" +"在噴頭停止的每一個位置下方插入一張紙,並調整平台高度。當紙張恰好被噴頭的尖端" +"輕微壓住時,表示列印平台已被校準在正確的高度。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "開始進行列印平台調平" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "移動到下一個位置" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This " +"firmware controls the step motors, regulates the temperature and ultimately " +"makes your printer work." +msgstr "" +"韌體是直接在 3D 印表機上運行的一個軟體。此韌體控制步進馬達,調節溫度讓印表機" +"正常運作。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "" +"The firmware shipping with new printers works, but new versions tend to have " +"more features and improvements." +msgstr "" +"新印表機出廠配備的韌體完全可以正常使用,但新版本往往具有更多的新功能和改進。" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "自動升級韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "上傳自訂韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "選擇自訂韌體" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "請選擇適用於 Ultimaker Original 的更新檔案" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "熱床(官方版本或自製版本)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "檢查印表機" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip " +"this step if you know your machine is functional" +msgstr "" +"對 Ultimaker 進行幾項正確性檢查是很好的做法。如果你知道你的機器功能正常,則可" +"跳過此步驟" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "開始印表機檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "連接:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "已連接" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "未連接" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "X Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "正常" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "未檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "Y Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "Z Min 限位開關:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "檢查噴頭溫度:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "停止加熱" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "開始加熱" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "熱床溫度檢查:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "已檢查" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "一切正常!你已經完成檢查。" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "未連接至印表機" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "印表機不接受命令" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "維護中。請檢查印表機" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "與印表機的連接中斷" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "列印中..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "已暫停" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "準備中..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "請取出列印件" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "繼續" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "暫停" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "中斷列印" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "中斷列印" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "你確定要中斷列印嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "捨棄或保留更改" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "" +"你已自訂部份列印參數設定。\n" +"你想保留或捨棄這些設定嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "列印參數設定" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "預設" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "自訂" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "捨棄更改,並不再詢問此問題" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "保留更改,並不再詢問此問題" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "捨棄" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "保留" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "創建新的列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "顯示名稱" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "品牌" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "耗材類型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "顏色" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "屬性" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "密度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "直徑" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "耗材成本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "耗材重量" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "耗材長度" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "每公尺成本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "此耗材與 %1 相關聯,並共享其部份屬性。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "解除聯結耗材" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "描述" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "附著資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "列印設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "參數顯示設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "全選" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "已計算" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "目前" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "單位" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +msgctxt "@title:tab" +msgid "General" +msgstr "基本" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "介面" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "語言:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "貨幣:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "主題:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "" +"You will need to restart the application for these changes to have effect." +msgstr "需重新啟動 Cura,新的設定才能生效。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "當設定變更時自動進行切片。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "自動切片" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "顯示區設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "" +"Highlight unsupported areas of the model in red. Without support these areas " +"will not print properly." +msgstr "以紅色凸顯模型缺少支撐的區域。如果沒有支撐這些區域將無法正常列印。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "顯示懸垂(Overhang)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "" +"Moves the camera so the model is in the center of the view when a model is " +"selected" +msgstr "當模型被選中時,視角將自動調整到最合適的觀察位置(模型處於正中央)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "當專案被選中時,自動置中視角" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "需要讓 Cura 的預設縮放操作反轉嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "反轉視角縮放方向。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "是否跟隨滑鼠方向進行縮放?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "跟隨滑鼠方向縮放" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "" +"Should models on the platform be moved so that they no longer intersect?" +msgstr "需要移動平台上的模型,使它們不再交錯嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "確保每個模型都保持分離" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "要將模型下降到碰觸列印平台嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "自動下降模型到列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "在 G-code 讀取器中顯示警告資訊。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "G-code 讀取器中的警告資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "分層檢視要強制進入相容模式嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "強制分層檢視相容模式(需要重新啟動)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "開啟並儲存檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "當模型的尺寸過大時,是否將模型自動縮小至列印範圍嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "縮小過大模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters " +"rather than millimeters. Should these models be scaled up?" +msgstr "" +"部份模型採用較大的單位(例如:公尺),導致模型變得非常小,要將這些模型放大嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "放大過小模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "" +"Should a prefix based on the printer name be added to the print job name " +"automatically?" +msgstr "是否自動將印表機名稱作為列印作業名稱的前綴?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "將印表機名稱前綴添加到列印作業名稱中" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "儲存專案檔案時是否顯示摘要?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "儲存專案時顯示摘要對話框" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "開啟專案檔案時的預設行為" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "開啟專案檔案時的預設行為:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "總是詢問" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "總是作為一個專案開啟" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "總是匯入模型" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "" +"When you have made changes to a profile and switched to a different one, a " +"dialog will be shown asking whether you want to keep your modifications or " +"not, or you can choose a default behaviour and never show that dialog again." +msgstr "" +"當你對列印參數進行更改然後切換到其他列印參數時,將顯示一個對話框詢問你是否要" +"保留修改。你也可以選擇預設不顯示該對話框。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "覆寫列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "隱私權" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "當 Cura 啟動時,是否自動檢查更新?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "啟動時檢查更新" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no " +"models, IP addresses or other personally identifiable information is sent or " +"stored." +msgstr "" +"你願意將關於你的列印資料以匿名形式發送到 Ultimaker 嗎?注意:我們不會記錄或發" +"送任何模型、IP 地址或其他私人資料。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "(匿名)發送列印資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +msgctxt "@title:tab" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "啟用" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "重命名" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +msgctxt "@label" +msgid "Printer type:" +msgstr "印表機類型:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +msgctxt "@label" +msgid "Connection:" +msgstr "連接:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "尚未連接到印表機。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +msgctxt "@label" +msgid "State:" +msgstr "狀態:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "等待清空列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "等待列印作業" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "受保護的列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "自訂列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "創建" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "匯入" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "匯出" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "印表機:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "使用目前設定 / 覆寫值更新列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "捨棄目前更改" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "" +"This profile uses the defaults specified by the printer, so it has no " +"settings/overrides in the list below." +msgstr "此列印參數使用印表機指定的預設值,因此在下面的列表中沒有此設定項。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "你目前的設定與選定的列印參數相匹配。" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "全局設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "重命名列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "創建列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "複製列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "匯入列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "匯入列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "匯出列印參數" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +msgctxt "@title:tab" +msgid "Materials" +msgstr "耗材" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "" +"@action:label %1 is printer name, %2 is how this printer names variants, %3 " +"is variant name" +msgid "Printer: %1, %2: %3" +msgstr "印表機:%1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "印表機:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "創建" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "複製" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "匯入耗材設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Could not import material %1: %2" +msgstr "無法匯入耗材 %1%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "成功匯入耗材 %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "匯出耗材設定" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "" +"Failed to export material to %1: %2" +msgstr "無法匯出耗材至 %1%2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "成功匯出耗材至:%1" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "新增印表機" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "印表機名稱:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "新增印表機" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "關於 Cura" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "熔絲 3D 列印技術的的端對端解決方案。" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "" +"Cura 由 Ultimaker B.V. 與社區合作開發。\n" +"Cura 使用以下開源專案:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "圖形用戶介面" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "應用框架" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "GCode 產生器" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "進程間通訊交互使用庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "編程語言" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "GUI 框架" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "GUI 框架綁定" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C / C++ 綁定庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "資料交換格式" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "科學計算函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "高速運算函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "用於處理 STL 檔案的函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "用於處理 3MF 檔案的函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "串口通訊函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "ZeroConf 發現函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "多邊形剪輯函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +msgctxt "@label" +msgid "Font" +msgstr "字體" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "SVG icons" +msgstr "SVG 圖標" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "列印參數:" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the " +"profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"部份設定/覆寫值與儲存在列印參數中的值不同。\n" +"\n" +"點擊開啟列印參數管理器。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "搜尋..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "將設定值複製到所有擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "隱藏此設定" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "不再顯示此設定" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "保持此設定可見" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "設定設定可見性..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated " +"value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"部份隱藏設定使用的值與一般計算所得的值不同。\n" +"\n" +"點擊以顯這些設定。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "影響" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "影響因素" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "" +"This setting is always shared between all extruders. Changing it here will " +"change the value for all extruders" +msgstr "這個設定由全部的擠出機共享,變更這個設定將改變全部擠出機的設定值" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "這個數值是由每個擠出機的設定值解析出來的" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"此設定的值與列印參數不同。\n" +"\n" +"單擊以復原列印參數的值。" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value " +"set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"這個設定通常由計算得出,可是它目前被設定為一個數值。\n" +"\n" +"點擊以恢復計算得出的數值。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "列印設定" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "" +"列印設定已禁用\n" +"G-code 檔案無法被修改" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 +msgctxt "@label" +msgid "00h 00min" +msgstr "00 小時 00 分" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +msgctxt "@tooltip" +msgid "Time information" +msgstr "時間資訊" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 +msgctxt "@description" +msgid "Print time" +msgstr "列印時間" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +msgctxt "@label" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "%1m / ~ %2g / ~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 +msgctxt "@label" +msgid "%1m / ~ %2g" +msgstr "%1m / ~ %2g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

    Print with the recommended settings " +"for the selected printer, material and quality." +msgstr "" +"推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行" +"列印。" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +msgctxt "@tooltip" +msgid "" +"Custom Print Setup

    Print with finegrained control over every " +"last bit of the slicing process." +msgstr "自訂列印設定
    對切片過程中的每一個細節進行精細控制。" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "自動:%1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "檢視(&V)" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "自動: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "列印所選模型:" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "複製所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "複製個數" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "最近開啟的檔案(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "沒有連接印表機" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +msgctxt "@label" +msgid "Extruder" +msgstr "擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down " +"towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "" +"加熱端的目標溫度。加熱端將加熱或冷卻至此溫度。若設定為 0,則關閉加熱端的加" +"熱。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "該擠出機的目前溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "該擠出機中耗材的顏色。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "該擠出機中的耗材。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "該擠出機所使用的噴頭。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +msgctxt "@label" +msgid "Build plate" +msgstr "列印平台" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +msgctxt "@tooltip" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down " +"towards this temperature. If this is 0, the bed heating is turned off." +msgstr "熱床的目標溫度。熱床將加熱或冷卻至此溫度。若設定為 0,則不使用熱床。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "熱床目前溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "熱床的預熱溫度。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +msgctxt "@button" +msgid "Pre-heat" +msgstr "預熱" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +msgctxt "@tooltip of pre-heat" +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your " +"print while it is heating, and you won't have to wait for the bed to heat up " +"when you're ready to print." +msgstr "" +"列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等" +"待熱床加熱完畢。" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +msgctxt "@label" +msgid "Active print" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +msgctxt "@label" +msgid "Job Name" +msgstr "作業名稱" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +msgctxt "@label" +msgid "Printing Time" +msgstr "列印時間" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +msgctxt "@label" +msgid "Estimated time left" +msgstr "預計剩餘時間" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "切換全螢幕(&F)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "復原(&U)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "取消復原(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "退出(&Q)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "設定 Cura…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "新增印表機(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "管理印表機(&I)..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "管理耗材…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "使用目前設定 / 覆寫更新列印參數(&U)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "捨棄目前更改(&D)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "從目前設定 / 覆寫值創建列印參數(&C)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "管理列印參數.." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "顯示線上說明文件(&D)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "BUG 回報(&B)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "關於(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "刪除所選模型(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "置中所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "複製所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "刪除模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "將模型置中(&N)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "群組模型(&G)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "取消模型群組" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "結合模型(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "複製模型…(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "選擇所有模型(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "清空列印平台(&C)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "重新載入所有模型(&L)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "編位所有的模型" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "為所選模型編位" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "重置所有模型位置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "重置所有模型旋轉(&T)" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "開啟檔案(&O)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "新建專案(&N)…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "顯示切片引擎日誌(&L)..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "顯示設定資料夾" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "參數顯示設定..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "請載入一個 3D 模型" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "切片已準備就緒" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "正在切片..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "%1 已準備就緒" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "無法切片" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "切片不可用" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "準備" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "取消" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "選擇作用中的輸出裝置" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "" +"We have found one or more project file(s) within the files you have " +"selected. You can open only one project file at a time. We suggest to only " +"import models from those files. Would you like to proceed?" +msgstr "" +"我們已經在你所選擇的檔案中找到一個或多個專案檔案,但一次只能開啟一個專案檔" +"案。我們建議只從那些檔案中匯入模型而不開啟專案。你要繼續操作嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "匯入所有模型" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "檔案(&F)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "儲存到檔案(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "另存為(&A)…" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "儲存專案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "編輯(&E)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +msgctxt "@title:menu" +msgid "&View" +msgstr "檢視(&V)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "設定(&S)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "印表機(&P)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +msgctxt "@title:menu" +msgid "&Material" +msgstr "耗材(&M)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "列印參數(&P)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "設為主要擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "擴充功能(&X)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "偏好設定(&R)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "幫助(&H)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +msgctxt "@action:button" +msgid "Open File" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "Settings" +msgstr "設定" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +msgctxt "@title:window" +msgid "New project" +msgstr "新建專案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +msgctxt "@info:question" +msgid "" +"Are you sure you want to start a new project? This will clear the build " +"plate and any unsaved settings." +msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何未儲存的設定。" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "安裝外掛" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "開啟檔案" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +msgctxt "@text:window" +msgid "" +"We have found one or more G-Code files within the files you have selected. " +"You can only open one G-Code file at a time. If you want to open a G-Code " +"file, please just select only one." +msgstr "" +"我們已經在你選擇的檔案中找到一個或多個 G-Code 檔案。你一次只能開啟一個 G-" +"Code 檔案。若需開啟 G-Code 檔案,請僅選擇一個。" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "儲存專案" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "擠出機 %1" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "%1 & 耗材" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "儲存時不再顯示專案摘要" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +msgctxt "@action:button" +msgid "Save" +msgstr "儲存" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "準備" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "監控" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +msgctxt "@label" +msgid "Layer Height" +msgstr "層高" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +msgctxt "@label" +msgid "Print Speed" +msgstr "列印速度" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +msgctxt "@label" +msgid "Slower" +msgstr "更慢" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +msgctxt "@label" +msgid "Faster" +msgstr "更快" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +msgctxt "@label" +msgid "Infill" +msgstr "填充" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +msgctxt "@label" +msgid "" +"Gradual infill will gradually increase the amount of infill towards the top." +msgstr "漸層填充(Gradual infill)將隨著列印高度的提升而逐漸加大填充密度。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +msgctxt "@label" +msgid "Enable gradual" +msgstr "啟用漸層" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +msgctxt "@label" +msgid "Generate Support" +msgstr "產生支撐" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +msgctxt "@label" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "" +"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" +"塌。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +msgctxt "@label" +msgid "Support Extruder" +msgstr "支撐用擠出機" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting " +"structures below the model to prevent the model from sagging or printing in " +"mid air." +msgstr "" +"選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空" +"中列印。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under " +"your object which is easy to cut off afterwards." +msgstr "" +"允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +msgctxt "@label" +msgid "" +"Need help improving your prints?
    Read the Ultimaker " +"Troubleshooting Guides" +msgstr "需要幫助改善你的列印?閱讀 Ultimaker 故障排除指南" + +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "用 %1 列印所選模型" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "開啟專案檔案" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +msgctxt "@text:window" +msgid "" +"This is a Cura project file. Would you like to open it as a project or " +"import the models from it?" +msgstr "這是一個 Cura 專案檔案。你想將其作為一個專案開啟還是從中匯入模型?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +msgctxt "@action:button" +msgid "Open as project" +msgstr "作為專案開啟" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +msgctxt "@action:button" +msgid "Import models" +msgstr "匯入模型" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "引擎日誌" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +msgctxt "@label" +msgid "Material" +msgstr "耗材" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +msgctxt "@label" +msgid "Check material compatibility" +msgstr "檢查耗材相容性" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "點擊查看 Ultimaker.com 上的耗材相容性。" + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "" +"Provides a way to change machine settings (such as build volume, nozzle " +"size, etc)" +msgstr "提供更改印表機設定(如成形空間體積、噴頭口徑等)的方法" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "印表機設定操作" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "提供透視檢視。" + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "透視檢視" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "提供讀取 X3D 檔案的支援。" + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "X3D 讀取器" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "將 GCode 寫入至檔案。" + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "GCode 寫入器" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "將所有設定內容轉儲至 HTML 檔案。" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "上帝模式" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "接受 G-Code 並透過 WiFi 將其發送到 Doodle3D 無線網路盒。" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "Doodle3D 無線網路盒" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "顯示最新版本更動。" + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "更新日誌" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "創建一份合併品質變化列印參數。" + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "列印參數合併器" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "" +"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "接受 G-Code 並且傳送到印表機。此外掛也可以更新韌體。" + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "USB 連線列印" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "提供行動裝置熱插拔和寫入檔案的支援。" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "行動裝置輸出設備外掛" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "管理與 Ultimaker 3 印表機的網路連接" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "UM3 網路連接" + +#: CuraPrintClusterUpload/plugin.json +msgctxt "name" +msgid "UM3 Network Connection (Cluster)" +msgstr "UM3 網路連接(叢集)" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "檢查是否有韌體更新。" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "韌體更新檢查" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "" +"Gives you the possibility to open certain files via SolidWorks itself. These " +"are then converted and loaded into Cura" +msgstr "" +"讓你可以透過 SolidWorks 自身開啟特定檔案。隨後會將這些檔案進行轉換並載入 Cura" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "SolidWorks 集成" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "擴充程式(允許用戶建立腳本進行後處理)" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "後處理" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "偏好設定、機器設定和列印參數修改後自動儲存。" + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "自動儲存" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "提交匿名切片資訊。這項功能可以在偏好設定中關閉。" + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "切片資訊" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "提供讀寫 XML 格式耗材參數的功能。" + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "耗材參數" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "提供匯入 Cura 舊版本列印參數的支援。" + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "舊版 Cura 列印參數讀取器" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "提供匯入 G-code 檔案中列印參數的支援。" + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "G-code 列印參數讀取器" + +#: LayerView/plugin.json +msgctxt "description" +msgid "Provides the Layer view." +msgstr "提供分層檢視。" + +#: LayerView/plugin.json +msgctxt "name" +msgid "Layer View" +msgstr "分層檢視" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "將設定從 Cura 2.5 版本升級至 2.6 版本。" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "升級版本 2.5 到 2.6" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "升級版本 2.7 到 3.0" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "將設定從 Cura 2.6 版本升級至 2.7 版本。" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "升級版本 2.6 到 2.7" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "將設定從 Cura 2.1 版本升級至 2.2 版本。" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "升級版本 2.1 到 2.2" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "將設定從 Cura 2.2 版本升級至 2.4 版本。" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "升級版本 2.2 到 2.4" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "支援從 2D 圖片檔案產生可列印 3D 模型的能力。" + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "圖片讀取器" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "提供連結到 Cura 切片引擎後台。" + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "Cura 引擎後台" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "提供對每個模型的單獨設定。" + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "單一模型設定工具" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "提供讀取 3MF 格式檔案的支援。" + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "3MF 讀取器" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "尋找、管理和安裝新外掛。" + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "外掛瀏覽器" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "提供一個基本的實體網格檢視。" + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "實體檢視" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "允許載入和顯示 G-code 檔案。" + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "G-code 讀取器" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "提供匯出 Cura 列印參數的支援。" + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "Cura 列印參數寫入器" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "提供寫入 3MF 檔案的支援。" + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "3MF 寫入器" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "" +"Provides machine actions for Ultimaker machines (such as bed leveling " +"wizard, selecting upgrades, etc)" +msgstr "提供 Ultimaker 印表機專屬功能(如平台調平精靈、選擇升級等)" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "Ultimaker 印表機操作" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "提供匯入 Cura 列印參數的支援。" + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "Cura 列印參數讀取器" + +#~ msgctxt "@item:inlistbox" +#~ msgid "X-Ray" +#~ msgstr "透視" + +#~ msgctxt "@label" +#~ msgid "Doodle3D" +#~ msgstr "Doodle3D" + +#~ msgctxt "@info:tooltip" +#~ msgid "Print with " +#~ msgstr "使用 " + +#~ msgctxt "@title:menu" +#~ msgid "Doodle3D" +#~ msgstr "Doodle3D 列印" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Enable Scan devices..." +#~ msgstr "啟用掃描設備..." + +#~ msgctxt "X3G Writer File Description" +#~ msgid "X3G File" +#~ msgstr "X3G 檔案" + +#~ msgctxt "@info:status" +#~ msgid "" +#~ "Please keep in mind, that you have to reopen your SolidWorks file " +#~ "manually! Reloading the model won't work!" +#~ msgstr "" +#~ "請注意,重新載入模型功能無法運作!你必須手動重新開啟 SolidWorks 檔案!" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Layers" +#~ msgstr "層" + +#~ msgctxt "@item:inmenu" +#~ msgid "Solid" +#~ msgstr "實體" + +#~ msgctxt "@title:window" +#~ msgid "Doodle3D Settings" +#~ msgstr "Doodle3D 設定" + +#~ msgctxt "@title:window" +#~ msgid "Print to: %1" +#~ msgstr "列印至:%1" + +#~ msgctxt "@label" +#~ msgid "Extruder Temperature: %1/%2°C" +#~ msgstr "列印頭溫度:%1/%2 °C" + +#~ msgctxt "@label" +#~ msgid "Bed Temperature: %1/%2°C" +#~ msgstr "熱床溫度:%1/%2°C" + +#~ msgctxt "@label" +#~ msgid "%1" +#~ msgstr "%1" + +#~ msgctxt "@label" +#~ msgid "View Mode: Layers" +#~ msgstr "檢視模式:分層" + +#~ msgctxt "@label" +#~ msgid "Hotend" +#~ msgstr "熱端" + +#~ msgctxt "@action:button" +#~ msgid "View Mode" +#~ msgstr "檢視模式" + +#~ msgctxt "@title:tab" +#~ msgid "Print" +#~ msgstr "列印" + +#~ msgctxt "@label" +#~ msgid "0%" +#~ msgstr "0%" + +#~ msgctxt "@label" +#~ msgid "Empty infill will leave your model hollow with low strength." +#~ msgstr "無填充將使模型處於低強度且保持空心狀態。" + +#~ msgctxt "@label" +#~ msgid "20%" +#~ msgstr "20%" + +#~ msgctxt "@label" +#~ msgid "Light (20%) infill will give your model an average strength." +#~ msgstr "輕度(20%)填充將使列印模型處於中等強度。" + +#~ msgctxt "@label" +#~ msgid "50%" +#~ msgstr "50%" + +#~ msgctxt "@label" +#~ msgid "Dense (50%) infill will give your model an above average strength." +#~ msgstr "密集(50%)填充將使列印模型高於平均的強度。" + +#~ msgctxt "@label" +#~ msgid "100%" +#~ msgstr "100%" + +#~ msgctxt "@label" +#~ msgid "Solid (100%) infill will make your model completely solid." +#~ msgstr "完全(100%)填充將使你的模型處於完全實心狀態。" + +#~ msgctxt "@label" +#~ msgid "Gradual" +#~ msgstr "漸層填充" + +#~ msgctxt "description" +#~ msgid "Provides support for writing X3G files" +#~ msgstr "提供寫入 X3G 檔案的支援" + +#~ msgctxt "name" +#~ msgid "X3G Writer" +#~ msgstr "X3G 寫入器" diff --git a/resources/i18n/zh_TW/fdmextruder.def.json.po b/resources/i18n/zh_TW/fdmextruder.def.json.po new file mode 100644 index 0000000000..527342aafb --- /dev/null +++ b/resources/i18n/zh_TW/fdmextruder.def.json.po @@ -0,0 +1,210 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-17 22:13+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" + +#: fdmextruder.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "機型" + +#: fdmextruder.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "機器詳細設定" + +#: fdmextruder.def.json +msgctxt "extruder_nr label" +msgid "Extruder" +msgstr "擠出機" + +#: fdmextruder.def.json +msgctxt "extruder_nr description" +msgid "The extruder train used for printing. This is used in multi-extrusion." +msgstr "用於列印的擠出機,在多擠出機情況下適用。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "噴頭 ID" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "擠出機組的噴頭 ID,比如 \"AA 0.4\" 和 \"BB 0.8\"。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "噴頭直徑" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x label" +msgid "Nozzle X Offset" +msgstr "噴頭 X 軸偏移量" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x description" +msgid "The x-coordinate of the offset of the nozzle." +msgstr "噴頭 X 軸座標偏移。" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y label" +msgid "Nozzle Y Offset" +msgstr "噴頭 Y 軸偏移量" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y description" +msgid "The y-coordinate of the offset of the nozzle." +msgstr "噴頭 Y 軸座標偏移。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code label" +msgid "Extruder Start G-Code" +msgstr "擠出機起始 G-code" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code description" +msgid "Start g-code to execute whenever turning the extruder on." +msgstr "打開擠出機將執行此段 G-code。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs label" +msgid "Extruder Start Position Absolute" +msgstr "擠出機起點絕對位置" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs description" +msgid "" +"Make the extruder starting position absolute rather than relative to the " +"last-known location of the head." +msgstr "讓擠出機以絕對位置做為起點,而不是與前一次位置的相對位置。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x label" +msgid "Extruder Start Position X" +msgstr "擠出機起始位置 X 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x description" +msgid "The x-coordinate of the starting position when turning the extruder on." +msgstr "打開擠出機時起始位置的 X 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y label" +msgid "Extruder Start Position Y" +msgstr "擠出機起始位置 Y 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y description" +msgid "The y-coordinate of the starting position when turning the extruder on." +msgstr "打開擠壓機時的起始位置 Y 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code label" +msgid "Extruder End G-Code" +msgstr "擠出機結束 Gcode" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code description" +msgid "End g-code to execute whenever turning the extruder off." +msgstr "在關閉擠出機時,執行結束 G-code。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs label" +msgid "Extruder End Position Absolute" +msgstr "擠出機終點絕對位置" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs description" +msgid "" +"Make the extruder ending position absolute rather than relative to the last-" +"known location of the head." +msgstr "讓擠出機以絕對位置為終點,而不是與前一次位置的相對位置。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x label" +msgid "Extruder End Position X" +msgstr "擠出機結束位置 X 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x description" +msgid "The x-coordinate of the ending position when turning the extruder off." +msgstr "關閉擠出機時的終止位置的 X 座標。" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y label" +msgid "Extruder End Position Y" +msgstr "擠出機終點位置 Y 座標" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y description" +msgid "The y-coordinate of the ending position when turning the extruder off." +msgstr "關閉擠出機時的終止位置的 Y 座標。" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "擠出機初始 Z 軸位置" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." + +#: fdmextruder.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: fdmextruder.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "附著" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "擠出機 X 軸座標" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 X 軸上初始位置。" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "擠出機 Y 軸起始位置" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po new file mode 100644 index 0000000000..5fa7bf1ce8 --- /dev/null +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -0,0 +1,6094 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.0\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-10-31 23:30+0800\n" +"Last-Translator: Zhang Heh Ji \n" +"Language-Team: TEAM\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.0.4\n" + +#: fdmprinter.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "機器" + +#: fdmprinter.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "機器詳細設定" + +#: fdmprinter.def.json +msgctxt "machine_name label" +msgid "Machine Type" +msgstr "機器類型" + +#: fdmprinter.def.json +msgctxt "machine_name description" +msgid "The name of your 3D printer model." +msgstr "你的 3D 印表機型號的名稱。" + +#: fdmprinter.def.json +msgctxt "machine_show_variants label" +msgid "Show Machine Variants" +msgstr "顯示印表機型號" + +#: fdmprinter.def.json +msgctxt "machine_show_variants description" +msgid "" +"Whether to show the different variants of this machine, which are described " +"in separate json files." +msgstr "是否顯示這台印表機在不同的 JSON 檔案中所描述的型號。" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode label" +msgid "Start GCode" +msgstr "起始 G-code" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode description" +msgid "" +"Gcode commands to be executed at the very start - separated by \n" +"." +msgstr "" +"在開始後執行的 G-code 命令 - 以 \n" +" 分行。" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode label" +msgid "End GCode" +msgstr "結束 G-code" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode description" +msgid "" +"Gcode commands to be executed at the very end - separated by \n" +"." +msgstr "" +"在結束前執行的 G-code 命令 - 以 \n" +" 分行。" + +#: fdmprinter.def.json +msgctxt "material_guid label" +msgid "Material GUID" +msgstr "耗材 GUID" + +#: fdmprinter.def.json +msgctxt "material_guid description" +msgid "GUID of the material. This is set automatically. " +msgstr "耗材 GUID,此項為自動設定。" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait label" +msgid "Wait for Build Plate Heatup" +msgstr "等待列印平台加熱" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait description" +msgid "" +"Whether to insert a command to wait until the build plate temperature is " +"reached at the start." +msgstr "是否插入一條命令,在開始時等待列印平台達到設定溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait label" +msgid "Wait for Nozzle Heatup" +msgstr "等待噴頭加熱" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait description" +msgid "Whether to wait until the nozzle temperature is reached at the start." +msgstr "是否在開始時等待噴頭達到設定溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend label" +msgid "Include Material Temperatures" +msgstr "插入耗材溫度" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend description" +msgid "" +"Whether to include nozzle temperature commands at the start of the gcode. " +"When the start_gcode already contains nozzle temperature commands Cura " +"frontend will automatically disable this setting." +msgstr "" +"是否在 G-code 開始部分插入噴頭溫度命令。當起始 G-code 已包含噴頭溫度命令時," +"Cura 前端將自動關閉此設定。" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend label" +msgid "Include Build Plate Temperature" +msgstr "插入熱床溫度" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend description" +msgid "" +"Whether to include build plate temperature commands at the start of the " +"gcode. When the start_gcode already contains build plate temperature " +"commands Cura frontend will automatically disable this setting." +msgstr "" +"是否需要在 G-code 開始部分插入熱床溫度的命令。當起始 G-code 包含熱床溫度命令" +"時,Cura 前端將自動關閉此設定。" + +#: fdmprinter.def.json +msgctxt "machine_width label" +msgid "Machine Width" +msgstr "機器寬度" + +#: fdmprinter.def.json +msgctxt "machine_width description" +msgid "The width (X-direction) of the printable area." +msgstr "機器可列印區域寬度(X 座標)" + +#: fdmprinter.def.json +msgctxt "machine_depth label" +msgid "Machine Depth" +msgstr "機器深度" + +#: fdmprinter.def.json +msgctxt "machine_depth description" +msgid "The depth (Y-direction) of the printable area." +msgstr "機器可列印區域深度(Y 座標)" + +#: fdmprinter.def.json +msgctxt "machine_shape label" +msgid "Build Plate Shape" +msgstr "列印平台形狀" + +#: fdmprinter.def.json +msgctxt "machine_shape description" +msgid "" +"The shape of the build plate without taking unprintable areas into account." +msgstr "列印平台形狀(不計算不可列印區域)。" + +#: fdmprinter.def.json +msgctxt "machine_shape option rectangular" +msgid "Rectangular" +msgstr "矩形" + +#: fdmprinter.def.json +msgctxt "machine_shape option elliptic" +msgid "Elliptic" +msgstr "類圓形" + +#: fdmprinter.def.json +msgctxt "machine_height label" +msgid "Machine Height" +msgstr "機器高度" + +#: fdmprinter.def.json +msgctxt "machine_height description" +msgid "The height (Z-direction) of the printable area." +msgstr "機器可列印區域高度(Z 座標)" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed label" +msgid "Has Heated Build Plate" +msgstr "有熱床" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed description" +msgid "Whether the machine has a heated build plate present." +msgstr "機器是否有熱床。" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero label" +msgid "Is Center Origin" +msgstr "原點是否位於中心" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero description" +msgid "" +"Whether the X/Y coordinates of the zero position of the printer is at the " +"center of the printable area." +msgstr "印表機的 X/Y 座標原點是否位於可列印區域的中心。" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count label" +msgid "Number of Extruders" +msgstr "擠出機數目" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count description" +msgid "" +"Number of extruder trains. An extruder train is the combination of a feeder, " +"bowden tube, and nozzle." +msgstr "擠出機組數目。擠出機組是指進料裝置、喉管和噴頭的組合。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter label" +msgid "Outer nozzle diameter" +msgstr "噴頭外徑" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter description" +msgid "The outer diameter of the tip of the nozzle." +msgstr "噴頭尖端的外徑。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance label" +msgid "Nozzle length" +msgstr "噴頭長度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance description" +msgid "" +"The height difference between the tip of the nozzle and the lowest part of " +"the print head." +msgstr "噴頭尖端與列印頭最低部分之間的高度差。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle label" +msgid "Nozzle angle" +msgstr "噴頭角度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle description" +msgid "" +"The angle between the horizontal plane and the conical part right above the " +"tip of the nozzle." +msgstr "水平面與噴頭尖端上部圓錐形之間的角度。" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length label" +msgid "Heat zone length" +msgstr "加熱區長度" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length description" +msgid "" +"The distance from the tip of the nozzle in which heat from the nozzle is " +"transferred to the filament." +msgstr "與噴頭尖端的距離,噴頭產生的熱量在這段距離內傳遞到耗材中。" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance label" +msgid "Filament Park Distance" +msgstr "耗材停放距離" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance description" +msgid "" +"The distance from the tip of the nozzle where to park the filament when an " +"extruder is no longer used." +msgstr "與噴頭尖端的距離,當不再使用擠出機時會將耗材停放在此區域。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled label" +msgid "Enable Nozzle Temperature Control" +msgstr "啟用噴頭溫度控制" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled description" +msgid "" +"Whether to control temperature from Cura. Turn this off to control nozzle " +"temperature from outside of Cura." +msgstr "是否從 Cura 控制溫度。若要從 Cura 外部控制噴頭溫度,關閉此選項。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed label" +msgid "Heat up speed" +msgstr "加熱速度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed description" +msgid "" +"The speed (°C/s) by which the nozzle heats up averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "噴頭從待機溫度加熱到列印溫度的平均速度(℃/ s)。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed label" +msgid "Cool down speed" +msgstr "冷卻速度" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed description" +msgid "" +"The speed (°C/s) by which the nozzle cools down averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "噴頭從列印溫度冷卻到待機溫度的平均速度(℃/ s)。" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window label" +msgid "Minimal Time Standby Temperature" +msgstr "待機溫度最短時間" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window description" +msgid "" +"The minimal time an extruder has to be inactive before the nozzle is cooled. " +"Only when an extruder is not used for longer than this time will it be " +"allowed to cool down to the standby temperature." +msgstr "" +"擠出機必須保持不活動以便噴頭冷卻的最短時間。擠出機必須停用超過此時間,才可以" +"冷卻到待機溫度。" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor label" +msgid "Gcode flavour" +msgstr "G-code 類型" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor description" +msgid "The type of gcode to be generated." +msgstr "需要產生的 G-code 類型。" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" +msgid "Marlin" +msgstr "Marlin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Volumetric)" +msgid "Marlin (Volumetric)" +msgstr "Marlin(容積)" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (RepRap)" +msgid "RepRap" +msgstr "RepRap" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option UltiGCode" +msgid "Ultimaker 2" +msgstr "Ultimaker 2" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Griffin" +msgid "Griffin" +msgstr "Griffin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Makerbot" +msgid "Makerbot" +msgstr "Makerbot" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option BFB" +msgid "Bits from Bytes" +msgstr "Bits from Bytes" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option MACH3" +msgid "Mach3" +msgstr "Mach3" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Repetier" +msgid "Repetier" +msgstr "Repetier" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas label" +msgid "Disallowed areas" +msgstr "不允許區域" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas description" +msgid "A list of polygons with areas the print head is not allowed to enter." +msgstr "不允許列印頭進入區域的多邊形列表。" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas label" +msgid "Nozzle Disallowed Areas" +msgstr "噴頭不允許區域" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas description" +msgid "A list of polygons with areas the nozzle is not allowed to enter." +msgstr "不允許噴頭進入區域的多邊形列表。" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon label" +msgid "Machine head polygon" +msgstr "機器頭多邊形" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon description" +msgid "A 2D silhouette of the print head (fan caps excluded)." +msgstr "列印頭 2D 輪廓圖(不包含風扇蓋)。" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon label" +msgid "Machine head & Fan polygon" +msgstr "機器頭和風扇多邊形" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon description" +msgid "A 2D silhouette of the print head (fan caps included)." +msgstr "列印頭 2D 輪廓圖(包含風扇蓋)。" + +#: fdmprinter.def.json +msgctxt "gantry_height label" +msgid "Gantry height" +msgstr "吊車高度" + +#: fdmprinter.def.json +msgctxt "gantry_height description" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes)." +msgstr "噴頭尖端與吊車之間的高度差。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "噴頭 ID" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "擠出機組的噴頭 ID,比如\"AA 0.4\"和\"BB 0.8\"。" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "噴頭直徑" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "噴頭內徑,在使用非標準噴頭尺寸時需更改此設定。" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords label" +msgid "Offset With Extruder" +msgstr "擠出機偏移量" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords description" +msgid "Apply the extruder offset to the coordinate system." +msgstr "將擠出機偏移量套用到座標軸系統。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "擠出機初始 Z 軸位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Z 軸座標上的起始位置." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs label" +msgid "Absolute Extruder Prime Position" +msgstr "擠出機使用絕對位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs description" +msgid "" +"Make the extruder prime position absolute rather than relative to the last-" +"known location of the head." +msgstr "擠出機的控制參數使用絕對位置,而不是與前次位置的相對位移。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x label" +msgid "Maximum Speed X" +msgstr "X 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x description" +msgid "The maximum speed for the motor of the X-direction." +msgstr "X 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y label" +msgid "Maximum Speed Y" +msgstr "Y 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y description" +msgid "The maximum speed for the motor of the Y-direction." +msgstr "Y 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z label" +msgid "Maximum Speed Z" +msgstr "Z 軸最大速度" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z description" +msgid "The maximum speed for the motor of the Z-direction." +msgstr "Z 軸方向馬達的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e label" +msgid "Maximum Feedrate" +msgstr "最大進料速率" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e description" +msgid "The maximum speed of the filament." +msgstr "耗材的最大速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x label" +msgid "Maximum Acceleration X" +msgstr "X 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x description" +msgid "Maximum acceleration for the motor of the X-direction" +msgstr "X 軸方向馬達的最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y label" +msgid "Maximum Acceleration Y" +msgstr "Y 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y description" +msgid "Maximum acceleration for the motor of the Y-direction." +msgstr "Y 軸方向馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z label" +msgid "Maximum Acceleration Z" +msgstr "Z 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z description" +msgid "Maximum acceleration for the motor of the Z-direction." +msgstr "Z 軸方向馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e label" +msgid "Maximum Filament Acceleration" +msgstr "擠出馬達最大加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e description" +msgid "Maximum acceleration for the motor of the filament." +msgstr "擠出馬達的最大加速度。" + +#: fdmprinter.def.json +msgctxt "machine_acceleration label" +msgid "Default Acceleration" +msgstr "預設加速度" + +#: fdmprinter.def.json +msgctxt "machine_acceleration description" +msgid "The default acceleration of print head movement." +msgstr "列印頭移動的預設加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy label" +msgid "Default X-Y Jerk" +msgstr "預設 X-Y 平面加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy description" +msgid "Default jerk for movement in the horizontal plane." +msgstr "水平面移動的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z label" +msgid "Default Z Jerk" +msgstr "預設 Z 軸加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z description" +msgid "Default jerk for the motor of the Z-direction." +msgstr "Z 軸方向馬達的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e label" +msgid "Default Filament Jerk" +msgstr "預設擠出馬達加加速度" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e description" +msgid "Default jerk for the motor of the filament." +msgstr "擠出馬達的預設加加速度。" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate label" +msgid "Minimum Feedrate" +msgstr "最小進料速率" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate description" +msgid "The minimal movement speed of the print head." +msgstr "列印頭的最低移動速度。" + +#: fdmprinter.def.json +msgctxt "resolution label" +msgid "Quality" +msgstr "品質" + +#: fdmprinter.def.json +msgctxt "resolution description" +msgid "" +"All settings that influence the resolution of the print. These settings have " +"a large impact on the quality (and print time)" +msgstr "影響列印解析度的所有設定。這些設定會對品質(和列印時間)產生顯著影響" + +#: fdmprinter.def.json +msgctxt "layer_height label" +msgid "Layer Height" +msgstr "層高" + +#: fdmprinter.def.json +msgctxt "layer_height description" +msgid "" +"The height of each layer in mm. Higher values produce faster prints in lower " +"resolution, lower values produce slower prints in higher resolution." +msgstr "" +"每層的高度(以毫米為單位)。值越高,則列印速度越快,解析度越低;值越低,則列" +"印速度越慢,解析度越高。" + +#: fdmprinter.def.json +msgctxt "layer_height_0 label" +msgid "Initial Layer Height" +msgstr "起始層高" + +#: fdmprinter.def.json +msgctxt "layer_height_0 description" +msgid "" +"The height of the initial layer in mm. A thicker initial layer makes " +"adhesion to the build plate easier." +msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台的附著越輕鬆。" + +#: fdmprinter.def.json +msgctxt "line_width label" +msgid "Line Width" +msgstr "線寬" + +#: fdmprinter.def.json +msgctxt "line_width description" +msgid "" +"Width of a single line. Generally, the width of each line should correspond " +"to the width of the nozzle. However, slightly reducing this value could " +"produce better prints." +msgstr "" +"單一線寬。一般而言,每條線條的寬度應與噴頭的寬度對應。但是,稍微降低此值可以" +"產生更好的列印成果。" + +#: fdmprinter.def.json +msgctxt "wall_line_width label" +msgid "Wall Line Width" +msgstr "牆壁線寬" + +#: fdmprinter.def.json +msgctxt "wall_line_width description" +msgid "Width of a single wall line." +msgstr "單層牆壁線寬。" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 label" +msgid "Outer Wall Line Width" +msgstr "線寬(外壁)" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 description" +msgid "" +"Width of the outermost wall line. By lowering this value, higher levels of " +"detail can be printed." +msgstr "最外側牆壁的線寬。降低此值,可列印出更高水準的細節。" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x label" +msgid "Inner Wall(s) Line Width" +msgstr "內壁線寬" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x description" +msgid "" +"Width of a single wall line for all wall lines except the outermost one." +msgstr "除了外壁以外牆壁的線寬。" + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "頂部表層線寬" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "列印頂部區域單一線寬。" + +#: fdmprinter.def.json +msgctxt "skin_line_width label" +msgid "Top/Bottom Line Width" +msgstr "頂部/底部線寬" + +#: fdmprinter.def.json +msgctxt "skin_line_width description" +msgid "Width of a single top/bottom line." +msgstr "單一頂部/底部線寬。" + +#: fdmprinter.def.json +msgctxt "infill_line_width label" +msgid "Infill Line Width" +msgstr "填充線寬" + +#: fdmprinter.def.json +msgctxt "infill_line_width description" +msgid "Width of a single infill line." +msgstr "單一填充線寬。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width label" +msgid "Skirt/Brim Line Width" +msgstr "外圍/邊緣線寬" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width description" +msgid "Width of a single skirt or brim line." +msgstr "單一外圍或邊緣的線寬。" + +#: fdmprinter.def.json +msgctxt "support_line_width label" +msgid "Support Line Width" +msgstr "支撐線寬" + +#: fdmprinter.def.json +msgctxt "support_line_width description" +msgid "Width of a single support structure line." +msgstr "單一支撐線寬。" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width label" +msgid "Support Interface Line Width" +msgstr "支撐介面線寬" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width description" +msgid "Width of a single line of support roof or floor." +msgstr "支撐頂板或底板單一線寬。" + +#: fdmprinter.def.json +msgctxt "support_roof_line_width label" +msgid "Support Roof Line Width" +msgstr "支撐頂板線寬" + +#: fdmprinter.def.json +msgctxt "support_roof_line_width description" +msgid "Width of a single support roof line." +msgstr "單一支撐頂板線寬。" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width label" +msgid "Support Floor Line Width" +msgstr "支撐底板線寬" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width description" +msgid "Width of a single support floor line." +msgstr "單一支撐底板線寬。" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width label" +msgid "Prime Tower Line Width" +msgstr "換料塔線寬" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width description" +msgid "Width of a single prime tower line." +msgstr "單一換料塔線寬。" + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor label" +msgid "Initial Layer Line Width" +msgstr "起始層線寬" + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor description" +msgid "" +"Multiplier of the line width on the first layer. Increasing this could " +"improve bed adhesion." +msgstr "第一層線寬倍數。增大此倍數可改善熱床附著。" + +#: fdmprinter.def.json +msgctxt "shell label" +msgid "Shell" +msgstr "外殼" + +#: fdmprinter.def.json +msgctxt "shell description" +msgid "Shell" +msgstr "外殼" + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr label" +msgid "Outer Wall Extruder" +msgstr "外壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr description" +msgid "" +"The extruder train used for printing the outer wall. This is used in multi-" +"extrusion." +msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr label" +msgid "Inner Walls Extruder" +msgstr "內壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr description" +msgid "" +"The extruder train used for printing the inner walls. This is used in multi-" +"extrusion." +msgstr "用於列印內壁的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "wall_thickness label" +msgid "Wall Thickness" +msgstr "壁厚" + +#: fdmprinter.def.json +msgctxt "wall_thickness description" +msgid "" +"The thickness of the walls in the horizontal direction. This value divided " +"by the wall line width defines the number of walls." +msgstr "水平方向的牆壁厚度。此值除以壁線寬度決定牆壁數量。" + +#: fdmprinter.def.json +msgctxt "wall_line_count label" +msgid "Wall Line Count" +msgstr "牆壁線條圈數" + +#: fdmprinter.def.json +msgctxt "wall_line_count description" +msgid "" +"The number of walls. When calculated by the wall thickness, this value is " +"rounded to a whole number." +msgstr "牆壁的線條圈數,如果由壁厚計算,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist label" +msgid "Outer Wall Wipe Distance" +msgstr "外壁擦拭噴頭長度" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist description" +msgid "" +"Distance of a travel move inserted after the outer wall, to hide the Z seam " +"better." +msgstr "在列印外壁後插入的空跑距離,以便消除隱藏 Z 縫的銜接痕跡。" + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr label" +msgid "Top Surface Skin Extruder" +msgstr "頂部表層擠出機" + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr description" +msgid "" +"The extruder train used for printing the top most skin. This is used in " +"multi-extrusion." +msgstr "用於列印最頂部表層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "roofing_layer_count label" +msgid "Top Surface Skin Layers" +msgstr "頂部表層" + +#: fdmprinter.def.json +msgctxt "roofing_layer_count description" +msgid "" +"The number of top most skin layers. Usually only one top most layer is " +"sufficient to generate higher quality top surfaces." +msgstr "最頂部表層層數。通常只需一層最頂部就足以產生較高品質的頂部表面。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "頂部表層列印樣式" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "最頂部列印樣式。" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "頂部表層線條方向" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "" +"A list of integer line directions to use when the top surface skin layers " +"use the lines or zig zag pattern. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees)." +msgstr "" +"當頂部表層採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" +"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表項以逗號分隔,整個列" +"表包含在方括號中。預設使用傳統的預設角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr label" +msgid "Top/Bottom Extruder" +msgstr "頂部/底部擠出機" + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr description" +msgid "" +"The extruder train used for printing the top and bottom skin. This is used " +"in multi-extrusion." +msgstr "用於列印頂部和底部表層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness label" +msgid "Top/Bottom Thickness" +msgstr "頂部 / 底部厚度" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness description" +msgid "" +"The thickness of the top/bottom layers in the print. This value divided by " +"the layer height defines the number of top/bottom layers." +msgstr "列印模型中頂部/底部的厚度。該值除以層高決定頂部/底部的層數。" + +#: fdmprinter.def.json +msgctxt "top_thickness label" +msgid "Top Thickness" +msgstr "頂部厚度" + +#: fdmprinter.def.json +msgctxt "top_thickness description" +msgid "" +"The thickness of the top layers in the print. This value divided by the " +"layer height defines the number of top layers." +msgstr "列印模型中頂部的厚度。該值除以層高決定頂部的層數。" + +#: fdmprinter.def.json +msgctxt "top_layers label" +msgid "Top Layers" +msgstr "頂部層數" + +#: fdmprinter.def.json +msgctxt "top_layers description" +msgid "" +"The number of top layers. When calculated by the top thickness, this value " +"is rounded to a whole number." +msgstr "頂部列印層數,當由頂部厚度來計算時層數時,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "bottom_thickness label" +msgid "Bottom Thickness" +msgstr "底部厚度" + +#: fdmprinter.def.json +msgctxt "bottom_thickness description" +msgid "" +"The thickness of the bottom layers in the print. This value divided by the " +"layer height defines the number of bottom layers." +msgstr "列印模型中底部的厚度。此值除以層高決定底部的層數。" + +#: fdmprinter.def.json +msgctxt "bottom_layers label" +msgid "Bottom Layers" +msgstr "底部層數" + +#: fdmprinter.def.json +msgctxt "bottom_layers description" +msgid "" +"The number of bottom layers. When calculated by the bottom thickness, this " +"value is rounded to a whole number." +msgstr "底部列印層數,當由底部厚度來計算時層數時,會四捨五入為一個整數值。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern label" +msgid "Top/Bottom Pattern" +msgstr "頂部/底部填充樣式" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern description" +msgid "The pattern of the top/bottom layers." +msgstr "頂部/底部的列印樣式。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 label" +msgid "Bottom Pattern Initial Layer" +msgstr "初始層列印樣式" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 description" +msgid "The pattern on the bottom of the print on the first layer." +msgstr "列印件底部第一層的列印樣式。" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "skin_angles label" +msgid "Top/Bottom Line Directions" +msgstr "頂部/底部線條方向" + +#: fdmprinter.def.json +msgctxt "skin_angles description" +msgid "" +"A list of integer line directions to use when the top/bottom layers use the " +"lines or zig zag pattern. Elements from the list are used sequentially as " +"the layers progress and when the end of the list is reached, it starts at " +"the beginning again. The list items are separated by commas and the whole " +"list is contained in square brackets. Default is an empty list which means " +"use the traditional default angles (45 and 135 degrees)." +msgstr "" +"當頂部/底部採用線條或鋸齒狀的列印樣式時使用的整數線條方向的列表。列表中的元素" +"隨層的進度依次使用,當達到列表末尾時,它將從頭開始。列表元素以逗號分隔,整個" +"列表包含在方括號中。空的列表代表使用傳統的預設角度(45 和 135 度)。" + +#: fdmprinter.def.json +msgctxt "wall_0_inset label" +msgid "Outer Wall Inset" +msgstr "外壁內嵌" + +#: fdmprinter.def.json +msgctxt "wall_0_inset description" +msgid "" +"Inset applied to the path of the outer wall. If the outer wall is smaller " +"than the nozzle, and printed after the inner walls, use this offset to get " +"the hole in the nozzle to overlap with the inner walls instead of the " +"outside of the model." +msgstr "" +"內嵌是套用在外壁路徑上的功能。如果外壁小於噴頭,並且在內壁之後列印,則此偏移" +"量將使噴頭孔內移與內壁重疊而不是行走在模型外部。" + +#: fdmprinter.def.json +msgctxt "outer_inset_first label" +msgid "Outer Before Inner Walls" +msgstr "先印外壁後印內壁" + +#: fdmprinter.def.json +msgctxt "outer_inset_first description" +msgid "" +"Prints walls in order of outside to inside when enabled. This can help " +"improve dimensional accuracy in X and Y when using a high viscosity plastic " +"like ABS; however it can decrease outer surface print quality, especially on " +"overhangs." +msgstr "" +"啟用時以從外向內的順序列印壁。當使用高黏度塑料如 ABS 時,這有助於提高 X 和 Y " +"的尺寸精度;但是,它可能會降低外表面列印品質,特别是在懸垂部分。" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter label" +msgid "Alternate Extra Wall" +msgstr "交錯額外牆壁" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter description" +msgid "" +"Prints an extra wall at every other layer. This way infill gets caught " +"between these extra walls, resulting in stronger prints." +msgstr "" +"每兩層建立一個額外牆壁,這些額外的牆壁能更緊密地抓填充部分,產生較強壯的模" +"型。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled label" +msgid "Compensate Wall Overlaps" +msgstr "補償牆壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled description" +msgid "" +"Compensate the flow for parts of a wall being printed where there is already " +"a wall in place." +msgstr "彌補牆壁重疊部分的流量。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled label" +msgid "Compensate Outer Wall Overlaps" +msgstr "補償外壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled description" +msgid "" +"Compensate the flow for parts of an outer wall being printed where there is " +"already a wall in place." +msgstr "列印外壁時如果該位置已經有牆壁存在,所進行的的流量補償。" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled label" +msgid "Compensate Inner Wall Overlaps" +msgstr "補償內壁重疊" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled description" +msgid "" +"Compensate the flow for parts of an inner wall being printed where there is " +"already a wall in place." +msgstr "列印內壁時如果該位置已經有牆壁存在,所進行的的流量補償。" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps label" +msgid "Fill Gaps Between Walls" +msgstr "填充牆壁之間空隙" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps description" +msgid "Fills the gaps between walls where no walls fit." +msgstr "填充牆壁之間空隙。" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option nowhere" +msgid "Nowhere" +msgstr "都不填充" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option everywhere" +msgid "Everywhere" +msgstr "全部填充" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps label" +msgid "Print Thin Walls" +msgstr "列印薄壁" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps description" +msgid "" +"Print pieces of the model which are horizontally thinner than the nozzle " +"size." +msgstr "列印在水平面上比噴頭尺寸更薄的模型部件。" + +#: fdmprinter.def.json +msgctxt "xy_offset label" +msgid "Horizontal Expansion" +msgstr "水平擴展" + +#: fdmprinter.def.json +msgctxt "xy_offset description" +msgid "" +"Amount of offset applied to all polygons in each layer. Positive values can " +"compensate for too big holes; negative values can compensate for too small " +"holes." +msgstr "" +"如果模型有挖孔,以便用來組合、鑲嵌時,這個偏移量可以用來微調孔的大小,當設為" +"正值時,模型外擴,孔會變小;若設為負值,模型內縮,孔會變大。" + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 label" +msgid "Initial Layer Horizontal Expansion" +msgstr "起始層水平擴展" + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 description" +msgid "" +"Amount of offset applied to all polygons in the first layer. A negative " +"value can compensate for squishing of the first layer known as \"elephant's " +"foot\"." +msgstr "" +"套用到第一層所有多邊形的偏移量。負數值可以補償第一層的壓扁量(被稱為“象" +"脚”)。" + +#: fdmprinter.def.json +msgctxt "z_seam_type label" +msgid "Z Seam Alignment" +msgstr "Z 接縫對齊" + +#: fdmprinter.def.json +msgctxt "z_seam_type description" +msgid "" +"Starting point of each path in a layer. When paths in consecutive layers " +"start at the same point a vertical seam may show on the print. When aligning " +"these near a user specified location, the seam is easiest to remove. When " +"placed randomly the inaccuracies at the paths' start will be less " +"noticeable. When taking the shortest path the print will be quicker." +msgstr "" +"一層中每條路徑的起點。當連續多層的路徑從相同點開始時,則列印物上會顯示一條垂" +"直縫隙。如果將這些路徑靠近一個使用者指定的位置對齊,則縫隙最容易移除。如果隨" +"機放置,則路徑起點的不精準度將較不明顯。採用最短的路徑時,列印將更為快速。" + +#: fdmprinter.def.json +msgctxt "z_seam_type option back" +msgid "User Specified" +msgstr "使用者指定" + +#: fdmprinter.def.json +msgctxt "z_seam_type option shortest" +msgid "Shortest" +msgstr "最短" + +#: fdmprinter.def.json +msgctxt "z_seam_type option random" +msgid "Random" +msgstr "隨機" + +#: fdmprinter.def.json +msgctxt "z_seam_type option sharpest_corner" +msgid "Sharpest Corner" +msgstr "最尖銳的轉角" + +#: fdmprinter.def.json +msgctxt "z_seam_x label" +msgid "Z Seam X" +msgstr "Z 接縫 X 座標" + +#: fdmprinter.def.json +msgctxt "z_seam_x description" +msgid "" +"The X coordinate of the position near where to start printing each part in a " +"layer." +msgstr "位置的 X 軸座標,在該位置附近開始列印層中各個部分。" + +#: fdmprinter.def.json +msgctxt "z_seam_y label" +msgid "Z Seam Y" +msgstr "Z 接縫 Y 座標" + +#: fdmprinter.def.json +msgctxt "z_seam_y description" +msgid "" +"The Y coordinate of the position near where to start printing each part in a " +"layer." +msgstr "位置的 Y 軸座標,在該位置附近開始列印層中各個部分。" + +#: fdmprinter.def.json +msgctxt "z_seam_corner label" +msgid "Seam Corner Preference" +msgstr "接縫偏好設定" + +#: fdmprinter.def.json +msgctxt "z_seam_corner description" +msgid "" +"Control whether corners on the model outline influence the position of the " +"seam. None means that corners have no influence on the seam position. Hide " +"Seam makes the seam more likely to occur on an inside corner. Expose Seam " +"makes the seam more likely to occur on an outside corner. Hide or Expose " +"Seam makes the seam more likely to occur at an inside or outside corner." +msgstr "" +"控制接縫是否受模型輪廓上的角影響。'無'表示轉角不影響接縫位置。'隱藏接縫'表示" +"使用盡可能使用凹角做為接縫位置。'暴露接縫'表示盡可能使用凸角做為接縫位置。'隱" +"藏或暴露接縫'則同時使用凹角和凸角做為接縫位置。" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_none" +msgid "None" +msgstr "無" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_inner" +msgid "Hide Seam" +msgstr "隱藏接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_outer" +msgid "Expose Seam" +msgstr "暴露接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_any" +msgid "Hide or Expose Seam" +msgstr "隱藏或暴露接縫" + +#: fdmprinter.def.json +msgctxt "z_seam_relative label" +msgid "Z Seam Relative" +msgstr "Z 接縫相對" + +#: fdmprinter.def.json +msgctxt "z_seam_relative description" +msgid "" +"When enabled, the z seam coordinates are relative to each part's centre. " +"When disabled, the coordinates define an absolute position on the build " +"plate." +msgstr "" +"啟用時,Z 接縫座標為相對於各個部分中心的值。關閉時,座標固定在列印平台上的一" +"個絕對位置。" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic label" +msgid "Ignore Small Z Gaps" +msgstr "忽略 Z 方向的小間隙" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic description" +msgid "" +"When the model has small vertical gaps, about 5% extra computation time can " +"be spent on generating top and bottom skin in these narrow spaces. In such " +"case, disable the setting." +msgstr "" +"當模型具有微小的垂直間隙時,為了在這些間隙上產生頂部、底部等表面,會花費大約" +"5%的額外的計算時間。勾選這個項目可以節省時間,但是間隙會消失,若要保留這些間" +"隙,不要勾選這個項目。" + +#: fdmprinter.def.json +msgctxt "skin_outline_count label" +msgid "Extra Skin Wall Count" +msgstr "額外表層牆壁計數" + +#: fdmprinter.def.json +msgctxt "skin_outline_count description" +msgid "" +"Replaces the outermost part of the top/bottom pattern with a number of " +"concentric lines. Using one or two lines improves roofs that start on infill " +"material." +msgstr "" +"用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在" +"填充上的頂板。" + +#: fdmprinter.def.json +msgctxt "infill label" +msgid "Infill" +msgstr "填充" + +#: fdmprinter.def.json +msgctxt "infill description" +msgid "Infill" +msgstr "填充" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr label" +msgid "Infill Extruder" +msgstr "填充擠出機" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr description" +msgid "" +"The extruder train used for printing infill. This is used in multi-extrusion." +msgstr "用於列印填充的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density label" +msgid "Infill Density" +msgstr "填充密度" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density description" +msgid "Adjusts the density of infill of the print." +msgstr "調整列印填充的密度。" + +#: fdmprinter.def.json +msgctxt "infill_line_distance label" +msgid "Infill Line Distance" +msgstr "填充線條距離" + +#: fdmprinter.def.json +msgctxt "infill_line_distance description" +msgid "" +"Distance between the printed infill lines. This setting is calculated by the " +"infill density and the infill line width." +msgstr "列印填充線條之間的距離。該設定是通過填充密度和填充線寬度計算。" + +#: fdmprinter.def.json +msgctxt "infill_pattern label" +msgid "Infill Pattern" +msgstr "填充列印樣式" + +#: fdmprinter.def.json +msgctxt "infill_pattern description" +msgid "" +"The pattern of the infill material of the print. The line and zig zag infill " +"swap direction on alternate layers, reducing material cost. The grid, " +"triangle, cubic, octet, quarter cubic and concentric patterns are fully " +"printed every layer. Cubic, quarter cubic and octet infill change with every " +"layer to provide a more equal distribution of strength over each direction." +msgstr "" +"填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" +"三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" +"分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强度分布。" + +#: fdmprinter.def.json +msgctxt "infill_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "infill_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "infill_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubic" +msgid "Cubic" +msgstr "立方體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubicsubdiv" +msgid "Cubic Subdivision" +msgstr "立方體細分" + +#: fdmprinter.def.json +msgctxt "infill_pattern option tetrahedral" +msgid "Octet" +msgstr "八面體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option quarter_cubic" +msgid "Quarter Cubic" +msgstr "四分立方體" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "立體同心圓" + +#: fdmprinter.def.json +msgctxt "infill_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross" +msgid "Cross" +msgstr "十字形" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross_3d" +msgid "Cross 3D" +msgstr "立體十字形" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill label" +msgid "Connect Infill Lines" +msgstr "連接填充線條" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill description" +msgid "" +"Connect the ends where the infill pattern meets the inner wall using a lines " +"which follows the shape of the inner wall. Enabling this setting can make " +"the infill adhere to the walls better and reduces the effects on infill on " +"the quality of vertical surfaces. Disabling this setting reduces the amount " +"of material used." +msgstr "" +"使用一條線沿著內牆的形狀,連接填充線條與內牆交會的末端。啟用此設定可以使填充" +"更好地附著在內牆上,並減少對垂直表面品質的影響。關閉此設定可降低材料的使用" +"量。" + +#: fdmprinter.def.json +msgctxt "infill_angles label" +msgid "Infill Line Directions" +msgstr "填充線條方向" + +#: fdmprinter.def.json +msgctxt "infill_angles description" +msgid "" +"A list of integer line directions to use. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees for the " +"lines and zig zag patterns and 45 degrees for all other patterns)." +msgstr "" +"要使用的整數線條方向列表。列表中的元素隨層的進度依次使用,當達到列表末尾時," +"它將從頭開始。列表元素以逗號分隔,整個列表包含在方括號中。空的列表代表使用傳" +"統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 " +"度)。" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add label" +msgid "Cubic Subdivision Shell" +msgstr "立方體細分外殼" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add description" +msgid "" +"An addition to the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to a thicker shell of small cubes near the boundary of " +"the model." +msgstr "" +"每個立方體半徑的增加量,用來檢查模型的邊界,決定是否應該細分該立方體。值越" +"大,靠近模型邊界附近的小立方體的殼越厚。" + +#: fdmprinter.def.json +msgctxt "infill_overlap label" +msgid "Infill Overlap Percentage" +msgstr "填充重疊百分比" + +#: fdmprinter.def.json +msgctxt "infill_overlap description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "填充和牆壁之間的重疊量。稍微重疊可讓各個牆壁與填充牢固連接。" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm label" +msgid "Infill Overlap" +msgstr "填充重疊" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "填充和牆壁之間的重疊量。稍微重疊可讓各個壁與填充牢固連接。" + +#: fdmprinter.def.json +msgctxt "skin_overlap label" +msgid "Skin Overlap Percentage" +msgstr "表層重疊百分比" + +#: fdmprinter.def.json +msgctxt "skin_overlap description" +msgid "" +"The amount of overlap between the skin and the walls as a percentage of the " +"line width. A slight overlap allows the walls to connect firmly to the skin. " +"This is a percentage of the average line widths of the skin lines and the " +"innermost wall." +msgstr "" +"表層和牆壁之間的重疊量,以線寬百分比表示。稍微重疊可讓各個牆壁與表層牢固連" +"接。這是表層平均線寬和最內壁的百分比。" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm label" +msgid "Skin Overlap" +msgstr "表層重疊" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "表層和牆壁之間的重疊量。稍微重疊可讓各個牆壁與表層牢固連接。" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist label" +msgid "Infill Wipe Distance" +msgstr "填充擦拭距離" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist description" +msgid "" +"Distance of a travel move inserted after every infill line, to make the " +"infill stick to the walls better. This option is similar to infill overlap, " +"but without extrusion and only on one end of the infill line." +msgstr "" +"每條填充線條後插入的空跑距離,讓填充更好地附著到壁上。此選項與填充重疊類似," +"但没有擠出,且僅位於填充線條的一端。" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness label" +msgid "Infill Layer Thickness" +msgstr "填充層厚度" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness description" +msgid "" +"The thickness per layer of infill material. This value should always be a " +"multiple of the layer height and is otherwise rounded." +msgstr "每層填充的厚度。此值應該是層高度的倍數,並且否則會四捨五入。" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps label" +msgid "Gradual Infill Steps" +msgstr "漸進填充步階數" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps description" +msgid "" +"Number of times to reduce the infill density by half when getting further " +"below top surfaces. Areas which are closer to top surfaces get a higher " +"density, up to the Infill Density." +msgstr "" +"由模型頂部往下,填充密度減半的次數。愈接近頂部的填充密度愈高,直到所設定的填" +"充密度。" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height label" +msgid "Gradual Infill Step Height" +msgstr "漸進填充步階高度" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height description" +msgid "" +"The height of infill of a given density before switching to half the density." +msgstr "減半填充密度的高度。" + +#: fdmprinter.def.json +msgctxt "infill_before_walls label" +msgid "Infill Before Walls" +msgstr "先印填充再印牆壁" + +#: fdmprinter.def.json +msgctxt "infill_before_walls description" +msgid "" +"Print the infill before printing the walls. Printing the walls first may " +"lead to more accurate walls, but overhangs print worse. Printing the infill " +"first leads to sturdier walls, but the infill pattern might sometimes show " +"through the surface." +msgstr "" +"列印牆壁前先列印填充。先列印牆壁可以產生更精確的牆壁,但懸垂列印品質會較差。" +"先列印填充會產生更牢固的牆壁,但有時候填充的列印樣式會透過表面顯現出來。" + +#: fdmprinter.def.json +msgctxt "min_infill_area label" +msgid "Minimum Infill Area" +msgstr "最小填充區域" + +#: fdmprinter.def.json +msgctxt "min_infill_area description" +msgid "Don't generate areas of infill smaller than this (use skin instead)." +msgstr "不要產生小於此面積的填充區域(使用表層取代)。" + +#: fdmprinter.def.json +msgctxt "skin_preshrink label" +msgid "Skin Removal Width" +msgstr "表層移除寬度" + +#: fdmprinter.def.json +msgctxt "skin_preshrink description" +msgid "" +"The largest width of skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top/bottom skin at slanted surfaces " +"in the model." +msgstr "" +"要移除表層區域的最大寬度。寬度小於此值的表層區域將會消失。這有助於減少在列印" +"模型傾斜的頂部表層和底部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink label" +msgid "Top Skin Removal Width" +msgstr "頂部表層移除寬度" + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink description" +msgid "" +"The largest width of top skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top skin at slanted surfaces in the " +"model." +msgstr "" +"要移除頂部表層區域的最大寬度。寬度小於此值的頂部表層區域將會消失。這有助於減" +"少在列印模型傾斜的頂部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink label" +msgid "Bottom Skin Removal Width" +msgstr "底部表層移除寬度" + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink description" +msgid "" +"The largest width of bottom skin areas which are to be removed. Every skin " +"area smaller than this value will disappear. This can help in limiting the " +"amount of time and material spent on printing bottom skin at slanted " +"surfaces in the model." +msgstr "" +"要移除底部表層區域的最大寬度。寬度小於此值的底部表層區域將會消失。這有助於減" +"少在列印模型傾斜的底部表層所花費的時間和耗材。" + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance label" +msgid "Skin Expand Distance" +msgstr "表層延伸距離" + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance description" +msgid "" +"The distance the skins are expanded into the infill. Higher values makes the " +"skin attach better to the infill pattern and makes the walls on neighboring " +"layers adhere better to the skin. Lower values save amount of material used." +msgstr "" +"表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使相鄰層的牆壁與表" +"層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance label" +msgid "Top Skin Expand Distance" +msgstr "頂部表層延伸距離" + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance description" +msgid "" +"The distance the top skins are expanded into the infill. Higher values makes " +"the skin attach better to the infill pattern and makes the walls on the " +"layer above adhere better to the skin. Lower values save amount of material " +"used." +msgstr "" +"頂部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使上方的牆壁與" +"表層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance label" +msgid "Bottom Skin Expand Distance" +msgstr "底部表層延伸距離" + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance description" +msgid "" +"The distance the bottom skins are expanded into the infill. Higher values " +"makes the skin attach better to the infill pattern and makes the skin adhere " +"better to the walls on the layer below. Lower values save amount of material " +"used." +msgstr "" +"底部表層延伸進入填充的距離。值愈高表層與填充之間的附著愈好,並使下方的牆壁與" +"表層黏得更緊。而較低的值可以節省耗材的使用。" + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion label" +msgid "Maximum Skin Angle for Expansion" +msgstr "最大延伸表層角度" + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion description" +msgid "" +"Top and/or bottom surfaces of your object with an angle larger than this " +"setting, won't have their top/bottom skin expanded. This avoids expanding " +"the narrow skin areas that are created when the model surface has a near " +"vertical slope. An angle of 0° is horizontal, while an angle of 90° is " +"vertical." +msgstr "" +"如果模型的頂部和/或底部表面的角度大於此設定,則不要延伸其頂部/底部表層。這會" +"避免延伸作用在模型表面有接近垂直的斜面時所形成的狹窄表層區域。0° 的角為水平," +"90° 的角為垂直。" + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion label" +msgid "Minimum Skin Width for Expansion" +msgstr "最小延伸表層寬度" + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion description" +msgid "" +"Skin areas narrower than this are not expanded. This avoids expanding the " +"narrow skin areas that are created when the model surface has a slope close " +"to the vertical." +msgstr "" +"如果表層區域寬度小於此值,則不會延伸。這會避免延伸在模型表面的斜度接近垂直時" +"所形成的狹窄表層區域。" + +#: fdmprinter.def.json +msgctxt "material label" +msgid "Material" +msgstr "耗材" + +#: fdmprinter.def.json +msgctxt "material description" +msgid "Material" +msgstr "耗材" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "自動溫度" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature description" +msgid "" +"Change the temperature for each layer automatically with the average flow " +"speed of that layer." +msgstr "根據每一層的平均流速自動更改每層的溫度。" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature label" +msgid "Default Printing Temperature" +msgstr "預設列印溫度" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature description" +msgid "" +"The default temperature used for printing. This should be the \"base\" " +"temperature of a material. All other print temperatures should use offsets " +"based on this value" +msgstr "" +"用於列印的預設溫度。應為耗材的\"基本\"溫度。所有其他列印溫度均應使用基於此值" +"的偏移量" + +#: fdmprinter.def.json +msgctxt "material_print_temperature label" +msgid "Printing Temperature" +msgstr "列印溫度" + +#: fdmprinter.def.json +msgctxt "material_print_temperature description" +msgid "The temperature used for printing." +msgstr "用於列印的溫度。" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 label" +msgid "Printing Temperature Initial Layer" +msgstr "列印溫度起始層" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 description" +msgid "" +"The temperature used for printing the first layer. Set at 0 to disable " +"special handling of the initial layer." +msgstr "用於列印第一層的溫度。設為 0 即關閉對起始層的特别處理。" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature label" +msgid "Initial Printing Temperature" +msgstr "起始列印溫度" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature description" +msgid "" +"The minimal temperature while heating up to the Printing Temperature at " +"which printing can already start." +msgstr "加熱到可以開始列印的列印溫度時的最低溫度。" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature label" +msgid "Final Printing Temperature" +msgstr "最終列印溫度" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature description" +msgid "" +"The temperature to which to already start cooling down just before the end " +"of printing." +msgstr "列印結束前開始冷卻的溫度。" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "流量溫度圖" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "數據連接耗材流量(mm3/s)到溫度(攝氏)。" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed label" +msgid "Extrusion Cool Down Speed Modifier" +msgstr "擠出降溫速度修正" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed description" +msgid "" +"The extra speed by which the nozzle cools while extruding. The same value is " +"used to signify the heat up speed lost when heating up while extruding." +msgstr "" +"解決在擠料的同時因為噴頭冷卻所造成的影響的額外速度修正。相同的值被用於表示在" +"擠壓時所失去的升溫速度。" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature label" +msgid "Build Plate Temperature" +msgstr "列印平台溫度" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature description" +msgid "" +"The temperature used for the heated build plate. If this is 0, the bed will " +"not heat up for this print." +msgstr "" +"用於加熱列印平台的溫度。如果列印平台溫度為 0,則熱床將不會為此次列印加熱。" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 label" +msgid "Build Plate Temperature Initial Layer" +msgstr "列印平台溫度起始層" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 description" +msgid "The temperature used for the heated build plate at the first layer." +msgstr "用於第一層加熱列印平台的溫度。" + +#: fdmprinter.def.json +msgctxt "material_diameter label" +msgid "Diameter" +msgstr "直徑" + +#: fdmprinter.def.json +msgctxt "material_diameter description" +msgid "" +"Adjusts the diameter of the filament used. Match this value with the " +"diameter of the used filament." +msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" + +#: fdmprinter.def.json +msgctxt "material_flow label" +msgid "Flow" +msgstr "流量" + +#: fdmprinter.def.json +msgctxt "material_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "流量補償:擠出的耗材量乘以此值。" + +#: fdmprinter.def.json +msgctxt "retraction_enable label" +msgid "Enable Retraction" +msgstr "啟用回抽" + +#: fdmprinter.def.json +msgctxt "retraction_enable description" +msgid "" +"Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "當噴頭移動到非列印區域上方時回抽耗材。" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change label" +msgid "Retract at Layer Change" +msgstr "列印下一層時回抽" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change description" +msgid "Retract the filament when the nozzle is moving to the next layer." +msgstr "當噴頭移動到下一層時回抽耗材。" + +#: fdmprinter.def.json +msgctxt "retraction_amount label" +msgid "Retraction Distance" +msgstr "回抽距離" + +#: fdmprinter.def.json +msgctxt "retraction_amount description" +msgid "The length of material retracted during a retraction move." +msgstr "回抽移動期間回抽的耗材長度。" + +#: fdmprinter.def.json +msgctxt "retraction_speed label" +msgid "Retraction Speed" +msgstr "回抽速度" + +#: fdmprinter.def.json +msgctxt "retraction_speed description" +msgid "" +"The speed at which the filament is retracted and primed during a retraction " +"move." +msgstr "回抽移動期間耗材回抽和裝填的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed label" +msgid "Retraction Retract Speed" +msgstr "回抽速度" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed description" +msgid "The speed at which the filament is retracted during a retraction move." +msgstr "回抽移動期間耗材回抽的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed label" +msgid "Retraction Prime Speed" +msgstr "回抽裝填速度" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed description" +msgid "The speed at which the filament is primed during a retraction move." +msgstr "回抽移動期間耗材裝填的速度。" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount label" +msgid "Retraction Extra Prime Amount" +msgstr "回抽額外裝填量" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount description" +msgid "" +"Some material can ooze away during a travel move, which can be compensated " +"for here." +msgstr "有些耗材可能會在空跑過程中滲出,可以在這裡對其進行補償。" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel label" +msgid "Retraction Minimum Travel" +msgstr "回抽最小空跑距離" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel description" +msgid "" +"The minimum distance of travel needed for a retraction to happen at all. " +"This helps to get fewer retractions in a small area." +msgstr "觸發回抽所需的最小空跑距離。這有助於減少小區域內的回抽次數。" + +#: fdmprinter.def.json +msgctxt "retraction_count_max label" +msgid "Maximum Retraction Count" +msgstr "最大回抽次數" + +#: fdmprinter.def.json +msgctxt "retraction_count_max description" +msgid "" +"This setting limits the number of retractions occurring within the minimum " +"extrusion distance window. Further retractions within this window will be " +"ignored. This avoids retracting repeatedly on the same piece of filament, as " +"that can flatten the filament and cause grinding issues." +msgstr "" +"此設定限制在最小擠出距離範圍內發生的回抽數。此範圍內的額外回抽將會忽略。這避" +"免了在同一件耗材上重複回抽,從而導致耗材變扁並引起磨損問題。" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window label" +msgid "Minimum Extrusion Distance Window" +msgstr "最小擠出距離範圍" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window description" +msgid "" +"The window in which the maximum retraction count is enforced. This value " +"should be approximately the same as the retraction distance, so that " +"effectively the number of times a retraction passes the same patch of " +"material is limited." +msgstr "" +"最大回抽次數範圍。此值應大致與回抽距離相等,從而有效地限制在同一段耗材上的回" +"抽次數。" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature label" +msgid "Standby Temperature" +msgstr "待機溫度" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature description" +msgid "" +"The temperature of the nozzle when another nozzle is currently used for " +"printing." +msgstr "當另一個噴頭進行列印時,這個噴頭要保持的溫度。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount label" +msgid "Nozzle Switch Retraction Distance" +msgstr "噴頭切換回抽距離" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount description" +msgid "" +"The amount of retraction: Set at 0 for no retraction at all. This should " +"generally be the same as the length of the heat zone." +msgstr "回抽量:設為 0,不進行任何回抽。該值通常應與加熱區的長度相同。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds label" +msgid "Nozzle Switch Retraction Speed" +msgstr "噴頭切換回抽速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds description" +msgid "" +"The speed at which the filament is retracted. A higher retraction speed " +"works better, but a very high retraction speed can lead to filament grinding." +msgstr "" +"回抽耗材的速度。較高的回抽速度效果較好,但回抽速度過高可能導致耗材磨損。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed label" +msgid "Nozzle Switch Retract Speed" +msgstr "噴頭切換回抽速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed description" +msgid "" +"The speed at which the filament is retracted during a nozzle switch retract." +msgstr "噴頭切換回抽期間耗材回抽的速度。" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed label" +msgid "Nozzle Switch Prime Speed" +msgstr "噴頭切換裝填速度" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed description" +msgid "" +"The speed at which the filament is pushed back after a nozzle switch " +"retraction." +msgstr "噴頭切換回抽後耗材被推回的速度。" + +#: fdmprinter.def.json +msgctxt "speed label" +msgid "Speed" +msgstr "速度" + +#: fdmprinter.def.json +msgctxt "speed description" +msgid "Speed" +msgstr "速度" + +#: fdmprinter.def.json +msgctxt "speed_print label" +msgid "Print Speed" +msgstr "列印速度" + +#: fdmprinter.def.json +msgctxt "speed_print description" +msgid "The speed at which printing happens." +msgstr "開始列印的速度。" + +#: fdmprinter.def.json +msgctxt "speed_infill label" +msgid "Infill Speed" +msgstr "填充速度" + +#: fdmprinter.def.json +msgctxt "speed_infill description" +msgid "The speed at which infill is printed." +msgstr "列印填充的速度。" + +#: fdmprinter.def.json +msgctxt "speed_wall label" +msgid "Wall Speed" +msgstr "牆壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall description" +msgid "The speed at which the walls are printed." +msgstr "列印牆壁的速度。" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 label" +msgid "Outer Wall Speed" +msgstr "外壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 description" +msgid "" +"The speed at which the outermost walls are printed. Printing the outer wall " +"at a lower speed improves the final skin quality. However, having a large " +"difference between the inner wall speed and the outer wall speed will affect " +"quality in a negative way." +msgstr "" +"列印最外壁的速度。以較低速度列印外壁可改善最終表層品質。但是,如果內壁速度和" +"外壁速度差距過大,則將對品質產生負面影響。" + +#: fdmprinter.def.json +msgctxt "speed_wall_x label" +msgid "Inner Wall Speed" +msgstr "內壁速度" + +#: fdmprinter.def.json +msgctxt "speed_wall_x description" +msgid "" +"The speed at which all inner walls are printed. Printing the inner wall " +"faster than the outer wall will reduce printing time. It works well to set " +"this in between the outer wall speed and the infill speed." +msgstr "" +"列印所有內壁的速度。以比外壁更快的速度列印內壁將減少列印時間。將該值設為外壁" +"速度和填充速度之間也可行。" + +#: fdmprinter.def.json +msgctxt "speed_roofing label" +msgid "Top Surface Skin Speed" +msgstr "頂部表層速度" + +#: fdmprinter.def.json +msgctxt "speed_roofing description" +msgid "The speed at which top surface skin layers are printed." +msgstr "列印頂部表層的速度。" + +#: fdmprinter.def.json +msgctxt "speed_topbottom label" +msgid "Top/Bottom Speed" +msgstr "頂部/底部速度" + +#: fdmprinter.def.json +msgctxt "speed_topbottom description" +msgid "The speed at which top/bottom layers are printed." +msgstr "列印頂部/底部層的速度。" + +#: fdmprinter.def.json +msgctxt "speed_support label" +msgid "Support Speed" +msgstr "支撐速度" + +#: fdmprinter.def.json +msgctxt "speed_support description" +msgid "" +"The speed at which the support structure is printed. Printing support at " +"higher speeds can greatly reduce printing time. The surface quality of the " +"support structure is not important since it is removed after printing." +msgstr "" +"在列印支撐結構時的速度。以更高的速度列印支撐可以大大減少列印時間。因為支撐在" +"列印後會被清除,所以表面品質並不重要。" + +#: fdmprinter.def.json +msgctxt "speed_support_infill label" +msgid "Support Infill Speed" +msgstr "支撐填充速度" + +#: fdmprinter.def.json +msgctxt "speed_support_infill description" +msgid "" +"The speed at which the infill of support is printed. Printing the infill at " +"lower speeds improves stability." +msgstr "列印支撐填充的速度。以較低的速度列印填充可改善穩定性。" + +#: fdmprinter.def.json +msgctxt "speed_support_interface label" +msgid "Support Interface Speed" +msgstr "支撐介面速度" + +#: fdmprinter.def.json +msgctxt "speed_support_interface description" +msgid "" +"The speed at which the roofs and floors of support are printed. Printing " +"them at lower speeds can improve overhang quality." +msgstr "列印支撐頂板和底板的速度。以較低的速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "speed_support_roof label" +msgid "Support Roof Speed" +msgstr "支撐頂板速度" + +#: fdmprinter.def.json +msgctxt "speed_support_roof description" +msgid "" +"The speed at which the roofs of support are printed. Printing them at lower " +"speeds can improve overhang quality." +msgstr "列印支撐頂板的速度。以較低的速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "speed_support_bottom label" +msgid "Support Floor Speed" +msgstr "支撐底板速度" + +#: fdmprinter.def.json +msgctxt "speed_support_bottom description" +msgid "" +"The speed at which the floor of support is printed. Printing it at lower " +"speed can improve adhesion of support on top of your model." +msgstr "列印支撐底板的速度。以較低的速度列印可以改善支撐在模型頂部的附著。" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower label" +msgid "Prime Tower Speed" +msgstr "換料塔速度" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower description" +msgid "" +"The speed at which the prime tower is printed. Printing the prime tower " +"slower can make it more stable when the adhesion between the different " +"filaments is suboptimal." +msgstr "" +"列印換料塔的速度。當不同耗材之間的黏合力不佳時,較慢地列印速度可以讓它更穩" +"定。" + +#: fdmprinter.def.json +msgctxt "speed_travel label" +msgid "Travel Speed" +msgstr "空跑速度" + +#: fdmprinter.def.json +msgctxt "speed_travel description" +msgid "The speed at which travel moves are made." +msgstr "噴頭在非列印時的移動速度。" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 label" +msgid "Initial Layer Speed" +msgstr "起始層速度" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 description" +msgid "" +"The speed for the initial layer. A lower value is advised to improve " +"adhesion to the build plate." +msgstr "起始層的速度。建議採用較低的值以便改善與列印平台的附著。" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 label" +msgid "Initial Layer Print Speed" +msgstr "起始層列印速度" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 description" +msgid "" +"The speed of printing for the initial layer. A lower value is advised to " +"improve adhesion to the build plate." +msgstr "列印起始層的速度。建議採用較低的值以便改善與列印平台的附著。" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 label" +msgid "Initial Layer Travel Speed" +msgstr "起始層空跑速度" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 description" +msgid "" +"The speed of travel moves in the initial layer. A lower value is advised to " +"prevent pulling previously printed parts away from the build plate. The " +"value of this setting can automatically be calculated from the ratio between " +"the Travel Speed and the Print Speed." +msgstr "" +"起始層中的空跑速度。建議採用較低的值,以防止將之前列印的部分從列印平台上拉" +"離。該設定的值可以根據空跑速度和列印速度的比率自動計算得出。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed label" +msgid "Skirt/Brim Speed" +msgstr "外圍/邊緣速度" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed description" +msgid "" +"The speed at which the skirt and brim are printed. Normally this is done at " +"the initial layer speed, but sometimes you might want to print the skirt or " +"brim at a different speed." +msgstr "" +"列印外圍和邊緣的速度。一般情况是以起始層速度列印這些部分,但有時候你可能想要" +"以不同速度來列印外圍或邊緣。" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override label" +msgid "Maximum Z Speed" +msgstr "最大 Z 軸速度" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override description" +msgid "" +"The maximum speed with which the build plate is moved. Setting this to zero " +"causes the print to use the firmware defaults for the maximum z speed." +msgstr "" +"列印平台移動的最大速度。將該值設為零會使列印為最大 Z 速度採用韌體預設值。" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers label" +msgid "Number of Slower Layers" +msgstr "慢速列印層數" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers description" +msgid "" +"The first few layers are printed slower than the rest of the model, to get " +"better adhesion to the build plate and improve the overall success rate of " +"prints. The speed is gradually increased over these layers." +msgstr "" +"前幾層的列印速度比模型的其他層慢,以便實現與列印平台的更好附著,並改善整體的" +"列印成功率。該速度在這些層中會逐漸增加。" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled label" +msgid "Equalize Filament Flow" +msgstr "均衡耗材流量" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled description" +msgid "" +"Print thinner than normal lines faster so that the amount of material " +"extruded per second remains the same. Thin pieces in your model might " +"require lines printed with smaller line width than provided in the settings. " +"This setting controls the speed changes for such lines." +msgstr "" +"以較快的速度列印比正常線條更細的線條,使每秒擠出的耗材量保持相同。模型中較薄" +"的部分可能需要以低於設定中所提供寬度的線寬來列印線條。該設定控制這些線條的速" +"度變化。" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max label" +msgid "Maximum Speed for Flow Equalization" +msgstr "流量均衡的最大速度" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max description" +msgid "" +"Maximum print speed when adjusting the print speed in order to equalize flow." +msgstr "調整列印速度以便均衡流量時的最大列印速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled label" +msgid "Enable Acceleration Control" +msgstr "啟用加速度控制" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled description" +msgid "" +"Enables adjusting the print head acceleration. Increasing the accelerations " +"can reduce printing time at the cost of print quality." +msgstr "啟用調整噴頭的加速度。增加加速度可以減少列印時間卻會犧牲列印品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_print label" +msgid "Print Acceleration" +msgstr "列印加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_print description" +msgid "The acceleration with which printing happens." +msgstr "列印發生的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_infill label" +msgid "Infill Acceleration" +msgstr "填充加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_infill description" +msgid "The acceleration with which infill is printed." +msgstr "列印填充的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall label" +msgid "Wall Acceleration" +msgstr "牆壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall description" +msgid "The acceleration with which the walls are printed." +msgstr "列印牆壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 label" +msgid "Outer Wall Acceleration" +msgstr "外壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 description" +msgid "The acceleration with which the outermost walls are printed." +msgstr "列印最外壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x label" +msgid "Inner Wall Acceleration" +msgstr "內壁加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x description" +msgid "The acceleration with which all inner walls are printed." +msgstr "列印所有內壁的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_roofing label" +msgid "Top Surface Skin Acceleration" +msgstr "頂部表層加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_roofing description" +msgid "The acceleration with which top surface skin layers are printed." +msgstr "列印頂部表層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom label" +msgid "Top/Bottom Acceleration" +msgstr "頂部/底部加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom description" +msgid "The acceleration with which top/bottom layers are printed." +msgstr "列印頂部/底部層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support label" +msgid "Support Acceleration" +msgstr "支撐加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support description" +msgid "The acceleration with which the support structure is printed." +msgstr "列印支撐的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill label" +msgid "Support Infill Acceleration" +msgstr "支撐填充加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill description" +msgid "The acceleration with which the infill of support is printed." +msgstr "列印支撐填充的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface label" +msgid "Support Interface Acceleration" +msgstr "支撐介面加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface description" +msgid "" +"The acceleration with which the roofs and floors of support are printed. " +"Printing them at lower acceleration can improve overhang quality." +msgstr "列印支撐頂板和底板的加速度。以較低的加速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof label" +msgid "Support Roof Acceleration" +msgstr "支撐頂板加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof description" +msgid "" +"The acceleration with which the roofs of support are printed. Printing them " +"at lower acceleration can improve overhang quality." +msgstr "列印支撐頂板的加速度。以較低的加速度列印可以改善懸垂品質。" + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom label" +msgid "Support Floor Acceleration" +msgstr "支撐底板加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom description" +msgid "" +"The acceleration with which the floors of support are printed. Printing them " +"at lower acceleration can improve adhesion of support on top of your model." +msgstr "列印支撐底板的加速度。以較低的加速度列印可以改善支撐在模型頂部的附著。" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower label" +msgid "Prime Tower Acceleration" +msgstr "換料塔加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower description" +msgid "The acceleration with which the prime tower is printed." +msgstr "列印換料塔的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_travel label" +msgid "Travel Acceleration" +msgstr "空跑加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_travel description" +msgid "The acceleration with which travel moves are made." +msgstr "進行空跑的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 label" +msgid "Initial Layer Acceleration" +msgstr "起始層加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 description" +msgid "The acceleration for the initial layer." +msgstr "起始層的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 label" +msgid "Initial Layer Print Acceleration" +msgstr "起始層列印加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 description" +msgid "The acceleration during the printing of the initial layer." +msgstr "列印起始層時的加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 label" +msgid "Initial Layer Travel Acceleration" +msgstr "起始層空跑加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "起始層中的空跑加速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim label" +msgid "Skirt/Brim Acceleration" +msgstr "外圍/邊緣加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim description" +msgid "" +"The acceleration with which the skirt and brim are printed. Normally this is " +"done with the initial layer acceleration, but sometimes you might want to " +"print the skirt or brim at a different acceleration." +msgstr "" +"列印外圍和邊緣的加速度。一般情况是以起始層加速度列印這些部分,但有時候你可能" +"想要以不同加速度來列印外圍或邊緣。" + +#: fdmprinter.def.json +msgctxt "jerk_enabled label" +msgid "Enable Jerk Control" +msgstr "啟用加加速度控制" + +#: fdmprinter.def.json +msgctxt "jerk_enabled description" +msgid "" +"Enables adjusting the jerk of print head when the velocity in the X or Y " +"axis changes. Increasing the jerk can reduce printing time at the cost of " +"print quality." +msgstr "" +"啟用當 X 或 Y 軸的速度變化時調整列印頭的加加速度。提高加加速度可以通過以列印" +"品質為代價來縮短列印時間。" + +#: fdmprinter.def.json +msgctxt "jerk_print label" +msgid "Print Jerk" +msgstr "列印加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_print description" +msgid "The maximum instantaneous velocity change of the print head." +msgstr "列印頭的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_infill label" +msgid "Infill Jerk" +msgstr "填充加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_infill description" +msgid "The maximum instantaneous velocity change with which infill is printed." +msgstr "列印填充時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall label" +msgid "Wall Jerk" +msgstr "牆壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall description" +msgid "" +"The maximum instantaneous velocity change with which the walls are printed." +msgstr "列印牆壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 label" +msgid "Outer Wall Jerk" +msgstr "外壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 description" +msgid "" +"The maximum instantaneous velocity change with which the outermost walls are " +"printed." +msgstr "列印最外壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x label" +msgid "Inner Wall Jerk" +msgstr "內壁加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x description" +msgid "" +"The maximum instantaneous velocity change with which all inner walls are " +"printed." +msgstr "列印所有內壁時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_roofing label" +msgid "Top Surface Skin Jerk" +msgstr "頂部表層加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_roofing description" +msgid "" +"The maximum instantaneous velocity change with which top surface skin layers " +"are printed." +msgstr "列印頂部表層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom label" +msgid "Top/Bottom Jerk" +msgstr "頂部/底部加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom description" +msgid "" +"The maximum instantaneous velocity change with which top/bottom layers are " +"printed." +msgstr "列印頂部/底部層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support label" +msgid "Support Jerk" +msgstr "支撐加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support description" +msgid "" +"The maximum instantaneous velocity change with which the support structure " +"is printed." +msgstr "列印支撐結構時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill label" +msgid "Support Infill Jerk" +msgstr "支撐填充加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill description" +msgid "" +"The maximum instantaneous velocity change with which the infill of support " +"is printed." +msgstr "列印支撐填充時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface label" +msgid "Support Interface Jerk" +msgstr "支撐介面加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface description" +msgid "" +"The maximum instantaneous velocity change with which the roofs and floors of " +"support are printed." +msgstr "列印支撐頂板和底板的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_roof label" +msgid "Support Roof Jerk" +msgstr "支撐頂板加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_roof description" +msgid "" +"The maximum instantaneous velocity change with which the roofs of support " +"are printed." +msgstr "列印支撐頂板的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom label" +msgid "Support Floor Jerk" +msgstr "支撐底板加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom description" +msgid "" +"The maximum instantaneous velocity change with which the floors of support " +"are printed." +msgstr "列印支撐底板時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower label" +msgid "Prime Tower Jerk" +msgstr "換料塔加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower description" +msgid "" +"The maximum instantaneous velocity change with which the prime tower is " +"printed." +msgstr "列印換料塔時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_travel label" +msgid "Travel Jerk" +msgstr "空跑加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_travel description" +msgid "" +"The maximum instantaneous velocity change with which travel moves are made." +msgstr "進行空跑時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 label" +msgid "Initial Layer Jerk" +msgstr "起始層加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 description" +msgid "The print maximum instantaneous velocity change for the initial layer." +msgstr "起始層的列印最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 label" +msgid "Initial Layer Print Jerk" +msgstr "起始層列印加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 description" +msgid "" +"The maximum instantaneous velocity change during the printing of the initial " +"layer." +msgstr "列印起始層時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 label" +msgid "Initial Layer Travel Jerk" +msgstr "起始層空跑加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "起始層中的空跑加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim label" +msgid "Skirt/Brim Jerk" +msgstr "外圍/邊緣加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim description" +msgid "" +"The maximum instantaneous velocity change with which the skirt and brim are " +"printed." +msgstr "列印外圍和邊緣時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "travel label" +msgid "Travel" +msgstr "空跑" + +#: fdmprinter.def.json +msgctxt "travel description" +msgid "travel" +msgstr "空跑" + +#: fdmprinter.def.json +msgctxt "retraction_combing label" +msgid "Combing Mode" +msgstr "梳理模式" + +#: fdmprinter.def.json +msgctxt "retraction_combing description" +msgid "" +"Combing keeps the nozzle within already printed areas when traveling. This " +"results in slightly longer travel moves but reduces the need for " +"retractions. If combing is off, the material will retract and the nozzle " +"moves in a straight line to the next point. It is also possible to avoid " +"combing over top/bottom skin areas by combing within the infill only." +msgstr "" +"梳理可在空跑時讓噴頭保持在已列印區域內。這會使空跑距離稍微延長,但可減少回抽" +"需求。如果關閉梳理,則耗材將回抽,且噴頭沿著直線移動到下一個點。也可以通過僅" +"在填充內進行梳理避免梳理頂部/底部表層區域。" + +#: fdmprinter.def.json +msgctxt "retraction_combing option off" +msgid "Off" +msgstr "關" + +#: fdmprinter.def.json +msgctxt "retraction_combing option all" +msgid "All" +msgstr "所有" + +#: fdmprinter.def.json +msgctxt "retraction_combing option noskin" +msgid "No Skin" +msgstr "表層除外" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall label" +msgid "Retract Before Outer Wall" +msgstr "列印外壁前先進行回抽" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall description" +msgid "Always retract when moving to start an outer wall." +msgstr "當移動到外牆起始點時總是進行回抽。" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts label" +msgid "Avoid Printed Parts When Traveling" +msgstr "空跑時避開已列印部分" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts description" +msgid "" +"The nozzle avoids already printed parts when traveling. This option is only " +"available when combing is enabled." +msgstr "噴頭會在空跑時避開已列印的部分。此選項僅在啟用梳理功能時可用。" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance label" +msgid "Travel Avoid Distance" +msgstr "空跑避開距離" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance description" +msgid "" +"The distance between the nozzle and already printed parts when avoiding " +"during travel moves." +msgstr "噴頭和已列印部分之間在空跑時避開的距離。" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position label" +msgid "Start Layers with the Same Part" +msgstr "在相同的位置列印新層" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position description" +msgid "" +"In each layer start with printing the object near the same point, so that we " +"don't start a new layer with printing the piece which the previous layer " +"ended with. This makes for better overhangs and small parts, but increases " +"printing time." +msgstr "" +"每一層都在相同點附近開始列印,這樣在列印新的一層時,就不需要列印前一層結束時" +"的那一小段區域。在懸垂部分和小零件有良好的效果,但會增加列印時間。" + +#: fdmprinter.def.json +msgctxt "layer_start_x label" +msgid "Layer Start X" +msgstr "每層列印起始點的 X 座標" + +#: fdmprinter.def.json +msgctxt "layer_start_x description" +msgid "" +"The X coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "每一層列印起始點附近位置的 X 坐標。" + +#: fdmprinter.def.json +msgctxt "layer_start_y label" +msgid "Layer Start Y" +msgstr "每層列印起始點的 Y 座標" + +#: fdmprinter.def.json +msgctxt "layer_start_y description" +msgid "" +"The Y coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "每一層列印起始點附近位置的 Y 坐標。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled label" +msgid "Z Hop When Retracted" +msgstr "回抽時 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled description" +msgid "" +"Whenever a retraction is done, the build plate is lowered to create " +"clearance between the nozzle and the print. It prevents the nozzle from " +"hitting the print during travel moves, reducing the chance to knock the " +"print from the build plate." +msgstr "" +"每當回抽完成時,列印平台會降低以便在噴頭和列印品之間形成空隙。它可以防止噴頭" +"在空跑過程中撞到列印品,降低將列印品從列印平台撞掉的幾率。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides label" +msgid "Z Hop Only Over Printed Parts" +msgstr "僅在已列印部分上 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides description" +msgid "" +"Only perform a Z Hop when moving over printed parts which cannot be avoided " +"by horizontal motion by Avoid Printed Parts when Traveling." +msgstr "" +"僅在移動到無法通過“空跑時避開已列印部分”選項的水平操作避開的已列印部分上方時" +"執行 Z 抬升。" + +#: fdmprinter.def.json +msgctxt "retraction_hop label" +msgid "Z Hop Height" +msgstr "Z 抬升高度" + +#: fdmprinter.def.json +msgctxt "retraction_hop description" +msgid "The height difference when performing a Z Hop." +msgstr "執行 Z 抬升的高度差。" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch label" +msgid "Z Hop After Extruder Switch" +msgstr "擠出機切換後的 Z 抬升" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch description" +msgid "" +"After the machine switched from one extruder to the other, the build plate " +"is lowered to create clearance between the nozzle and the print. This " +"prevents the nozzle from leaving oozed material on the outside of a print." +msgstr "" +"當機器從一個擠出機切換到另一個時,列印平台會降低以便在噴頭和列印品之間形成空" +"隙。這將防止噴頭在列印品外部留下滲出物。" + +#: fdmprinter.def.json +msgctxt "cooling label" +msgid "Cooling" +msgstr "冷卻" + +#: fdmprinter.def.json +msgctxt "cooling description" +msgid "Cooling" +msgstr "冷卻" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled label" +msgid "Enable Print Cooling" +msgstr "開啟列印冷卻" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled description" +msgid "" +"Enables the print cooling fans while printing. The fans improve print " +"quality on layers with short layer times and bridging / overhangs." +msgstr "" +"列印時啟用列印冷卻風扇。風扇可以在列印時間較短的層和橋接/懸垂結構提高列印品" +"質。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed label" +msgid "Fan Speed" +msgstr "風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed description" +msgid "The speed at which the print cooling fans spin." +msgstr "列印冷卻風扇旋轉的速度。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min label" +msgid "Regular Fan Speed" +msgstr "標準風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min description" +msgid "" +"The speed at which the fans spin before hitting the threshold. When a layer " +"prints faster than the threshold, the fan speed gradually inclines towards " +"the maximum fan speed." +msgstr "" +"在單層列印時間大於門檻值時,風扇運轉的速度。當單層列印時間小於門檻值時,系統" +"會根據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但" +"不會超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max label" +msgid "Maximum Fan Speed" +msgstr "最大風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max description" +msgid "" +"The speed at which the fans spin on the minimum layer time. The fan speed " +"gradually increases between the regular fan speed and maximum fan speed when " +"the threshold is hit." +msgstr "" +"在“最短單層列印時間”時,風扇運轉的速度。當單層列印時間小於門檻值時,系統會根" +"據單層列印時間決定使用的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會" +"超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max label" +msgid "Regular/Maximum Fan Speed Threshold" +msgstr "標準風扇轉速門檻值" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max description" +msgid "" +"The layer time which sets the threshold between regular fan speed and " +"maximum fan speed. Layers that print slower than this time use regular fan " +"speed. For faster layers the fan speed gradually increases towards the " +"maximum fan speed." +msgstr "" +"使用標準風扇轉速的單層列印時間門檻值。如果單層列印時間大於這個門檻值,就使用" +"標準風扇轉速。如果單層列印時間比這個門檻值短,系統會根據單層列印時間決定使用" +"的風扇轉速。列印時間愈短,所使用的風扇轉速愈快,但不會超過最大風扇轉速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 label" +msgid "Initial Fan Speed" +msgstr "起始層風扇轉速" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 description" +msgid "" +"The speed at which the fans spin at the start of the print. In subsequent " +"layers the fan speed is gradually increased up to the layer corresponding to " +"Regular Fan Speed at Height." +msgstr "" +"列印起始層時的風扇轉速。在隨後的層中,風扇轉速會逐漸增加到對應層所設定的速" +"度。" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height label" +msgid "Regular Fan Speed at Height" +msgstr "標準風扇轉速(高度)" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height description" +msgid "" +"The height at which the fans spin on regular fan speed. At the layers below " +"the fan speed gradually increases from Initial Fan Speed to Regular Fan " +"Speed." +msgstr "" +"使用標準風扇轉速的高度。風扇轉速會從起始轉速逐漸增加,在此高度達到標準風扇轉" +"速。" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer label" +msgid "Regular Fan Speed at Layer" +msgstr "標準風扇轉速(層)" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer description" +msgid "" +"The layer at which the fans spin on regular fan speed. If regular fan speed " +"at height is set, this value is calculated and rounded to a whole number." +msgstr "" +"要使用標準風扇轉速的層。如果標準風扇轉速高度已被設定,這個值將使用計算出來後" +"取四捨五入的整數值。" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time label" +msgid "Minimum Layer Time" +msgstr "最短單層列印時間" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time description" +msgid "" +"The minimum time spent in a layer. This forces the printer to slow down, to " +"at least spend the time set here in one layer. This allows the printed " +"material to cool down properly before printing the next layer. Layers may " +"still take shorter than the minimal layer time if Lift Head is disabled and " +"if the Minimum Speed would otherwise be violated." +msgstr "" +"單層列印時間的下限。這會迫使印表機減速,以便在單層列印中消耗此處所規定的時" +"間。這會讓模型充分冷卻後再列印下一層。如果“噴頭抬升”功能被關閉,為了不違反“最" +"低列印速度”,單層列印時間仍有可能低於此設定值。" + +#: fdmprinter.def.json +msgctxt "cool_min_speed label" +msgid "Minimum Speed" +msgstr "最低列印速度" + +#: fdmprinter.def.json +msgctxt "cool_min_speed description" +msgid "" +"The minimum print speed, despite slowing down due to the minimum layer time. " +"When the printer would slow down too much, the pressure in the nozzle would " +"be too low and result in bad print quality." +msgstr "" +"列印速度的下限,限制因“最短單層列印時間”的減速。當印表機減速過多時,噴頭中的" +"壓力將過低並導致較差的列印品質。" + +#: fdmprinter.def.json +msgctxt "cool_lift_head label" +msgid "Lift Head" +msgstr "噴頭抬升" + +#: fdmprinter.def.json +msgctxt "cool_lift_head description" +msgid "" +"When the minimum speed is hit because of minimum layer time, lift the head " +"away from the print and wait the extra time until the minimum layer time is " +"reached." +msgstr "" +"當“最短單層列印時間”受到“最低列印速度”限制時,將噴頭從模型上抬高,並等候達到" +"最短單層列印時間。" + +#: fdmprinter.def.json +msgctxt "support label" +msgid "Support" +msgstr "支撐" + +#: fdmprinter.def.json +msgctxt "support description" +msgid "Support" +msgstr "支撐" + +#: fdmprinter.def.json +msgctxt "support_enable label" +msgid "Generate Support" +msgstr "產生支撐" + +#: fdmprinter.def.json +msgctxt "support_enable description" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "" +"在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" +"塌。" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr label" +msgid "Support Extruder" +msgstr "支撐用擠出機" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr description" +msgid "" +"The extruder train to use for printing the support. This is used in multi-" +"extrusion." +msgstr "用於列印支撐的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr label" +msgid "Support Infill Extruder" +msgstr "支撐填充擠出機" + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr description" +msgid "" +"The extruder train to use for printing the infill of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐填充的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 label" +msgid "First Layer Support Extruder" +msgstr "第一層支撐擠出機" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 description" +msgid "" +"The extruder train to use for printing the first layer of support infill. " +"This is used in multi-extrusion." +msgstr "用於列印支撐填充第一層的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr label" +msgid "Support Interface Extruder" +msgstr "支撐介面擠出機" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs and floors of the support. " +"This is used in multi-extrusion." +msgstr "用於列印支撐頂板和底板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr label" +msgid "Support Roof Extruder" +msgstr "支撐頂板擠出機" + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐頂板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr label" +msgid "Support Floor Extruder" +msgstr "支撐底板擠出機" + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr description" +msgid "" +"The extruder train to use for printing the floors of the support. This is " +"used in multi-extrusion." +msgstr "用於列印支撐底板的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "support_type label" +msgid "Support Placement" +msgstr "支撐位置" + +#: fdmprinter.def.json +msgctxt "support_type description" +msgid "" +"Adjusts the placement of the support structures. The placement can be set to " +"touching build plate or everywhere. When set to everywhere the support " +"structures will also be printed on the model." +msgstr "" +"調整支撐結構的位置。位置可以設定為“接觸列印平台”或“每個地方”。當設定為“每個地" +"方”時,在模型上也會列印支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_type option buildplate" +msgid "Touching Buildplate" +msgstr "接觸列印平台" + +#: fdmprinter.def.json +msgctxt "support_type option everywhere" +msgid "Everywhere" +msgstr "每個地方" + +#: fdmprinter.def.json +msgctxt "support_angle label" +msgid "Support Overhang Angle" +msgstr "支撐懸垂角度" + +#: fdmprinter.def.json +msgctxt "support_angle description" +msgid "" +"The minimum angle of overhangs for which support is added. At a value of 0° " +"all overhangs are supported, 90° will not provide any support." +msgstr "" +"添加支撐的最小懸垂角度。當角度為 0° 時,將支撐所有懸垂,當角度為 90° 時,不提" +"供任何支撐。" + +#: fdmprinter.def.json +msgctxt "support_pattern label" +msgid "Support Pattern" +msgstr "支撐列印樣式" + +#: fdmprinter.def.json +msgctxt "support_pattern description" +msgid "" +"The pattern of the support structures of the print. The different options " +"available result in sturdy or easy to remove support." +msgstr "支撐結構的列印樣式。有不同的選項可產生堅固的或容易清除的支撐。" + +#: fdmprinter.def.json +msgctxt "support_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_pattern option cross" +msgid "Cross" +msgstr "十字形" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags label" +msgid "Connect Support ZigZags" +msgstr "連接支撐鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags description" +msgid "" +"Connect the ZigZags. This will increase the strength of the zig zag support " +"structure." +msgstr "連接鋸齒狀。這將增加鋸齒狀支撐結構的强度。" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "將支撐拆成塊狀" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "" +"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "支撐塊大小" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "支撐塊線條數" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "支撐密度" + +#: fdmprinter.def.json +msgctxt "support_infill_rate description" +msgid "" +"Adjusts the density of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "調整支撐結構的密度。較高的值會實現更好的懸垂,但支撐將更加難以移除。" + +#: fdmprinter.def.json +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "支撐線條間距" + +#: fdmprinter.def.json +msgctxt "support_line_distance description" +msgid "" +"Distance between the printed support structure lines. This setting is " +"calculated by the support density." +msgstr "已列印支撐結構線條之間的距離。該設定通過支撐密度計算。" + +#: fdmprinter.def.json +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "支撐 Z 間距" + +#: fdmprinter.def.json +msgctxt "support_z_distance description" +msgid "" +"Distance from the top/bottom of the support structure to the print. This gap " +"provides clearance to remove the supports after the model is printed. This " +"value is rounded up to a multiple of the layer height." +msgstr "" +"支撐結構距離模型頂部/底部的距離。這一個小的差距使得它更容易被去除,這個數值會" +"被無條件進位到層高的倍數。" + +#: fdmprinter.def.json +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "支撐頂部間距" + +#: fdmprinter.def.json +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "從支撐頂部到列印品的距離。" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "支撐底部間距" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "從列印品到支撐底部的距離。" + +#: fdmprinter.def.json +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "支撐 X/Y 間距" + +#: fdmprinter.def.json +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "支撐結構在 X/Y 方向距列印品的距離。" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "支撐間距優先權" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z description" +msgid "" +"Whether the Support X/Y Distance overrides the Support Z Distance or vice " +"versa. When X/Y overrides Z the X/Y distance can push away the support from " +"the model, influencing the actual Z distance to the overhang. We can disable " +"this by not applying the X/Y distance around overhangs." +msgstr "" +"支撐 X/Y 間距是否優先於支撐 Z 間距的設定。當 X/Y 間距優先於 Z 時,X/Y 間距可" +"將支撐從模型上推離,同時影響與懸垂之間的實際 Z 間距。我們可以通過不在懸垂周圍" +"套用 X/Y 間距來關閉此選項。" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X/Y 優先 Z" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z 優先 X/Y" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "最小支撐 X/Y 間距" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang description" +msgid "" +"Distance of the support structure from the overhang in the X/Y directions. " +msgstr "支撐結構在 X/Y 方向與懸垂的間距。" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "支撐階梯高度" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height description" +msgid "" +"The height of the steps of the stair-like bottom of support resting on the " +"model. A low value makes the support harder to remove, but too high values " +"can lead to unstable support structures. Set to zero to turn off the stair-" +"like behaviour." +msgstr "" +"模型上的支撐階梯狀底部的階梯高度。較低的值會使支撐更難於移除,但過高的值可能" +"導致不穩定的支撐結構。設為零可以關閉階梯狀行為。" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width label" +msgid "Support Stair Step Maximum Width" +msgstr "支撐階梯最大寬度" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width description" +msgid "" +"The maximum width of the steps of the stair-like bottom of support resting " +"on the model. A low value makes the support harder to remove, but too high " +"values can lead to unstable support structures." +msgstr "" +"停留在模型上的支撐階梯狀底部的最大階梯寬度。較低的值會使支撐更難於移除,但過" +"高的值可能導致不穩定的支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "支撐結合距離" + +#: fdmprinter.def.json +msgctxt "support_join_distance description" +msgid "" +"The maximum distance between support structures in the X/Y directions. When " +"seperate structures are closer together than this value, the structures " +"merge into one." +msgstr "" +"支撐結構間在 X/Y 方向的最大距離。當分離結構之間的距離小於此值時,這些結構將合" +"併為一個。" + +#: fdmprinter.def.json +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "支撐水平擴展" + +#: fdmprinter.def.json +msgctxt "support_offset description" +msgid "" +"Amount of offset applied to all support polygons in each layer. Positive " +"values can smooth out the support areas and result in more sturdy support." +msgstr "" +"套用到每一層所有支撐多邊形的偏移量。正值可以讓支撐區域更平滑,並產生更為牢固" +"的支撐。" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness label" +msgid "Support Infill Layer Thickness" +msgstr "支撐填充層厚度" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness description" +msgid "" +"The thickness per layer of support infill material. This value should always " +"be a multiple of the layer height and is otherwise rounded." +msgstr "" +"支撐填充耗材每層的厚度。該值應為層高的倍數,否則數值會被四捨五入到層高的倍" +"數。" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps label" +msgid "Gradual Support Infill Steps" +msgstr "漸進支撐填充步階" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps description" +msgid "" +"Number of times to reduce the support infill density by half when getting " +"further below top surfaces. Areas which are closer to top surfaces get a " +"higher density, up to the Support Infill Density." +msgstr "" +"從支撐頂層往下,填充密度減半的次數。越靠近頂層的填充密度越高,最高密度為支撐" +"填充密度。" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height label" +msgid "Gradual Support Infill Step Height" +msgstr "漸進支撐填充步階高度" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height description" +msgid "" +"The height of support infill of a given density before switching to half the " +"density." +msgstr "支撐層密度減半的厚度。" + +#: fdmprinter.def.json +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "啟用支撐介面" + +#: fdmprinter.def.json +msgctxt "support_interface_enable description" +msgid "" +"Generate a dense interface between the model and the support. This will " +"create a skin at the top of the support on which the model is printed and at " +"the bottom of the support, where it rests on the model." +msgstr "" +"在模型和支撐之間產生一個密度較高的介面。這會在承載模型的支撐頂部和座落在模型" +"上的支撐底部創造出一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_roof_enable label" +msgid "Enable Support Roof" +msgstr "啟用支撐頂板" + +#: fdmprinter.def.json +msgctxt "support_roof_enable description" +msgid "" +"Generate a dense slab of material between the top of support and the model. " +"This will create a skin between the model and support." +msgstr "" +"在支撐頂部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable label" +msgid "Enable Support Floor" +msgstr "啟用支撐底板" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable description" +msgid "" +"Generate a dense slab of material between the bottom of the support and the " +"model. This will create a skin between the model and support." +msgstr "" +"在支撐底部和模型之間產生一個密集的平板。這會在模型和支撐之間形成一個介面層。" + +#: fdmprinter.def.json +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "支撐介面厚度" + +#: fdmprinter.def.json +msgctxt "support_interface_height description" +msgid "" +"The thickness of the interface of the support where it touches with the " +"model on the bottom or the top." +msgstr "支撐與模型在底部或頂部接觸的介面厚度。" + +#: fdmprinter.def.json +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "支撐頂板厚度" + +#: fdmprinter.def.json +msgctxt "support_roof_height description" +msgid "" +"The thickness of the support roofs. This controls the amount of dense layers " +"at the top of the support on which the model rests." +msgstr "支撐頂板的厚度。這會控制承載模型的支撐頂部密集層的數量。" + +#: fdmprinter.def.json +msgctxt "support_bottom_height label" +msgid "Support Floor Thickness" +msgstr "支撐底板厚度" + +#: fdmprinter.def.json +msgctxt "support_bottom_height description" +msgid "" +"The thickness of the support floors. This controls the number of dense " +"layers that are printed on top of places of a model on which support rests." +msgstr "支撐底板的厚度。這會控制座落在模型上的支撐底部密集層的數量。" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "支撐介面解析度" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height description" +msgid "" +"When checking where there's model above and below the support, take steps of " +"the given height. Lower values will slice slower, while higher values may " +"cause normal support to be printed in some places where there should have " +"been support interface." +msgstr "" +"在檢查支撐上方或下方是否有模型時,所採用步階的高度。值越低切片速度越慢,而較" +"高的值會導致在部分應有支撐介面的位置列印一般的支撐。" + +#: fdmprinter.def.json +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "支撐介面密度" + +#: fdmprinter.def.json +msgctxt "support_interface_density description" +msgid "" +"Adjusts the density of the roofs and floors of the support structure. A " +"higher value results in better overhangs, but the supports are harder to " +"remove." +msgstr "" +"調整支撐結構頂板和底板的密度。較高的值會實現更好的懸垂,但支撐將更加難以移" +"除。" + +#: fdmprinter.def.json +msgctxt "support_roof_density label" +msgid "Support Roof Density" +msgstr "支撐頂板密度" + +#: fdmprinter.def.json +msgctxt "support_roof_density description" +msgid "" +"The density of the roofs of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "支撐結構頂板的密度。較高的值會讓懸垂印得更好,但支撐將更加難以移除。" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance label" +msgid "Support Roof Line Distance" +msgstr "支撐頂板線條距離" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance description" +msgid "" +"Distance between the printed support roof lines. This setting is calculated " +"by the Support Roof Density, but can be adjusted separately." +msgstr "支撐頂板線條之間的距離。該設定是通過支撐頂板密度計算,但可以單獨調整。" + +#: fdmprinter.def.json +msgctxt "support_bottom_density label" +msgid "Support Floor Density" +msgstr "支撐底板密度" + +#: fdmprinter.def.json +msgctxt "support_bottom_density description" +msgid "" +"The density of the floors of the support structure. A higher value results " +"in better adhesion of the support on top of the model." +msgstr "支撐結構底板的密度。較高的值會讓支撐更容易附著在模型上。" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance label" +msgid "Support Floor Line Distance" +msgstr "支撐底板線條距離" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance description" +msgid "" +"Distance between the printed support floor lines. This setting is calculated " +"by the Support Floor Density, but can be adjusted separately." +msgstr "支撐底板線條之間的距離。該設定是通過支撐底板密度計算,但可以單獨調整。" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "支撐介面列印樣式" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern description" +msgid "" +"The pattern with which the interface of the support with the model is " +"printed." +msgstr "支撐與模型之間介面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern label" +msgid "Support Roof Pattern" +msgstr "支撐頂板列印樣式" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern description" +msgid "The pattern with which the roofs of the support are printed." +msgstr "列印支撐頂板的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option lines" +msgid "Lines" +msgstr "直線" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric" +msgid "Concentric" +msgstr "同心圓" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "立體同心圓" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern label" +msgid "Support Floor Pattern" +msgstr "支撐底板列印樣式" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern description" +msgid "The pattern with which the floors of the support are printed." +msgstr "列印支撐底板的列印樣式。" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option lines" +msgid "Lines" +msgstr "線條" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option grid" +msgid "Grid" +msgstr "網格" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option triangles" +msgid "Triangles" +msgstr "三角形" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "同心 3D" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "使用塔型支撐" + +#: fdmprinter.def.json +msgctxt "support_use_towers description" +msgid "" +"Use specialized towers to support tiny overhang areas. These towers have a " +"larger diameter than the region they support. Near the overhang the towers' " +"diameter decreases, forming a roof." +msgstr "" +"使用專門的塔來支撐較小的懸垂區域。這些塔的直徑比它們所支撐的區域要大。在靠近" +"懸垂物時,塔的直徑減小,形成頂板。" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "塔直徑" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "特殊塔的直徑。" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "最小直徑" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter description" +msgid "" +"Minimum diameter in the X/Y directions of a small area which is to be " +"supported by a specialized support tower." +msgstr "小區域中支撐塔的 X/Y 軸方向最小直徑。" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "塔頂板角度" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle description" +msgid "" +"The angle of a rooftop of a tower. A higher value results in pointed tower " +"roofs, a lower value results in flattened tower roofs." +msgstr "塔頂角度。該值越高,塔頂越尖,值越低,塔頂越平。" + +#: fdmprinter.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "列印平台附著" + +#: fdmprinter.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "附著" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable label" +msgid "Enable Prime Blob" +msgstr "啟用少量裝填" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable description" +msgid "" +"Whether to prime the filament with a blob before printing. Turning this " +"setting on will ensure that the extruder will have material ready at the " +"nozzle before printing. Printing Brim or Skirt can act like priming too, in " +"which case turning this setting off saves some time." +msgstr "" +"列印前是否裝填少量的耗材。開啟此設定將確保列印前擠出機的噴頭處已準備好耗材。" +"列印邊緣或外圍也可作為裝填用途,這種情况下關閉此設定可以節省時間。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "擠出機 X 軸起始位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 X 軸上初始位置。" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "擠出機 Y 軸起始位置" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "列印開始時,噴頭在 Y 軸座標上初始位置。" + +#: fdmprinter.def.json +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "列印平台附著類型" + +#: fdmprinter.def.json +msgctxt "adhesion_type description" +msgid "" +"Different options that help to improve both priming your extrusion and " +"adhesion to the build plate. Brim adds a single layer flat area around the " +"base of your model to prevent warping. Raft adds a thick grid with a roof " +"below the model. Skirt is a line printed around the model, but not connected " +"to the model." +msgstr "" +"幫助改善擠出裝填以及與列印平台附著的不同選項。邊緣會在模型基座周圍添加單層平" +"面區域,以防止翹曲。木筏會在模型底下添加一個有頂板的厚網格。外圍是在模型四周" +"列印的一條線,但並不與模型連接。" + +#: fdmprinter.def.json +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr "外圍" + +#: fdmprinter.def.json +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "邊緣" + +#: fdmprinter.def.json +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "木筏" + +#: fdmprinter.def.json +msgctxt "adhesion_type option none" +msgid "None" +msgstr "無" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "列印平台附著擠出機" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr description" +msgid "" +"The extruder train to use for printing the skirt/brim/raft. This is used in " +"multi-extrusion." +msgstr "用於列印外圍/邊緣/木筏的擠出機組。在多擠出機情況下適用。" + +#: fdmprinter.def.json +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "外圍線條數量" + +#: fdmprinter.def.json +msgctxt "skirt_line_count description" +msgid "" +"Multiple skirt lines help to prime your extrusion better for small models. " +"Setting this to 0 will disable the skirt." +msgstr "" +"多條外圍線條有助你在列印小型模型時,更好地裝填的擠出機組。將其設為 0 將關閉外" +"圍。" + +#: fdmprinter.def.json +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "外圍間距" + +#: fdmprinter.def.json +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance, multiple skirt lines will extend outwards from " +"this distance." +msgstr "" +"外圍和列印第一層之間的水平距離。\n" +"這是最小距離,多個外圍線條將從此距離向外延伸。" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "外圍/邊緣最小長度" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length description" +msgid "" +"The minimum length of the skirt or brim. If this length is not reached by " +"all skirt or brim lines together, more skirt or brim lines will be added " +"until the minimum length is reached. Note: If the line count is set to 0 " +"this is ignored." +msgstr "" +"外圍或邊緣的最小長度。如果所有外圍或邊緣線條之和都没有達到此長度,則將添加更" +"多外圍或邊緣線條直至達到最小長度。注意:如果線條計數設為 0,則將忽略此選項。" + +#: fdmprinter.def.json +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "邊緣寬度" + +#: fdmprinter.def.json +msgctxt "brim_width description" +msgid "" +"The distance from the model to the outermost brim line. A larger brim " +"enhances adhesion to the build plate, but also reduces the effective print " +"area." +msgstr "" +"模型到最外側邊緣線的距離。較大的邊緣可增强與列印平台的附著,但也會減少有效列" +"印區域。" + +#: fdmprinter.def.json +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "邊緣線條數量" + +#: fdmprinter.def.json +msgctxt "brim_line_count description" +msgid "" +"The number of lines used for a brim. More brim lines enhance adhesion to the " +"build plate, but also reduces the effective print area." +msgstr "" +"邊緣所用線條數量。更多邊緣線條可增强與列印平台的附著,但也會減少有效列印區" +"域。" + +#: fdmprinter.def.json +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "僅在外部列印邊緣" + +#: fdmprinter.def.json +msgctxt "brim_outside_only description" +msgid "" +"Only print the brim on the outside of the model. This reduces the amount of " +"brim you need to remove afterwards, while it doesn't reduce the bed adhesion " +"that much." +msgstr "" +"僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台" +"附著。" + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 label" +msgid "Initial Layer Z Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "z_offset_layer_0 description" +msgid "" +"The extruder is offset from the normal height of the first layer by this " +"amount. It can be positive (raised) or negative (lowered). Some filament " +"types adhere to the build plate better if the extruder is raised slightly." +msgstr "" +"擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下降)。" +"某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers label" +msgid "Z Offset Taper Layers" +msgstr "Z 軸偏移漸減層數" + +#: fdmprinter.def.json +msgctxt "z_offset_taper_layers description" +msgid "" +"When non-zero, the Z offset is reduced to 0 over that many layers. A value " +"of 0 means that the Z offset remains constant for all the layers in the " +"print." +msgstr "" +"當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列印" +"層的 Z 軸偏移量保持為固定值。" + +#: fdmprinter.def.json +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "木筏額外邊緣" + +#: fdmprinter.def.json +msgctxt "raft_margin description" +msgid "" +"If the raft is enabled, this is the extra raft area around the model which " +"is also given a raft. Increasing this margin will create a stronger raft " +"while using more material and leaving less area for your print." +msgstr "" +"如果啟用了木筏,在模型周圍也會增加額外邊緣。增大這個邊緣將產生更強的木筏,不" +"過也會使用更多的耗材,並減少印表機的可列印面積。" + +#: fdmprinter.def.json +msgctxt "raft_smoothing label" +msgid "Raft Smoothing" +msgstr "木筏平滑處理" + +#: fdmprinter.def.json +msgctxt "raft_smoothing description" +msgid "" +"This setting control how much inner corners in the raft outline are rounded. " +"Inward corners are rounded to a semi circle with a radius equal to the value " +"given here. This setting also removes holes in the raft outline which are " +"smaller than such a circle." +msgstr "" +"此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定" +"值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" + +#: fdmprinter.def.json +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "木筏間隙" + +#: fdmprinter.def.json +msgctxt "raft_airgap description" +msgid "" +"The gap between the final raft layer and the first layer of the model. Only " +"the first layer is raised by this amount to lower the bonding between the " +"raft layer and the model. Makes it easier to peel off the raft." +msgstr "" +"木筏最後一層與模型第一層之間的間隙。只有第一層被提高了這個距離,以便降低木筏" +"和模型之間的附著。讓木筏更容易剝離。" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "起始層 Z 重疊" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the model overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "" +"使模型的第一層和第二層在 Z 方向上重疊以補償在空隙中損失的耗材。第一個模型層上" +"方的所有模型將向下移動此重疊量。" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "木筏頂部層數" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers description" +msgid "" +"The number of top layers on top of the 2nd raft layer. These are fully " +"filled layers that the model sits on. 2 layers result in a smoother top " +"surface than 1." +msgstr "" +"位於木筏中層上方的頂部層數。這是承載模型的完全填充層。兩層會產生比一層更平滑" +"的頂部表面。" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "木筏頂部層厚" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "木筏頂部單層的厚度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "木筏頂部線寬" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width description" +msgid "" +"Width of the lines in the top surface of the raft. These can be thin lines " +"so that the top of the raft becomes smooth." +msgstr "木筏頂部表面的線寬。這些線條可以是細線,以便讓木筏頂部變得平滑。" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "木筏頂部間距" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing description" +msgid "" +"The distance between the raft lines for the top raft layers. The spacing " +"should be equal to the line width, so that the surface is solid." +msgstr "木筏頂部線條之間的距離。間距應等於線寬,以便打造堅固表面。" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "木筏中層厚度" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "木筏中層的層厚。" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "木筏中層線寬" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width description" +msgid "" +"Width of the lines in the middle raft layer. Making the second layer extrude " +"more causes the lines to stick to the build plate." +msgstr "木筏中層的線寬。第二層擠出多一些會讓線條附著在列印平台上。" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "木筏中層間距" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing description" +msgid "" +"The distance between the raft lines for the middle raft layer. The spacing " +"of the middle should be quite wide, while being dense enough to support the " +"top raft layers." +msgstr "" +"木筏中層線條之間的距離。中層的間距應足夠寬,同時也要足夠密集,以便支撐木筏頂" +"部。" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "木筏底部厚度" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness description" +msgid "" +"Layer thickness of the base raft layer. This should be a thick layer which " +"sticks firmly to the printer build plate." +msgstr "木筏底部的層厚。本層應為與印表機列印平台穩固附著厚實的一層。" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "木筏底部線寬" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width description" +msgid "" +"Width of the lines in the base raft layer. These should be thick lines to " +"assist in build plate adhesion." +msgstr "木筏底部的線寬。這些線條應該是粗線,以便協助列印平台附著。" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "木筏底部間距" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing description" +msgid "" +"The distance between the raft lines for the base raft layer. Wide spacing " +"makes for easy removal of the raft from the build plate." +msgstr "木筏底部線條之間的距離。寬間距方便讓木筏從列印平台移除。" + +#: fdmprinter.def.json +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "木筏列印速度" + +#: fdmprinter.def.json +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "列印木筏的速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "木筏頂部列印速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed description" +msgid "" +"The speed at which the top raft layers are printed. These should be printed " +"a bit slower, so that the nozzle can slowly smooth out adjacent surface " +"lines." +msgstr "" +"列印木筏頂部的速度。這些層應以稍慢的速度列印,以便噴頭緩慢地整平臨近的表面線" +"條。" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "木筏中層列印速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed description" +msgid "" +"The speed at which the middle raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"列印木筏中層的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" + +#: fdmprinter.def.json +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "木筏底部列印速度" + +#: fdmprinter.def.json +msgctxt "raft_base_speed description" +msgid "" +"The speed at which the base raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"列印木筏底部的速度。這些層應以很慢的速度列印,因為噴頭所出的耗材量非常高。" + +#: fdmprinter.def.json +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "木筏列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "列印木筏的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "木筏頂部列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "列印木筏頂部的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "木筏中層列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "列印木筏中層的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "木筏底部列印加速度" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "列印木筏底部的加速度。" + +#: fdmprinter.def.json +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "木筏列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "列印木筏的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "木筏頂部列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "列印木筏頂部的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "木筏中層列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "列印木筏中層的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "木筏底部列印加加速度" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "列印木筏底部的加加速度。" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "木筏風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "木筏的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "木筏頂部風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "木筏頂部的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "木筏中層風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "木筏中層的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "木筏底部風扇轉速" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "木筏底部的風扇轉速。" + +#: fdmprinter.def.json +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "雙重擠出機" + +#: fdmprinter.def.json +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "用於多擠出機情況下的設定。" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "啟用換料塔" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable description" +msgid "" +"Print a tower next to the print which serves to prime the material after " +"each nozzle switch." +msgstr "在列印件旁邊印一個塔,用在每次切換噴頭後填充耗材。" + +#: fdmprinter.def.json +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "換料塔尺寸" + +#: fdmprinter.def.json +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "換料塔的寬度。" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "換料塔最小體積" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume description" +msgid "" +"The minimum volume for each layer of the prime tower in order to purge " +"enough material." +msgstr "為了清除足夠的耗材,換料塔每層的最小體積。" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "換料塔厚度" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness description" +msgid "" +"The thickness of the hollow prime tower. A thickness larger than half the " +"Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "" +"空心換料塔的厚度。如果厚度大於換料塔最小體積的一半,則將形成一個密集的換料" +"塔。" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "換料塔 X 位置" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "換料塔位置的 X 座標。" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "換料塔 Y 位置" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "換料塔位置的 Y 座標。" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "換料塔流量" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "流量補償:擠出的耗材量乘以此值。" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "在換料塔上擦拭非作用中的噴頭" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled description" +msgid "" +"After printing the prime tower with one nozzle, wipe the oozed material from " +"the other nozzle off on the prime tower." +msgstr "在一個噴頭列印換料塔後,在換料塔上擦拭另一個噴頭滲出的耗材。" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "切換後擦拭噴頭" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe description" +msgid "" +"After switching extruder, wipe the oozed material off of the nozzle on the " +"first thing printed. This performs a safe slow wipe move at a place where " +"the oozed material causes least harm to the surface quality of your print." +msgstr "" +"切換擠出機後,在列印的第一個物件上擦拭噴頭上的滲出耗材。這會在滲出耗材對列印" +"品表面品質造成最小損害的位置進行緩慢安全的擦拭動作。" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume label" +msgid "Prime Tower Purge Volume" +msgstr "換料塔清洗量" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume description" +msgid "" +"Amount of filament to be purged when wiping on the prime tower. Purging is " +"useful for compensating the filament lost by oozing during inactivity of the " +"nozzle." +msgstr "" +"在換料塔上進行擦拭時要清洗的耗材量。清洗可用於補償在噴頭不活動期間由於滲出而" +"損失的耗材。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "啟用擦拭牆" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled description" +msgid "" +"Enable exterior ooze shield. This will create a shell around the model which " +"is likely to wipe a second nozzle if it's at the same height as the first " +"nozzle." +msgstr "" +"啟用外部擦拭牆。這將在模型周圍創建一個外殼,如果與第一個噴頭處於相同的高度," +"則可能會擦拭第二個噴頭。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "擦拭牆角度" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle description" +msgid "" +"The maximum angle a part in the ooze shield will have. With 0 degrees being " +"vertical, and 90 degrees being horizontal. A smaller angle leads to less " +"failed ooze shields, but more material." +msgstr "" +"擦拭牆中的一部分的最大角度。0度為垂直,90度為水平。較小的角度擦拭效果較好,但" +"是要用更多的耗材。" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr "擦拭牆距離" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "擦拭牆與模型間的水平 ( X/Y 方向 ) 距離。" + +#: fdmprinter.def.json +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "網格修復" + +#: fdmprinter.def.json +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "修復" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "合併重疊體積" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all description" +msgid "" +"Ignore the internal geometry arising from overlapping volumes within a mesh " +"and print the volumes as one. This may cause unintended internal cavities to " +"disappear." +msgstr "" +"忽略由網格內的重疊體積產生的內部幾何,並將多個部分作為一個列印。這可能會導致" +"意外的內部孔洞消失。" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "移除所有孔洞" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes description" +msgid "" +"Remove the holes in each layer and keep only the outside shape. This will " +"ignore any invisible internal geometry. However, it also ignores layer holes " +"which can be viewed from above or below." +msgstr "" +"移除每層的孔洞,僅保留外部形狀。這會忽略任何不可見的內部幾何。但是,也會忽略" +"可從上方或下方看到的層孔洞。" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "廣泛縫合" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching description" +msgid "" +"Extensive stitching tries to stitch up open holes in the mesh by closing the " +"hole with touching polygons. This option can introduce a lot of processing " +"time." +msgstr "" +"廣泛縫合嘗試通過接觸多邊形來閉合孔洞,以此縫合網格中的開孔。此選項可能會產生" +"大量的處理時間。" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "保持斷開表面" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons description" +msgid "" +"Normally Cura tries to stitch up small holes in the mesh and remove parts of " +"a layer with big holes. Enabling this option keeps those parts which cannot " +"be stitched. This option should be used as a last resort option when " +"everything else fails to produce proper GCode." +msgstr "" +"一般情况下,Cura 會嘗試縫合網格中的小孔,並移除有大孔的部分層。啟用此選項將保" +"留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用" +"作最後手段。" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "合併網格重疊" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap description" +msgid "" +"Make meshes which are touching each other overlap a bit. This makes them " +"bond together better." +msgstr "使彼此接觸的網格稍微重疊。使他們能更緊密地結合在一起。" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "刪除網格交集部分" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes description" +msgid "" +"Remove areas where multiple meshes are overlapping with each other. This may " +"be used if merged dual material objects overlap with each other." +msgstr "" +"刪除多個網格彼此重疊的區域。如果合併的雙重耗材對象彼此重疊,則可以使用此選" +"項。" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "交互移除網格重疊部分" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order description" +msgid "" +"Switch to which mesh intersecting volumes will belong with every layer, so " +"that the overlapping meshes become interwoven. Turning this setting off will " +"cause one of the meshes to obtain all of the volume in the overlap, while it " +"is removed from the other meshes." +msgstr "" +"將網格重疊的部分,交互的在每一層中歸屬到不同的網格,以便重疊的網格交織在一" +"起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移" +"除。" + +#: fdmprinter.def.json +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "特殊模式" + +#: fdmprinter.def.json +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "黑魔法" + +#: fdmprinter.def.json +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "列印順序" + +#: fdmprinter.def.json +msgctxt "print_sequence description" +msgid "" +"Whether to print all models one layer at a time or to wait for one model to " +"finish, before moving on to the next. One at a time mode is only possible if " +"all models are separated in such a way that the whole print head can move in " +"between and all models are lower than the distance between the nozzle and " +"the X/Y axes." +msgstr "" +"選擇一次列印一層中的所有模型或等待一個模型完成後再轉到下一個模型。排隊模式只" +"有在所有模型以一種整個列印頭可以在各個模型之間移動的方式分隔開,且所有模型都" +"低於噴頭和 X / Y 軸之間距離的情况下可用。" + +#: fdmprinter.def.json +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "同時列印" + +#: fdmprinter.def.json +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "排隊列印" + +#: fdmprinter.def.json +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "填充網格" + +#: fdmprinter.def.json +msgctxt "infill_mesh description" +msgid "" +"Use this mesh to modify the infill of other meshes with which it overlaps. " +"Replaces infill regions of other meshes with regions for this mesh. It's " +"suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "" +"使用此網格修改與其重疊的其他網格的填充。利用此網格的區域替換其他網格的填充區" +"域。建議僅為此網格列印一個壁,而不列印頂部/底部表層。" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "填充網格順序" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order description" +msgid "" +"Determines which infill mesh is inside the infill of another infill mesh. An " +"infill mesh with a higher order will modify the infill of infill meshes with " +"lower order and normal meshes." +msgstr "" +"確定哪個填充網格在另一個填充網格的填充內。順序較高的填充網格將修改順序較低的" +"填充網格以及普通網格的填充。" + +#: fdmprinter.def.json +msgctxt "cutting_mesh label" +msgid "Cutting Mesh" +msgstr "切割網格" + +#: fdmprinter.def.json +msgctxt "cutting_mesh description" +msgid "" +"Limit the volume of this mesh to within other meshes. You can use this to " +"make certain areas of one mesh print with different settings and with a " +"whole different extruder." +msgstr "" +"將此網格的體積限制在其他網格內。你可以使用它來制作採用不同的設定以及完全不同" +"的擠出機的網格列印的特定區域。" + +#: fdmprinter.def.json +msgctxt "mold_enabled label" +msgid "Mold" +msgstr "模具" + +#: fdmprinter.def.json +msgctxt "mold_enabled description" +msgid "" +"Print models as a mold, which can be cast in order to get a model which " +"resembles the models on the build plate." +msgstr "將模型作為模具列印,可進行鑄造,以便獲取與列印平台上的模型類似的模型。" + +#: fdmprinter.def.json +msgctxt "mold_width label" +msgid "Minimal Mold Width" +msgstr "最小模具寬度" + +#: fdmprinter.def.json +msgctxt "mold_width description" +msgid "" +"The minimal distance between the ouside of the mold and the outside of the " +"model." +msgstr "模具外側和模型外側之間的最小距離。" + +#: fdmprinter.def.json +msgctxt "mold_roof_height label" +msgid "Mold Roof Height" +msgstr "模具頂板高度" + +#: fdmprinter.def.json +msgctxt "mold_roof_height description" +msgid "The height above horizontal parts in your model which to print mold." +msgstr "用於列印模具的模型水平部分上方的高度。" + +#: fdmprinter.def.json +msgctxt "mold_angle label" +msgid "Mold Angle" +msgstr "模具角度" + +#: fdmprinter.def.json +msgctxt "mold_angle description" +msgid "" +"The angle of overhang of the outer walls created for the mold. 0° will make " +"the outer shell of the mold vertical, while 90° will make the outside of the " +"model follow the contour of the model." +msgstr "" +"為模具創建的外壁的懸垂角度。0° 將使模具的外殼垂直,而 90° 將使模型的外部遵循" +"模型的輪廓。" + +#: fdmprinter.def.json +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "支撐網格" + +#: fdmprinter.def.json +msgctxt "support_mesh description" +msgid "" +"Use this mesh to specify support areas. This can be used to generate support " +"structure." +msgstr "使用此網格指定支撐區域。可用於產生支撐結構。" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "下拉式支撐網格" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down description" +msgid "" +"Make support everywhere below the support mesh, so that there's no overhang " +"in the support mesh." +msgstr "在支撐網格下方的所有位置進行支撐,讓支撐網格中没有懸垂。" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "防懸網格" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh description" +msgid "" +"Use this mesh to specify where no part of the model should be detected as " +"overhang. This can be used to remove unwanted support structure." +msgstr "" +"使用此網格指定模型的任何部分不應被檢測為懸垂的區域。可用於移除不需要的支撐結" +"構。" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "表面模式" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode description" +msgid "" +"Treat the model as a surface only, a volume, or volumes with loose surfaces. " +"The normal print mode only prints enclosed volumes. \"Surface\" prints a " +"single wall tracing the mesh surface with no infill and no top/bottom skin. " +"\"Both\" prints enclosed volumes like normal and any remaining polygons as " +"surfaces." +msgstr "" +"將模型作為僅表面、一個空間或多個具有鬆散表面的空間處理。“正常”僅列印封閉的空" +"間。“表面”列印模型表面的單壁,没有填充,也没有頂部/底部表層。“兩者”將封閉空間" +"正常列印,並將任何剩餘多邊形作為表面列印。" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "正常" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "表面" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "兩者" + +#: fdmprinter.def.json +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "螺旋列印外輪廓" + +#: fdmprinter.def.json +msgctxt "magic_spiralize description" +msgid "" +"Spiralize smooths out the Z move of the outer edge. This will create a " +"steady Z increase over the whole print. This feature turns a solid model " +"into a single walled print with a solid bottom. This feature should only be " +"enabled when each layer only contains a single part." +msgstr "" +"螺旋列印實現外部邊緣的平滑 Z 移動。這會在整個列印上改成 Z 軸穩定增動。該功能" +"會將一個實心模型轉變為具有實體底部的單壁列印。只有在當每一層只包含一個封閉面" +"時才應啟用此功能。" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours label" +msgid "Smooth Spiralized Contours" +msgstr "平滑螺旋輪廓" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours description" +msgid "" +"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-" +"seam should be barely visible on the print but will still be visible in the " +"layer view). Note that smoothing will tend to blur fine surface details." +msgstr "" +"平滑螺旋輪廓可以減少 Z 縫的出現(Z 縫應在列印品上幾乎看不到,但在分層檢視中仍" +"然可見)。請注意,平滑操作將傾向於模糊精細的表面細節。" + +#: fdmprinter.def.json +msgctxt "relative_extrusion label" +msgid "Relative Extrusion" +msgstr "相對模式擠出" + +#: fdmprinter.def.json +msgctxt "relative_extrusion description" +msgid "" +"Use relative extrusion rather than absolute extrusion. Using relative E-" +"steps makes for easier post-processing of the Gcode. However, it's not " +"supported by all printers and it may produce very slight deviations in the " +"amount of deposited material compared to absolute E-steps. Irrespective of " +"this setting, the extrusion mode will always be set to absolute before any " +"Gcode script is output." +msgstr "" +"擠出控制使用相對模式而非絕對模式。使用相對的 E 步數使 G-code 在後處理上更為簡" +"便。然而並非所有印表機都支援此模式,而且和絕對的 E 步數相比,它可能在沉積耗材" +"的使用量上產生輕微的偏差。無論此設定為何,在輸出任何 G-code 腳本之前,擠出模" +"式將始終設定為絕對模式。" + +#: fdmprinter.def.json +msgctxt "experimental label" +msgid "Experimental" +msgstr "實驗性" + +#: fdmprinter.def.json +msgctxt "experimental description" +msgid "experimental!" +msgstr "實驗性!" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "最佳化牆壁列印順序" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "" +"Optimize the order in which walls are printed so as to reduce the number of " +"retractions and the distance travelled. Most parts will benefit from this " +"being enabled but some may actually take longer so please compare the print " +"time estimates with and without optimization." +msgstr "" +"最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的," +"但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled label" +msgid "Enable Draft Shield" +msgstr "啟用防風罩" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled description" +msgid "" +"This will create a wall around the model, which traps (hot) air and shields " +"against exterior airflow. Especially useful for materials which warp easily." +msgstr "" +"這將在模型周圍建立一個牆壁留住(熱)空氣並遮住外部氣流。對於容易翹曲的耗材非" +"常有用。" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist label" +msgid "Draft Shield X/Y Distance" +msgstr "防風罩 X/Y 距離" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist description" +msgid "Distance of the draft shield from the print, in the X/Y directions." +msgstr "防風罩與模型在 X/Y 軸方向的距離。" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation label" +msgid "Draft Shield Limitation" +msgstr "防風罩限高" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation description" +msgid "" +"Set the height of the draft shield. Choose to print the draft shield at the " +"full height of the model or at a limited height." +msgstr "設定防風罩的高度。選擇防風罩與模型同高或只列印到限制的高度。" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option full" +msgid "Full" +msgstr "完整" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option limited" +msgid "Limited" +msgstr "限制" + +#: fdmprinter.def.json +msgctxt "draft_shield_height label" +msgid "Draft Shield Height" +msgstr "防風罩高度" + +#: fdmprinter.def.json +msgctxt "draft_shield_height description" +msgid "" +"Height limitation of the draft shield. Above this height no draft shield " +"will be printed." +msgstr "防風罩的高度限制。超過這個高度就不再列印防風罩。" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled label" +msgid "Make Overhang Printable" +msgstr "使懸垂可列印" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled description" +msgid "" +"Change the geometry of the printed model such that minimal support is " +"required. Steep overhangs will become shallow overhangs. Overhanging areas " +"will drop down to become more vertical." +msgstr "" +"更改列印模型的幾何形狀,以最大程度減少需要的支撐。陡峭的懸垂物將變淺。懸垂區" +"域將下降變得更垂直。" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle label" +msgid "Maximum Model Angle" +msgstr "最大模型角度" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle description" +msgid "" +"The maximum angle of overhangs after the they have been made printable. At a " +"value of 0° all overhangs are replaced by a piece of model connected to the " +"build plate, 90° will not change the model in any way." +msgstr "" +"在懸垂變得可列印後懸垂的最大角度。當該值為 0° 時,所有懸垂將被與列印平台連接" +"的模型的一個部分替代,如果為 90° 時,不會以任何方式更改模型。" + +#: fdmprinter.def.json +msgctxt "coasting_enable label" +msgid "Enable Coasting" +msgstr "啟用滑行" + +#: fdmprinter.def.json +msgctxt "coasting_enable description" +msgid "" +"Coasting replaces the last part of an extrusion path with a travel path. The " +"oozed material is used to print the last piece of the extrusion path in " +"order to reduce stringing." +msgstr "" +"滑行會用一個空跑路徑替代擠出路徑的最後部分。滲出耗材用於列印擠出路徑的最後部" +"分,以便減少牽絲。" + +#: fdmprinter.def.json +msgctxt "coasting_volume label" +msgid "Coasting Volume" +msgstr "滑行體積" + +#: fdmprinter.def.json +msgctxt "coasting_volume description" +msgid "" +"The volume otherwise oozed. This value should generally be close to the " +"nozzle diameter cubed." +msgstr "不進行滑行時,會滲出的體積。該值一般應接近噴頭直徑的立方。" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume label" +msgid "Minimum Volume Before Coasting" +msgstr "滑行前最小體積" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume description" +msgid "" +"The smallest volume an extrusion path should have before allowing coasting. " +"For smaller extrusion paths, less pressure has been built up in the bowden " +"tube and so the coasted volume is scaled linearly. This value should always " +"be larger than the Coasting Volume." +msgstr "" +"可以進行滑行前,擠出路徑應有的最小體積。對於較小的擠出路徑,喉管內累積的壓力" +"較少,因此滑行體積採用線性比率縮小。該值應大於滑行體積。" + +#: fdmprinter.def.json +msgctxt "coasting_speed label" +msgid "Coasting Speed" +msgstr "滑行速度" + +#: fdmprinter.def.json +msgctxt "coasting_speed description" +msgid "" +"The speed by which to move during coasting, relative to the speed of the " +"extrusion path. A value slightly under 100% is advised, since during the " +"coasting move the pressure in the bowden tube drops." +msgstr "" +"滑行期間相對於擠出路徑的移動速度。建議採用略低於 100% 的值,因為在滑行移動期" +"間喉管中的壓力會下降。" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation label" +msgid "Alternate Skin Rotation" +msgstr "交替表層旋轉" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation description" +msgid "" +"Alternate the direction in which the top/bottom layers are printed. Normally " +"they are printed diagonally only. This setting adds the X-only and Y-only " +"directions." +msgstr "" +"交替列印頂部/底部層的方向。通常它們只進行對角線列印。此設定添加純 X 和純 Y 方" +"向。" + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size label" +msgid "Cross 3D Pocket Size" +msgstr "立體十字形氣囊大小" + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size description" +msgid "" +"The size of pockets at four-way crossings in the cross 3D pattern at heights " +"where the pattern is touching itself." +msgstr "立體十字形在樣式閉合的高度處,中央十字交叉的氣囊大小。" + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly label" +msgid "Alternate Cross 3D Pockets" +msgstr "交錯立體十字形氣囊" + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly description" +msgid "" +"Only apply pockets at half of the four-way crossings in the cross 3D pattern " +"and alternate the location of the pockets between heights where the pattern " +"is touching itself." +msgstr "" +"在立體十字形樣式中,只在半數樣式閉合的中央十字交叉處使用氣囊,並在高度上交錯" +"排列。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled label" +msgid "Spaghetti Infill" +msgstr "義大利麵式填充" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled description" +msgid "" +"Print the infill every so often, so that the filament will curl up " +"chaotically inside the object. This reduces print time, but the behaviour is " +"rather unpredictable." +msgstr "" +"經常列印填充,使得耗材在模型內部混亂地捲曲。這會縮短列印時間,但行為會難以預" +"測。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped label" +msgid "Spaghetti Infill Stepping" +msgstr "義大利麵式逐步填充" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped description" +msgid "" +"Whether to print spaghetti infill in steps or extrude all the infill " +"filament at the end of the print." +msgstr "是否逐步列印義大利麵式填充或在列印結束時一次擠出所有填充耗材。" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle label" +msgid "Spaghetti Maximum Infill Angle" +msgstr "義大利麵式填充 - 最大填充角度" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle description" +msgid "" +"The maximum angle w.r.t. the Z axis of the inside of the print for areas " +"which are to be filled with spaghetti infill afterwards. Lowering this value " +"causes more angled parts in your model to be filled on each layer." +msgstr "" +"允許延後填充義大利麵式填充的最大角度,取列印物內側與 Z 軸的夾角。降低此值會導" +"致模型中的更多有角度部位在各層填充。" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height label" +msgid "Spaghetti Infill Maximum Height" +msgstr "義大利麵式填充 - 最大填充高度" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height description" +msgid "" +"The maximum height of inside space which can be combined and filled from the " +"top." +msgstr "可以從頂部組合和填充的內部空間的最大高度。" + +#: fdmprinter.def.json +msgctxt "spaghetti_inset label" +msgid "Spaghetti Inset" +msgstr "義大利麵式填充內嵌" + +#: fdmprinter.def.json +msgctxt "spaghetti_inset description" +msgid "" +"The offset from the walls from where the spaghetti infill will be printed." +msgstr "列印義大利麵式填充開始位置與牆壁的偏移量。" + +#: fdmprinter.def.json +msgctxt "spaghetti_flow label" +msgid "Spaghetti Flow" +msgstr "義大利麵式填充流量" + +#: fdmprinter.def.json +msgctxt "spaghetti_flow description" +msgid "" +"Adjusts the density of the spaghetti infill. Note that the Infill Density " +"only controls the line spacing of the filling pattern, not the amount of " +"extrusion for spaghetti infill." +msgstr "" +"調整義大利麵式填充的密度。注意,填充密度僅控制填充列印樣式的線條間距,而不是" +"義大利麵式填充的擠出量。" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume label" +msgid "Spaghetti Infill Extra Volume" +msgstr "義大利麵式填充額外體積" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume description" +msgid "" +"A correction term to adjust the total volume being extruded each time when " +"filling spaghetti." +msgstr "一個用於調整每次進行義大利麵式填充時擠出總量的修正項。" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled label" +msgid "Enable Conical Support" +msgstr "啟用錐形支撐" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled description" +msgid "" +"Experimental feature: Make support areas smaller at the bottom than at the " +"overhang." +msgstr "實驗性功能: 讓底部的支撐區域小於懸垂處的支撐區域。" + +#: fdmprinter.def.json +msgctxt "support_conical_angle label" +msgid "Conical Support Angle" +msgstr "錐形支撐角度" + +#: fdmprinter.def.json +msgctxt "support_conical_angle description" +msgid "" +"The angle of the tilt of conical support. With 0 degrees being vertical, and " +"90 degrees being horizontal. Smaller angles cause the support to be more " +"sturdy, but consist of more material. Negative angles cause the base of the " +"support to be wider than the top." +msgstr "" +"錐形支撐的傾斜角度。角度 0 度時為垂直,角度 90 度時為水平。較小的角度會讓支撐" +"更為牢固,但需要更多耗材。負值會讓支撐底座比頂部寬。" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width label" +msgid "Conical Support Minimum Width" +msgstr "錐形支撐最小寬度" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width description" +msgid "" +"Minimum width to which the base of the conical support area is reduced. " +"Small widths can lead to unstable support structures." +msgstr "錐形支撐區域底部的最小寬度。寬度較小可能導致不穩定的支撐結構。" + +#: fdmprinter.def.json +msgctxt "infill_hollow label" +msgid "Hollow Out Objects" +msgstr "挖空模型" + +#: fdmprinter.def.json +msgctxt "infill_hollow description" +msgid "" +"Remove all infill and make the inside of the object eligible for support." +msgstr "移除所有填充並讓模型內部可以進行支撐。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled label" +msgid "Fuzzy Skin" +msgstr "絨毛皮膚" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled description" +msgid "" +"Randomly jitter while printing the outer wall, so that the surface has a " +"rough and fuzzy look." +msgstr "在列印外牆時隨機抖動,使表面具有粗糙和模糊的外觀。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness label" +msgid "Fuzzy Skin Thickness" +msgstr "絨毛皮膚厚度" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness description" +msgid "" +"The width within which to jitter. It's advised to keep this below the outer " +"wall width, since the inner walls are unaltered." +msgstr "進行抖動的寬度。建議讓此值低於外壁寬度,因為內壁不會更改。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density label" +msgid "Fuzzy Skin Density" +msgstr "絨毛皮膚密度" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density description" +msgid "" +"The average density of points introduced on each polygon in a layer. Note " +"that the original points of the polygon are discarded, so a low density " +"results in a reduction of the resolution." +msgstr "" +"在每一層中,每個多邊形上改變的點的平均密度。注意,多邊形的原始點會被捨棄,因" +"此低密度導致解析度降低。" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist label" +msgid "Fuzzy Skin Point Distance" +msgstr "絨毛皮膚距離" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist description" +msgid "" +"The average distance between the random points introduced on each line " +"segment. Note that the original points of the polygon are discarded, so a " +"high smoothness results in a reduction of the resolution. This value must be " +"higher than half the Fuzzy Skin Thickness." +msgstr "" +"在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此" +"高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled label" +msgid "Wire Printing" +msgstr "鐵絲網列印(以下簡稱 WP)" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled description" +msgid "" +"Print only the outside surface with a sparse webbed structure, printing 'in " +"thin air'. This is realized by horizontally printing the contours of the " +"model at given Z intervals which are connected via upward and diagonally " +"downward lines." +msgstr "" +"只列印一個具有稀疏網狀結構的外表面,在“稀疏的空中”列印。這是在给定的 Z 軸間隔" +"內,通過上行線和下行斜線連接,橫向列印模型的輪廓來實現的。" + +#: fdmprinter.def.json +msgctxt "wireframe_height label" +msgid "WP Connection Height" +msgstr "WP 連接高度" + +#: fdmprinter.def.json +msgctxt "wireframe_height description" +msgid "" +"The height of the upward and diagonally downward lines between two " +"horizontal parts. This determines the overall density of the net structure. " +"Only applies to Wire Printing." +msgstr "" +"兩個水平部分之間上行線和下行斜線的高度。這决定網狀結構的整體密度。僅套用於鐵" +"絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset label" +msgid "WP Roof Inset Distance" +msgstr "WP 頂板嵌入距離" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset description" +msgid "" +"The distance covered when making a connection from a roof outline inward. " +"Only applies to Wire Printing." +msgstr "在從頂板輪廓向內進行連接時所覆蓋的距離。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed label" +msgid "WP Speed" +msgstr "WP 速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed description" +msgid "" +"Speed at which the nozzle moves when extruding material. Only applies to " +"Wire Printing." +msgstr "擠出耗材時噴頭移動的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom label" +msgid "WP Bottom Printing Speed" +msgstr "WP 底部列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom description" +msgid "" +"Speed of printing the first layer, which is the only layer touching the " +"build platform. Only applies to Wire Printing." +msgstr "列印第一層的速度,該層是唯一接觸列印平台的層。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up label" +msgid "WP Upward Printing Speed" +msgstr "WP 上升列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up description" +msgid "" +"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgstr "在“稀疏的空中”向上列印線條的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down label" +msgid "WP Downward Printing Speed" +msgstr "WP 下降列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down description" +msgid "" +"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgstr "列印下行斜線的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat label" +msgid "WP Horizontal Printing Speed" +msgstr "WP 水平列印速度" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat description" +msgid "" +"Speed of printing the horizontal contours of the model. Only applies to Wire " +"Printing." +msgstr "列印模型水平輪廓的速度。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow label" +msgid "WP Flow" +msgstr "WP 列印流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value. Only applies to Wire Printing." +msgstr "流量補償:擠出的耗材量乘以此值。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection label" +msgid "WP Connection Flow" +msgstr "WP 連接流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection description" +msgid "Flow compensation when going up or down. Only applies to Wire Printing." +msgstr "向上或向下時的流量補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat label" +msgid "WP Flat Flow" +msgstr "WP 平面流量" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat description" +msgid "" +"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgstr "列印平面線條時的流量補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay label" +msgid "WP Top Delay" +msgstr "WP 頂部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay description" +msgid "" +"Delay time after an upward move, so that the upward line can harden. Only " +"applies to Wire Printing." +msgstr "向上移動後的延遲時間,以便上行線條硬化。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay label" +msgid "WP Bottom Delay" +msgstr "WP 底部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay description" +msgid "Delay time after a downward move. Only applies to Wire Printing." +msgstr "向下移動後的延遲時間。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay label" +msgid "WP Flat Delay" +msgstr "WP 平面延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay description" +msgid "" +"Delay time between two horizontal segments. Introducing such a delay can " +"cause better adhesion to previous layers at the connection points, while too " +"long delays cause sagging. Only applies to Wire Printing." +msgstr "" +"兩個水平部分之間的延遲時間。引入這樣的延遲可以在連接點處與先前的層產生更好的" +"附著,而太長的延遲會引起下垂。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed label" +msgid "WP Ease Upward" +msgstr "WP 輕鬆上行" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed description" +msgid "" +"Distance of an upward move which is extruded with half speed.\n" +"This can cause better adhesion to previous layers, while not heating the " +"material in those layers too much. Only applies to Wire Printing." +msgstr "" +"以半速擠出的上行移動的距離。\n" +"這會與之前的層產生更好的附著,而不會將這些層中的耗材過度加熱。僅套用於鐵絲網" +"列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump label" +msgid "WP Knot Size" +msgstr "WP 紐結大小" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump description" +msgid "" +"Creates a small knot at the top of an upward line, so that the consecutive " +"horizontal layer has a better chance to connect to it. Only applies to Wire " +"Printing." +msgstr "" +"在上行線條的頂部創建一個小紐結,使連續的水平層有更好的機會與其連接。僅套用於" +"鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down label" +msgid "WP Fall Down" +msgstr "WP 倒塌" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down description" +msgid "" +"Distance with which the material falls down after an upward extrusion. This " +"distance is compensated for. Only applies to Wire Printing." +msgstr "耗材在向上擠出後倒塌的距離。將對此距離進行補償。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along label" +msgid "WP Drag Along" +msgstr "WP 拖行" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along description" +msgid "" +"Distance with which the material of an upward extrusion is dragged along " +"with the diagonally downward extrusion. This distance is compensated for. " +"Only applies to Wire Printing." +msgstr "" +"向上擠出耗材與斜向下擠出一起拖動的距離。將對此距離進行補償。僅套用於鐵絲網列" +"印。" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy label" +msgid "WP Strategy" +msgstr "WP 使用策略" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy description" +msgid "" +"Strategy for making sure two consecutive layers connect at each connection " +"point. Retraction lets the upward lines harden in the right position, but " +"may cause filament grinding. A knot can be made at the end of an upward line " +"to heighten the chance of connecting to it and to let the line cool; " +"however, it may require slow printing speeds. Another strategy is to " +"compensate for the sagging of the top of an upward line; however, the lines " +"won't always fall down as predicted." +msgstr "" +"用於確定兩個連續層在每個連接點連接的策略。回抽可讓上行線條在正確的位置硬化," +"但可能導致耗材磨損。紐結可以在上行線條的尾端進行打結以便提高與其連接的幾率," +"並讓線條冷卻;但這會需要較慢的列印速度。另一種策略是補償上行線條頂部的下垂;" +"然而,線條不會總是如預期的那樣下降。" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option compensate" +msgid "Compensate" +msgstr "補償" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option knot" +msgid "Knot" +msgstr "紐結" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option retract" +msgid "Retract" +msgstr "回抽" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down label" +msgid "WP Straighten Downward Lines" +msgstr "WP 拉直下行線條" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down description" +msgid "" +"Percentage of a diagonally downward line which is covered by a horizontal " +"line piece. This can prevent sagging of the top most point of upward lines. " +"Only applies to Wire Printing." +msgstr "" +"水平線條部分所覆蓋的斜下行線條的百分比。這可以防止上行線最頂端點下垂。僅套用" +"於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down label" +msgid "WP Roof Fall Down" +msgstr "WP 頂板倒塌" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down description" +msgid "" +"The distance which horizontal roof lines printed 'in thin air' fall down " +"when being printed. This distance is compensated for. Only applies to Wire " +"Printing." +msgstr "" +"列印時,在“稀疏的空中”列印的水平頂板線條倒塌的距離。將對此距離進行補償。僅套" +"用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along label" +msgid "WP Roof Drag Along" +msgstr "WP 頂板拖行" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along description" +msgid "" +"The distance of the end piece of an inward line which gets dragged along " +"when going back to the outer outline of the roof. This distance is " +"compensated for. Only applies to Wire Printing." +msgstr "" +"向內線的末端在返回至頂板外部輪廓時被拖行的距離。將對此距離進行補償。僅套用於" +"鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay label" +msgid "WP Roof Outer Delay" +msgstr "WP 頂板外部延遲" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay description" +msgid "" +"Time spent at the outer perimeters of hole which is to become a roof. Longer " +"times can ensure a better connection. Only applies to Wire Printing." +msgstr "" +"在成為頂板的孔的外圍花費的時間。較長的時間可確保更好的連接。僅套用於鐵絲網列" +"印。" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance label" +msgid "WP Nozzle Clearance" +msgstr "WP 噴頭間隙" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance description" +msgid "" +"Distance between the nozzle and horizontally downward lines. Larger " +"clearance results in diagonally downward lines with a less steep angle, " +"which in turn results in less upward connections with the next layer. Only " +"applies to Wire Printing." +msgstr "" +"噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的" +"上行連接較少。僅套用於鐵絲網列印。" + +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "啟用燙平" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "" +"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" +"表面。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "只燙平最高層" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "" +"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" +"時間。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "燙平列印樣式" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "用於燙平頂部表面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "燙平線條間距" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "燙平線條之間的距離。" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "燙平流量" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "" +"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" +"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "燙平內嵌" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "" +"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "燙平速度" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "通過頂部表面的速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "燙平加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "執行燙平的加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "燙平加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "執行燙平時的最大瞬時速度變化。" + +#: fdmprinter.def.json +msgctxt "command_line_settings label" +msgid "Command Line Settings" +msgstr "命令行設定" + +#: fdmprinter.def.json +msgctxt "command_line_settings description" +msgid "" +"Settings which are only used if CuraEngine isn't called from the Cura " +"frontend." +msgstr "未從 Cura 前端調用 CuraEngine 時使用的設定。" + +#: fdmprinter.def.json +msgctxt "center_object label" +msgid "Center object" +msgstr "模型置中" + +#: fdmprinter.def.json +msgctxt "center_object description" +msgid "" +"Whether to center the object on the middle of the build platform (0,0), " +"instead of using the coordinate system in which the object was saved." +msgstr "是否將模型放置在列印平台中心 (0,0),而不是使用模型內儲存的座標系統。" + +#: fdmprinter.def.json +msgctxt "mesh_position_x label" +msgid "Mesh position x" +msgstr "網格位置 x" + +#: fdmprinter.def.json +msgctxt "mesh_position_x description" +msgid "Offset applied to the object in the x direction." +msgstr "套用在模型 x 方向上的偏移量。" + +#: fdmprinter.def.json +msgctxt "mesh_position_y label" +msgid "Mesh position y" +msgstr "網格位置 y" + +#: fdmprinter.def.json +msgctxt "mesh_position_y description" +msgid "Offset applied to the object in the y direction." +msgstr "套用在模型 y 方向上的偏移量。" + +#: fdmprinter.def.json +msgctxt "mesh_position_z label" +msgid "Mesh position z" +msgstr "網格位置 z" + +#: fdmprinter.def.json +msgctxt "mesh_position_z description" +msgid "" +"Offset applied to the object in the z direction. With this you can perform " +"what was used to be called 'Object Sink'." +msgstr "" +"套用在模型 z 方向上的偏移量。利用此選項,你可以執行過去被稱為“模型沉降”的操" +"作。" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix label" +msgid "Mesh Rotation Matrix" +msgstr "網格旋轉矩陣" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix description" +msgid "" +"Transformation matrix to be applied to the model when loading it from file." +msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" + +#~ msgctxt "wall_extruder_nr label" +#~ msgid "Wall Extruder" +#~ msgstr "牆壁擠出機" + +#~ msgctxt "wall_extruder_nr description" +#~ msgid "" +#~ "The extruder train used for printing the walls. This is used in multi-" +#~ "extrusion." +#~ msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" + +#~ msgctxt "infill_pattern option tetrahedral" +#~ msgid "Tetrahedral" +#~ msgstr "正四面體" + +#~ msgctxt "expand_skins_into_infill label" +#~ msgid "Expand Skins Into Infill" +#~ msgstr "將表層延伸到填充中" + +#~ msgctxt "expand_skins_into_infill description" +#~ msgid "" +#~ "Expand skin areas of top and/or bottom skin of flat surfaces. By default, " +#~ "skins stop under the wall lines that surround infill but this can lead to " +#~ "holes appearing when the infill density is low. This setting extends the " +#~ "skins beyond the wall lines so that the infill on the next layer rests on " +#~ "skin." +#~ msgstr "" +#~ "延伸平面頂部和/或底部表層的區域。預設情况下,表層會在環繞填充的壁線下方停" +#~ "止,但如果填充密度較低,則可能導致出現孔洞。該設定將表層延展到壁線以外,因" +#~ "此下一層的填充會座落在表層上。" + +#~ msgctxt "expand_upper_skins label" +#~ msgid "Expand Top Skins Into Infill" +#~ msgstr "將頂部表層延伸到填充中" + +#~ msgctxt "expand_upper_skins description" +#~ msgid "" +#~ "Expand the top skin areas (areas with air above) so that they support " +#~ "infill above." +#~ msgstr "延伸頂部表層區域(上方有空氣的區域),讓它們支撐上方的填充。" + +#~ msgctxt "expand_lower_skins label" +#~ msgid "Expand Bottom Skins Into Infill" +#~ msgstr "將底部表層延伸到填充中" + +#~ msgctxt "expand_lower_skins description" +#~ msgid "" +#~ "Expand the bottom skin areas (areas with air below) so that they are " +#~ "anchored by the infill layers above and below." +#~ msgstr "延伸底部表層區域(下方有空氣的區域),讓它們由上下的填充層錨定。" + +#~ msgctxt "support_skip_some_zags label" +#~ msgid "Skip Some ZigZags Connections" +#~ msgstr "跳過部分鋸齒狀連接" + +#~ msgctxt "support_zag_skip_count label" +#~ msgid "ZigZag Connection Skip Count" +#~ msgstr "鋸齒狀連接跳過計數" From 302543cad2f04115508271efba21588adcffa2bd Mon Sep 17 00:00:00 2001 From: Dinow Date: Wed, 22 Nov 2017 23:46:19 +0800 Subject: [PATCH 453/764] update from pot files --- resources/i18n/zh_TW/cura.po | 2029 +++++++++++------- resources/i18n/zh_TW/fdmextruder.def.json.po | 4 +- resources/i18n/zh_TW/fdmprinter.def.json.po | 586 +++-- 3 files changed, 1593 insertions(+), 1026 deletions(-) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 5cf77c1bbe..03be837a5b 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-25 08:53+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -18,68 +18,6 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.0.4\n" -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Print aborted" -msgstr "列印已取消" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Blocked" -msgstr "暫停" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Action required" -msgstr "需要採取的動作" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label:status" -msgid "Can't start print" -msgstr "無法開始列印" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is not set up to host a group of Ultimaker 3 printers." -msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" - -#: Manually added for plugins/UM3NetworkPrinting/PrinterInfoBlock.qml -msgctxt "@label" -msgid "Finishes at: " -msgstr "完成時間:" - -#: Manually added for plugins/UM3NetworkPrinting/DiscoverUM3Action.qml -msgctxt "@label" -msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" - -#: Manually added for -#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Printer '{printer_name}' has finished printing '{job_name}'." -msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" - -#: Manually added for -#: plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py -msgctxt "@info:status" -msgid "Print finished" -msgstr "列印已完成" - -#: Manually added for resources/Cura/Cura.qml -msgctxt "@title:menu menubar:toplevel" -msgid "P&lugins" -msgstr "外掛(&l)" - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Browse plugins..." -msgstr "瀏覽外掛..." - -#: Manually added for resources/Cura/Actions.qml -msgctxt "@action:menu" -msgid "Installed plugins..." -msgstr "安裝外掛..." - #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 msgctxt "@action" msgid "Machine Settings" @@ -117,19 +55,17 @@ msgstr "正在連接 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:840 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:822 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:428 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:367 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:371 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 msgctxt "@action:button" msgid "Cancel" msgstr "取消" @@ -155,8 +91,11 @@ msgid "File sent to Doodle3D Connect" msgstr "檔案已被傳送到 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Open Connect.." msgctxt "@action:button" -msgid "Open Connect.." +msgid "Open Connect..." msgstr "開啟連線..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 @@ -164,7 +103,7 @@ msgctxt "@info:tooltip" msgid "Open the Doodle3D Connect web interface" msgstr "開啟 Doodle3D Connect 的網路介面" -#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 msgctxt "@item:inmenu" msgid "Show Changelog" msgstr "顯示更新日誌" @@ -199,40 +138,44 @@ msgctxt "@info:status" msgid "Connected via USB" msgstr "透過 USB 連接" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:status" msgid "Unable to start a new job because the printer is busy or not connected." msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:153 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +#, fuzzy +#| msgctxt "@label:PrintjobStatus" +#| msgid "Slicing unavailable" msgctxt "@info:title" -msgid "Print Details" -msgstr "列印細項設定" +msgid "Printer Unavailable" +msgstr "切片不可用" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" msgid "" "This printer does not support USB printing because it uses UltiGCode flavor." msgstr "" "此印表機不支援透過 USB 連線列印,因為其使用 UltiGCode 類型的 G-code 檔案。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:title" msgid "USB Printing" msgstr "USB 連線列印" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 msgctxt "@info:status" msgid "" "Unable to start a new job because the printer does not support usb printing." msgstr "無法啟動新作業,因為該印表機不支援 USB 連線列印。" -#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:460 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:909 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1296 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 msgctxt "@info:title" msgid "Warning" msgstr "警告" @@ -296,11 +239,11 @@ msgid "Could not save to removable drive {0}: {1}" msgstr "無法儲存到行動裝置 {0}:{1}" #: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:675 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:683 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:152 -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 msgctxt "@info:title" msgid "Error" msgstr "錯誤" @@ -349,137 +292,115 @@ msgctxt "@item:intext" msgid "Removable Drive" msgstr "行動裝置" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:107 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:49 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "網路連線列印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:108 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:108 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "網路連線列印" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:status" msgid "" "Access to the printer requested. Please approve the request on the printer" msgstr "已發送印表機存取請求,請在印表機上批准該請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 msgctxt "@info:title" msgid "Connection status" msgstr "連線狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 msgctxt "@info:status" msgid "" msgstr "" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:468 -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:500 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 msgctxt "@info:title" msgid "Connection Status" msgstr "連線狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@action:button" msgid "Retry" msgstr "重試" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 msgctxt "@info:tooltip" msgid "Re-send the access request" msgstr "重新發送存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:161 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 msgctxt "@info:status" msgid "Access to the printer accepted" msgstr "印表機接受了存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:162 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:162 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 msgctxt "@info:status" msgid "No access to print with this printer. Unable to send print job." msgstr "無法使用本印表機進行列印,無法發送列印作業。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:28 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:72 msgctxt "@action:button" msgid "Request Access" msgstr "請求存取" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:27 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:71 msgctxt "@info:tooltip" msgid "Send access request to the printer" msgstr "向印表機發送存取請求" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:375 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:364 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 msgctxt "@info:status" msgid "" "Connected over the network. Please approve the access request on the printer." msgstr "已透過網路連接。請在印表機上接受存取請求。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:382 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:371 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 msgctxt "@info:status" msgid "Connected over the network." msgstr "已透過網路連接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:395 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:384 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 msgctxt "@info:status" msgid "Connected over the network. No access to control the printer." msgstr "已透過網路連接,但沒有印表機的控制權限。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:400 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 msgctxt "@info:status" msgid "Access request was denied on the printer." msgstr "存取請求被印表機上拒絕。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:403 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:392 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 msgctxt "@info:status" msgid "Access request failed due to a timeout." msgstr "存取請求超時失敗。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:467 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:456 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 msgctxt "@info:status" msgid "The connection with the network was lost." msgstr "網路連接中斷。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:499 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:487 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 msgctxt "@info:status" msgid "" "The connection with the printer was lost. Check your printer to see if it is " "connected." msgstr "與印表機的連接中斷,請檢查印表機是否已連接。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:649 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:636 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 #, python-format msgctxt "@info:status" msgid "" @@ -487,48 +408,42 @@ msgid "" "%s." msgstr "印表機無法啟動新的列印作業,目前的印表機狀態為 %s。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:650 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 msgctxt "@info:title" msgid "Printer Status" msgstr "印表機狀態" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:674 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:660 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No Printcore loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入列印頭。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:682 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:667 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 #, python-brace-format msgctxt "@info:status" msgid "Unable to start a new print job. No material loaded in slot {0}" msgstr "無法啟動新的列印作業。插槽 {0} 中未載入耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:676 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 #, python-brace-format msgctxt "@label" msgid "Not enough material for spool {0}." msgstr "線軸 {0} 上沒有足夠的耗材。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:686 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 #, python-brace-format msgctxt "@label" msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "不同的列印頭(Cura:{0},印表機: 為擠出機 {2} 選擇了 {1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:716 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 #, python-brace-format msgctxt "@label" msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" msgstr "你為擠出機 {2} 選擇了不同的耗材(Cura:{0},印表機:{1})" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:724 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:708 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 #, python-brace-format msgctxt "@label" msgid "" @@ -536,14 +451,12 @@ msgid "" "performed on the printer." msgstr "列印頭 {0} 未正確校準。需要在印表機上執行 XY 校正。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:729 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:713 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 msgctxt "@label" msgid "Are you sure you wish to print with the selected configuration?" msgstr "你確定要使用所選設定進行列印嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:730 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:714 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 msgctxt "@label" msgid "" "There is a mismatch between the configuration or calibration of the printer " @@ -553,68 +466,65 @@ msgstr "" "印表機的設定或校正與 Cura 之間不匹配。為了獲得最佳列印效果,請使用印表機的列" "印頭和耗材設定進行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:736 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:720 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 msgctxt "@window:title" msgid "Mismatched configuration" msgstr "設定不匹配" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:821 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "前一列印作業傳送中,暫停傳送新列印作業。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:status" msgid "Sending data to printer" msgstr "正在向印表機發送資料" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:839 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 msgctxt "@info:title" msgid "Sending Data" msgstr "發送資料中" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:908 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:890 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 msgctxt "@info:status" msgid "Unable to send data to printer. Is another job still active?" msgstr "無法向印表機發送資料。請確認是否有另一項列印作業正在進行?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1050 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1034 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:198 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 msgctxt "@label:MonitorStatus" msgid "Aborting print..." msgstr "中斷列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1056 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1040 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 msgctxt "@label:MonitorStatus" msgid "Print aborted. Please check the printer" msgstr "列印已中斷。請檢查印表機" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1062 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1046 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 msgctxt "@label:MonitorStatus" msgid "Pausing print..." msgstr "暫停列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1064 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1048 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 msgctxt "@label:MonitorStatus" msgid "Resuming print..." msgstr "繼續列印..." -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1216 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1191 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 msgctxt "@window:title" msgid "Sync with your printer" msgstr "與你的印表機同步" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1218 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1193 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 msgctxt "@label" msgid "Would you like to use your current printer configuration in Cura?" msgstr "你想在 Cura 中使用目前的印表機設定嗎?" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1220 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkPrinterOutputDevice.py:1195 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 msgctxt "@label" msgid "" "The PrintCores and/or materials on your printer differ from those within " @@ -624,18 +534,12 @@ msgstr "" "印表機上的列印頭和/或耗材與目前專案中的不同。為獲得最佳列印效果,請使用目前印" "表機的列印頭和耗材設定進行切片。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.py:19 -msgctxt "@action" -msgid "Connect via Network" -msgstr "透過網路連接" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:103 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 msgid "" "This printer is not set up to host a group of connected Ultimaker 3 printers." msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:104 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 #, python-brace-format msgctxt "Count is number of printers." msgid "" @@ -643,7 +547,7 @@ msgid "" "printers." msgstr "這台印表機是 {count} 台連線的 Ultimaker 3 印表機群組的主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 #, python-brace-format msgid "" "{printer_name} has finished printing '{job_name}'. Please collect the print " @@ -651,7 +555,8 @@ msgid "" msgstr "" "{printer_name} 已完成列印 '{job_name}'。請收起列印件並確認清空列印平台。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:106 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 #, python-brace-format msgid "" "{printer_name} is reserved to print '{job_name}'. Please change the " @@ -660,13 +565,7 @@ msgstr "" "{printer_name} 已為了列印 '{job_name}' 保留。請更改印表機設定配合此列印作業," "以便開始列印。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:196 -msgctxt "@info:status" -msgid "" -"Sending new jobs (temporarily) blocked, still sending the previous print job." -msgstr "前一列印作業傳送中,暫停傳送新列印作業。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:212 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 msgctxt "@info:status" msgid "" "Unable to send new print job: this 3D printer is not (yet) set up to host a " @@ -675,60 +574,87 @@ msgstr "" "無法傳送新的列印作業:這台印表機尚未設定成管理一組連線的 Ultimaker 3 印表機的" "主機。" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:425 -#, python-brace-format -msgctxt "@info:progress" -msgid "Sending {file_name} to group {cluster_name}" -msgstr "傳送 {file_name} 到群組 {cluster_name} 中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:498 -#, python-brace-format -msgctxt "@info:status" -msgid "Sent {file_name} to group {cluster_name}." -msgstr "{file_name} 已傳送到群組 {cluster_name}。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:503 -msgctxt "@action:button" -msgid "Show print jobs" -msgstr "顯示列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:504 -msgctxt "@info:tooltip" -msgid "Opens the print jobs interface in your browser." -msgstr "使用瀏覽器開啟列印作業介面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/NetworkClusterPrinterOutputDevice.py:520 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 #, python-brace-format msgctxt "@info:status" msgid "Unable to send print job to group {cluster_name}." msgstr "無法傳送列印作業到群組 {cluster_name}。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:71 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{file_name} 已傳送到群組 {cluster_name}。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "顯示列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "使用瀏覽器開啟列印作業介面。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "印表機 '{printer_name}' 已完成列印 '{job_name}'。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "列印已完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "需要採取的動作" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "傳送 {file_name} 到群組 {cluster_name} 中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "透過網路連接" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 #, python-brace-format msgctxt "" "@info Don't translate {machine_name}, since it gets replaced by a printer " "name!" msgid "" -"To ensure that your {machine_name} is equipped with the latest features it " -"is recommended to update the firmware regularly. This can be done on the " -"{machine_name} (when connected to the network) or via USB." +"New features are available for your {machine_name}! It is recommended to " +"update the firmware on your printer." msgstr "" -"為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " -"{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:72 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format msgctxt "@info:title The %s gets replaced with the printer name." msgid "New %s firmware available" msgstr "有新 %s 韌體可用" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:73 -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" -msgid "Download" -msgstr "下載" +msgid "How to update" +msgstr "" -#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:83 +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." msgstr "無法存取升級資訊。" @@ -763,7 +689,30 @@ msgctxt "@info:status" msgid "Error while starting %s!" msgstr "啟動 %s 時發生錯誤!" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +#, fuzzy +#| msgctxt "@item:inmenu" +#| msgid "Solid view" +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" +"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" +"(Layers)" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +#, fuzzy +#| msgctxt "name" +#| msgid "Solid View" +msgctxt "@info:title" +msgid "Simulation View" +msgstr "實體檢視" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" msgstr "修改 G-Code 檔案" @@ -795,23 +744,6 @@ msgctxt "@item:inlistbox" msgid "G-code File" msgstr "G-code 檔案" -#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "分層檢視" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:93 -msgctxt "@info:status" -msgid "Cura does not accurately display layers when Wire Printing is enabled" -msgstr "" -"當鐵絲網列印(Wire Printing)功能開啟時,Cura 將無法準確地顯示列印層" -"(Layers)" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:94 -msgctxt "@info:title" -msgid "Layer View" -msgstr "分層檢視" - #: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 msgctxt "@item:inlistbox" msgid "JPG Image" @@ -846,8 +778,9 @@ msgstr "無法使用目前耗材切片,因為它與所選機器或設定不相 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:307 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:316 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 msgctxt "@info:title" msgid "Unable to slice" msgstr "無法切片" @@ -860,13 +793,25 @@ msgid "" "errors: {0}" msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:306 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, fuzzy, python-brace-format +#| msgctxt "@info:status" +#| msgid "" +#| "Unable to slice with the current settings. The following settings have " +#| "errors: {0}" +msgctxt "@info:status" +msgid "" +"Unable to slice due to some per-model settings. The following settings have " +"errors on one or more models: {error_labels}" +msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" msgid "" "Unable to slice because the prime tower or prime position(s) are invalid." msgstr "無法切片(原因:換料塔或主位置無效)。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:315 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 msgctxt "@info:status" msgid "" "Nothing to slice because none of the models fit the build volume. Please " @@ -875,13 +820,13 @@ msgstr "" "沒有模型可進行切片,因為模型超出了列印範圍。請縮放或旋轉模型, 讓模型可置入列" "印範圍。" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:65 -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:status" msgid "Processing Layers" msgstr "正在處理層" -#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:238 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 msgctxt "@info:title" msgid "Information" msgstr "資訊" @@ -896,14 +841,44 @@ msgctxt "@info:tooltip" msgid "Configure Per Model Settings" msgstr "設定對每個模型的單獨設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:165 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:475 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Installed" +msgid "Install" +msgstr "已安裝" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " +"is not set to a directory." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "" +"Failed to install Siemens NX plugin. Could not set environment variable " +"UGII_USER_DIR for Siemens NX." +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 msgctxt "@title:tab" msgid "Recommended" msgstr "推薦" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:480 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 msgctxt "@title:tab" msgid "Custom" msgstr "自訂選項" @@ -914,29 +889,24 @@ msgctxt "@item:inlistbox" msgid "3MF File" msgstr "3MF 檔案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:123 -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1062 +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 msgctxt "@label" msgid "Nozzle" msgstr "噴頭" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:28 -msgctxt "@menuitem" -msgid "Browse plugins" -msgstr "瀏覽外掛" - -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:163 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 #, python-brace-format msgctxt "@info:status" msgid "Failed to get plugin ID from {0}" msgstr "無法從 {0} 取得外掛 ID" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 msgctxt "@info:tile" msgid "Warning" msgstr "警告" -#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:202 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 msgctxt "@window:title" msgid "Plugin browser" msgstr "外掛瀏覽器" @@ -951,18 +921,18 @@ msgctxt "@item:inlistbox" msgid "G File" msgstr "G 檔案" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:254 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 msgctxt "@info:status" msgid "Parsing G-code" msgstr "正在解析 G-code" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:256 -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:370 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 msgctxt "@info:title" msgid "G-code Details" msgstr "G-code 細項設定" -#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:368 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 msgctxt "@info:generic" msgid "" "Make sure the g-code is suitable for your printer and printer configuration " @@ -1008,73 +978,81 @@ msgctxt "@action" msgid "Level build plate" msgstr "調平列印平台" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 msgctxt "@tooltip" msgid "Outer Wall" msgstr "外壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 msgctxt "@tooltip" msgid "Inner Walls" msgstr "內壁" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 msgctxt "@tooltip" msgid "Skin" msgstr "表層" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 msgctxt "@tooltip" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 msgctxt "@tooltip" msgid "Support Infill" msgstr "支撐填充" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 msgctxt "@tooltip" msgid "Support Interface" msgstr "支撐介面" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 msgctxt "@tooltip" msgid "Support" msgstr "支撐" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 msgctxt "@tooltip" msgid "Skirt" msgstr "外圍" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 msgctxt "@tooltip" msgid "Travel" msgstr "移動" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 msgctxt "@tooltip" msgid "Retractions" msgstr "回抽" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 msgctxt "@tooltip" msgid "Other" msgstr "其它" -#: /home/ruben/Projects/Cura/cura/PrintInformation.py:259 +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +#, fuzzy +#| msgctxt "@label" +#| msgid "Unknown" +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format msgctxt "@label" msgid "Pre-sliced file {0}" msgstr "預切片檔案 {0}" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:463 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 msgctxt "@item:material" msgid "No material loaded" msgstr "未載入耗材" -#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:470 +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 msgctxt "@item:material" msgid "Unknown material" msgstr "未知耗材" @@ -1101,13 +1079,13 @@ msgid "Can't Find Location" msgstr "無法找到位置" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:112 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 msgctxt "@title:window" msgid "File Already Exists" msgstr "檔案已經存在" #: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 #, python-brace-format msgctxt "@label Don't translate the XML tag !" msgid "" @@ -1125,14 +1103,28 @@ msgctxt "@label" msgid "Custom Material" msgstr "自訂耗材" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:108 +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +#, fuzzy +#| msgctxt "@action:label" +#| msgid "%1 override" +#| msgid_plural "%1 overrides" +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "%1 覆寫" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" msgid "" "The selected material is incompatible with the selected machine or " "configuration." msgstr "所選耗材與所選機器或設定不相容。" -#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:109 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 #: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 msgctxt "@info:title" msgid "Incompatible Material" @@ -1155,14 +1147,14 @@ msgctxt "@action" msgid "Undo changing the material diameter." msgstr "復原更改耗材直徑。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" "Failed to export profile to {0}: {1}" msgstr "無法將列印參數匯出至 {0}{1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:150 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "" @@ -1170,21 +1162,21 @@ msgid "" "failure." msgstr "無法將列印參數匯出至 {0}:寫入器外掛報告故障。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:155 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Exported profile to {0}" msgstr "列印參數已匯出至:{0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" -msgid "Export Details" -msgstr "匯出細項設定" +msgid "Export succeeded" +msgstr "" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:182 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:204 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:247 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 #, python-brace-format msgctxt "@info:status Don't translate the XML tags or !" msgid "" @@ -1192,30 +1184,30 @@ msgid "" "message>" msgstr "無法從 {0} 匯入列印參數:{1}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:215 -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:251 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 #, python-brace-format msgctxt "@info:status" msgid "Successfully imported profile {0}" msgstr "已成功匯入列印參數 {0}" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:254 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 #, python-brace-format msgctxt "@info:status" msgid "Profile {0} has an unknown file type or is corrupted." msgstr "列印參數 {0} 檔案類型未知或已損壞。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:272 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 msgctxt "@label" msgid "Custom profile" msgstr "自訂列印參數" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:283 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 msgctxt "@info:status" msgid "Profile is missing a quality type." msgstr "列印參數缺少列印品質類型定義。" -#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 #, python-brace-format msgctxt "@info:status" msgid "Could not find a quality type {0} for the current configuration." @@ -1246,46 +1238,124 @@ msgctxt "@info:title" msgid "Placing Object" msgstr "擺放物件中" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:54 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 msgctxt "@title:window" msgid "Crash Report" msgstr "錯誤報告" -#: /home/ruben/Projects/Cura/cura/CrashHandler.py:79 -msgctxt "@label" +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" msgid "" -"

    A fatal exception has occurred that we could not recover from!

    \n" -"

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" -"issues

    \n" -" " +"

    A fatal exception has occurred. Please send us this Crash Report to " +"fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report " +"automatically to our servers

    \n" +" " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +#, fuzzy +#| msgctxt "@info:title" +#| msgid "Information" +msgctxt "@title:groupbox" +msgid "System information" +msgstr "資訊" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +#, fuzzy +#| msgctxt "@label" +#| msgid "Unknown" +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "未知" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " msgstr "" -"

    發生了致命錯誤,我們無法繼續!

    \n" -"

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" -" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 -msgctxt "@action:button" -msgid "Open Web Page" -msgstr "開啟網頁" +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:251 +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +#, fuzzy +#| msgctxt "@label" +#| msgid "Description" +msgctxt "@title:groupbox" +msgid "User description" +msgstr "描述" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" msgid "Loading machines..." msgstr "正在載入印表機..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:619 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 msgctxt "@info:progress" msgid "Setting up scene..." msgstr "正在設定場景..." -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 msgctxt "@info:progress" msgid "Loading interface..." msgstr "正在載入介面…" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:824 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 #, python-format msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be " @@ -1293,93 +1363,98 @@ msgctxt "" msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1295 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" -#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1304 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "" + #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" msgid "Machine Settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:77 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 msgctxt "@title:tab" msgid "Printer" msgstr "印表機" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:96 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 msgctxt "@label" msgid "Printer Settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:107 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 msgctxt "@label" msgid "X (Width)" msgstr "X (寬度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:287 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:839 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 msgctxt "@label" msgid "mm" msgstr "mm" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 msgctxt "@label" msgid "Y (Depth)" msgstr "Y (深度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:127 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 msgctxt "@label" msgid "Z (Height)" msgstr "Z (高度)" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:139 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 msgctxt "@label" msgid "Build plate shape" msgstr "列印平台形狀" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:148 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 msgctxt "@option:check" msgid "Origin at center" msgstr "原點位於中心" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:156 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 msgctxt "@option:check" msgid "Heated bed" msgstr "熱床" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:167 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 msgctxt "@label" msgid "Gcode flavor" msgstr "GCode 類型" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:180 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 msgctxt "@label" msgid "Printhead Settings" msgstr "列印頭設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:190 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 msgctxt "@label" msgid "X min" msgstr "X 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 msgctxt "@tooltip" msgid "" "Distance from the left of the printhead to the center of the nozzle. Used to " @@ -1389,12 +1464,12 @@ msgstr "" "列印頭左側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:200 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 msgctxt "@label" msgid "Y min" msgstr "Y 最小值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 msgctxt "@tooltip" msgid "" "Distance from the front of the printhead to the center of the nozzle. Used " @@ -1404,12 +1479,12 @@ msgstr "" "列印頭前端至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:210 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 msgctxt "@label" msgid "X max" msgstr "X 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 msgctxt "@tooltip" msgid "" "Distance from the right of the printhead to the center of the nozzle. Used " @@ -1419,12 +1494,12 @@ msgstr "" "列印頭右側至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:220 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 msgctxt "@label" msgid "Y max" msgstr "Y 最大值" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 msgctxt "@tooltip" msgid "" "Distance from the rear of the printhead to the center of the nozzle. Used to " @@ -1434,12 +1509,12 @@ msgstr "" "列印頭後部至噴頭中心的距離。用於防止「排隊列印」時之前的列印品與列印頭發生碰" "撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:233 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 msgctxt "@label" msgid "Gantry height" msgstr "龍門高度" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 msgctxt "@tooltip" msgid "" "The height difference between the tip of the nozzle and the gantry system (X " @@ -1449,70 +1524,70 @@ msgstr "" "噴頭尖端與龍門系統(X 軸和 Y 軸)之間的高度差。用於防止「排隊列印」時之前的列" "印品與龍門發生碰撞。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:254 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 msgctxt "@label" msgid "Number of Extruders" msgstr "擠出機數目" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 msgctxt "@tooltip" msgid "" "The nominal diameter of filament supported by the printer. The exact " "diameter will be overridden by the material and/or the profile." msgstr "印表機所支援的耗材直徑。實際列印的耗材直徑由耗材和/或列印參數提供。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:290 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 msgctxt "@label" msgid "Material diameter" msgstr "耗材直徑" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:298 -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:389 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 msgctxt "@label" msgid "Nozzle size" msgstr "噴頭孔徑" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:316 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 msgctxt "@label" msgid "Start Gcode" msgstr "起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:326 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very start." msgstr "將在開始時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:335 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 msgctxt "@label" msgid "End Gcode" msgstr "結束 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:345 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 msgctxt "@tooltip" msgid "Gcode commands to be executed at the very end." msgstr "將在結束時執行的 Gcode 命令。" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:377 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 msgctxt "@label" msgid "Nozzle Settings" msgstr "噴頭設定" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:399 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 msgctxt "@label" msgid "Nozzle offset X" msgstr "噴頭偏移 X" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:411 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 msgctxt "@label" msgid "Nozzle offset Y" msgstr "噴頭偏移 Y" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:432 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 msgctxt "@label" msgid "Extruder Start Gcode" msgstr "擠出機起始 Gcode" -#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:450 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 msgctxt "@label" msgid "Extruder End Gcode" msgstr "擠出機結束 Gcode" @@ -1525,12 +1600,11 @@ msgstr "更新日誌" #: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 #: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:55 -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 #: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:125 -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:146 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 #: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 msgctxt "@action:button" msgid "Close" @@ -1582,13 +1656,11 @@ msgid "Unknown error code: %1" msgstr "未知錯誤代碼: %1" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:55 msgctxt "@title:window" msgid "Connect to Networked Printer" msgstr "連接到網路印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:65 msgctxt "@label" msgid "" "To print directly to your printer over the network, please make sure your " @@ -1605,20 +1677,17 @@ msgstr "" "從以下列表中選擇你的印表機:" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:75 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 msgctxt "@action:button" msgid "Add" msgstr "增加" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:85 msgctxt "@action:button" msgid "Edit" msgstr "編輯" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:96 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 @@ -1627,224 +1696,232 @@ msgid "Remove" msgstr "移除" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:104 #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 msgctxt "@action:button" msgid "Refresh" msgstr "刷新" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:196 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:196 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 msgctxt "@label" msgid "" "If your printer is not listed, read the network printing " "troubleshooting guide" msgstr "如果你的印表機未被列出,請閱讀網路列印故障排除指南" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:223 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:223 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 msgctxt "@label" msgid "Type" msgstr "類型" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:235 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:235 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 msgctxt "@label" msgid "Ultimaker 3" msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:238 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:238 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 msgctxt "@label" msgid "Ultimaker 3 Extended" msgstr "Ultimaker 3 Extended" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:241 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:241 -msgctxt "@label" -msgid "Unknown" -msgstr "未知" - -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:254 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:254 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 msgctxt "@label" msgid "Firmware version" msgstr "韌體版本" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:266 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:266 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 msgctxt "@label" msgid "Address" msgstr "位址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:280 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:297 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "這台印表機未設定成管理一組 Ultimaker 3 印表機的主機。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 msgctxt "@label" msgid "The printer at this address has not yet responded." msgstr "該網路位址的印表機尚無回應。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:285 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:302 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:38 msgctxt "@action:button" msgid "Connect" msgstr "連接" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:299 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:316 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 msgctxt "@title:window" msgid "Printer Address" msgstr "印表機網路位址" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:329 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:346 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 msgctxt "@alabel" msgid "Enter the IP address or hostname of your printer on the network." msgstr "輸入印表機在網路上的 IP 位址或主機名。" -#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:359 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:376 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 msgctxt "@action:button" -msgid "Ok" +msgid "OK" msgstr "確定" +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +#, fuzzy +#| msgctxt "@info:tooltip" +#| msgid "Opens the print jobs page with your default web browser." +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "使用你的預設瀏覽器開啟列印作業頁面。" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "檢視列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "準備列印中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "正在列印" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "可用" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "與印表機的連接中斷" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "保留" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "已完成" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +#, fuzzy +#| msgctxt "@label:MonitorStatus" +#| msgid "Paused" +msgctxt "@label:status" +msgid "Paused" +msgstr "已暫停" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +#, fuzzy +#| msgctxt "@label:" +#| msgid "Resume" +msgctxt "@label:status" +msgid "Resuming" +msgstr "繼續" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "列印已取消" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "不接受列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "完成時間:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "清空列印平台" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "等待設定更動" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "列印作業" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "列印中" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "已排入佇列" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "印表機" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "檢視印表機" + #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:37 msgctxt "@info:tooltip" msgid "Connect to a printer" msgstr "連接到印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:116 msgctxt "@info:tooltip" msgid "Load the configuration of the printer into Cura" msgstr "將印表機設定載入 Cura" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/UM3InfoComponents.qml:117 msgctxt "@action:button" msgid "Activate Configuration" msgstr "啟用設定" -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:284 -msgctxt "@label" -msgid "" -"This printer is not set up to host a group of connected Ultimaker 3 printers" -msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/DiscoverUM3Action.qml:287 -msgctxt "@label" -msgid "" -"This printer is the host for a group of %1 connected Ultimaker 3 printers" -msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:24 -msgctxt "@title:window" -msgid "Print over network" -msgstr "網路連線列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/PrintWindow.qml:92 -msgctxt "@action:button" -msgid "Print" -msgstr "列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:50 -msgctxt "@label: arg 1 is group name" -msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" -msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:311 -msgctxt "@label:status" -msgid "Printing" -msgstr "正在列印" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:315 -msgctxt "@label:status" -msgid "Reserved" -msgstr "保留" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:317 -msgctxt "@label:status" -msgid "Finished" -msgstr "已完成" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:320 -msgctxt "@label:status" -msgid "Preparing" -msgstr "正在準備" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:327 -msgctxt "@label:status" -msgid "Available" -msgstr "可用" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:367 -msgctxt "@label" -msgid "Completed on: " -msgstr "完成時間:" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:371 -msgctxt "@label" -msgid "Clear build plate" -msgstr "清空列印平台" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:375 -msgctxt "@label" -msgid "Preparing to print" -msgstr "準備列印中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterMonitorItem.qml:379 -msgctxt "@label" -msgid "Not accepting print jobs" -msgstr "不接受列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:14 -msgctxt "@info:tooltip" -msgid "Opens the print jobs page with your default web browser." -msgstr "使用你的預設瀏覽器開啟列印作業頁面。" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/OpenPanelButton.qml:15 -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:154 -msgctxt "@action:button" -msgid "View print jobs" -msgstr "檢視列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:36 -msgctxt "@label" -msgid "PRINTER GROUP" -msgstr "印表機群組" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:69 -msgctxt "@title" -msgid "Print jobs" -msgstr "列印作業" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:100 -msgctxt "@label" -msgid "Printing" -msgstr "列印中" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:118 -msgctxt "@label" -msgid "Queued" -msgstr "已排入佇列" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:135 -msgctxt "@label" -msgid "Waiting for configuration change" -msgstr "等待設定更動" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:194 -msgctxt "@label:title" -msgid "Printers" -msgstr "印表機" - -#: /home/ruben/Projects/Cura/plugins/CuraPrintClusterUpload/ClusterControlItem.qml:247 -msgctxt "@action:button" -msgid "View printers" -msgstr "檢視印表機" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 msgctxt "@title:window" msgid "Cura SolidWorks Plugin Configuration" @@ -1870,13 +1947,6 @@ msgctxt "@option:curaSolidworksStlQuality" msgid "Always use Coarse quality" msgstr "總是使用粗糙品質" -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 -#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 -#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 -msgctxt "@action:button" -msgid "OK" -msgstr "確定" - #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 msgctxt "@title:window" msgid "Import SolidWorks File as STL..." @@ -1903,11 +1973,100 @@ msgid "Fine" msgstr "精細" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:81 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 msgctxt "@text:window" msgid "Remember my choice" msgstr "記住我的選擇" +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "顏色方案" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "耗材顏色" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "線條類型" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +#, fuzzy +#| msgctxt "@item:inlistbox" +#| msgid "Layer view" +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "分層檢視" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "相容模式" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "顯示移動軌跡" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "顯示輔助結構" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "顯示外殼" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "顯示填充" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "只顯示頂層" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "顯示頂端 5 層列印細節" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "頂 / 底層" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "內壁" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +#, fuzzy +#| msgctxt "@label" +#| msgid "X min" +msgctxt "@label" +msgid "min" +msgstr "X 最小值" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +#, fuzzy +#| msgctxt "@label" +#| msgid "X max" +msgctxt "@label" +msgid "max" +msgstr "X 最大值" + #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" msgid "Post Processing Plugin" @@ -1918,81 +2077,21 @@ msgctxt "@label" msgid "Post Processing Scripts" msgstr "後處理腳本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 msgctxt "@action" msgid "Add a script" msgstr "添加一個腳本" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 msgctxt "@label" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 msgctxt "@info:tooltip" msgid "Change active post-processing scripts" msgstr "更改目前啟用的後處理腳本" -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:76 -msgctxt "@label" -msgid "Color scheme" -msgstr "顏色方案" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:91 -msgctxt "@label:listbox" -msgid "Material Color" -msgstr "耗材顏色" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:95 -msgctxt "@label:listbox" -msgid "Line Type" -msgstr "線條類型" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:135 -msgctxt "@label" -msgid "Compatibility Mode" -msgstr "相容模式" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:216 -msgctxt "@label" -msgid "Show Travels" -msgstr "顯示移動軌跡" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:222 -msgctxt "@label" -msgid "Show Helpers" -msgstr "顯示輔助結構" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:228 -msgctxt "@label" -msgid "Show Shell" -msgstr "顯示外殼" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:234 -msgctxt "@label" -msgid "Show Infill" -msgstr "顯示填充" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:283 -msgctxt "@label" -msgid "Only Show Top Layers" -msgstr "只顯示頂層" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:292 -msgctxt "@label" -msgid "Show 5 Detailed Layers On Top" -msgstr "顯示頂端 5 層列印細節" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:303 -msgctxt "@label" -msgid "Top / Bottom" -msgstr "頂 / 底層" - -#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.qml:307 -msgctxt "@label" -msgid "Inner Wall" -msgstr "內壁" - #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 msgctxt "@title:window" msgid "Convert Image..." @@ -2090,127 +2189,130 @@ msgctxt "@label:checkbox" msgid "Show all" msgstr "顯示全部" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 msgctxt "@title:window" msgid "Open Project" msgstr "開啟專案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:54 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 msgctxt "@action:ComboBox option" msgid "Update existing" msgstr "更新已有設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:55 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 msgctxt "@action:ComboBox option" msgid "Create new" msgstr "新建" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:66 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:70 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 msgctxt "@action:title" msgid "Summary - Cura Project" msgstr "摘要 - Cura 專案" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:88 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:88 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 msgctxt "@action:label" msgid "Printer settings" msgstr "印表機設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 msgctxt "@info:tooltip" msgid "How should the conflict in the machine be resolved?" msgstr "如何解決機器的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:124 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:97 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 msgctxt "@action:label" msgid "Type" msgstr "類型" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:140 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:197 -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:289 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:112 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 msgctxt "@action:label" msgid "Name" msgstr "名稱" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:161 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:164 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 msgctxt "@action:label" msgid "Profile settings" msgstr "列印參數設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 msgctxt "@info:tooltip" msgid "How should the conflict in the profile be resolved?" msgstr "如何解决列印參數中的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:212 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 msgctxt "@action:label" msgid "Not in profile" msgstr "不在列印參數中" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:217 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:177 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 msgctxt "@action:label" msgid "%1 override" msgid_plural "%1 overrides" msgstr[0] "%1 覆寫" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:228 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 msgctxt "@action:label" msgid "Derivative from" msgstr "衍生自" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:233 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 msgctxt "@action:label" msgid "%1, %2 override" msgid_plural "%1, %2 overrides" msgstr[0] "%1, %2 覆寫" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:249 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 msgctxt "@action:label" msgid "Material settings" msgstr "耗材設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:265 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 msgctxt "@info:tooltip" msgid "How should the conflict in the material be resolved?" msgstr "如何解决耗材的設定衝突?" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:207 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 msgctxt "@action:label" msgid "Setting visibility" msgstr "參數顯示設定" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:317 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 msgctxt "@action:label" msgid "Mode" msgstr "模式" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:332 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:216 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 msgctxt "@action:label" msgid "Visible settings:" msgstr "可見設定:" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:221 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 msgctxt "@action:label" msgid "%1 out of %2" msgstr "%1 / %2" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:363 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 +#, fuzzy +#| msgctxt "@action:warning" +#| msgid "Loading a project will clear all models on the buildplate" msgctxt "@action:warning" -msgid "Loading a project will clear all models on the buildplate" +msgid "Loading a project will clear all models on the build plate." msgstr "載入專案時將清除列印平台上的所有模型" -#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:381 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" msgid "Open" msgstr "開啟" @@ -2235,15 +2337,26 @@ msgctxt "@action:button" msgid "Installed" msgstr "已安裝" +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "下載" + #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 msgctxt "@title:window" msgid "Plugin License Agreement" msgstr "外掛授權協議" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +#, fuzzy +#| msgctxt "@label" +#| msgid "" +#| " plugin contains a license.\n" +#| "You need to accept this license to install this plugin.\n" +#| "Do you agree with the terms below?" msgctxt "@label" msgid "" -" plugin contains a license.\n" +"This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" @@ -2261,6 +2374,14 @@ msgctxt "@action:button" msgid "Decline" msgstr "拒絕" +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +#, fuzzy +#| msgctxt "@title:window" +#| msgid "Plugin License Agreement" +msgctxt "@title:window" +msgid "User Agreement" +msgstr "外掛授權協議" + #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 msgctxt "@title" @@ -2468,30 +2589,25 @@ msgid "Printer does not accept commands" msgstr "印表機不接受命令" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 msgctxt "@label:MonitorStatus" msgid "In maintenance. Please check the printer" msgstr "維護中。請檢查印表機" -#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 -msgctxt "@label:MonitorStatus" -msgid "Lost connection with the printer" -msgstr "與印表機的連接中斷" - #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 msgctxt "@label:MonitorStatus" msgid "Printing..." msgstr "列印中..." #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 msgctxt "@label:MonitorStatus" msgid "Paused" msgstr "已暫停" #: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 msgctxt "@label:MonitorStatus" msgid "Preparing..." msgstr "準備中..." @@ -2709,7 +2825,7 @@ msgid "Unit" msgstr "單位" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:436 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 msgctxt "@title:tab" msgid "General" msgstr "基本" @@ -2961,7 +3077,7 @@ msgid "Send (anonymous) print information" msgstr "(匿名)發送列印資訊" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:441 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 msgctxt "@title:tab" msgid "Printers" msgstr "印表機" @@ -2979,39 +3095,39 @@ msgctxt "@action:button" msgid "Rename" msgstr "重命名" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:151 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 msgctxt "@label" msgid "Printer type:" msgstr "印表機類型:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:160 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 msgctxt "@label" msgid "Connection:" msgstr "連接:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:166 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 msgctxt "@info:status" msgid "The printer is not connected." msgstr "尚未連接到印表機。" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:172 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 msgctxt "@label" msgid "State:" msgstr "狀態:" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 msgctxt "@label:MonitorStatus" msgid "Waiting for someone to clear the build plate" msgstr "等待清空列印平台" -#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:201 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 msgctxt "@label:MonitorStatus" msgid "Waiting for a printjob" msgstr "等待列印作業" #: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:445 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 msgctxt "@title:tab" msgid "Profiles" msgstr "列印參數" @@ -3111,7 +3227,7 @@ msgid "Export Profile" msgstr "匯出列印參數" #: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:443 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 msgctxt "@title:tab" msgid "Materials" msgstr "耗材" @@ -3173,7 +3289,7 @@ msgid "Successfully exported material to %1" msgstr "成功匯出耗材至:%1" #: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:766 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 msgctxt "@title:window" msgid "Add Printer" msgstr "新增印表機" @@ -3193,6 +3309,14 @@ msgctxt "@title:window" msgid "About Cura" msgstr "關於 Cura" +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +#, fuzzy +#| msgctxt "@label %1 is printer name" +#| msgid "Printer: %1" +msgctxt "@label" +msgid "version: %1" +msgstr "印表機:%1" + #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" msgid "End-to-end solution for fused filament 3D printing." @@ -3287,12 +3411,20 @@ msgctxt "@label" msgid "Polygon clipping library" msgstr "多邊形剪輯函式庫" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:136 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +#, fuzzy +#| msgctxt "@label" +#| msgid "Polygon clipping library" +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "多邊形剪輯函式庫" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" msgid "Font" msgstr "字體" -#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 msgctxt "@label" msgid "SVG icons" msgstr "SVG 圖標" @@ -3302,7 +3434,15 @@ msgctxt "@label" msgid "Profile:" msgstr "列印參數:" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:97 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +#, fuzzy +#| msgctxt "@info:title The %s gets replaced with the printer name." +#| msgid "New %s firmware available" +msgctxt "@" +msgid "No Profile Available" +msgstr "有新 %s 韌體可用" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" msgid "" "Some setting/override values are different from the values stored in the " @@ -3314,32 +3454,32 @@ msgstr "" "\n" "點擊開啟列印參數管理器。" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 msgctxt "@label:textbox" msgid "Search..." msgstr "搜尋..." -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 msgctxt "@action:menu" msgid "Copy value to all extruders" msgstr "將設定值複製到所有擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:491 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 msgctxt "@action:menu" msgid "Hide this setting" msgstr "隱藏此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:501 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 msgctxt "@action:menu" msgid "Don't show this setting" msgstr "不再顯示此設定" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:505 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 msgctxt "@action:menu" msgid "Keep this setting visible" msgstr "保持此設定可見" -#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:524 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 msgctxt "@action:menu" msgid "Configure setting visiblity..." msgstr "設定設定可見性..." @@ -3401,12 +3541,12 @@ msgstr "" "\n" "點擊以恢復計算得出的數值。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "Print Setup" msgstr "列印設定" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:118 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 msgctxt "@label:listbox" msgid "" "Print Setup disabled\n" @@ -3415,32 +3555,69 @@ msgstr "" "列印設定已禁用\n" "G-code 檔案無法被修改" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:326 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +#, fuzzy +#| msgctxt "@label" +#| msgid "00h 00min" +msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小時 00 分" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:344 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +#, fuzzy +#| msgctxt "@tooltip" +#| msgid "Time information" msgctxt "@tooltip" -msgid "Time information" +msgid "Time specification
    " + feature + " (in a more verbose language):
    " + feature + ":  %1  %1%
    " msgstr "時間資訊" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:370 -msgctxt "@description" -msgid "Print time" -msgstr "列印時間" - -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:409 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" +msgid "Cost specification" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1" +msgctxt "@label m for meter" +msgid "%1m" +msgstr "%1" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1" +msgctxt "@label g for grams" +msgid "%1g" +msgstr "%1" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1m / ~ %2g / ~ %4 %3" +msgctxt "" +"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " +"print cost" msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:414 -msgctxt "@label" +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +#, fuzzy +#| msgctxt "@label" +#| msgid "%1m / ~ %2g" +msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" msgid "" "Recommended Print Setup

    Print with the recommended settings " @@ -3449,14 +3626,14 @@ msgstr "" "推薦的列印設定

    使用針對所選印表機、耗材和品質的推薦設定進行" "列印。" -#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:481 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 msgctxt "@tooltip" msgid "" "Custom Print Setup

    Print with finegrained control over every " "last bit of the slicing process." msgstr "自訂列印設定
    對切片過程中的每一個細節進行精細控制。" -#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:35 +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 msgctxt "@title:menuitem %1 is the automatically selected material" msgid "Automatic: %1" msgstr "自動:%1" @@ -3466,7 +3643,7 @@ msgctxt "@title:menu menubar:toplevel" msgid "&View" msgstr "檢視(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" msgid "Automatic: %1" msgstr "自動: %1" @@ -3493,13 +3670,13 @@ msgctxt "@title:menu menubar:file" msgid "Open &Recent" msgstr "最近開啟的檔案(&R)" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:33 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 msgctxt "@info:status" msgid "No printer connected" msgstr "沒有連接印表機" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 msgctxt "@label" msgid "Extruder" msgstr "擠出機" @@ -3518,54 +3695,54 @@ msgctxt "@tooltip" msgid "The current temperature of this extruder." msgstr "該擠出機的目前溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:187 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 msgctxt "@tooltip" msgid "The colour of the material in this extruder." msgstr "該擠出機中耗材的顏色。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:219 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 msgctxt "@tooltip" msgid "The material in this extruder." msgstr "該擠出機中的耗材。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:251 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 msgctxt "@tooltip" msgid "The nozzle inserted in this extruder." msgstr "該擠出機所使用的噴頭。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:282 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 msgctxt "@label" msgid "Build plate" msgstr "列印平台" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 msgctxt "@tooltip" msgid "" "The target temperature of the heated bed. The bed will heat up or cool down " "towards this temperature. If this is 0, the bed heating is turned off." msgstr "熱床的目標溫度。熱床將加熱或冷卻至此溫度。若設定為 0,則不使用熱床。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 msgctxt "@tooltip" msgid "The current temperature of the heated bed." msgstr "熱床目前溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:422 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 msgctxt "@tooltip of temperature input" msgid "The temperature to pre-heat the bed to." msgstr "熱床的預熱溫度。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button Cancel pre-heating" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:617 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 msgctxt "@button" msgid "Pre-heat" msgstr "預熱" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:644 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 msgctxt "@tooltip of pre-heat" msgid "" "Heat the bed in advance before printing. You can continue adjusting your " @@ -3575,256 +3752,305 @@ msgstr "" "列印前請預熱熱床。你可以在熱床加熱時繼續調整相關物件,讓你在準備列印時不必等" "待熱床加熱完畢。" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:677 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +#, fuzzy +#| msgctxt "@action:button Preceded by 'Ready to'." +#| msgid "Print over network" +msgctxt "@label" +msgid "Printer control" +msgstr "網路連線列印" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +#, fuzzy +#| msgctxt "@action:button" +#| msgid "Move to Next Position" +msgctxt "@label" +msgid "Jog Position" +msgstr "移動到下一個位置" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" msgid "Active print" msgstr "正在列印" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:682 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 msgctxt "@label" msgid "Job Name" msgstr "作業名稱" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:688 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 msgctxt "@label" msgid "Printing Time" msgstr "列印時間" -#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 msgctxt "@label" msgid "Estimated time left" msgstr "預計剩餘時間" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:67 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 msgctxt "@action:inmenu" msgid "Toggle Fu&ll Screen" msgstr "切換全螢幕(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:74 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "復原(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:84 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "取消復原(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +#, fuzzy +#| msgctxt "@action:inmenu menubar:edit" +#| msgid "Reset All Model Positions" +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "重置所有模型位置" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "設定 Cura…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增印表機(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:115 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理印表機(&I)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理耗材…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用目前設定 / 覆寫更新列印參數(&U)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "捨棄目前更改(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "從目前設定 / 覆寫值創建列印參數(&C)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:156 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理列印參數.." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:163 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "顯示線上說明文件(&D)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 回報(&B)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 msgctxt "@action:inmenu menubar:help" msgid "&About..." msgstr "關於(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 msgctxt "@action:inmenu menubar:edit" msgid "Delete &Selected Model" msgid_plural "Delete &Selected Models" msgstr[0] "刪除所選模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:196 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected Model" msgid_plural "Center Selected Models" msgstr[0] "置中所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:205 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "複製所選模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:214 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "刪除模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:222 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "將模型置中(&N)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:228 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "群組模型(&G)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:238 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "取消模型群組" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:248 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "結合模型(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "複製模型…(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:265 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:edit" msgid "&Select All Models" msgstr "選擇所有模型(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:275 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 msgctxt "@action:inmenu menubar:edit" msgid "&Clear Build Plate" msgstr "清空列印平台(&C)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 msgctxt "@action:inmenu menubar:file" msgid "Re&load All Models" msgstr "重新載入所有模型(&L)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "編位所有的模型" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:302 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "為所選模型編位" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:309 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "重置所有模型位置" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:316 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model &Transformations" msgstr "重置所有模型旋轉(&T)" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "開啟檔案(&O)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:331 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建專案(&N)…" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 msgctxt "@action:inmenu menubar:help" msgid "Show Engine &Log..." msgstr "顯示切片引擎日誌(&L)..." -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:346 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "顯示設定資料夾" -#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:353 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "參數顯示設定..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:26 +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "瀏覽外掛..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "安裝外掛..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 msgctxt "@label:PrintjobStatus" msgid "Please load a 3D model" msgstr "請載入一個 3D 模型" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 msgctxt "@label:PrintjobStatus" msgid "Ready to slice" msgstr "切片已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 msgctxt "@label:PrintjobStatus" msgid "Slicing..." msgstr "正在切片..." -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 msgctxt "@label:PrintjobStatus %1 is target operation" msgid "Ready to %1" msgstr "%1 已準備就緒" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 msgctxt "@label:PrintjobStatus" msgid "Unable to Slice" msgstr "無法切片" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" msgstr "切片不可用" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Prepare" msgstr "準備" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" msgid "Cancel" msgstr "取消" -#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:287 +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 msgctxt "@info:tooltip" msgid "Select the active output device" msgstr "選擇作用中的輸出裝置" #: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:593 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 msgctxt "@title:window" msgid "Open file(s)" msgstr "開啟檔案" @@ -3845,115 +4071,123 @@ msgid "Import all as models" msgstr "匯入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +#, fuzzy +#| msgctxt "@label" +#| msgid "Ultimaker 3" msgctxt "@title:window" -msgid "Cura" -msgstr "Cura" +msgid "Ultimaker Cura" +msgstr "Ultimaker 3" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" msgid "&File" msgstr "檔案(&F)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:102 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 msgctxt "@action:inmenu menubar:file" msgid "&Save Selection to File" msgstr "儲存到檔案(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 msgctxt "@title:menu menubar:file" msgid "Save &As..." msgstr "另存為(&A)…" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:122 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 msgctxt "@title:menu menubar:file" msgid "Save project" msgstr "儲存專案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:145 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" msgstr "編輯(&E)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:162 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 msgctxt "@title:menu" msgid "&View" msgstr "檢視(&V)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 msgctxt "@title:menu" msgid "&Settings" msgstr "設定(&S)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:169 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 msgctxt "@title:menu menubar:toplevel" msgid "&Printer" msgstr "印表機(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:179 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:191 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 msgctxt "@title:menu" msgid "&Material" msgstr "耗材(&M)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:192 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 msgctxt "@title:menu" msgid "&Profile" msgstr "列印參數(&P)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 msgctxt "@action:inmenu" msgid "Set as Active Extruder" msgstr "設為主要擠出機" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:202 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 msgctxt "@title:menu menubar:toplevel" msgid "E&xtensions" msgstr "擴充功能(&X)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:235 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "外掛(&l)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 msgctxt "@title:menu menubar:toplevel" msgid "P&references" msgstr "偏好設定(&R)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:243 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 msgctxt "@title:menu menubar:toplevel" msgid "&Help" msgstr "幫助(&H)" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:325 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 msgctxt "@action:button" msgid "Open File" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 msgctxt "@title:tab" msgid "Settings" msgstr "設定" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:475 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 msgctxt "@title:window" msgid "New project" msgstr "新建專案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:476 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 msgctxt "@info:question" msgid "" "Are you sure you want to start a new project? This will clear the build " "plate and any unsaved settings." msgstr "你確定要開始一個新專案嗎?這將清除列印平台及任何未儲存的設定。" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:694 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 msgctxt "@window:title" msgid "Install Plugin" msgstr "安裝外掛" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:701 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 msgctxt "@title:window" msgid "Open File(s)" msgstr "開啟檔案" -#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:704 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 msgctxt "@text:window" msgid "" "We have found one or more G-Code files within the files you have selected. " @@ -3968,78 +4202,99 @@ msgctxt "@title:window" msgid "Save Project" msgstr "儲存專案" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:134 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 msgctxt "@action:label" msgid "Extruder %1" msgstr "擠出機 %1" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:144 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 msgctxt "@action:label" msgid "%1 & material" msgstr "%1 & 耗材" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:240 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 msgctxt "@action:label" msgid "Don't show project summary on save again" msgstr "儲存時不再顯示專案摘要" -#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:262 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 msgctxt "@action:button" msgid "Save" msgstr "儲存" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:65 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 msgctxt "@title:tab" msgid "Prepare" msgstr "準備" -#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:79 +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 msgctxt "@title:tab" msgid "Monitor" msgstr "監控" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 msgctxt "@label" msgid "Layer Height" msgstr "層高" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:62 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "" +"A custom profile is currently active. To enable the quality slider, choose a " +"default quality profile in Custom tab" +msgstr "" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" msgid "Print Speed" msgstr "列印速度" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:73 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 msgctxt "@label" msgid "Slower" msgstr "更慢" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:85 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 msgctxt "@label" msgid "Faster" msgstr "更快" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:416 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +#, fuzzy +#| msgctxt "@text:window" +#| msgid "" +#| "You have customized some profile settings.\n" +#| "Would you like to keep or discard those settings?" +msgctxt "@tooltip" +msgid "" +"You have modified some profile settings. If you want to change these go to " +"custom mode." +msgstr "" +"你已自訂部份列印參數設定。\n" +"你想保留或捨棄這些設定嗎?" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" msgid "Infill" msgstr "填充" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:590 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 msgctxt "@label" msgid "" "Gradual infill will gradually increase the amount of infill towards the top." msgstr "漸層填充(Gradual infill)將隨著列印高度的提升而逐漸加大填充密度。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:602 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 msgctxt "@label" msgid "Enable gradual" msgstr "啟用漸層" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:668 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 msgctxt "@label" msgid "Generate Support" msgstr "產生支撐" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:702 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 msgctxt "@label" msgid "" "Generate structures to support parts of the model which have overhangs. " @@ -4048,12 +4303,12 @@ msgstr "" "在模型的懸垂(Overhangs)部分產生支撐結構。若不這樣做,這些部分在列印時將倒" "塌。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:718 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 msgctxt "@label" msgid "Support Extruder" msgstr "支撐用擠出機" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:769 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 msgctxt "@label" msgid "" "Select which extruder to use for support. This will build up supporting " @@ -4063,12 +4318,12 @@ msgstr "" "選擇用於支撐的擠出機。該擠出機將在模型之下建立支撐結構,以防止模型下垂或在空" "中列印。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:796 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 msgctxt "@label" msgid "Build Plate Adhesion" msgstr "列印平台附著" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:843 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 msgctxt "@label" msgid "" "Enable printing a brim or raft. This will add a flat area around or under " @@ -4076,7 +4331,7 @@ msgid "" msgstr "" "允許列印邊緣或木筏。這將在你的物件周圍或下方添加一個容易切斷的平面區域。" -#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:883 +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 msgctxt "@label" msgid "" "Need help improving your prints?
    Read the Ultimaker " @@ -4094,19 +4349,19 @@ msgctxt "@title:window" msgid "Open project file" msgstr "開啟專案檔案" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:71 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 msgctxt "@text:window" msgid "" "This is a Cura project file. Would you like to open it as a project or " "import the models from it?" msgstr "這是一個 Cura 專案檔案。你想將其作為一個專案開啟還是從中匯入模型?" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 msgctxt "@action:button" msgid "Open as project" msgstr "作為專案開啟" -#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 msgctxt "@action:button" msgid "Import models" msgstr "匯入模型" @@ -4116,17 +4371,20 @@ msgctxt "@title:window" msgid "Engine Log" msgstr "引擎日誌" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:261 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 msgctxt "@label" msgid "Material" msgstr "耗材" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:374 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +#, fuzzy +#| msgctxt "@label" +#| msgid "Check material compatibility" msgctxt "@label" -msgid "Check material compatibility" +msgid "Check compatibility" msgstr "檢查耗材相容性" -#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:394 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" msgid "Click to check the material compatibility on Ultimaker.com." msgstr "點擊查看 Ultimaker.com 上的耗材相容性。" @@ -4244,11 +4502,6 @@ msgctxt "name" msgid "UM3 Network Connection" msgstr "UM3 網路連接" -#: CuraPrintClusterUpload/plugin.json -msgctxt "name" -msgid "UM3 Network Connection (Cluster)" -msgstr "UM3 網路連接(叢集)" - #: FirmwareUpdateChecker/plugin.json msgctxt "description" msgid "Checks for firmware updates." @@ -4272,6 +4525,22 @@ msgctxt "name" msgid "SolidWorks Integration" msgstr "SolidWorks 集成" +#: SimulationView/plugin.json +#, fuzzy +#| msgctxt "description" +#| msgid "Provides the X-Ray view." +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "提供透視檢視。" + +#: SimulationView/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "Solid View" +msgctxt "name" +msgid "Simulation View" +msgstr "實體檢視" + #: PostProcessingPlugin/plugin.json msgctxt "description" msgid "Extension that allows for user created scripts for post processing" @@ -4332,16 +4601,6 @@ msgctxt "name" msgid "GCode Profile Reader" msgstr "G-code 列印參數讀取器" -#: LayerView/plugin.json -msgctxt "description" -msgid "Provides the Layer view." -msgstr "提供分層檢視。" - -#: LayerView/plugin.json -msgctxt "name" -msgid "Layer View" -msgstr "分層檢視" - #: VersionUpgrade/VersionUpgrade25to26/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." @@ -4362,6 +4621,22 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "升級版本 2.7 到 3.0" +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +#, fuzzy +#| msgctxt "description" +#| msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "Version Upgrade 2.7 to 3.0" +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "升級版本 2.7 到 3.0" + #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." @@ -4422,6 +4697,19 @@ msgctxt "name" msgid "Per Model Settings Tool" msgstr "單一模型設定工具" +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "" + +#: cura-siemensnx-plugin/plugin.json +#, fuzzy +#| msgctxt "name" +#| msgid "SolidWorks Integration" +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "SolidWorks 集成" + #: 3MFReader/plugin.json msgctxt "description" msgid "Provides support for reading 3MF files." @@ -4482,6 +4770,16 @@ msgctxt "name" msgid "3MF Writer" msgstr "3MF 寫入器" +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "" + #: UltimakerMachineActions/plugin.json msgctxt "description" msgid "" @@ -4504,6 +4802,105 @@ msgctxt "name" msgid "Cura Profile Reader" msgstr "Cura 列印參數讀取器" +#~ msgctxt "@label:status" +#~ msgid "Blocked" +#~ msgstr "暫停" + +#~ msgctxt "@label:status" +#~ msgid "Can't start print" +#~ msgstr "無法開始列印" + +#~ msgctxt "@info:title" +#~ msgid "Print Details" +#~ msgstr "列印細項設定" + +#~ msgctxt "" +#~ "@info Don't translate {machine_name}, since it gets replaced by a printer " +#~ "name!" +#~ msgid "" +#~ "To ensure that your {machine_name} is equipped with the latest features " +#~ "it is recommended to update the firmware regularly. This can be done on " +#~ "the {machine_name} (when connected to the network) or via USB." +#~ msgstr "" +#~ "為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " +#~ "{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" + +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "分層檢視" + +#~ msgctxt "@menuitem" +#~ msgid "Browse plugins" +#~ msgstr "瀏覽外掛" + +#~ msgctxt "@info:title" +#~ msgid "Export Details" +#~ msgstr "匯出細項設定" + +#~ msgctxt "@label" +#~ msgid "" +#~ "

    A fatal exception has occurred that we could not recover from!

    \n" +#~ "

    Please use the information below to post a bug report at http://github.com/" +#~ "Ultimaker/Cura/issues

    \n" +#~ " " +#~ msgstr "" +#~ "

    發生了致命錯誤,我們無法繼續!

    \n" +#~ "

    請利用下方資訊回報錯誤到 http://github.com/Ultimaker/Cura/issues

    \n" +#~ " " + +#~ msgctxt "@action:button" +#~ msgid "Open Web Page" +#~ msgstr "開啟網頁" + +#~ msgctxt "@action:button" +#~ msgid "Ok" +#~ msgstr "確定" + +#~ msgctxt "@label" +#~ msgid "" +#~ "This printer is not set up to host a group of connected Ultimaker 3 " +#~ "printers" +#~ msgstr "這台印表機未設定成管理一組連線的 Ultimaker 3 印表機的主機" + +#~ msgctxt "@label" +#~ msgid "" +#~ "This printer is the host for a group of %1 connected Ultimaker 3 printers" +#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" + +#~ msgctxt "@label:status" +#~ msgid "Preparing" +#~ msgstr "正在準備" + +#~ msgctxt "@label" +#~ msgid "Completed on: " +#~ msgstr "完成時間:" + +#~ msgctxt "@label" +#~ msgid "PRINTER GROUP" +#~ msgstr "印表機群組" + +#~ msgctxt "@description" +#~ msgid "Print time" +#~ msgstr "列印時間" + +#~ msgctxt "@title:window" +#~ msgid "Cura" +#~ msgstr "Cura" + +#~ msgctxt "name" +#~ msgid "UM3 Network Connection (Cluster)" +#~ msgstr "UM3 網路連接(叢集)" + +#~ msgctxt "description" +#~ msgid "Provides the Layer view." +#~ msgstr "提供分層檢視。" + +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "分層檢視" + #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" #~ msgstr "透視" @@ -4559,10 +4956,6 @@ msgstr "Cura 列印參數讀取器" #~ msgid "Bed Temperature: %1/%2°C" #~ msgstr "熱床溫度:%1/%2°C" -#~ msgctxt "@label" -#~ msgid "%1" -#~ msgstr "%1" - #~ msgctxt "@label" #~ msgid "View Mode: Layers" #~ msgstr "檢視模式:分層" diff --git a/resources/i18n/zh_TW/fdmextruder.def.json.po b/resources/i18n/zh_TW/fdmextruder.def.json.po index 527342aafb..1b5f351cf9 100644 --- a/resources/i18n/zh_TW/fdmextruder.def.json.po +++ b/resources/i18n/zh_TW/fdmextruder.def.json.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-17 22:13+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index 5fa7bf1ce8..bcac969aa3 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -5,10 +5,10 @@ # msgid "" msgstr "" -"Project-Id-Version: Cura 3.0\n" +"Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-10-31 23:30+0800\n" +"PO-Revision-Date: 2017-11-22 23:36+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -664,6 +664,38 @@ msgid "" "adhesion to the build plate easier." msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台的附著越輕鬆。" +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "" +"How to slice layers with diagonal surfaces. The areas of a layer can be " +"generated based on where the middle of the layer intersects the surface " +"(Middle). Alternatively each layer can have the areas which fall inside of " +"the volume throughout the height of the layer (Exclusive) or a layer has the " +"areas which fall inside anywhere within the layer (Inclusive). Exclusive " +"retains the most details, Inclusive makes for the best fit and Middle takes " +"the least time to process." +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "" + #: fdmprinter.def.json msgctxt "line_width label" msgid "Line Width" @@ -824,6 +856,18 @@ msgctxt "shell description" msgid "Shell" msgstr "外殼" +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "牆壁擠出機" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "" +"The extruder train used for printing the walls. This is used in multi-" +"extrusion." +msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" + #: fdmprinter.def.json msgctxt "wall_0_extruder_nr label" msgid "Outer Wall Extruder" @@ -837,8 +881,11 @@ msgid "" msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "wall_x_extruder_nr label" +#| msgid "Inner Walls Extruder" msgctxt "wall_x_extruder_nr label" -msgid "Inner Walls Extruder" +msgid "Inner Wall Extruder" msgstr "內壁擠出機" #: fdmprinter.def.json @@ -1383,6 +1430,124 @@ msgstr "" "用多個同心線代替頂部/底部列印樣式的最外面部分。使用一條或兩條線可以改善列印在" "填充上的頂板。" +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "啟用燙平" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "" +"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" +"表面。" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "只燙平最高層" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "" +"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" +"時間。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "燙平列印樣式" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "用於燙平頂部表面的列印樣式。" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "同心" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "鋸齒狀" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "燙平線條間距" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "燙平線條之間的距離。" + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "燙平流量" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "" +"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" +"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "燙平內嵌" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "" +"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "燙平速度" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "通過頂部表面的速度。" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "燙平加速度" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "執行燙平的加速度。" + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "燙平加加速度" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "執行燙平時的最大瞬時速度變化。" + #: fdmprinter.def.json msgctxt "infill label" msgid "Infill" @@ -1432,13 +1597,23 @@ msgid "Infill Pattern" msgstr "填充列印樣式" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "infill_pattern description" +#| msgid "" +#| "The pattern of the infill material of the print. The line and zig zag " +#| "infill swap direction on alternate layers, reducing material cost. The " +#| "grid, triangle, cubic, octet, quarter cubic and concentric patterns are " +#| "fully printed every layer. Cubic, quarter cubic and octet infill change " +#| "with every layer to provide a more equal distribution of strength over " +#| "each direction." msgctxt "infill_pattern description" msgid "" "The pattern of the infill material of the print. The line and zig zag infill " "swap direction on alternate layers, reducing material cost. The grid, " -"triangle, cubic, octet, quarter cubic and concentric patterns are fully " -"printed every layer. Cubic, quarter cubic and octet infill change with every " -"layer to provide a more equal distribution of strength over each direction." +"triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " +"patterns are fully printed every layer. Cubic, quarter cubic and octet " +"infill change with every layer to provide a more equal distribution of " +"strength over each direction." msgstr "" "填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" "三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" @@ -1459,6 +1634,11 @@ msgctxt "infill_pattern option triangles" msgid "Triangles" msgstr "三角形" +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "" + #: fdmprinter.def.json msgctxt "infill_pattern option cubic" msgid "Cubic" @@ -1510,11 +1690,19 @@ msgid "Connect Infill Lines" msgstr "連接填充線條" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "zig_zaggify_infill description" +#| msgid "" +#| "Connect the ends where the infill pattern meets the inner wall using a " +#| "lines which follows the shape of the inner wall. Enabling this setting " +#| "can make the infill adhere to the walls better and reduces the effects on " +#| "infill on the quality of vertical surfaces. Disabling this setting " +#| "reduces the amount of material used." msgctxt "zig_zaggify_infill description" msgid "" -"Connect the ends where the infill pattern meets the inner wall using a lines " +"Connect the ends where the infill pattern meets the inner wall using a line " "which follows the shape of the inner wall. Enabling this setting can make " -"the infill adhere to the walls better and reduces the effects on infill on " +"the infill adhere to the walls better and reduce the effects of infill on " "the quality of vertical surfaces. Disabling this setting reduces the amount " "of material used." msgstr "" @@ -1542,6 +1730,32 @@ msgstr "" "統的預設角度(線條和鋸齒狀的列印樣式為 45 和 135 度,其他所有的列印樣式為 45 " "度)。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "z_offset_layer_0 label" +#| msgid "Initial Layer Z Offset" +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "z_offset_layer_0 label" +#| msgid "Initial Layer Z Offset" +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "起始層 Z 軸偏移" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "" + #: fdmprinter.def.json msgctxt "sub_div_rad_add label" msgid "Cubic Subdivision Shell" @@ -1961,6 +2175,35 @@ msgid "" "diameter of the used filament." msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "platform_adhesion description" +#| msgid "Adhesion" +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "附著" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "magic_mesh_surface_mode label" +#| msgid "Surface Mode" +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "表面模式" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "magic_mesh_surface_mode label" +#| msgid "Surface Mode" +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "表面模式" + #: fdmprinter.def.json msgctxt "material_flow label" msgid "Flow" @@ -3407,43 +3650,6 @@ msgid "" "structure." msgstr "連接鋸齒狀。這將增加鋸齒狀支撐結構的强度。" -#: fdmprinter.def.json -msgctxt "support_skip_some_zags label" -msgid "Break Up Support In Chunks" -msgstr "將支撐拆成塊狀" - -#: fdmprinter.def.json -msgctxt "support_skip_some_zags description" -msgid "" -"Skip some support line connections to make the support structure easier to " -"break away. This setting is applicable to the Zig Zag support infill pattern." -msgstr "" -"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm label" -msgid "Support Chunk Size" -msgstr "支撐塊大小" - -#: fdmprinter.def.json -msgctxt "support_skip_zag_per_mm description" -msgid "" -"Leave out a connection between support lines once every N millimeter to make " -"the support structure easier to break away." -msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count label" -msgid "Support Chunk Line Count" -msgstr "支撐塊線條數" - -#: fdmprinter.def.json -msgctxt "support_zag_skip_count description" -msgid "" -"Skip one in every N connection lines to make the support structure easier to " -"break away." -msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" - #: fdmprinter.def.json msgctxt "support_infill_rate label" msgid "Support Density" @@ -4099,10 +4305,17 @@ msgid "Skirt Distance" msgstr "外圍間距" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "skirt_gap description" +#| msgid "" +#| "The horizontal distance between the skirt and the first layer of the " +#| "print.\n" +#| "This is the minimum distance, multiple skirt lines will extend outwards " +#| "from this distance." msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" -"This is the minimum distance, multiple skirt lines will extend outwards from " +"This is the minimum distance. Multiple skirt lines will extend outwards from " "this distance." msgstr "" "外圍和列印第一層之間的水平距離。\n" @@ -4168,36 +4381,6 @@ msgstr "" "僅在模型外部列印邊緣。這會減少你之後需要移除的邊緣量,而不會過度影響列印平台" "附著。" -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 label" -msgid "Initial Layer Z Offset" -msgstr "起始層 Z 軸偏移" - -#: fdmprinter.def.json -msgctxt "z_offset_layer_0 description" -msgid "" -"The extruder is offset from the normal height of the first layer by this " -"amount. It can be positive (raised) or negative (lowered). Some filament " -"types adhere to the build plate better if the extruder is raised slightly." -msgstr "" -"擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下降)。" -"某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers label" -msgid "Z Offset Taper Layers" -msgstr "Z 軸偏移漸減層數" - -#: fdmprinter.def.json -msgctxt "z_offset_taper_layers description" -msgid "" -"When non-zero, the Z offset is reduced to 0 over that many layers. A value " -"of 0 means that the Z offset remains constant for all the layers in the " -"print." -msgstr "" -"當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列印" -"層的 Z 軸偏移量保持為固定值。" - #: fdmprinter.def.json msgctxt "raft_margin label" msgid "Raft Extra Margin" @@ -4219,12 +4402,19 @@ msgid "Raft Smoothing" msgstr "木筏平滑處理" #: fdmprinter.def.json +#, fuzzy +#| msgctxt "raft_smoothing description" +#| msgid "" +#| "This setting control how much inner corners in the raft outline are " +#| "rounded. Inward corners are rounded to a semi circle with a radius equal " +#| "to the value given here. This setting also removes holes in the raft " +#| "outline which are smaller than such a circle." msgctxt "raft_smoothing description" msgid "" -"This setting control how much inner corners in the raft outline are rounded. " -"Inward corners are rounded to a semi circle with a radius equal to the value " -"given here. This setting also removes holes in the raft outline which are " -"smaller than such a circle." +"This setting controls how much inner corners in the raft outline are " +"rounded. Inward corners are rounded to a semi circle with a radius equal to " +"the value given here. This setting also removes holes in the raft outline " +"which are smaller than such a circle." msgstr "" "此設定控制木筏輪廓凹角導圓角的量。向內的轉角會被導為圓弧,其半徑等於此設定" "值。此設定同時可以移除木筏輪廓中半徑小於此設定值的圓孔。" @@ -4798,6 +4988,23 @@ msgstr "" "留那些無法縫合的部分。當其他所有方法都無法產生正確的 GCode 時,該選項應該被用" "作最後手段。" +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "machine_max_acceleration_x label" +#| msgid "Maximum Acceleration X" +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "X 軸最大加速度" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "" +"The minimum size of a line segment after slicing. If you increase this, the " +"mesh will have a lower resolution. This may allow the printer to keep up " +"with the speed it has to process g-code and will increase slice speed by " +"removing details of the mesh that it can't process anyway." +msgstr "" + #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" msgid "Merged Meshes Overlap" @@ -4841,6 +5048,19 @@ msgstr "" "起。關閉此設定將使其中一個網格物體獲得重疊中的所有體積,而從其他網格物體中移" "除。" +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "" +"Remove empty layers beneath the first printed layer if they are present. " +"Disabling this setting can cause empty first layers if the Slicing Tolerance " +"setting is set to Exclusive or Middle." +msgstr "" + #: fdmprinter.def.json msgctxt "blackmagic label" msgid "Special Modes" @@ -5122,6 +5342,43 @@ msgstr "" "最佳化牆壁列印順序以減少回抽的次數和空跑的距離。啟用此功能對大多數是有益的," "但有的可能會花更多的時間。所以請比較有無最佳化的估算時間進行確認。" +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "將支撐拆成塊狀" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "" +"省略支撐的部分連接線,讓支撐結構更容易拆除。此設定適用於鋸齒狀的支撐樣式。" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "支撐塊大小" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "每隔 N 毫米省略一次連接線,讓支撐結構更容易拆除。" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "支撐塊線條數" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "每隔 N 個連接線省略一次,讓支撐結構更容易拆除。" + #: fdmprinter.def.json msgctxt "draft_shield_enabled label" msgid "Enable Draft Shield" @@ -5508,6 +5765,29 @@ msgstr "" "在每個線條部分改變的隨機點之間的平均距離。注意,多邊形的原始點會被捨棄,因此" "高平滑度導致解析度降低。該值必須大於絨毛皮膚厚度的一半。" +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "" + +#: fdmprinter.def.json +#, fuzzy +#| msgctxt "machine_max_feedrate_e description" +#| msgid "The maximum speed of the filament." +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "耗材的最大速度。" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "" + #: fdmprinter.def.json msgctxt "wireframe_enabled label" msgid "Wire Printing" @@ -5848,124 +6128,6 @@ msgstr "" "噴頭和水平下行線之間的距離。較大的間隙會讓斜下行線角度較平緩,進而使第二層的" "上行連接較少。僅套用於鐵絲網列印。" -#: fdmprinter.def.json -msgctxt "ironing_enabled label" -msgid "Enable Ironing" -msgstr "啟用燙平" - -#: fdmprinter.def.json -msgctxt "ironing_enabled description" -msgid "" -"Go over the top surface one additional time, but without extruding material. " -"This is meant to melt the plastic on top further, creating a smoother " -"surface." -msgstr "" -"再一次經過頂部表面,但不擠出耗材。這是為了進一步融化頂部的塑料,打造更平滑的" -"表面。" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer label" -msgid "Iron Only Highest Layer" -msgstr "只燙平最高層" - -#: fdmprinter.def.json -msgctxt "ironing_only_highest_layer description" -msgid "" -"Only perform ironing on the very last layer of the mesh. This saves time if " -"the lower layers don't need a smooth surface finish." -msgstr "" -"只在網格的最後一層進行燙平處理。 如果下層不需要光滑的表面,可啟用此選項以節省" -"時間。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern label" -msgid "Ironing Pattern" -msgstr "燙平列印樣式" - -#: fdmprinter.def.json -msgctxt "ironing_pattern description" -msgid "The pattern to use for ironing top surfaces." -msgstr "用於燙平頂部表面的列印樣式。" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option concentric" -msgid "Concentric" -msgstr "同心" - -#: fdmprinter.def.json -msgctxt "ironing_pattern option zigzag" -msgid "Zig Zag" -msgstr "鋸齒狀" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing label" -msgid "Ironing Line Spacing" -msgstr "燙平線條間距" - -#: fdmprinter.def.json -msgctxt "ironing_line_spacing description" -msgid "The distance between the lines of ironing." -msgstr "燙平線條之間的距離。" - -#: fdmprinter.def.json -msgctxt "ironing_flow label" -msgid "Ironing Flow" -msgstr "燙平流量" - -#: fdmprinter.def.json -msgctxt "ironing_flow description" -msgid "" -"The amount of material, relative to a normal skin line, to extrude during " -"ironing. Keeping the nozzle filled helps filling some of the crevices of the " -"top surface, but too much results in overextrusion and blips on the side of " -"the surface." -msgstr "" -"燙平期間相對於正常表層線條的擠出耗材量。保持噴頭填充狀态有助於填充頂部表面的" -"一些縫隙,但如填充過多則會導致表面上過度擠出和光點。" - -#: fdmprinter.def.json -msgctxt "ironing_inset label" -msgid "Ironing Inset" -msgstr "燙平內嵌" - -#: fdmprinter.def.json -msgctxt "ironing_inset description" -msgid "" -"A distance to keep from the edges of the model. Ironing all the way to the " -"edge of the mesh may result in a jagged edge on your print." -msgstr "" -"與模型邊緣保持的距離。一直燙平至網格的邊緣可能導致列印品出現鋸齒狀邊緣。" - -#: fdmprinter.def.json -msgctxt "speed_ironing label" -msgid "Ironing Speed" -msgstr "燙平速度" - -#: fdmprinter.def.json -msgctxt "speed_ironing description" -msgid "The speed at which to pass over the top surface." -msgstr "通過頂部表面的速度。" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing label" -msgid "Ironing Acceleration" -msgstr "燙平加速度" - -#: fdmprinter.def.json -msgctxt "acceleration_ironing description" -msgid "The acceleration with which ironing is performed." -msgstr "執行燙平的加速度。" - -#: fdmprinter.def.json -msgctxt "jerk_ironing label" -msgid "Ironing Jerk" -msgstr "燙平加加速度" - -#: fdmprinter.def.json -msgctxt "jerk_ironing description" -msgid "The maximum instantaneous velocity change while performing ironing." -msgstr "執行燙平時的最大瞬時速度變化。" - #: fdmprinter.def.json msgctxt "command_line_settings label" msgid "Command Line Settings" @@ -6035,15 +6197,27 @@ msgid "" "Transformation matrix to be applied to the model when loading it from file." msgstr "在將模型從檔案中載入時套用在模型上的轉換矩陣。" -#~ msgctxt "wall_extruder_nr label" -#~ msgid "Wall Extruder" -#~ msgstr "牆壁擠出機" - -#~ msgctxt "wall_extruder_nr description" +#~ msgctxt "z_offset_layer_0 description" #~ msgid "" -#~ "The extruder train used for printing the walls. This is used in multi-" -#~ "extrusion." -#~ msgstr "用於列印牆壁的擠出機組。在多擠出機情況下適用。" +#~ "The extruder is offset from the normal height of the first layer by this " +#~ "amount. It can be positive (raised) or negative (lowered). Some filament " +#~ "types adhere to the build plate better if the extruder is raised slightly." +#~ msgstr "" +#~ "擠出機在第一層從正常高度偏移了此設定量。它可以是正值(上升)或負值(下" +#~ "降)。某些耗材類型在擠出機稍微上升情況下,會更好地附著在列印平台上。" + +#~ msgctxt "z_offset_taper_layers label" +#~ msgid "Z Offset Taper Layers" +#~ msgstr "Z 軸偏移漸減層數" + +#~ msgctxt "z_offset_taper_layers description" +#~ msgid "" +#~ "When non-zero, the Z offset is reduced to 0 over that many layers. A " +#~ "value of 0 means that the Z offset remains constant for all the layers in " +#~ "the print." +#~ msgstr "" +#~ "當此值不為 0 時,Z 軸偏移量在經過此層數時逐漸降為 0。此值設為 0 表示所有列" +#~ "印層的 Z 軸偏移量保持為固定值。" #~ msgctxt "infill_pattern option tetrahedral" #~ msgid "Tetrahedral" From 4c1024fcc2dfaf01566cea00f41bbb5e7100aa24 Mon Sep 17 00:00:00 2001 From: Dinow Date: Sat, 25 Nov 2017 00:31:48 +0800 Subject: [PATCH 454/764] Update fdmprinter for 3.1 --- resources/i18n/zh_TW/fdmprinter.def.json.po | 108 ++++++-------------- 1 file changed, 31 insertions(+), 77 deletions(-) diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index bcac969aa3..2be6fbeefe 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-22 23:36+0800\n" +"PO-Revision-Date: 2017-11-25 00:31+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -667,7 +667,7 @@ msgstr "起始層高(以毫米為單位)。起始層越厚,與列印平台 #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "切片公差" #: fdmprinter.def.json msgctxt "slicing_tolerance description" @@ -680,21 +680,25 @@ msgid "" "retains the most details, Inclusive makes for the best fit and Middle takes " "the least time to process." msgstr "" +"如何使用傾斜的外表切片。可以使用層高的中間與外表相交產生的截面(中間)。也可" +"以使用該層高完全不超出模型體積的區域(排除),或是該層高的模型投影區域(包" +"含)。「排除」保留最多的細節,「包含」有最符合的外形,而「中間」花最少的運算" +"時間。" #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "中間" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "排除" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "包含" #: fdmprinter.def.json msgctxt "line_width label" @@ -881,9 +885,6 @@ msgid "" msgstr "用於列印外壁的擠出機組。在多擠出機情況下適用。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "wall_x_extruder_nr label" -#| msgid "Inner Walls Extruder" msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" msgstr "內壁擠出機" @@ -1597,15 +1598,6 @@ msgid "Infill Pattern" msgstr "填充列印樣式" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "infill_pattern description" -#| msgid "" -#| "The pattern of the infill material of the print. The line and zig zag " -#| "infill swap direction on alternate layers, reducing material cost. The " -#| "grid, triangle, cubic, octet, quarter cubic and concentric patterns are " -#| "fully printed every layer. Cubic, quarter cubic and octet infill change " -#| "with every layer to provide a more equal distribution of strength over " -#| "each direction." msgctxt "infill_pattern description" msgid "" "The pattern of the infill material of the print. The line and zig zag infill " @@ -1616,8 +1608,9 @@ msgid "" "strength over each direction." msgstr "" "填充耗材的樣式。線條和鋸齒狀填充輪流在每一層交換方向,以降低耗材成本。網格、" -"三角形、立方體、八面體、四分立方體和同心的列印樣式在每層完整列印。立方體、四" -"分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强度分布。" +"三角形、三-六邊形、立方體、八面體、四分立方體、十字形和同心的列印樣式在每層完" +"整列印。立方體、四分立方體和八面體填充隨每層變化,以在各個方向提供更均衡的强" +"度分布。" #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1637,7 +1630,7 @@ msgstr "三角形" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "三-六邊形" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1690,14 +1683,6 @@ msgid "Connect Infill Lines" msgstr "連接填充線條" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "zig_zaggify_infill description" -#| msgid "" -#| "Connect the ends where the infill pattern meets the inner wall using a " -#| "lines which follows the shape of the inner wall. Enabling this setting " -#| "can make the infill adhere to the walls better and reduces the effects on " -#| "infill on the quality of vertical surfaces. Disabling this setting " -#| "reduces the amount of material used." msgctxt "zig_zaggify_infill description" msgid "" "Connect the ends where the infill pattern meets the inner wall using a line " @@ -1731,30 +1716,24 @@ msgstr "" "度)。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "z_offset_layer_0 label" -#| msgid "Initial Layer Z Offset" msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "起始層 Z 軸偏移" +msgstr "填充 X 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "填充樣式在 X 軸方向偏移此距離。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "z_offset_layer_0 label" -#| msgid "Initial Layer Z Offset" msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "起始層 Z 軸偏移" +msgstr "填充 Y 軸偏移" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "填充樣式在 Y 軸方向偏移此距離。" #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -2176,33 +2155,24 @@ msgid "" msgstr "調整所使用耗材的直徑。這個數值要等同於所使用耗材的直徑。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "platform_adhesion description" -#| msgid "Adhesion" msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "附著" +msgstr "附著趨勢" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "表面附著趨勢。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "magic_mesh_surface_mode label" -#| msgid "Surface Mode" msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "表面模式" +msgstr "表面能量" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "magic_mesh_surface_mode label" -#| msgid "Surface Mode" msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "表面模式" +msgstr "表面能量。" #: fdmprinter.def.json msgctxt "material_flow label" @@ -4305,13 +4275,6 @@ msgid "Skirt Distance" msgstr "外圍間距" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "skirt_gap description" -#| msgid "" -#| "The horizontal distance between the skirt and the first layer of the " -#| "print.\n" -#| "This is the minimum distance, multiple skirt lines will extend outwards " -#| "from this distance." msgctxt "skirt_gap description" msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" @@ -4402,13 +4365,6 @@ msgid "Raft Smoothing" msgstr "木筏平滑處理" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "raft_smoothing description" -#| msgid "" -#| "This setting control how much inner corners in the raft outline are " -#| "rounded. Inward corners are rounded to a semi circle with a radius equal " -#| "to the value given here. This setting also removes holes in the raft " -#| "outline which are smaller than such a circle." msgctxt "raft_smoothing description" msgid "" "This setting controls how much inner corners in the raft outline are " @@ -4989,12 +4945,9 @@ msgstr "" "作最後手段。" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "machine_max_acceleration_x label" -#| msgid "Maximum Acceleration X" msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "X 軸最大加速度" +msgstr "最高解析度" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" @@ -5004,6 +4957,8 @@ msgid "" "with the speed it has to process g-code and will increase slice speed by " "removing details of the mesh that it can't process anyway." msgstr "" +"切片後線段的最小尺寸。 如果你增加此設定值,網格的解析度將較低。 這允許印表機" +"保持處理 G-code 的速度,並通過移除無法處理的網格細節來增加切片速度。" #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -5051,7 +5006,7 @@ msgstr "" #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "移除空的第一層" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" @@ -5060,6 +5015,8 @@ msgid "" "Disabling this setting can cause empty first layers if the Slicing Tolerance " "setting is set to Exclusive or Middle." msgstr "" +"如果可列印的第一層下方有空的層,將其移除。假如「切片公差」設定為「排除」或" +"「中間」,關閉此設定可能會導致空的第一層。" #: fdmprinter.def.json msgctxt "blackmagic label" @@ -5768,25 +5725,22 @@ msgstr "" #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "流量補償的最大擠出偏移量" #: fdmprinter.def.json -#, fuzzy -#| msgctxt "machine_max_feedrate_e description" -#| msgid "The maximum speed of the filament." msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "耗材的最大速度。" +msgstr "最大補償距離(以毫米為單位)。" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "流量補償因子" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "流量倍率 -> 移動距離。" #: fdmprinter.def.json msgctxt "wireframe_enabled label" From c5baabd8a3773a7e1b486ce8e4ce04d914c5da81 Mon Sep 17 00:00:00 2001 From: Dinow Date: Mon, 27 Nov 2017 23:16:14 +0800 Subject: [PATCH 455/764] Update cura.po for 3.1 --- resources/i18n/zh_TW/cura.po | 269 ++++++++++------------------------- 1 file changed, 74 insertions(+), 195 deletions(-) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 03be837a5b..b17800b6f6 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.1\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2017-08-02 16:53+0000\n" -"PO-Revision-Date: 2017-11-22 23:36+0800\n" +"PO-Revision-Date: 2017-11-28 23:48+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: TEAM\n" "Language: zh_TW\n" @@ -91,9 +91,6 @@ msgid "File sent to Doodle3D Connect" msgstr "檔案已被傳送到 Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Open Connect.." msgctxt "@action:button" msgid "Open Connect..." msgstr "開啟連線..." @@ -144,12 +141,9 @@ msgid "Unable to start a new job because the printer is busy or not connected." msgstr "無法啟動新作業,因為印表機處於忙碌狀態或未連接。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 -#, fuzzy -#| msgctxt "@label:PrintjobStatus" -#| msgid "Slicing unavailable" msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "切片不可用" +msgstr "印表機無法使用" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -641,7 +635,7 @@ msgctxt "" msgid "" "New features are available for your {machine_name}! It is recommended to " "update the firmware on your printer." -msgstr "" +msgstr "你的 {machine_name} 有新功能可用!建議更新印表機韌體。" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -652,12 +646,12 @@ msgstr "有新 %s 韌體可用" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "如何更新" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" msgid "Could not access update information." -msgstr "無法存取升級資訊。" +msgstr "無法存取更新資訊。" #: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 msgctxt "@info:status" @@ -690,12 +684,9 @@ msgid "Error while starting %s!" msgstr "啟動 %s 時發生錯誤!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 -#, fuzzy -#| msgctxt "@item:inmenu" -#| msgid "Solid view" msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "實體檢視" +msgstr "模擬檢視" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -705,12 +696,9 @@ msgstr "" "(Layers)" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 -#, fuzzy -#| msgctxt "name" -#| msgid "Solid View" msgctxt "@info:title" msgid "Simulation View" -msgstr "實體檢視" +msgstr "模擬檢視" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -794,16 +782,13 @@ msgid "" msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 -#, fuzzy, python-brace-format -#| msgctxt "@info:status" -#| msgid "" -#| "Unable to slice with the current settings. The following settings have " -#| "errors: {0}" +#, python-brace-format msgctxt "@info:status" msgid "" "Unable to slice due to some per-model settings. The following settings have " "errors on one or more models: {error_labels}" -msgstr "無法使用目前設定進行切片。以下設定存在錯誤:{0}" +msgstr "" +"因部份模型設定問題無法進行切片。部份模型的下列設定有錯誤:{error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -842,34 +827,34 @@ msgid "Configure Per Model Settings" msgstr "設定對每個模型的單獨設定" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Installed" msgid "Install" -msgstr "已安裝" +msgstr "安裝" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "" "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " "is not set to a directory." msgstr "" +"無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR,它沒有設置到正確的目" +"錄。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Siemens NX Cura 外掛已成功安裝。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "" "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "無法複製 Siemens NX 外掛檔案。請檢查你的 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "" "Failed to install Siemens NX plugin. Could not set environment variable " "UGII_USER_DIR for Siemens NX." msgstr "" +"無法安裝 Siemens NX 外掛。無法為 Siemens NX 設定環境變數 UGII_USER_DIR。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -1034,9 +1019,6 @@ msgid "Other" msgstr "其它" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 -#, fuzzy -#| msgctxt "@label" -#| msgid "Unknown" msgctxt "@label unknown material" msgid "Unknown" msgstr "未知" @@ -1106,16 +1088,12 @@ msgstr "自訂耗材" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "整體" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 -#, fuzzy -#| msgctxt "@action:label" -#| msgid "%1 override" -#| msgid_plural "%1 overrides" msgctxt "@menuitem" msgid "Not overridden" -msgstr "%1 覆寫" +msgstr "不覆寫" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1171,7 +1149,7 @@ msgstr "列印參數已匯出至:{0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "匯出成功" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1252,19 +1230,16 @@ msgid "" "automatically to our servers

    \n" " " msgstr "" +"

    程式發生了致命異常。請將錯誤報告傳送給我們以解決這個問題

    \n" +"

    請使用「送出報告」按鈕將錯誤報告自動發送到我們的伺服器

    \n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 -#, fuzzy -#| msgctxt "@info:title" -#| msgid "Information" msgctxt "@title:groupbox" msgid "System information" -msgstr "資訊" +msgstr "系統資訊" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 -#, fuzzy -#| msgctxt "@label" -#| msgid "Unknown" msgctxt "@label unknown version of Cura" msgid "Unknown" msgstr "未知" @@ -1273,72 +1248,69 @@ msgstr "未知" #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Cura 版本: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "平台: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Qt 版本: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "PyQt 版本: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • OpenGL 版本:{version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • OpenGL 供應商:{vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • OpenGL 渲染器:{renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "異常追溯" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "日誌" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 -#, fuzzy -#| msgctxt "@label" -#| msgid "Description" msgctxt "@title:groupbox" msgid "User description" -msgstr "描述" +msgstr "使用者描述" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "送出報告" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1378,7 +1350,7 @@ msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過 #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "選擇的模型太小無法載入。" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1788,12 +1760,9 @@ msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" msgstr "%1 未設定成管理一組連線的 Ultimaker 3 印表機的主機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 -#, fuzzy -#| msgctxt "@info:tooltip" -#| msgid "Opens the print jobs page with your default web browser." msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "使用你的預設瀏覽器開啟列印作業頁面。" +msgstr "使用預設瀏覽器開啟列印作業頁面。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1828,7 +1797,7 @@ msgstr "與印表機的連接中斷" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "已關閉" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1841,17 +1810,11 @@ msgid "Finished" msgstr "已完成" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 -#, fuzzy -#| msgctxt "@label:MonitorStatus" -#| msgid "Paused" msgctxt "@label:status" msgid "Paused" msgstr "已暫停" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 -#, fuzzy -#| msgctxt "@label:" -#| msgid "Resume" msgctxt "@label:status" msgid "Resuming" msgstr "繼續" @@ -1890,7 +1853,7 @@ msgstr "列印作業" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 msgctxt "@label" msgid "Printing" -msgstr "列印中" +msgstr "已排入佇列" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 msgctxt "@label" @@ -1996,15 +1959,12 @@ msgstr "線條類型" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "進給率" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 -#, fuzzy -#| msgctxt "@item:inlistbox" -#| msgid "Layer view" msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "分層檢視" +msgstr "層厚" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -2052,20 +2012,14 @@ msgid "Inner Wall" msgstr "內壁" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 -#, fuzzy -#| msgctxt "@label" -#| msgid "X min" msgctxt "@label" msgid "min" -msgstr "X 最小值" +msgstr "最小值" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 -#, fuzzy -#| msgctxt "@label" -#| msgid "X max" msgctxt "@label" msgid "max" -msgstr "X 最大值" +msgstr "最大值" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2305,12 +2259,9 @@ msgid "%1 out of %2" msgstr "%1 / %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 -#, fuzzy -#| msgctxt "@action:warning" -#| msgid "Loading a project will clear all models on the buildplate" msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "載入專案時將清除列印平台上的所有模型" +msgstr "載入專案時將清除列印平台上的所有模型。" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2348,19 +2299,13 @@ msgid "Plugin License Agreement" msgstr "外掛授權協議" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 -#, fuzzy -#| msgctxt "@label" -#| msgid "" -#| " plugin contains a license.\n" -#| "You need to accept this license to install this plugin.\n" -#| "Do you agree with the terms below?" msgctxt "@label" msgid "" "This plugin contains a license.\n" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" -" 外掛內含一份授權\n" +"外掛內含一份授權協議。\n" "你必需同意此份授權協議才能安裝此外掛。\n" "是否同意下列條款?" @@ -2375,12 +2320,9 @@ msgid "Decline" msgstr "拒絕" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 -#, fuzzy -#| msgctxt "@title:window" -#| msgid "Plugin License Agreement" msgctxt "@title:window" msgid "User Agreement" -msgstr "外掛授權協議" +msgstr "使用者授權" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -3310,12 +3252,9 @@ msgid "About Cura" msgstr "關於 Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 -#, fuzzy -#| msgctxt "@label %1 is printer name" -#| msgid "Printer: %1" msgctxt "@label" msgid "version: %1" -msgstr "印表機:%1" +msgstr "版本:%1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3412,12 +3351,9 @@ msgid "Polygon clipping library" msgstr "多邊形剪輯函式庫" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 -#, fuzzy -#| msgctxt "@label" -#| msgid "Polygon clipping library" msgctxt "@Label" msgid "Python HTTP library" -msgstr "多邊形剪輯函式庫" +msgstr "Python HTTP 函式庫" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3435,12 +3371,9 @@ msgid "Profile:" msgstr "列印參數:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 -#, fuzzy -#| msgctxt "@info:title The %s gets replaced with the printer name." -#| msgid "New %s firmware available" msgctxt "@" msgid "No Profile Available" -msgstr "有新 %s 韌體可用" +msgstr "無可用的列印參數" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3552,57 +3485,42 @@ msgid "" "Print Setup disabled\n" "G-code files cannot be modified" msgstr "" -"列印設定已禁用\n" +"列印設定已關閉\n" "G-code 檔案無法被修改" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 -#, fuzzy -#| msgctxt "@label" -#| msgid "00h 00min" msgctxt "@label Hours and minutes" msgid "00h 00min" msgstr "00 小時 00 分" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 -#, fuzzy -#| msgctxt "@tooltip" -#| msgid "Time information" msgctxt "@tooltip" msgid "Time specification
    " -msgstr "時間資訊" +msgstr "時間資訊
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "成本明細" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1" msgctxt "@label m for meter" msgid "%1m" -msgstr "%1" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1" msgctxt "@label g for grams" msgid "%1g" -msgstr "%1" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "總共:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1m / ~ %2g / ~ %4 %3" msgctxt "" "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " "print cost" @@ -3610,9 +3528,6 @@ msgid "%1m / ~ %2g / ~ %4 %3" msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 -#, fuzzy -#| msgctxt "@label" -#| msgid "%1m / ~ %2g" msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" msgstr "%1m / ~ %2g" @@ -3753,35 +3668,29 @@ msgstr "" "待熱床加熱完畢。" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 -#, fuzzy -#| msgctxt "@action:button Preceded by 'Ready to'." -#| msgid "Print over network" msgctxt "@label" msgid "Printer control" -msgstr "網路連線列印" +msgstr "印表機控制" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 -#, fuzzy -#| msgctxt "@action:button" -#| msgid "Move to Next Position" msgctxt "@label" msgid "Jog Position" -msgstr "移動到下一個位置" +msgstr "輕搖位置" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "輕搖距離" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3824,12 +3733,9 @@ msgid "&Quit" msgstr "退出(&Q)" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 -#, fuzzy -#| msgctxt "@action:inmenu menubar:edit" -#| msgid "Reset All Model Positions" msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "重置所有模型位置" +msgstr "重置視角位置" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -4032,7 +3938,7 @@ msgstr "無法切片" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 msgctxt "@label:PrintjobStatus" msgid "Slicing unavailable" -msgstr "切片不可用" +msgstr "切片無法使用" #: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 msgctxt "@label:Printjob" @@ -4071,12 +3977,9 @@ msgid "Import all as models" msgstr "匯入所有模型" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 -#, fuzzy -#| msgctxt "@label" -#| msgid "Ultimaker 3" msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "Ultimaker 3" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -4243,6 +4146,7 @@ msgid "" "A custom profile is currently active. To enable the quality slider, choose a " "default quality profile in Custom tab" msgstr "" +"目前正使用自訂列印參數。若要使用品質滑動條,在自訂分頁中選擇預設的列印參數" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -4260,18 +4164,11 @@ msgid "Faster" msgstr "更快" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 -#, fuzzy -#| msgctxt "@text:window" -#| msgid "" -#| "You have customized some profile settings.\n" -#| "Would you like to keep or discard those settings?" msgctxt "@tooltip" msgid "" "You have modified some profile settings. If you want to change these go to " "custom mode." -msgstr "" -"你已自訂部份列印參數設定。\n" -"你想保留或捨棄這些設定嗎?" +msgstr "你修改過部份列印參數設定。如果你想改變這些設定,請切換到自訂模式。" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4377,9 +4274,6 @@ msgid "Material" msgstr "耗材" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 -#, fuzzy -#| msgctxt "@label" -#| msgid "Check material compatibility" msgctxt "@label" msgid "Check compatibility" msgstr "檢查耗材相容性" @@ -4523,23 +4417,17 @@ msgstr "" #: CuraSolidWorksPlugin/plugin.json msgctxt "name" msgid "SolidWorks Integration" -msgstr "SolidWorks 集成" +msgstr "SolidWorks 整合" #: SimulationView/plugin.json -#, fuzzy -#| msgctxt "description" -#| msgid "Provides the X-Ray view." msgctxt "description" msgid "Provides the Simulation view." -msgstr "提供透視檢視。" +msgstr "提供模擬檢視。" #: SimulationView/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "Solid View" msgctxt "name" msgid "Simulation View" -msgstr "實體檢視" +msgstr "模擬檢視" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4622,20 +4510,14 @@ msgid "Version Upgrade 2.7 to 3.0" msgstr "升級版本 2.7 到 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json -#, fuzzy -#| msgctxt "description" -#| msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "將設定從 Cura 2.7 版本升級至 3.0 版本。" +msgstr "將設定從 Cura 3.0 版本升級至 3.1 版本。" #: VersionUpgrade/VersionUpgrade30to31/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "Version Upgrade 2.7 to 3.0" msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "升級版本 2.7 到 3.0" +msgstr "升級版本 3.0 到 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4700,15 +4582,12 @@ msgstr "單一模型設定工具" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "協助你在 Siemens NX 中安裝一個「匯出到 Cura」按鈕。" #: cura-siemensnx-plugin/plugin.json -#, fuzzy -#| msgctxt "name" -#| msgid "SolidWorks Integration" msgctxt "name" msgid "Siemens NX Integration" -msgstr "SolidWorks 集成" +msgstr "Siemens NX 整合" #: 3MFReader/plugin.json msgctxt "description" @@ -4773,12 +4652,12 @@ msgstr "3MF 寫入器" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "詢問使用者是否同意我們的授權協議" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "使用者授權" #: UltimakerMachineActions/plugin.json msgctxt "description" From e3b7bbb6bd1ad808992e557c7090acfc8d38815a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 14:43:41 +0100 Subject: [PATCH 456/764] Fix whitespace at the end Otherwise gettext will complain that one of them ends with \n but the other doesn't. Contributes to issue CURA-4601. --- resources/i18n/es_ES/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 48459b5746..7b4a343be4 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -1137,7 +1137,7 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n" +msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" From a425a1c51bf2ce6ee72620c76bc85778f60ee1a6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 1 Dec 2017 14:56:06 +0100 Subject: [PATCH 457/764] Fix legacy profile loading CURA-4075 --- plugins/LegacyProfileReader/LegacyProfileReader.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index ca04ec4b36..369bdd6cf0 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -151,6 +151,9 @@ class LegacyProfileReader(ProfileReader): data = profile.serialize() parser.read_string(data) parser["general"]["version"] = "1" + if parser.has_section("values"): + parser["settings"] = parser["values"] + del parser["values"] stream = io.StringIO() parser.write(stream) data = stream.getvalue() From 7068f6c28c3676b6a99f490c34393b5d01d72c00 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 14:43:41 +0100 Subject: [PATCH 458/764] Fix whitespace at the end Otherwise gettext will complain that one of them ends with \n but the other doesn't. Contributes to issue CURA-4601. --- resources/i18n/es_ES/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 48459b5746..7b4a343be4 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -1137,7 +1137,7 @@ msgid "" "

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    \n" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " -msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n" +msgstr "

    Se ha producido una excepción fatal. Envíenos este informe de errores para que podamos solucionar el problema.

    \n

    Utilice el botón «Enviar informe» para publicar automáticamente un informe de errores en nuestros servidores.

    \n " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" From 62185a8ef0757257831414c373c0d6dcbf7ef2cd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 15:06:03 +0100 Subject: [PATCH 459/764] Add Traditional Chinese language option Contributes to issue CURA-4370. --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index dc5853ebb2..9870cbe065 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -162,6 +162,7 @@ UM.PreferencesPage //Russian is disabled for being incomplete: append({ text: "Русский", code: "ru_RU" }) append({ text: "Türkçe", code: "tr_TR" }) append({ text: "简体中文", code: "zh_CN" }) + append({ text: "正體字", code: "zh_TW" }) var date_object = new Date(); if (date_object.getUTCMonth() == 8 && date_object.getUTCDate() == 19) //Only add Pirate on the 19th of September. From 317effd8f3ff00f849b21ac93778446b3fc7b643 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 15:24:09 +0100 Subject: [PATCH 460/764] Uncomment translations for Layer View The layer view was renamed back from Simulation View to layer view after the string freeze. Contributes to issue CURA-4601. --- resources/i18n/de_DE/cura.po | 24 ++++++++++++------------ resources/i18n/es_ES/cura.po | 24 ++++++++++++------------ resources/i18n/fr_FR/cura.po | 24 ++++++++++++------------ resources/i18n/it_IT/cura.po | 24 ++++++++++++------------ resources/i18n/ja_JP/cura.po | 18 +++++++++--------- resources/i18n/ko_KR/cura.po | 18 +++++++++--------- resources/i18n/nl_NL/cura.po | 24 ++++++++++++------------ resources/i18n/pl_PL/cura.po | 24 ++++++++++++------------ resources/i18n/pt_BR/cura.po | 24 ++++++++++++------------ resources/i18n/ru_RU/cura.po | 24 ++++++++++++------------ resources/i18n/tr_TR/cura.po | 24 ++++++++++++------------ resources/i18n/zh_CN/cura.po | 24 ++++++++++++------------ resources/i18n/zh_TW/cura.po | 12 ++++++------ 13 files changed, 144 insertions(+), 144 deletions(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index da42c9a4d8..211e75c2bc 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -4433,13 +4433,13 @@ msgstr "Cura-Profil-Reader" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Um sicherzustellen, dass Ihr {machine_name} mit den neuesten Funktionen ausgestattet ist, wird empfohlen, die Firmware regelmäßig zu aktualisieren Dies kann auf dem {machine_name} (bei Anschluss an ein Netzwerk) oder über USB erfolgen." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Schichtenansicht" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Schichtenansicht" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Schichtenansicht" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Schichtenansicht" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Cura-Profil-Reader" #~ msgid "Provides the Layer view." #~ msgstr "Bietet eine Schichtenansicht." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Schichtenansicht" +msgctxt "name" +msgid "Layer View" +msgstr "Schichtenansicht" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +4864,9 @@ msgstr "Cura-Profil-Reader" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Ermöglicht das Importieren von Profilen aus G-Code-Dateien." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Schichtenansicht" +msgctxt "@label" +msgid "Layer View" +msgstr "Schichtenansicht" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 7b4a343be4..3a35477fc9 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -4433,13 +4433,13 @@ msgstr "Lector de perfiles de Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para garantizar que su {machine_name} disponga de las prestaciones más recientes, se recomienda actualizar el firmware con regularidad. Esto se puede hacer en la {machine_name} (cuando esté conectada a la red) o vía USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Vista de capas" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Vista de capas" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Vista de capas" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Vista de capas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Lector de perfiles de Cura" #~ msgid "Provides the Layer view." #~ msgstr "Proporciona la vista de capas." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Vista de capas" +msgctxt "name" +msgid "Layer View" +msgstr "Vista de capas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +4864,9 @@ msgstr "Lector de perfiles de Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Proporciona asistencia para la importación de perfiles de archivos GCode." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Vista de capas" +msgctxt "@label" +msgid "Layer View" +msgstr "Vista de capas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index e65d19d978..4db845190f 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -4433,13 +4433,13 @@ msgstr "Lecteur de profil Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Pour s'assurer que votre {machine_name} est pourvue des dernières fonctionnalités, il est recommandé de mettre régulièrement à jour le firmware. Cela peut se faire sur la {machine_name} (lorsque connectée au réseau) ou via USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Vue en couches" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Vue en couches" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Vue en couches" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Vue en couches" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Lecteur de profil Cura" #~ msgid "Provides the Layer view." #~ msgstr "Permet la vue en couches." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Vue en couches" +msgctxt "name" +msgid "Layer View" +msgstr "Vue en couches" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +4864,9 @@ msgstr "Lecteur de profil Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Fournit la prise en charge de l'importation de profils à partir de fichiers g-code." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Vue en couches" +msgctxt "@label" +msgid "Layer View" +msgstr "Vue en couches" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index e4a7d1c75d..a4c9ef40f8 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -4433,13 +4433,13 @@ msgstr "Lettore profilo Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Per verificare che la vostra {machine_name} sia dotata delle funzionalità più recenti, si consiglia di aggiornare periodicamente il firmware. Questo può essere fatto sulla {machine_name} (quando connessa alla rete) o via USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Visualizzazione strato" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Visualizzazione strato" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Visualizzazione strato" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Visualizzazione strato" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Lettore profilo Cura" #~ msgid "Provides the Layer view." #~ msgstr "Fornisce la visualizzazione degli strati." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Visualizzazione strato" +msgctxt "name" +msgid "Layer View" +msgstr "Visualizzazione strato" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +4864,9 @@ msgstr "Lettore profilo Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Fornisce supporto per l'importazione di profili da file G-Code." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Visualizzazione strato" +msgctxt "@label" +msgid "Layer View" +msgstr "Visualizzazione strato" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index f2c10b77bb..01b39b3229 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -4442,13 +4442,13 @@ msgstr "Curaプロファイルリーダー" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "{machine_name}が最新の機能を得るために、定期的にファームウェアをアップデートすることをお勧めします。{machine_name}(ネットワーク上で接続)またはUSBにて行ってください。 " -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "レイヤービュー" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "レイヤービュー" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "レイヤービュー" +msgctxt "@info:title" +msgid "Layer View" +msgstr "レイヤービュー" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4550,6 +4550,6 @@ msgstr "Curaプロファイルリーダー" #~ msgid "Provides the Layer view." #~ msgstr "レイヤービューを供給する" -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "レイヤービュー" +msgctxt "name" +msgid "Layer View" +msgstr "レイヤービュー" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 4204b5a80a..a72274dc2c 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -4435,13 +4435,13 @@ msgstr "Cura 프로필 판독기" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "{machine_name}에 최신 기능이 탑재되어 있는지 확인하려면 정기적으로 펌웨어를 업데이트하는 것이 좋습니다. 이 작업은 {machine_name} (네트워크에 연결된 경우) 또는 USB를 통해 수행 할 수 있습니다." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "레이어 보기" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "레이어 보기" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "레이어 보기" +msgctxt "@info:title" +msgid "Layer View" +msgstr "레이어 보기" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4534,6 +4534,6 @@ msgstr "Cura 프로필 판독기" #~ msgid "Provides the Layer view." #~ msgstr "레이어 보기를 제공합니다." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "레이어보기" +msgctxt "name" +msgid "Layer View" +msgstr "레이어보기" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index b391b29b10..a6021b3ce0 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -4433,13 +4433,13 @@ msgstr "Cura-profiellezer" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Om ervoor te zorgen dat uw {machine_name} van de nieuwste functies is voorzien, wordt aanbevolen om de firmware regelmatig bij te werken. U kunt dit doen op de {machine_name} (wanneer deze is verbonden met het netwerk) of via USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Laagweergave" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Laagweergave" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Laagweergave" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Laagweergave" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Cura-profiellezer" #~ msgid "Provides the Layer view." #~ msgstr "Biedt een laagweergave." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Laagweergave" +msgctxt "name" +msgid "Layer View" +msgstr "Laagweergave" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4883,9 +4883,9 @@ msgstr "Cura-profiellezer" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Deze optie biedt ondersteuning voor het importeren van profielen uit G-code-bestanden." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Laagweergave" +msgctxt "@label" +msgid "Layer View" +msgstr "Laagweergave" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index e162ba0e65..19b4c72931 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -4462,13 +4462,13 @@ msgstr "Czytnik Profili Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Aby upewnić się że twoja {machine_name} jest wyposażona w najnowsze opcje rekomendowane jest aktualizowanie oprogramowania regularnie. Może to być wykonane na {machine_name} (kiedy jest podłączona do sieci) lub przez USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Widok warstwy" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Widok warstwy" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Widok warstwy" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Widok warstwy" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4570,9 +4570,9 @@ msgstr "Czytnik Profili Cura" #~ msgid "Provides the Layer view." #~ msgstr "Zapewnia widok warstw." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Widok Warstw" +msgctxt "name" +msgid "Layer View" +msgstr "Widok Warstw" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4893,9 +4893,9 @@ msgstr "Czytnik Profili Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Zapewnia obsługę importowania profili z plików g-code." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Widok warstwy" +msgctxt "@label" +msgid "Layer View" +msgstr "Widok warstwy" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 52abe5a64a..82cbda8362 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -4453,13 +4453,13 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Visão de Camadas" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Visão de Camadas" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4561,9 +4561,9 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "Provides the Layer view." #~ msgstr "Provê a visão de Camadas." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "name" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4884,9 +4884,9 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Provê suporte para importar perfis de arquivos G-Code." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "@label" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index bd125277a5..a953a8c87e 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -4443,13 +4443,13 @@ msgstr "Чтение профиля Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Рекомендуется регулярно обновлять прошивку принтера {machine_name}. Это может сделано когда {machine_name} подключен к сети или к USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Просмотр слоёв" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Просмотр слоёв" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Просмотр слоёв" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Просмотр слоёв" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4550,9 +4550,9 @@ msgstr "Чтение профиля Cura" #~ msgid "Provides the Layer view." #~ msgstr "Предоставляет послойный просмотр." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Просмотр слоёв" +msgctxt "name" +msgid "Layer View" +msgstr "Просмотр слоёв" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4873,9 +4873,9 @@ msgstr "Чтение профиля Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Предоставляет поддержку для импортирования профилей из GCode файлов." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Просмотр слоёв" +msgctxt "@label" +msgid "Layer View" +msgstr "Просмотр слоёв" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 29b23081fe..c77df51d69 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -4433,13 +4433,13 @@ msgstr "Cura Profil Okuyucu" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Makinenizin {machine_name} en son özellikler ile donanımlı olmasını sağlamak için bellenimi düzenli olarak güncellenmeniz önerilir. Bu, (ağa bağlı olduğunuzda) {machine_name} üzerinde veya USB ile gerçekleştirilebilir." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Katman görünümü" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Katman görünümü" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Katman Görünümü" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Katman Görünümü" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4541,9 +4541,9 @@ msgstr "Cura Profil Okuyucu" #~ msgid "Provides the Layer view." #~ msgstr "Katman görünümü sağlar." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Katman Görünümü" +msgctxt "name" +msgid "Layer View" +msgstr "Katman Görünümü" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4864,9 +4864,9 @@ msgstr "Cura Profil Okuyucu" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "G-code dosyalarından profilleri içe aktarmak için destek sağlar." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Katman Görünümü" +msgctxt "@label" +msgid "Layer View" +msgstr "Katman Görünümü" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index a3c4401d93..f4bf6159d5 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -4427,13 +4427,13 @@ msgstr "Cura 配置文件读取器" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "为确保您的 {machine_name} 具备最新功能,建议定期更新固件。 更新可在 {machine_name} 上(连接至网络时)或通过 USB 进行。" -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "分层视图" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "分层视图" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "分层视图" +msgctxt "@info:title" +msgid "Layer View" +msgstr "分层视图" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4534,9 +4534,9 @@ msgstr "Cura 配置文件读取器" #~ msgid "Provides the Layer view." #~ msgstr "提供分层视图。" -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "分层视图" +msgctxt "name" +msgid "Layer View" +msgstr "分层视图" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4857,9 +4857,9 @@ msgstr "Cura 配置文件读取器" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "提供了从 GCode 文件中导入配置文件的支持。" -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "分层视图" +msgctxt "@label" +msgid "Layer View" +msgstr "分层视图" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index b17800b6f6..2007c308ea 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -4704,9 +4704,9 @@ msgstr "Cura 列印參數讀取器" #~ "為了確保您的 {machine_name} 配備了最新功能,建議定期更新韌體。 這可以在 " #~ "{machine_name} 上完成(有連接到網絡時)或透過 USB 完成。" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "分層檢視" +msgctxt "@info:title" +msgid "Layer View" +msgstr "分層檢視" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4776,9 +4776,9 @@ msgstr "Cura 列印參數讀取器" #~ msgid "Provides the Layer view." #~ msgstr "提供分層檢視。" -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "分層檢視" +msgctxt "name" +msgid "Layer View" +msgstr "分層檢視" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" From 1a9112d5985a6cd734c02ec6a147bd09d1bfdd6b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 15:33:21 +0100 Subject: [PATCH 461/764] Add missing layer view translation Luckily we already have some translations which were made for other contexts. I'm assuming that the translation here doesn't really depend on the context. Contributes to issue CURA-4601. --- resources/i18n/zh_TW/cura.po | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 2007c308ea..2b000890f5 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -4894,3 +4894,8 @@ msgstr "分層檢視" #~ msgctxt "name" #~ msgid "X3G Writer" #~ msgstr "X3G 寫入器" + +#Added manually to fix a string that was changed after string freeze. +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "分層檢視" \ No newline at end of file From 1f6510a82f5de0434bf4ada53fb332a5f43c46b2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 15:40:36 +0100 Subject: [PATCH 462/764] Re-enable Russian and disable Finnish Russian has been translated by Bothof now so it's complete again. Finnish has been officially dropped now so we'll disable that language. Contributes to issue CURA-4601. --- resources/qml/Preferences/GeneralPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 9870cbe065..e9dae6eb11 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -151,7 +151,7 @@ UM.PreferencesPage append({ text: "English", code: "en_US" }) append({ text: "Deutsch", code: "de_DE" }) append({ text: "Español", code: "es_ES" }) - append({ text: "Suomi", code: "fi_FI" }) + //Finnish is disabled for being incomplete: append({ text: "Suomi", code: "fi_FI" }) append({ text: "Français", code: "fr_FR" }) append({ text: "Italiano", code: "it_IT" }) append({ text: "日本語", code: "ja_JP" }) @@ -159,7 +159,7 @@ UM.PreferencesPage append({ text: "Nederlands", code: "nl_NL" }) append({ text: "Polski", code: "pl_PL" }) append({ text: "Português do Brasil", code: "pt_BR" }) - //Russian is disabled for being incomplete: append({ text: "Русский", code: "ru_RU" }) + append({ text: "Русский", code: "ru_RU" }) append({ text: "Türkçe", code: "tr_TR" }) append({ text: "简体中文", code: "zh_CN" }) append({ text: "正體字", code: "zh_TW" }) From 17ede12573b9b25c399638931853aa5b980a9fc9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 16:07:30 +0100 Subject: [PATCH 463/764] Also set base_file metadata when deserialising just metadata Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 414886e1da..7a76c1522e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -643,7 +643,8 @@ class XmlMaterialProfile(InstanceContainer): "type": "material", "status": "unknown", #TODO: Add material verification. "container_type": XmlMaterialProfile, - "id": container_id + "id": container_id, + "base_file": container_id } try: From 083a4a802477100e3acda5bb005f841d44f31c2d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 1 Dec 2017 16:19:58 +0100 Subject: [PATCH 464/764] Rewrite cloning of materials The original was based on reading the original file back, but that won't work if the files are provided by an arbitrary container provider. Instead we'll actually make a copy of all the profiles that need to be copied. It's much faster as well. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 54 +++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 14 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index daf30d0792..94a79c9911 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import copy import os.path import urllib import uuid @@ -751,27 +752,52 @@ class ContainerManager(QObject): # \return \type{str} the id of the newly created container. @pyqtSlot(str, result = str) def duplicateMaterial(self, material_id: str) -> str: - containers = self._container_registry.findInstanceContainers(id = material_id) - if not containers: + original = self._container_registry.findContainersMetadata(id = material_id) + if not original: Logger.log("d", "Unable to duplicate the material with id %s, because it doesn't exist.", material_id) return "" + original = original[0] + + base_container_id = original.get("base_file") + base_container = self._container_registry.findContainers(id = base_container_id) + if not base_container: + Logger.log("d", "Unable to duplicate the material with id {material_id}, because base_file {base_container_id} doesn't exist.".format(material_id = material_id, base_container_id = base_container_id)) + return "" + base_container = base_container[0] + + #We'll copy all containers with the same base. + #This way the correct variant and machine still gets assigned when loading the copy of the material. + containers_to_copy = self._container_registry.findInstanceContainers(base_file = base_container_id) # Ensure all settings are saved. Application.getInstance().saveSettings() # Create a new ID & container to hold the data. - new_id = self._container_registry.uniqueName(material_id) - container_type = type(containers[0]) # Could be either a XMLMaterialProfile or a InstanceContainer - duplicated_container = container_type(new_id) + new_containers = [] + new_base_id = self._container_registry.uniqueName(base_container.getId()) + new_base_container = copy.deepcopy(base_container) + new_base_container.getMetaData()["id"] = new_base_id + new_base_container.getMetaData()["base_file"] = new_base_id + new_containers.append(new_base_container) - # Instead of duplicating we load the data from the basefile again. - # This ensures that the inheritance goes well and all "cut up" subclasses of the xmlMaterial profile - # are also correctly created. - with open(containers[0].getPath(), encoding="utf-8") as f: - duplicated_container.deserialize(f.read()) - duplicated_container.setDirty(True) - self._container_registry.addContainer(duplicated_container) - return self._getMaterialContainerIdForActiveMachine(new_id) + #Clone all of them. + clone_of_original = None #Keeping track of which one is the clone of the original material, since we need to return that. + for container_to_copy in containers_to_copy: + #Create unique IDs for every clone. + current_id = container_to_copy.getId() + new_id = self._container_registry.uniqueName(current_id) + if current_id == material_id: + clone_of_original = new_id + + new_container = copy.deepcopy(container_to_copy) + new_container.getMetaData()["id"] = new_id + new_container.getMetaData()["base_file"] = new_base_id + new_containers.append(new_container) + + for container_to_add in new_containers: + container_to_add.setDirty(True) + ContainerRegistry.getInstance().addContainer(container_to_add) + return self._getMaterialContainerIdForActiveMachine(clone_of_original) ## Create a new material by cloning Generic PLA for the current material diameter and setting the GUID to something unqiue # @@ -839,7 +865,7 @@ class ContainerManager(QObject): if materials: return materials[0]["id"] - Logger.log("w", "Unable to find a suitable container based on %s for the current machine .", base_file) + Logger.log("w", "Unable to find a suitable container based on %s for the current machine.", base_file) return "" # do not activate a new material if a container can not be found return base_file From a52889a601de2921b3583fadd1a6e4cbd4d8ce3b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 1 Dec 2017 16:29:02 +0100 Subject: [PATCH 465/764] Update 3D viewer build volume when relevant machine settings are changed - CURA-4659 --- cura/BuildVolume.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 50f63e49d5..2567641cc9 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -513,14 +513,13 @@ class BuildVolume(SceneNode): update_disallowed_areas = False update_raft_thickness = False update_extra_z_clearance = True + for setting_key in self._changed_settings_since_last_rebuild: + if setting_key == "print_sequence": machine_height = self._global_container_stack.getProperty("machine_height", "value") - if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", - "value") == "one_at_a_time" and len( - self._scene_objects) > 1: - self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), - machine_height) + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1: + self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) if self._height < machine_height: self._build_volume_message.show() else: @@ -528,9 +527,20 @@ class BuildVolume(SceneNode): else: self._height = self._global_container_stack.getProperty("machine_height", "value") self._build_volume_message.hide() + update_disallowed_areas = True rebuild_me = True - if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings or setting_key in self._extruder_settings: + # sometimes the machine size or shape settings are adjusted on the active machine, we should reflect this + if setting_key in self._machine_settings: + self._height = self._global_container_stack.getProperty("machine_height", "value") + self._width = self._global_container_stack.getProperty("machine_width", "value") + self._depth = self._global_container_stack.getProperty("machine_depth", "value") + self._shape = self._global_container_stack.getProperty("machine_shape", "value") + update_extra_z_clearance = True + update_disallowed_areas = True + rebuild_me = True + + if setting_key in self._skirt_settings + self._prime_settings + self._tower_settings + self._ooze_shield_settings + self._distance_settings + self._extruder_settings: update_disallowed_areas = True rebuild_me = True @@ -969,6 +979,7 @@ class BuildVolume(SceneNode): def _clamp(self, value, min_value, max_value): return max(min(value, max_value), min_value) + _machine_settings = ["machine_width", "machine_depth", "machine_height", "machine_shape", "machine_center_is_zero"] _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "initial_layer_line_width_factor"] _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"] _extra_z_settings = ["retraction_hop_enabled", "retraction_hop"] From 585c3e4f06b458088e5e47259c5e11751625b898 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 1 Dec 2017 16:45:23 +0100 Subject: [PATCH 466/764] CURA-4660 Fix some mismatches between quality profiles, AA0.25 variant and UM3 definitions. --- .../um3_aa0.25_ABS_Normal_Quality.inst.cfg | 1 - .../um3_aa0.25_CPE_Normal_Quality.inst.cfg | 1 - .../um3_aa0.25_Nylon_Normal_Quality.inst.cfg | 5 ++--- .../um3_aa0.25_PC_Normal_Quality.inst.cfg | 3 +++ .../um3_aa0.25_PLA_Normal_Quality.inst.cfg | 2 +- .../um3_aa0.25_PP_Normal_Quality.inst.cfg | 1 - resources/variants/ultimaker3_aa0.25.inst.cfg | 14 ++++++++++++-- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg index 5d798d556e..fc7d4d12d2 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg @@ -14,7 +14,6 @@ setting_version = 4 cool_fan_speed = 40 infill_overlap = 15 material_final_print_temperature = =material_print_temperature - 5 -prime_tower_enable = True prime_tower_purge_volume = 0.6 prime_tower_size = 12 prime_tower_wall_thickness = 0.9 diff --git a/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg index a68b43fa2a..83e0c549c4 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg @@ -11,7 +11,6 @@ weight = 0 setting_version = 4 [values] -infill_overlap = =10 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0 prime_tower_size = 12 prime_tower_wall_thickness = 0.9 retraction_extrusion_window = 0.5 diff --git a/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg index ff16fff8f1..58ddc32101 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_Nylon_Normal_Quality.inst.cfg @@ -14,9 +14,8 @@ setting_version = 4 cool_min_layer_time_fan_speed_max = 20 cool_min_speed = 12 infill_line_width = =round(line_width * 0.5 / 0.4, 2) -infill_overlap = =10 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0 machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 2.0 +machine_nozzle_heat_up_speed = 1.4 ooze_shield_angle = 40 raft_acceleration = =acceleration_layer_0 raft_airgap = =round(layer_height_0 * 0.85, 2) @@ -24,7 +23,7 @@ raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 3) raft_jerk = =jerk_layer_0 raft_margin = 10 raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) -retraction_min_travel = =line_width * 2 +retraction_min_travel = 5 skin_overlap = 50 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) diff --git a/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg index 43b8f95677..7c9fa32949 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_PC_Normal_Quality.inst.cfg @@ -28,6 +28,9 @@ machine_min_cool_heat_time_window = 15 multiple_mesh_overlap = 0 ooze_shield_angle = 40 prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) retraction_count_max = 80 retraction_hop = 2 retraction_hop_enabled = True diff --git a/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg index c1a93e12b0..1bee4b8f18 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_PLA_Normal_Quality.inst.cfg @@ -17,7 +17,7 @@ cool_min_speed = 10 infill_overlap = 10 infill_pattern = grid machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_heat_up_speed = 2.0 +machine_nozzle_heat_up_speed = 1.4 material_final_print_temperature = =max(-273.15, material_print_temperature - 15) material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) material_print_temperature = 190 diff --git a/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg index 7f138f979d..58e7fdc688 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_PP_Normal_Quality.inst.cfg @@ -57,4 +57,3 @@ travel_avoid_distance = 3 wall_0_inset = 0 wall_line_width_x = =line_width wall_thickness = =line_width * 3 - diff --git a/resources/variants/ultimaker3_aa0.25.inst.cfg b/resources/variants/ultimaker3_aa0.25.inst.cfg index ebb584f674..e6f852c02c 100644 --- a/resources/variants/ultimaker3_aa0.25.inst.cfg +++ b/resources/variants/ultimaker3_aa0.25.inst.cfg @@ -11,7 +11,6 @@ setting_version = 4 [values] brim_width = 7 infill_line_width = 0.23 -infill_overlap = 0 layer_height_0 = 0.17 line_width = 0.23 machine_nozzle_cool_down_speed = 0.85 @@ -21,10 +20,18 @@ machine_nozzle_size = 0.25 machine_nozzle_tip_outer_diameter = 0.65 material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = 0.3 +raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 +raft_interface_line_spacing = =raft_interface_line_width + 0.2 +raft_interface_line_width = =line_width * 2 raft_interface_thickness = =layer_height * 1.5 +raft_jerk = =jerk_print +raft_margin = 15 +raft_surface_layers = 2 retraction_count_max = 25 retraction_extrusion_window = 1 retraction_min_travel = 0.7 +retraction_prime_speed = =retraction_speed skin_overlap = 15 speed_layer_0 = 20 speed_print = 55 @@ -32,9 +39,12 @@ speed_topbottom = 20 speed_wall = =math.ceil(speed_print * 30 / 55) support_angle = 60 support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag support_top_distance = =support_z_distance +support_use_towers = True support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length top_bottom_thickness = 1.2 wall_line_width_x = 0.23 wall_thickness = 1.3 - From 033a4615ebbd7f8adaead4c641f661997f7796d2 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 1 Dec 2017 17:47:08 +0000 Subject: [PATCH 467/764] Call resetLayerData() before adding LayerDataDecorator to scene node rather than afterwards. This ensures that the layer data is reset before the scene is rendered. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 37ab451d16..7a43b43fd0 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -208,6 +208,10 @@ class ProcessSlicedLayersJob(Job): self._progress_message.hide() return + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "SimulationView": + view.resetLayerData() + # Add LayerDataDecorator to scene node to indicate that the node has layer data decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) @@ -226,10 +230,6 @@ class ProcessSlicedLayersJob(Job): if self._progress_message: self._progress_message.setProgress(100) - view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "SimulationView": - view.resetLayerData() - if self._progress_message: self._progress_message.hide() From 184bfc9dfd825276f340c206c8bbea18a7c56468 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Mon, 4 Dec 2017 09:34:30 +0100 Subject: [PATCH 468/764] Update_ChangeLog_3.1_CURA-4656 --- plugins/ChangeLogPlugin/ChangeLog.txt | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 63ecb37564..0f86b4a21a 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -11,8 +11,20 @@ The existing Layer View has been updated in order to see a live simulation of al *Quick camera controls New buttons have been added to the interface that can quickly reposition the camera view of the buildplate. -*Increased processing speeds and performance -A 5-10% speed increase when calculating normals, loading models and slicing. +*Lock model on platform +The move tool has a new option to lock a selected model to the platform. + +*Faster profile switching speed +Duplicating and removing a profile could take Ultimaker Cura quite some time, it now happens instantly. + +*Faster printer selection +Removing a printer from the library is now instant. No more unresponsive screens. + +*Faster processing speed +A 5 - 10 % speed increase when calculating normals, loading models, and slicing. + +*Feedrate visualization +Feedrate visualization has been added to the Layer view. Using this gives the user an idea of the print speeds per model part, allowing for better control over prints. *Jogging It allows the printhead to be moved with on-screen controls. Contributed by fieldOfView. @@ -52,8 +64,8 @@ If profile settings have been modified in recommended mode under custom mode, a - Fix for Ultimaker Cura engine crashes on certain models - Fix for Uninstalling previous versions of Cura on Windows platforms - Fix for displaying visible settings -- Fix for loading legacy profiles -- Fix for importing custom single extrusion profile +- Fix for importing legacy .ini files +- Prevent skipping user agreement dialog by pressing escape [3.0.4] *Bug fixes From c3d9c1b3d8058876e328369a768c8619531e6938 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 4 Dec 2017 09:49:03 +0100 Subject: [PATCH 469/764] CURA-4667 Fix simulation view render race. Change the place where the layer data is reset. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 7a43b43fd0..26a8269183 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -61,7 +61,9 @@ class ProcessSlicedLayersJob(Job): def run(self): start_time = time() - if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "SimulationView": + view.resetLayerData() self._progress_message.show() Job.yieldThread() if self._abort_requested: @@ -208,10 +210,6 @@ class ProcessSlicedLayersJob(Job): self._progress_message.hide() return - view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "SimulationView": - view.resetLayerData() - # Add LayerDataDecorator to scene node to indicate that the node has layer data decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) From ad4a27db3a36768f588754ed6d1d6d61a4586463 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Fri, 1 Dec 2017 17:47:08 +0000 Subject: [PATCH 470/764] Call resetLayerData() before adding LayerDataDecorator to scene node rather than afterwards. This ensures that the layer data is reset before the scene is rendered. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 37ab451d16..7a43b43fd0 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -208,6 +208,10 @@ class ProcessSlicedLayersJob(Job): self._progress_message.hide() return + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "SimulationView": + view.resetLayerData() + # Add LayerDataDecorator to scene node to indicate that the node has layer data decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) @@ -226,10 +230,6 @@ class ProcessSlicedLayersJob(Job): if self._progress_message: self._progress_message.setProgress(100) - view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "SimulationView": - view.resetLayerData() - if self._progress_message: self._progress_message.hide() From 288aba0ec4125bce1144903663c053e985596790 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 4 Dec 2017 09:49:03 +0100 Subject: [PATCH 471/764] CURA-4667 Fix simulation view render race. Change the place where the layer data is reset. --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 7a43b43fd0..26a8269183 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -61,7 +61,9 @@ class ProcessSlicedLayersJob(Job): def run(self): start_time = time() - if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView": + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "SimulationView": + view.resetLayerData() self._progress_message.show() Job.yieldThread() if self._abort_requested: @@ -208,10 +210,6 @@ class ProcessSlicedLayersJob(Job): self._progress_message.hide() return - view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "SimulationView": - view.resetLayerData() - # Add LayerDataDecorator to scene node to indicate that the node has layer data decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) From d69e397716120d542a74734f6c7ec100ac663beb Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 10:31:21 +0100 Subject: [PATCH 472/764] Add new plugins to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f67add62cf..7284597fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ plugins/cura-big-flame-graph plugins/cura-siemensnx-plugin plugins/CuraVariSlicePlugin plugins/CuraLiveScriptingPlugin +plugins/CuraPrintProfileCreator #Build stuff CMakeCache.txt From 1934bdfb99ad6c407f360f12221e710a0edb524f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 10:52:40 +0100 Subject: [PATCH 473/764] Add sidebar view object --- cura/SidebarView.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 cura/SidebarView.py diff --git a/cura/SidebarView.py b/cura/SidebarView.py new file mode 100644 index 0000000000..f5a9caba94 --- /dev/null +++ b/cura/SidebarView.py @@ -0,0 +1,13 @@ +# Copyright (c) 2017 Ultimaker B.V. + +from UM.PluginObject import PluginObject + + +# Abstract class for sidebar view objects. +# By default the sidebar is Cura's settings, slicing and printing overview. +# The last plugin to claim the sidebar QML target will be displayed. +class SidebarView(PluginObject): + + def __init__(self): + super().__init__() + print("sidebar view hello") From bc28189ff5867dd81cf58f25fec40139d3831f84 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Dec 2017 10:55:30 +0100 Subject: [PATCH 474/764] Don't serialize the name of the metadata It's being serialized in a different place. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 7a76c1522e..940f88773f 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -131,6 +131,7 @@ class XmlMaterialProfile(InstanceContainer): metadata.pop("approximate_diameter", "") metadata.pop("id", "") metadata.pop("container_type", "") + metadata.pop("name", "") ## Begin Name Block builder.start("name") From 72c7d2bd76c0ea0d6acfd50b519757ee6940f307 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Dec 2017 11:04:28 +0100 Subject: [PATCH 475/764] Reconstruct ID for submaterials from unique base name When you make the ID of the subprofile unique it doesn't get linked to the base profile any more since the '#2' gets put at the end. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 94a79c9911..c552a6fe8c 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -785,7 +785,11 @@ class ContainerManager(QObject): for container_to_copy in containers_to_copy: #Create unique IDs for every clone. current_id = container_to_copy.getId() - new_id = self._container_registry.uniqueName(current_id) + new_id = new_base_id + if container_to_copy.getMetaDataEntry("definition") != "fdmprinter": + new_id += "_" + container_to_copy.getMetaDataEntry("definition") + if container_to_copy.getMetaDataEntry("variant"): + new_id += "_" + container_to_copy.getMetaDataEntry("variant") if current_id == material_id: clone_of_original = new_id From db2c3525c48411a9611dff17d334728556c9ca27 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 11:06:10 +0100 Subject: [PATCH 476/764] Sidebar view and controller scaffolding --- cura/Sidebar/SidebarController.py | 48 +++++++++++++++++++++++++++++++ cura/{ => Sidebar}/SidebarView.py | 0 cura/Sidebar/__init__.py | 0 3 files changed, 48 insertions(+) create mode 100644 cura/Sidebar/SidebarController.py rename cura/{ => Sidebar}/SidebarView.py (100%) create mode 100644 cura/Sidebar/__init__.py diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py new file mode 100644 index 0000000000..79e8d55c56 --- /dev/null +++ b/cura/Sidebar/SidebarController.py @@ -0,0 +1,48 @@ +# Copyright (c) 2017 Ultimaker B.V. +from UM.Logger import Logger +from UM.PluginRegistry import PluginRegistry +from UM.Signal import Signal +from .SidebarView import SidebarView +from typing import Optional + +# The sidebar controller manages available sidebar components and decides which one to display. +# The cura.qml file uses this controller to repeat over the sidebars and show the active index. +class SidebarController: + + def __init__(self, application): + self._application = application + self._sidebar_views = {} + self._active_sidebar_view = None + + PluginRegistry.addType("sidebar_view", self.addSidebarView) + + ## Emitted when the list of views changes. + sidebarViewsChanged = Signal() + + ## Emitted when the active view changes. + activeSidebarViewChanged = Signal() + + ## Get the active application instance. + def getApplication(self): + return self._application + + ## Add a sidebar view to the registry. + # It get's a unique name based on the plugin ID. + def addSidebarView(self, sidebar_view: SidebarView): + name = sidebar_view.getPluginId() + if name not in self._sidebar_views: + self._sidebar_views[name] = sidebar_view + self.sidebarViewsChanged.emit() + + ## Get a registered sidebar view by name. + # The name is the ID of the plugin that registered the view. + def getSidebarView(self, name: str) -> Optional[SidebarView]: + try: + return self._sidebar_views[name] + except KeyError: + Logger.log("e", "Unable to find %s in sidebar view list", name) + return None + + ## Change the active sidebar view to one of the registered views. + def setActiveSidebarView(self, name: str): + print("setting active sidebar view") diff --git a/cura/SidebarView.py b/cura/Sidebar/SidebarView.py similarity index 100% rename from cura/SidebarView.py rename to cura/Sidebar/SidebarView.py diff --git a/cura/Sidebar/__init__.py b/cura/Sidebar/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 44537c4ef46d9ad2730faca8eb19cfbf2782b170 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 11:11:57 +0100 Subject: [PATCH 477/764] Added sorting by brand to MaterialsModel. Contributes to issue CURA-4243. --- cura/Settings/MaterialsModel.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py index bab8929765..e3d56c2f86 100644 --- a/cura/Settings/MaterialsModel.py +++ b/cura/Settings/MaterialsModel.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import Any, List from UM.Settings.ContainerRegistry import ContainerRegistry #To listen for changes to the materials. from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel #We're extending this class. @@ -23,3 +24,10 @@ class MaterialsModel(InstanceContainersModel): def _onContainerChanged(self, container): if container.getMetaDataEntry("type", "") == "material": super()._onContainerChanged(container) + + ## Group brand together + def _sortKey(self, item) -> List[Any]: + result = [] + result.append(item["metadata"]["brand"]) + result.extend(super()._sortKey(item)) + return result From 0d9f49413e72c116f21969d970fe3a1875db9a4b Mon Sep 17 00:00:00 2001 From: Andrew Donaldson Date: Mon, 4 Dec 2017 21:16:30 +1100 Subject: [PATCH 478/764] Add Fedora to test for nvidia driver work around. --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index d725bc1200..313b161a7d 100755 --- a/cura_app.py +++ b/cura_app.py @@ -12,7 +12,7 @@ from UM.Platform import Platform #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 - if platform.linux_distribution()[0] in ("debian", "Ubuntu", "LinuxMint"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. + if platform.linux_distribution()[0] in ("debian", "Ubuntu", "LinuxMint", "Fedora"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. import ctypes from ctypes.util import find_library libGL = find_library("GL") From b453e0a4e78fb18d4e41f873b787e0e995df9755 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Dec 2017 11:27:37 +0100 Subject: [PATCH 479/764] Allow minimum layer time to be higher than the fan speed min/max threshold Previously that wasn't possible because the division that calculated the slope of the fan speed ramping up towards the minimum layer time couldn't deal with negative values. Now it deals with that properly and in the limit the regular fan speed will be used. Fixes #2328 and CURA-4272. --- resources/definitions/fdmprinter.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 484e857aef..ed8bf59b97 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3379,7 +3379,6 @@ "unit": "s", "type": "float", "default_value": 10, - "minimum_value": "cool_min_layer_time", "maximum_value_warning": "600", "settable_per_mesh": false, "settable_per_extruder": true From f2b4cbe182fe01fdd974958f28e35f37952a1b28 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 11:37:49 +0100 Subject: [PATCH 480/764] Register sidebar controller in application, start with default sidebar view --- cura/CuraApplication.py | 19 +++++++++++++++++++ cura/Settings/SettingsSidebarView.py | 10 ++++++++++ cura/Sidebar/SidebarViewModel.py | 16 ++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 cura/Settings/SettingsSidebarView.py create mode 100644 cura/Sidebar/SidebarViewModel.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9427e15552..7f8fef05ad 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -33,9 +33,11 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation from cura.Arrange import Arrange +from cura.Settings.SettingsSidebarView import SettingsSidebarView from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation +from cura.Sidebar.SidebarController import SidebarController from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator @@ -204,6 +206,14 @@ class CuraApplication(QtApplication): self._setting_inheritance_manager = None self._simple_mode_settings_manager = None + ## As of Cura 3.2, the sidebar is controlled by a controller. + # This functionality was added to allow plugins registering custom sidebar views. + self._sidebar_controller = SidebarController(self) + + ## Register the default settings sidebar manually + settings_sidebar_view = SettingsSidebarView() + self._sidebar_controller.addSidebarView(settings_sidebar_view) + self._additional_components = {} # Components to add to certain areas in the interface super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType, @@ -775,6 +785,14 @@ class CuraApplication(QtApplication): def getPrintInformation(self): return self._print_information + ## Get the SidebarController of this application. + # A sidebar controller is created if it wasn't yet. + # \returns SidebarControllers \type{SidebarController} + def getSidebarController(self) -> SidebarController: + if self._sidebar_controller is None: + self._sidebar_controller = SidebarController(self) + return self._sidebar_controller + ## Registers objects for the QML engine to use. # # \param engine The QML engine. @@ -800,6 +818,7 @@ class CuraApplication(QtApplication): qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) + qmlRegisterSingletonType(SidebarController, "Cura", 1, 0, "SidebarController", self.getSidebarController) # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py new file mode 100644 index 0000000000..813f3fef2f --- /dev/null +++ b/cura/Settings/SettingsSidebarView.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Ultimaker B.V. + +from PyQt5.QtCore import QObject + +from cura.Sidebar.SidebarView import SidebarView + +class SettingsSidebarView(QObject, SidebarView): + + def __init__(self): + super().__init__() diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py new file mode 100644 index 0000000000..49e64060bc --- /dev/null +++ b/cura/Sidebar/SidebarViewModel.py @@ -0,0 +1,16 @@ +# Copyright (c) 2017 Ultimaker B.V. +from PyQt5.QtCore import Qt +from UM.Qt.ListModel import ListModel +from UM.Application import Application +from UM.PluginRegistry import PluginRegistry + +## The SidebarViewModel is the default sidebar view in Cura with all the print settings and print button. +class SidebarViewModel(ListModel): + IdRole = Qt.UserRole + 1 + NameRole = Qt.UserRole + 2 + ActiveRole = Qt.UserRole + 3 + + def __init__(self, parent = None): + super().__init__(parent) + + \ No newline at end of file From 713055e320266d2bfa456e545c475cf8ba4849c7 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 12:37:29 +0100 Subject: [PATCH 481/764] Get meta data per sidebar view in sidebar view model --- cura/Settings/SettingsSidebarView.py | 13 +++++++-- cura/Sidebar/SidebarController.py | 6 ++++- cura/Sidebar/SidebarViewModel.py | 40 +++++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py index 813f3fef2f..abd3968ca9 100644 --- a/cura/Settings/SettingsSidebarView.py +++ b/cura/Settings/SettingsSidebarView.py @@ -1,10 +1,19 @@ # Copyright (c) 2017 Ultimaker B.V. - from PyQt5.QtCore import QObject - +from UM.i18n import i18nCatalog from cura.Sidebar.SidebarView import SidebarView +i18n_catalog = i18nCatalog("cura") class SettingsSidebarView(QObject, SidebarView): def __init__(self): super().__init__() + + ## As the default sidebar is not a plugin, we have a get meta data method here to allow the sidebar view model to get the needed data. + def getMetaData(self): + return { + "sidebar_view": { + "name": i18n_catalog.i18nc("", "Print settings"), + "weight": 1 + } + } diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index 79e8d55c56..cb0e4a1e8e 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -3,7 +3,7 @@ from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry from UM.Signal import Signal from .SidebarView import SidebarView -from typing import Optional +from typing import Optional, Dict # The sidebar controller manages available sidebar components and decides which one to display. # The cura.qml file uses this controller to repeat over the sidebars and show the active index. @@ -46,3 +46,7 @@ class SidebarController: ## Change the active sidebar view to one of the registered views. def setActiveSidebarView(self, name: str): print("setting active sidebar view") + + ## Get all sidebar views registered in this controller. + def getAllSidebarViews(self) -> Dict[SidebarView]: + return self._sidebar_views diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index 49e64060bc..638800247d 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -13,4 +13,42 @@ class SidebarViewModel(ListModel): def __init__(self, parent = None): super().__init__(parent) - \ No newline at end of file + self._controller = Application.getInstance().getSidebarController() + + # register Qt list roles + self.addRoleName(self.IdRole, "id") + self.addRoleName(self.NameRole, "name") + self.addRoleName(self.ActiveRole, "active") + + ## Update the model when new views are added or another view is made the active view. + def _onSidebarViewsChanged(self): + items = [] + sidebar_views = self._controller.getAllSidebarViews() + current_view = self._controller.getActiveSidebarView() + + for sidebar_view_id, sidebar_view in sidebar_views.items(): + plugin_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id) + if plugin_metadata: + # Check if the registered view came from a plugin and extract the metadata if so. + sidebar_view_metadata = plugin_metadata.get("sidebar_view", {}) + else: + # Get the meta data directly from the plugin + sidebar_view_metadata = sidebar_view.getMetaData() + + # Skip view modes that are marked as not visible + if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: + continue + + name = sidebar_view_metadata.get("name", id) + weight = sidebar_view_metadata.get("weight", 0) + + items.append({ + "id": sidebar_view_id, + "name": name, + "active": sidebar_view_id == current_view.getPluginId(), + "weight": weight + }) + + # Sort the views by weight + items.sort(key=lambda t: t["weight"]) + self.setItems(items) From 4ef39ca31374ee77670d33a0096b57f473951210 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 12:47:08 +0100 Subject: [PATCH 482/764] Add sidebar views menu item and expose model to QML --- cura/CuraApplication.py | 2 ++ cura/Settings/SettingsSidebarView.py | 4 ++++ cura/Sidebar/SidebarController.py | 1 + cura/Sidebar/SidebarViewModel.py | 5 ++++- resources/qml/Menus/ViewMenu.qml | 33 ++++++++++++++++++++++------ 5 files changed, 37 insertions(+), 8 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7f8fef05ad..a2efa887c0 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -38,6 +38,7 @@ from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation from cura.Sidebar.SidebarController import SidebarController +from cura.Sidebar.SidebarViewModel import SidebarViewModel from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator @@ -819,6 +820,7 @@ class CuraApplication(QtApplication): qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) qmlRegisterSingletonType(SidebarController, "Cura", 1, 0, "SidebarController", self.getSidebarController) + qmlRegisterType(SidebarViewModel, "Cura", 1, 0, "SidebarViewModel") # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py index abd3968ca9..648e056044 100644 --- a/cura/Settings/SettingsSidebarView.py +++ b/cura/Settings/SettingsSidebarView.py @@ -9,6 +9,10 @@ class SettingsSidebarView(QObject, SidebarView): def __init__(self): super().__init__() + ## As the default sidebar is not a plugin, we have a get plugin ID method to allow the sidebar view model to get the needed data. + def getPluginId(self): + return "default" + ## As the default sidebar is not a plugin, we have a get meta data method here to allow the sidebar view model to get the needed data. def getMetaData(self): return { diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index cb0e4a1e8e..1212091b2d 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -46,6 +46,7 @@ class SidebarController: ## Change the active sidebar view to one of the registered views. def setActiveSidebarView(self, name: str): print("setting active sidebar view") + self.activeSidebarViewChanged.emit() ## Get all sidebar views registered in this controller. def getAllSidebarViews(self) -> Dict[SidebarView]: diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index 638800247d..4ed1ca60cb 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -13,7 +13,10 @@ class SidebarViewModel(ListModel): def __init__(self, parent = None): super().__init__(parent) + # connect views changed signals self._controller = Application.getInstance().getSidebarController() + self._controller.sidebarViewsChanged.connect(self._onSidebarViewsChanged) + self._controller.activeSidebarViewChanged.connect(self._onSidebarViewsChanged) # register Qt list roles self.addRoleName(self.IdRole, "id") @@ -39,7 +42,7 @@ class SidebarViewModel(ListModel): if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: continue - name = sidebar_view_metadata.get("name", id) + name = sidebar_view_metadata.get("name", sidebar_view_id) weight = sidebar_view_metadata.get("weight", 0) items.append({ diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index bb5999edb9..654de3391a 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -12,21 +12,40 @@ Menu title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); id: menu enabled: !PrintInformation.preSliced + + // main views Instantiator { - model: UM.ViewModel { } + model: UM.ViewModel{} MenuItem { - text: model.name; - checkable: true; - checked: model.active; - exclusiveGroup: group; - onTriggered: UM.Controller.setActiveView(model.id); + text: model.name + checkable: true + checked: model.active + exclusiveGroup: group + onTriggered: UM.Controller.setActiveView(model.id) } onObjectAdded: menu.insertItem(index, object) onObjectRemoved: menu.removeItem(object) } - ExclusiveGroup { id: group; } + ExclusiveGroup { id: group } + + // sidebar views + Instantiator + { + model: Cura.SidebarViewModel{} + MenuItem + { + text: model.name + checkable: true + checked: model.active + exclusiveGroup: sidebarGroup + onTriggered: Cura.SidebarController.setActiveSidebarView(model.id) + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + ExclusiveGroup { id: sidebarGroup } MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; } From e8f1073af85c8a5fad8d80896f1954c5b9809144 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 12:48:07 +0100 Subject: [PATCH 483/764] Add menu seperator --- resources/qml/Menus/ViewMenu.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 654de3391a..b5e4c5765f 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -30,6 +30,8 @@ Menu } ExclusiveGroup { id: group } + MenuSeparator {} + // sidebar views Instantiator { From 5eeb98bbcf41011bc9f49591aa4727e75803f511 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 13:20:16 +0100 Subject: [PATCH 484/764] Move sidebar controller init --- cura/CuraApplication.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a2efa887c0..6f5746b49d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -207,14 +207,6 @@ class CuraApplication(QtApplication): self._setting_inheritance_manager = None self._simple_mode_settings_manager = None - ## As of Cura 3.2, the sidebar is controlled by a controller. - # This functionality was added to allow plugins registering custom sidebar views. - self._sidebar_controller = SidebarController(self) - - ## Register the default settings sidebar manually - settings_sidebar_view = SettingsSidebarView() - self._sidebar_controller.addSidebarView(settings_sidebar_view) - self._additional_components = {} # Components to add to certain areas in the interface super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType, @@ -225,6 +217,14 @@ class CuraApplication(QtApplication): self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) + ## As of Cura 3.2, the sidebar is controlled by a controller. + # This functionality was added to allow plugins registering custom sidebar views. + self._sidebar_controller = SidebarController(self) + + ## Register the default settings sidebar manually + settings_sidebar_view = SettingsSidebarView() + self._sidebar_controller.addSidebarView(settings_sidebar_view) + self.setRequiredPlugins([ "CuraEngineBackend", "UserAgreement", From ac97d0d83f41717088b565c2b9f52bc9f323e4fb Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 13:23:30 +0100 Subject: [PATCH 485/764] Sort materials by brand, material, name, color_name. Contributes to issue CURA-4243. --- cura/Settings/MaterialsModel.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py index e3d56c2f86..36f7805281 100644 --- a/cura/Settings/MaterialsModel.py +++ b/cura/Settings/MaterialsModel.py @@ -29,5 +29,8 @@ class MaterialsModel(InstanceContainersModel): def _sortKey(self, item) -> List[Any]: result = [] result.append(item["metadata"]["brand"]) + result.append(item["metadata"]["material"]) + result.append(item["metadata"]["name"]) + result.append(item["metadata"]["color_name"]) result.extend(super()._sortKey(item)) return result From 6315cbae4e2cf83bdccf5cacb29d0b48d949d409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udio=20Sampaio=20=28Patola=29?= Date: Mon, 4 Dec 2017 12:48:19 -0200 Subject: [PATCH 486/764] updated brazilian portuguese translations --- resources/i18n/pt_BR/cura.po | 172 ++++++++++--------- resources/i18n/pt_BR/fdmextruder.def.json.po | 2 +- resources/i18n/pt_BR/fdmprinter.def.json.po | 58 ++++--- 3 files changed, 120 insertions(+), 112 deletions(-) diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 82cbda8362..175c00c2e0 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2017-11-21 16:58+0100\n" -"PO-Revision-Date: 2017-10-05 12:20-0300\n" +"PO-Revision-Date: 2017-12-04 10:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" "Language: pt_BR\n" @@ -92,7 +92,7 @@ msgstr "Arquivo enviado ao Doodle3D Connect" #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@action:button" msgid "Open Connect..." -msgstr "" +msgstr "Abrir Connect..." #: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 msgctxt "@info:tooltip" @@ -142,7 +142,7 @@ msgstr "Incapaz de iniciar novo trabalho porque a impressora está ocupada ou n #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 msgctxt "@info:title" msgid "Printer Unavailable" -msgstr "" +msgstr "Impressora Não Disponível" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 msgctxt "@info:status" @@ -594,7 +594,7 @@ msgstr "Conectar pela rede" #, python-brace-format msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!" msgid "New features are available for your {machine_name}! It is recommended to update the firmware on your printer." -msgstr "" +msgstr "Novos recursos estão disponível para sua {machine_name}! Recomenda-se atualizar o firmware da impressora." #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 #, python-format @@ -605,7 +605,7 @@ msgstr "Novo firmware de %s disponível" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 msgctxt "@action:button" msgid "How to update" -msgstr "" +msgstr "Como atualizar" #: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 msgctxt "@info" @@ -640,7 +640,7 @@ msgstr "Erro ao iniciar %s!" #: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 msgctxt "@item:inlistbox" msgid "Simulation view" -msgstr "" +msgstr "Visão simulada" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 msgctxt "@info:status" @@ -650,7 +650,7 @@ msgstr "O Cura não mostra as camadas corretamente quando Impressão em Arame es #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 msgctxt "@info:title" msgid "Simulation View" -msgstr "" +msgstr "Visão Simulada" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 msgid "Modify G-Code" @@ -731,7 +731,7 @@ msgstr "Incapaz de fatiar com os ajustes atuais. Os seguintes ajustes têm erros #, python-brace-format msgctxt "@info:status" msgid "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}" -msgstr "" +msgstr "Incapaz de fatiar devido a alguns ajustes por modelo. Os seguintes ajustes têm erros em um ou mais dos modelos: {error_labels}" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 msgctxt "@info:status" @@ -766,25 +766,25 @@ msgstr "Configurar ajustes por Modelo" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 msgid "Install" -msgstr "" +msgstr "Instalar" #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It is not set to a directory." -msgstr "" +msgstr "Erro ao copiar arquivos de plugins Siemens NX. Por favor verifique seu UGII_USER_DIR. Ele não está configurado para um diretório." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 msgid "Successfully installed Siemens NX Cura plugin." -msgstr "" +msgstr "Plugin Siemens NX do Cura instalado com sucesso." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 msgid "Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." -msgstr "" +msgstr "Erro ao copiar arquivos de plugins Siemens NX. Por favor, verifique seu UGII_USER_DIR." #: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 msgid "Failed to install Siemens NX plugin. Could not set environment variable UGII_USER_DIR for Siemens NX." -msgstr "" +msgstr "Erro ao instalar arquivos de plugins Siemens NX. Não foi possível ajustar a variável de ambiente UGII_USER_DIR para o Simenes NX." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 @@ -947,7 +947,7 @@ msgstr "Outros" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 msgctxt "@label unknown material" msgid "Unknown" -msgstr "" +msgstr "Desconhecido" #: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 #, python-brace-format @@ -1012,12 +1012,12 @@ msgstr "Material Personalizado" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 msgctxt "@menuitem" msgid "Global" -msgstr "" +msgstr "Global" #: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 msgctxt "@menuitem" msgid "Not overridden" -msgstr "" +msgstr "Não sobrepujado" #: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 msgctxt "@info:status" @@ -1066,7 +1066,7 @@ msgstr "Perfil exportado para {0}" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 msgctxt "@info:title" msgid "Export succeeded" -msgstr "" +msgstr "Exportação concluída" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 @@ -1139,84 +1139,87 @@ msgid "" "

    Please use the \"Send report\" button to post a bug report automatically to our servers

    \n" " " msgstr "" +"

    Uma exceção fatal aocorreu. Por favor nos envie este Relatório de Erros para consertarmos o problema

    \n" +"

    Por favor use o botão \"Enviar relatório\" para postar um relato de bug automaticamente em nossos servidores

    \n" +" " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 msgctxt "@title:groupbox" msgid "System information" -msgstr "" +msgstr "Informação do Sistema" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 msgctxt "@label unknown version of Cura" msgid "Unknown" -msgstr "" +msgstr "Desconhecida" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 #, python-brace-format msgctxt "@label Cura version" msgid "Cura version: {version}
    " -msgstr "" +msgstr "Versão do Cura: {version}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 #, python-brace-format msgctxt "@label Platform" msgid "Platform: {platform}
    " -msgstr "" +msgstr "Plataforma: {platform}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 #, python-brace-format msgctxt "@label Qt version" msgid "Qt version: {qt}
    " -msgstr "" +msgstr "Versão da Qt: {qt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 #, python-brace-format msgctxt "@label PyQt version" msgid "PyQt version: {pyqt}
    " -msgstr "" +msgstr "Versão da PyQt: {pyqt}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 #, python-brace-format msgctxt "@label OpenGL" msgid "OpenGL: {opengl}
    " -msgstr "" +msgstr "OpenGL: {opengl}
    " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "" +msgstr "
  • Versão da OpenGL: {version}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "" +msgstr "
  • Fornecedor da OpenGL: {vendor}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "" +msgstr "
  • Renderizador da OpenGL: {renderer}
  • " #: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 msgctxt "@title:groupbox" msgid "Exception traceback" -msgstr "" +msgstr "Traceback de exceção" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 msgctxt "@title:groupbox" msgid "Logs" -msgstr "" +msgstr "Registros" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 msgctxt "@title:groupbox" msgid "User description" -msgstr "" +msgstr "Descrição do usuário" #: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 msgctxt "@action:button" msgid "Send report" -msgstr "" +msgstr "Enviar relatório" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 msgctxt "@info:progress" @@ -1254,7 +1257,7 @@ msgstr "Não é possível abrir nenhum outro arquivo se G-Code estiver sendo car #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 msgctxt "@info:status" msgid "The selected model was too small to load." -msgstr "" +msgstr "O modelo selecionado é pequenos demais para carregar." #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 msgctxt "@title" @@ -1632,7 +1635,7 @@ msgstr "%1 não está configurada para hospedar um grupo de impressora Ultimaker #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 msgctxt "@info:tooltip" msgid "Opens the print jobs page with your default web browser." -msgstr "" +msgstr "Abre a página de trabalhos de impressão com seu navegador default." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 @@ -1667,7 +1670,7 @@ msgstr "A conexão à impressora foi perdida" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 msgctxt "@label:status" msgid "Disabled" -msgstr "" +msgstr "Desabilitado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 msgctxt "@label:status" @@ -1682,12 +1685,12 @@ msgstr "Finalizado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 msgctxt "@label:status" msgid "Paused" -msgstr "" +msgstr "Pausado" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 msgctxt "@label:status" msgid "Resuming" -msgstr "" +msgstr "Continuando" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 msgctxt "@label:status" @@ -1829,12 +1832,12 @@ msgstr "Tipo de Linha" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 msgctxt "@label:listbox" msgid "Feedrate" -msgstr "" +msgstr "Taxa de alimentação" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 msgctxt "@label:listbox" msgid "Layer thickness" -msgstr "" +msgstr "Largura de camada" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 msgctxt "@label" @@ -1884,12 +1887,12 @@ msgstr "Parede Interna" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 msgctxt "@label" msgid "min" -msgstr "" +msgstr "mín" #: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 msgctxt "@label" msgid "max" -msgstr "" +msgstr "máx" #: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 msgctxt "@title:window" @@ -2127,7 +2130,7 @@ msgstr "%1 de %2" #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 msgctxt "@action:warning" msgid "Loading a project will clear all models on the build plate." -msgstr "" +msgstr "Carregar um projeto limpará todos os modelos da mesa de impressão." #: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 msgctxt "@action:button" @@ -2171,6 +2174,9 @@ msgid "" "You need to accept this license to install this plugin.\n" "Do you agree with the terms below?" msgstr "" +"Este plugin contém uma licença.\n" +"Você precisa aceitar esta licença para instalar este plugin.\n" +"Você concorda com os termos abaixo?" #: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 msgctxt "@action:button" @@ -2185,7 +2191,7 @@ msgstr "Recusar" #: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 msgctxt "@title:window" msgid "User Agreement" -msgstr "" +msgstr "Termos de Acordo do Usuário" #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 #: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 @@ -3068,7 +3074,7 @@ msgstr "Sobre o Cura" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 msgctxt "@label" msgid "version: %1" -msgstr "" +msgstr "versão: %1" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 msgctxt "@label" @@ -3167,7 +3173,7 @@ msgstr "Biblioteca de recorte de polígonos" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 msgctxt "@Label" msgid "Python HTTP library" -msgstr "" +msgstr "Biblioteca de HTTP Python" #: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 msgctxt "@label" @@ -3187,7 +3193,7 @@ msgstr "Perfil:" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 msgctxt "@" msgid "No Profile Available" -msgstr "" +msgstr "Nenhum Perfil Disponível" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 msgctxt "@tooltip" @@ -3298,44 +3304,44 @@ msgstr "" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 msgctxt "@label Hours and minutes" msgid "00h 00min" -msgstr "" +msgstr "00h 00min" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 msgctxt "@tooltip" msgid "Time specification
    " -msgstr "" +msgstr "Especificação de tempo
    " #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 msgctxt "@label" msgid "Cost specification" -msgstr "" +msgstr "Especificação de custo" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 msgctxt "@label m for meter" msgid "%1m" -msgstr "" +msgstr "%1m" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 msgctxt "@label g for grams" msgid "%1g" -msgstr "" +msgstr "%1g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 msgctxt "@label" msgid "Total:" -msgstr "" +msgstr "Total:" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 msgctxt "@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost" msgid "%1m / ~ %2g / ~ %4 %3" -msgstr "" +msgstr "%1m / ~ %2g / ~ %4 %3" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 msgctxt "@label Print estimates: m for meters, g for grams" msgid "%1m / ~ %2g" -msgstr "" +msgstr "%1m / ~ %2g" #: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 msgctxt "@tooltip" @@ -3460,27 +3466,27 @@ msgstr "Aquecer a mesa antes de imprimir. Você pode continuar ajustando sua imp #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 msgctxt "@label" msgid "Printer control" -msgstr "" +msgstr "Controle da Impressora" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 msgctxt "@label" msgid "Jog Position" -msgstr "" +msgstr "Posição de Trote" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 msgctxt "@label" msgid "X/Y" -msgstr "" +msgstr "X/Y" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 msgctxt "@label" msgid "Z" -msgstr "" +msgstr "Z" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 msgctxt "@label" msgid "Jog Distance" -msgstr "" +msgstr "Distância de Trote" #: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 msgctxt "@label" @@ -3525,7 +3531,7 @@ msgstr "&Sair" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 msgctxt "@action:inmenu menubar:view" msgid "&Reset camera position" -msgstr "" +msgstr "&Recompor posições de câmera" #: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 msgctxt "@action:inmenu" @@ -3767,7 +3773,7 @@ msgstr "Importar todos como modelos" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 msgctxt "@title:window" msgid "Ultimaker Cura" -msgstr "" +msgstr "Ultimaker Cura" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 msgctxt "@title:menu menubar:toplevel" @@ -3924,7 +3930,7 @@ msgstr "Altura de Camada" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 msgctxt "@tooltip" msgid "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab" -msgstr "" +msgstr "Um perfil personalizado está atualmente ativo. Para habilitar o controle deslizante de qualidade, escolha um perfil de qualidade default na aba Personalizado" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 msgctxt "@label" @@ -3944,7 +3950,7 @@ msgstr "Mais Rápido" #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 msgctxt "@tooltip" msgid "You have modified some profile settings. If you want to change these go to custom mode." -msgstr "" +msgstr "Você modificou alguns ajustes de perfil. Se você quiser alterá-los, use o modo personalizado." #: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 msgctxt "@label" @@ -4036,7 +4042,7 @@ msgstr "Material" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 msgctxt "@label" msgid "Check compatibility" -msgstr "" +msgstr "Verificar compatibilidade" #: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 msgctxt "@tooltip" @@ -4176,12 +4182,12 @@ msgstr "Integração ao SolidWorks" #: SimulationView/plugin.json msgctxt "description" msgid "Provides the Simulation view." -msgstr "" +msgstr "Provê a Visão Simulada." #: SimulationView/plugin.json msgctxt "name" msgid "Simulation View" -msgstr "" +msgstr "Visão Simulada" #: PostProcessingPlugin/plugin.json msgctxt "description" @@ -4266,12 +4272,12 @@ msgstr "Atualização de Versão de 2.7 para 3.0" #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" +msgstr "Atualiza configurações do Cura 3.0 para o Cura 3.1." #: VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" msgid "Version Upgrade 3.0 to 3.1" -msgstr "" +msgstr "Atualização de Versão 3.0 para 3.1" #: VersionUpgrade/VersionUpgrade26to27/plugin.json msgctxt "description" @@ -4336,12 +4342,12 @@ msgstr "Ferramenta de Ajustes Por Modelo" #: cura-siemensnx-plugin/plugin.json msgctxt "description" msgid "Helps you to install an 'export to Cura' button in Siemens NX." -msgstr "" +msgstr "Auxilia na instalação de um botão 'exportar para o Cura' no Siemens NX." #: cura-siemensnx-plugin/plugin.json msgctxt "name" msgid "Siemens NX Integration" -msgstr "" +msgstr "Integração ao Siemens NX" #: 3MFReader/plugin.json msgctxt "description" @@ -4406,12 +4412,12 @@ msgstr "Gerador de 3MF" #: UserAgreementPlugin/plugin.json msgctxt "description" msgid "Ask the user once if he/she agrees with our license" -msgstr "" +msgstr "Pergunta ao usuário uma única vez sobre concordância com a licença" #: UserAgreementPlugin/plugin.json msgctxt "name" msgid "UserAgreement" -msgstr "" +msgstr "Acordo de Usuário" #: UltimakerMachineActions/plugin.json msgctxt "description" @@ -4453,13 +4459,13 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." -msgctxt "@item:inlistbox" -msgid "Layer view" -msgstr "Visão de Camadas" +#~ msgctxt "@item:inlistbox" +#~ msgid "Layer view" +#~ msgstr "Visão de Camadas" -msgctxt "@info:title" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "@info:title" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4561,9 +4567,9 @@ msgstr "Visão de Camadas" #~ msgid "Provides the Layer view." #~ msgstr "Provê a visão de Camadas." -msgctxt "name" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "name" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4884,9 +4890,9 @@ msgstr "Visão de Camadas" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Provê suporte para importar perfis de arquivos G-Code." -msgctxt "@label" -msgid "Layer View" -msgstr "Visão de Camadas" +#~ msgctxt "@label" +#~ msgid "Layer View" +#~ msgstr "Visão de Camadas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." diff --git a/resources/i18n/pt_BR/fdmextruder.def.json.po b/resources/i18n/pt_BR/fdmextruder.def.json.po index 816a6ccb4a..1f222f9847 100644 --- a/resources/i18n/pt_BR/fdmextruder.def.json.po +++ b/resources/i18n/pt_BR/fdmextruder.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-10-06 08:00-0300\n" +"PO-Revision-Date: 2017-12-04 09:00-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" "Language: pt_BR\n" diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index d0e806e768..4aeea1d2f9 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 3.0\n" "Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" "POT-Creation-Date: 2017-11-21 16:58+0000\n" -"PO-Revision-Date: 2017-10-06 10:00-0300\n" +"PO-Revision-Date: 2017-12-04 10:20-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio and CoderSquirrel \n" "Language: pt_BR\n" @@ -613,27 +613,27 @@ msgstr "A altura da camada inicial em mm. Uma camada inicial mais espessa faz a #: fdmprinter.def.json msgctxt "slicing_tolerance label" msgid "Slicing Tolerance" -msgstr "" +msgstr "Tolerância de Fatiamento" #: fdmprinter.def.json msgctxt "slicing_tolerance description" msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process." -msgstr "" +msgstr "Como fatiar camadas com superfícies diagonais. As áreas de uma camada podem ser geradas baseadas em onde o meio da camada interseciona a superfície (Meio). Alternativamente, cada camada pode ter as áreas que se encontram dentro do volume por toda a altura da camada (Exclusivo) ou a camada pode abranger todas as áreas que tenham qualquer penetração dentro do volume (Inclusivo). Exclusivo retém mais detalhes, Inclusivo é melhor para encaixes e Meio toma menos tempo para processar." #: fdmprinter.def.json msgctxt "slicing_tolerance option middle" msgid "Middle" -msgstr "" +msgstr "Meio" #: fdmprinter.def.json msgctxt "slicing_tolerance option exclusive" msgid "Exclusive" -msgstr "" +msgstr "Exclusivo" #: fdmprinter.def.json msgctxt "slicing_tolerance option inclusive" msgid "Inclusive" -msgstr "" +msgstr "Inclusivo" #: fdmprinter.def.json msgctxt "line_width label" @@ -808,7 +808,7 @@ msgstr "O carro extrusor usado para imprimir a parede externa. Este ajuste é us #: fdmprinter.def.json msgctxt "wall_x_extruder_nr label" msgid "Inner Wall Extruder" -msgstr "" +msgstr "Extrusor da Parede Interior" #: fdmprinter.def.json msgctxt "wall_x_extruder_nr description" @@ -1388,7 +1388,7 @@ msgstr "Padrão de Preenchimento" #: fdmprinter.def.json msgctxt "infill_pattern description" msgid "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric patterns are fully printed every layer. Cubic, quarter cubic and octet infill change with every layer to provide a more equal distribution of strength over each direction." -msgstr "" +msgstr "O padrão do material de preenchimento da impressão. Preenchimento de Linhas e Ziguezague trocam direções em camadas alternadas, reduzindo custo do material. Os padrões de Grade, Triângulo, Tri-Hexágono, Cúbico, Octeto, Quarto Cúbico, Cruzado e Concêntrico são totalmente impressos em cada camada. Os preenchimentos Cúbico, Quarto Cúbico e Octeto mudam em cada camada para prover uma distribuição mais uniforme de forças em cada direção." #: fdmprinter.def.json msgctxt "infill_pattern option grid" @@ -1408,7 +1408,7 @@ msgstr "Triângulos" #: fdmprinter.def.json msgctxt "infill_pattern option trihexagon" msgid "Tri-Hexagon" -msgstr "" +msgstr "Tri-Hexágono" #: fdmprinter.def.json msgctxt "infill_pattern option cubic" @@ -1463,7 +1463,7 @@ msgstr "Conectar Linhas de Preenchimento" #: fdmprinter.def.json msgctxt "zig_zaggify_infill description" msgid "Connect the ends where the infill pattern meets the inner wall using a line which follows the shape of the inner wall. Enabling this setting can make the infill adhere to the walls better and reduce the effects of infill on the quality of vertical surfaces. Disabling this setting reduces the amount of material used." -msgstr "" +msgstr "Conecta as extremidades onde o padrão de preenchimento toca a parede interna usando uma linha que segue a forma da parede interna. Habilitar este ajuste pode fazer o preenchimento aderir melhor às paredes e reduzir o efeito do preenchimento na qualidade de superfícies verticais. Desabilitar este ajuda diminui a quantidade de material usado." #: fdmprinter.def.json msgctxt "infill_angles label" @@ -1478,22 +1478,22 @@ msgstr "Uma lista de direções de filetes em números inteiros a usar. Elemento #: fdmprinter.def.json msgctxt "infill_offset_x label" msgid "Infill X Offset" -msgstr "" +msgstr "Deslocamento X do Preenchimento" #: fdmprinter.def.json msgctxt "infill_offset_x description" msgid "The infill pattern is offset this distance along the X axis." -msgstr "" +msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo X." #: fdmprinter.def.json msgctxt "infill_offset_y label" msgid "Infill Y Offset" -msgstr "" +msgstr "Deslocamento do Preenchimento Y" #: fdmprinter.def.json msgctxt "infill_offset_y description" msgid "The infill pattern is offset this distance along the Y axis." -msgstr "" +msgstr "O padrão de preenchimento é corrigido/deslocado nesta distância no eixo Y." #: fdmprinter.def.json msgctxt "sub_div_rad_add label" @@ -1643,7 +1643,7 @@ msgstr "Distância de Expansão do Contorno" #: fdmprinter.def.json msgctxt "expand_skins_expand_distance description" msgid "The distance the skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on neighboring layers adhere better to the skin. Lower values save amount of material used." -msgstr "" +msgstr "A distância em que os contornos são expandidos pra dentro do preenchimento. Valores mais altos fazem o contorno aderir melhor ao padrão de preenchimento e faz as paredes de camadas vizinhas aderirem melhor ao contorno. Valores menores diminuem a quantidade de material usado." #: fdmprinter.def.json msgctxt "top_skin_expand_distance label" @@ -1808,22 +1808,22 @@ msgstr "Ajusta o diâmetro do filamento utilizado. Acerte este valor com o diâm #: fdmprinter.def.json msgctxt "material_adhesion_tendency label" msgid "Adhesion Tendency" -msgstr "" +msgstr "Tendência à Aderência" #: fdmprinter.def.json msgctxt "material_adhesion_tendency description" msgid "Surface adhesion tendency." -msgstr "" +msgstr "Tendência de aderência da superfície" #: fdmprinter.def.json msgctxt "material_surface_energy label" msgid "Surface Energy" -msgstr "" +msgstr "Energia de Superfície" #: fdmprinter.def.json msgctxt "material_surface_energy description" msgid "Surface energy." -msgstr "" +msgstr "Energia de superfície." #: fdmprinter.def.json msgctxt "material_flow label" @@ -3556,6 +3556,8 @@ msgid "" "The horizontal distance between the skirt and the first layer of the print.\n" "This is the minimum distance. Multiple skirt lines will extend outwards from this distance." msgstr "" +"A distância horizontal entre o skirt a primeira camada da impressão.\n" +"Esta é a distância mínima. Linhas múltiplas de skirt estenderão além desta distância." #: fdmprinter.def.json msgctxt "skirt_brim_minimal_length label" @@ -3615,7 +3617,7 @@ msgstr "Amaciamento do Raft" #: fdmprinter.def.json msgctxt "raft_smoothing description" msgid "This setting controls how much inner corners in the raft outline are rounded. Inward corners are rounded to a semi circle with a radius equal to the value given here. This setting also removes holes in the raft outline which are smaller than such a circle." -msgstr "" +msgstr "Este ajuste controla quanto os cantos internos do contorno do raft são arredondados. Esses cantos internos são convertidos em semicírculos com raio igual ao valor dado aqui. Este ajuste também remove furos no contorno do raft que forem menores que o círculo equivalente." #: fdmprinter.def.json msgctxt "raft_airgap label" @@ -4090,12 +4092,12 @@ msgstr "Normalmente o Cura tenta costurar pequenos furos na malha e remover part #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution label" msgid "Maximum Resolution" -msgstr "" +msgstr "Resolução Máxima" #: fdmprinter.def.json msgctxt "meshfix_maximum_resolution description" msgid "The minimum size of a line segment after slicing. If you increase this, the mesh will have a lower resolution. This may allow the printer to keep up with the speed it has to process g-code and will increase slice speed by removing details of the mesh that it can't process anyway." -msgstr "" +msgstr "O tamanho mínimo de um segmento de linha após o fatiamento. Se você aumentar este valor, a malha terá uma resolução menor. Isto pode permitir que a impressora mantenha a velocidade que precisa para processar o G-Code e aumentará a velocidade de fatiamento ao remover detalhes da malha que não poderia processar de qualquer jeito." #: fdmprinter.def.json msgctxt "multiple_mesh_overlap label" @@ -4130,12 +4132,12 @@ msgstr "Troca quais volumes sobrepondo malhas vão pertencer a cada camada, de m #: fdmprinter.def.json msgctxt "remove_empty_first_layers label" msgid "Remove Empty First Layers" -msgstr "" +msgstr "Remover Camadas Iniciais Vazias" #: fdmprinter.def.json msgctxt "remove_empty_first_layers description" msgid "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle." -msgstr "" +msgstr "Remove camadas vazias entre a primeira camada impressa se estiverem presentes. Desabilitar este ajuste pode criar camadas iniciais vazias se a Tolerância de Fatiamento estiver configurada para Exclusivo ou Meio." #: fdmprinter.def.json msgctxt "blackmagic label" @@ -4665,22 +4667,22 @@ msgstr "A distância média entre os pontos aleatórios introduzidos em cada seg #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset label" msgid "Flow rate compensation max extrusion offset" -msgstr "" +msgstr "Deslocamento de extrusão máxima da compensação de taxa de fluxo." #: fdmprinter.def.json msgctxt "flow_rate_max_extrusion_offset description" msgid "The maximum distance in mm to compensate." -msgstr "" +msgstr "A distância máxima em mm a compensar." #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor label" msgid "Flow rate compensation factor" -msgstr "" +msgstr "Fator de compensaçõ de taxa de fluxo" #: fdmprinter.def.json msgctxt "flow_rate_extrusion_offset_factor description" msgid "The multiplication factor for the flow rate -> distance translation." -msgstr "" +msgstr "O fator de multiplicação para a tradução entre taxa de fluxo -> distância." #: fdmprinter.def.json msgctxt "wireframe_enabled label" From 3c863fc388b0f7e813005f3b50403572d333b9e5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 16:28:35 +0100 Subject: [PATCH 487/764] Get default settings view to work as sidebar component --- cura/CuraApplication.py | 37 +++++++++++++++----------- cura/Settings/SettingsSidebarView.py | 16 +++++++---- cura/Sidebar/SidebarController.py | 33 ++++++++++++----------- cura/Sidebar/SidebarControllerProxy.py | 36 +++++++++++++++++++++++++ cura/Sidebar/SidebarView.py | 15 +++++++++-- cura_app.py | 8 +++--- resources/qml/Cura.qml | 21 +++++++++------ resources/qml/SidebarSettings.qml | 21 +++++++++++++++ 8 files changed, 138 insertions(+), 49 deletions(-) create mode 100644 cura/Sidebar/SidebarControllerProxy.py create mode 100644 resources/qml/SidebarSettings.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6f5746b49d..d7ded98688 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -32,13 +32,11 @@ from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation + from cura.Arrange import Arrange -from cura.Settings.SettingsSidebarView import SettingsSidebarView from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation -from cura.Sidebar.SidebarController import SidebarController -from cura.Sidebar.SidebarViewModel import SidebarViewModel from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator @@ -78,6 +76,11 @@ from cura.Settings.ContainerManager import ContainerManager from cura.Settings.GlobalStack import GlobalStack from cura.Settings.ExtruderStack import ExtruderStack +from cura.Sidebar.SidebarController import SidebarController +from cura.Sidebar.SidebarControllerProxy import SidebarControllerProxy +from cura.Sidebar.SidebarViewModel import SidebarViewModel +from cura.Settings.SettingsSidebarView import SettingsSidebarView + from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from UM.FlameProfiler import pyqtSlot from PyQt5.QtGui import QColor, QIcon @@ -131,6 +134,7 @@ class CuraApplication(QtApplication): stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished def __init__(self): + # this list of dir names will be used by UM to detect an old cura directory for dir_name in ["extruders", "machine_instances", "materials", "plugins", "quality", "user", "variants"]: Resources.addExpectedDirNameInData(dir_name) @@ -159,7 +163,6 @@ class CuraApplication(QtApplication): SettingDefinition.addSettingType("extruder", None, str, Validator) SettingDefinition.addSettingType("optional_extruder", None, str, None) - SettingDefinition.addSettingType("[int]", None, str, None) SettingFunction.registerOperator("extruderValues", ExtruderManager.getExtruderValues) @@ -184,7 +187,8 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.DefinitionChangesContainer) ## Initialise the version upgrade manager with Cura's storage paths. - import UM.VersionUpgradeManager #Needs to be here to prevent circular dependencies. + # Needs to be here to prevent circular dependencies. + import UM.VersionUpgradeManager UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions( { @@ -323,6 +327,11 @@ class CuraApplication(QtApplication): self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") + # Set the active sidebar view based on user preferences + preferences.addPreference("cura/active_sidebar_view", "default") + active_sidebar_view = preferences.getValue("cura/active_sidebar_view") + self._sidebar_controller.setActiveSidebarView(active_sidebar_view) + for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", @@ -678,7 +687,6 @@ class CuraApplication(QtApplication): controller = self.getController() controller.setActiveView("SolidView") - controller.setCameraTool("CameraTool") controller.setSelectionTool("SelectionTool") @@ -741,6 +749,11 @@ class CuraApplication(QtApplication): self.exec_() + ## Get the SidebarController of this application. + # \returns SidebarControllers \type{SidebarController} + def getSidebarController(self) -> SidebarController: + return self._sidebar_controller + def getMachineManager(self, *args): if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() @@ -786,14 +799,6 @@ class CuraApplication(QtApplication): def getPrintInformation(self): return self._print_information - ## Get the SidebarController of this application. - # A sidebar controller is created if it wasn't yet. - # \returns SidebarControllers \type{SidebarController} - def getSidebarController(self) -> SidebarController: - if self._sidebar_controller is None: - self._sidebar_controller = SidebarController(self) - return self._sidebar_controller - ## Registers objects for the QML engine to use. # # \param engine The QML engine. @@ -808,6 +813,7 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterType(SidebarViewModel, "Cura", 1, 0, "SidebarViewModel") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) @@ -819,8 +825,7 @@ class CuraApplication(QtApplication): qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) - qmlRegisterSingletonType(SidebarController, "Cura", 1, 0, "SidebarController", self.getSidebarController) - qmlRegisterType(SidebarViewModel, "Cura", 1, 0, "SidebarViewModel") + qmlRegisterSingletonType(SidebarControllerProxy, "Cura", 1, 0, "SidebarController", SidebarControllerProxy.createSidebarControllerProxy) # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py index 648e056044..b1cb88182b 100644 --- a/cura/Settings/SettingsSidebarView.py +++ b/cura/Settings/SettingsSidebarView.py @@ -1,23 +1,29 @@ # Copyright (c) 2017 Ultimaker B.V. -from PyQt5.QtCore import QObject +import os.path +from PyQt5.QtCore import QObject, QUrl + from UM.i18n import i18nCatalog from cura.Sidebar.SidebarView import SidebarView i18n_catalog = i18nCatalog("cura") class SettingsSidebarView(QObject, SidebarView): - def __init__(self): - super().__init__() + def __init__(self, parent = None): + super().__init__(parent) ## As the default sidebar is not a plugin, we have a get plugin ID method to allow the sidebar view model to get the needed data. def getPluginId(self): return "default" - ## As the default sidebar is not a plugin, we have a get meta data method here to allow the sidebar view model to get the needed data. + ## As the default sidebar is not a plugin, we have a add meta data method here to allow the sidebar view model to get the needed data. def getMetaData(self): return { "sidebar_view": { "name": i18n_catalog.i18nc("", "Print settings"), - "weight": 1 + "weight": 0 } } + + ## As the default sidebar is not a plugin, we have a get component path method here to allow the sidebar controller to get the needed data. + def getComponentPath(self): + return QUrl("SidebarSettings.qml") diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index 1212091b2d..d7789b9fb8 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -1,9 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry from UM.Signal import Signal -from .SidebarView import SidebarView -from typing import Optional, Dict +from UM.PluginRegistry import PluginRegistry # The sidebar controller manages available sidebar components and decides which one to display. # The cura.qml file uses this controller to repeat over the sidebars and show the active index. @@ -14,6 +12,7 @@ class SidebarController: self._sidebar_views = {} self._active_sidebar_view = None + # Register the sidebar_view plugin type so plugins can expose custom sidebar views. PluginRegistry.addType("sidebar_view", self.addSidebarView) ## Emitted when the list of views changes. @@ -26,28 +25,32 @@ class SidebarController: def getApplication(self): return self._application + ## Get all sidebar views registered in this controller. + def getAllSidebarViews(self): + return self._sidebar_views + ## Add a sidebar view to the registry. # It get's a unique name based on the plugin ID. - def addSidebarView(self, sidebar_view: SidebarView): - name = sidebar_view.getPluginId() - if name not in self._sidebar_views: - self._sidebar_views[name] = sidebar_view + def addSidebarView(self, sidebar_view): + sidebar_view_id = sidebar_view.getPluginId() + if sidebar_view_id not in self._sidebar_views: + self._sidebar_views[sidebar_view_id] = sidebar_view self.sidebarViewsChanged.emit() ## Get a registered sidebar view by name. # The name is the ID of the plugin that registered the view. - def getSidebarView(self, name: str) -> Optional[SidebarView]: + def getSidebarView(self, name: str): try: return self._sidebar_views[name] except KeyError: Logger.log("e", "Unable to find %s in sidebar view list", name) return None - ## Change the active sidebar view to one of the registered views. - def setActiveSidebarView(self, name: str): - print("setting active sidebar view") - self.activeSidebarViewChanged.emit() + ## Get the active sidebar view. + def getActiveSidebarView(self): + return self._active_sidebar_view - ## Get all sidebar views registered in this controller. - def getAllSidebarViews(self) -> Dict[SidebarView]: - return self._sidebar_views + ## Change the active sidebar view to one of the registered views. + def setActiveSidebarView(self, sidebar_view_id: str): + self._active_sidebar_view = self._sidebar_views[sidebar_view_id] + self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarControllerProxy.py b/cura/Sidebar/SidebarControllerProxy.py new file mode 100644 index 0000000000..1278d1cea8 --- /dev/null +++ b/cura/Sidebar/SidebarControllerProxy.py @@ -0,0 +1,36 @@ +# Copyright (c) 2017 Ultimaker B.V. +from PyQt5.QtCore import QObject, pyqtSlot, QUrl, pyqtProperty, pyqtSignal +from UM.Application import Application + + +## The sidebar controller proxy acts a proxy between the sidebar controller and the QMl context of the controller. +class SidebarControllerProxy(QObject): + + def __init__(self, parent = None): + super().__init__(parent) + self._controller = Application.getInstance().getSidebarController() + self._controller.activeSidebarViewChanged.connect(self._onActiveSidebarComponentChanged) + + ## Emitted when the active view changes. + activeSidebarViewChanged = pyqtSignal() + + @classmethod + def createSidebarControllerProxy(self, engine, script_engine): + return SidebarControllerProxy() + + @pyqtSlot() + def setActiveView(self, sidebar_view): + self._controller.setActiveSidebarView(sidebar_view) + + @pyqtProperty(QUrl, notify = activeSidebarViewChanged) + def activeComponentPath(self): + if not self._controller.getActiveSidebarView(): + return QUrl() + return self._controller.getActiveSidebarView().getComponentPath() + + @pyqtSlot(QUrl) + def getSidebarComponentPath(self, sidebar_id): + self._controller.getSidebarView(sidebar_id).getComponentPath() + + def _onActiveSidebarComponentChanged(self): + self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarView.py b/cura/Sidebar/SidebarView.py index f5a9caba94..6b78de1f17 100644 --- a/cura/Sidebar/SidebarView.py +++ b/cura/Sidebar/SidebarView.py @@ -1,7 +1,9 @@ # Copyright (c) 2017 Ultimaker B.V. +from PyQt5.QtCore import QUrl +from UM.Logger import Logger from UM.PluginObject import PluginObject - +from UM.PluginRegistry import PluginRegistry # Abstract class for sidebar view objects. # By default the sidebar is Cura's settings, slicing and printing overview. @@ -10,4 +12,13 @@ class SidebarView(PluginObject): def __init__(self): super().__init__() - print("sidebar view hello") + self._view = None + + ## Get the path to the component QML file as QUrl + def getComponentPath(self): + try: + sidebar_component_file_path = PluginRegistry.getInstance().getMetaData(self.getPluginId())["sidebar_view"]["sidebar_component"] + return QUrl.fromLocalFile(sidebar_component_file_path) + except KeyError: + Logger.log("w", "Could not find sidebar component QML file for %s", self.getPluginId()) + return QUrl() diff --git a/cura_app.py b/cura_app.py index d725bc1200..dd795e5aa4 100755 --- a/cura_app.py +++ b/cura_app.py @@ -22,9 +22,10 @@ if Platform.isLinux(): # Needed for platform.linux_distribution, which is not av if Platform.isWindows() and hasattr(sys, "frozen"): try: del os.environ["PYTHONPATH"] - except KeyError: pass + except KeyError: + pass -#WORKAROUND: GITHUB-704 GITHUB-708 +# WORKAROUND: GITHUB-704 GITHUB-708 # It looks like setuptools creates a .pth file in # the default /usr/lib which causes the default site-packages # to be inserted into sys.path before PYTHONPATH. @@ -45,6 +46,7 @@ def exceptHook(hook_type, value, traceback): _crash_handler = CrashHandler(hook_type, value, traceback) _crash_handler.show() + sys.excepthook = exceptHook # Workaround for a race condition on certain systems where there @@ -75,7 +77,7 @@ faulthandler.enable() # Force an instance of CuraContainerRegistry to be created and reused later. cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance() -# This prestart up check is needed to determine if we should start the application at all. +# This pre-start up check is needed to determine if we should start the application at all. if not cura.CuraApplication.CuraApplication.preStartUp(): sys.exit(0) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e144048af7..9385b36b60 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -366,19 +366,24 @@ UM.MainWindow onStopMonitoringPrint: base.showPrintMonitor = false } - Sidebar + Loader { - id: sidebar; + id: sidebar anchors { - top: topbar.bottom; - bottom: parent.bottom; - right: parent.right; + top: topbar.bottom + bottom: parent.bottom + right: parent.right } - z: 1 - width: UM.Theme.getSize("sidebar").width; - monitoringPrint: base.showPrintMonitor + + width: UM.Theme.getSize("sidebar").width + + // all sidebar components will have access to the show print monitor flag + property bool showPrintMonitor: base.showPrintMonitor + + // dynamically get the component from the sidebar controller + source: Cura.SidebarController.activeComponentPath } Rectangle diff --git a/resources/qml/SidebarSettings.qml b/resources/qml/SidebarSettings.qml new file mode 100644 index 0000000000..85bee1f096 --- /dev/null +++ b/resources/qml/SidebarSettings.qml @@ -0,0 +1,21 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 + +Sidebar +{ + id: sidebarSettings + + property bool showPrintMonitor: false + + anchors { + top: parent.top + bottom: parent.bottom + left: parent.left + right: parent.right + } + + width: parent.width + monitoringPrint: showPrintMonitor +} From c52451217b72e5aa93deebeefcea9740897aeeaf Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 16:29:21 +0100 Subject: [PATCH 488/764] Use timer instead of calling _update directly. Speeds up when the signal is called very often in a small period. Contributes to issue CURA-4243. --- cura/Settings/MaterialsModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py index 36f7805281..1b9b015108 100644 --- a/cura/Settings/MaterialsModel.py +++ b/cura/Settings/MaterialsModel.py @@ -19,7 +19,7 @@ class MaterialsModel(InstanceContainersModel): # \param container The container whose metadata was changed. def _onContainerMetaDataChanged(self, container): if container.getMetaDataEntry("type") == "material": #Only need to update if a material was changed. - self._update() + self._container_change_timer.start() def _onContainerChanged(self, container): if container.getMetaDataEntry("type", "") == "material": From 90e8256f466ee2875bb28b7fe39a8796bb618f31 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 16:30:21 +0100 Subject: [PATCH 489/764] Fix that renaming a custom material also updates the selected material. The namechanged signal was not connected at startup, so the update would only work if you change material first before renaming. Contributes to CURA-4243. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a395329552..c051e429e2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -728,6 +728,8 @@ class CuraApplication(QtApplication): def getMachineManager(self, *args): if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() + # explicitly sets current material and set internal state: also fixes problem with material namechange signal + self._machine_manager.setActiveMaterial(self._machine_manager.activeMaterialId) return self._machine_manager def getExtruderManager(self, *args): From 3b251919497e77e5dc4dfd5956603973d30bc1cc Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 17:00:43 +0100 Subject: [PATCH 490/764] Undo a fix that causes Cura to crash when starting up clean. Contributes to issue CURA-4243. --- cura/CuraApplication.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c051e429e2..a395329552 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -728,8 +728,6 @@ class CuraApplication(QtApplication): def getMachineManager(self, *args): if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() - # explicitly sets current material and set internal state: also fixes problem with material namechange signal - self._machine_manager.setActiveMaterial(self._machine_manager.activeMaterialId) return self._machine_manager def getExtruderManager(self, *args): From a3818be46faf92ae43d6eac52fbc988247227036 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 4 Dec 2017 17:05:38 +0100 Subject: [PATCH 491/764] Reactivate layer view translation The layer view mode was renamed back from Simulation View to Layer View after the string freeze. Luckily we still have this old translation. Contributes to issue CURA-4601. --- resources/i18n/pt_BR/cura.po | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 175c00c2e0..e00c6099c4 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -4459,13 +4459,13 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "To ensure that your {machine_name} is equipped with the latest features it is recommended to update the firmware regularly. This can be done on the {machine_name} (when connected to the network) or via USB." #~ msgstr "Para assegurar que sua {machine_name} esteja equipada com os recursos mais recentes, é recomendado atualizar o firmware regularmente. Isto pode ser feito na {machine_name} (quando conectado pela rede) ou via USB." -#~ msgctxt "@item:inlistbox" -#~ msgid "Layer view" -#~ msgstr "Visão de Camadas" +msgctxt "@item:inlistbox" +msgid "Layer view" +msgstr "Visão de Camadas" -#~ msgctxt "@info:title" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "@info:title" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@menuitem" #~ msgid "Browse plugins" @@ -4567,9 +4567,9 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "Provides the Layer view." #~ msgstr "Provê a visão de Camadas." -#~ msgctxt "name" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "name" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@item:inlistbox" #~ msgid "X-Ray" @@ -4890,9 +4890,9 @@ msgstr "Leitor de Perfis do Cura" #~ msgid "Provides support for importing profiles from g-code files." #~ msgstr "Provê suporte para importar perfis de arquivos G-Code." -#~ msgctxt "@label" -#~ msgid "Layer View" -#~ msgstr "Visão de Camadas" +msgctxt "@label" +msgid "Layer View" +msgstr "Visão de Camadas" #~ msgctxt "@info:whatsthis" #~ msgid "Provides the Layer view." From 41cde7c7f4520d2840f5c64e6868fba03324e04a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 4 Dec 2017 17:07:37 +0100 Subject: [PATCH 492/764] Fix connecting material name change signal on startup. Contributes to CURA-4243. --- cura/Settings/MachineManager.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 9a3f529355..1d73e5e261 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -117,6 +117,10 @@ class MachineManager(QObject): "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Incompatible Material")) + containers = ContainerRegistry.getInstance().findInstanceContainers(id = self.activeMaterialId) + if containers: + containers[0].nameChanged.connect(self._onMaterialNameChanged) + globalContainerChanged = pyqtSignal() # Emitted whenever the global stack is changed (ie: when changing between printers, changing a global profile, but not when changing a value) activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() From caf56587fe3b96f2142268ca07eba2cfb825ebfa Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 19:37:03 +0100 Subject: [PATCH 493/764] Implement switching sidebar views --- cura/CuraApplication.py | 34 ++++++++++------- cura/Settings/SettingsSidebarView.py | 11 +++--- cura/Sidebar/SidebarController.py | 7 +++- cura/Sidebar/SidebarControllerProxy.py | 36 +++++++++++------- cura/Sidebar/SidebarView.py | 17 +++++++-- cura/Sidebar/SidebarViewModel.py | 15 ++++---- resources/qml/Cura.qml | 52 +++++++++++++++++++++++--- resources/qml/SidebarSettings.qml | 21 ----------- 8 files changed, 121 insertions(+), 72 deletions(-) delete mode 100644 resources/qml/SidebarSettings.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index d7ded98688..e9e521fb49 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -201,6 +201,10 @@ class CuraApplication(QtApplication): } ) + ## As of Cura 3.2, the sidebar is controlled by a controller. + # This functionality was added to allow plugins registering custom sidebar views. + self._sidebar_controller = SidebarController(self) + self._currently_loading_files = [] self._non_sliceable_extensions = [] @@ -221,14 +225,6 @@ class CuraApplication(QtApplication): self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) - ## As of Cura 3.2, the sidebar is controlled by a controller. - # This functionality was added to allow plugins registering custom sidebar views. - self._sidebar_controller = SidebarController(self) - - ## Register the default settings sidebar manually - settings_sidebar_view = SettingsSidebarView() - self._sidebar_controller.addSidebarView(settings_sidebar_view) - self.setRequiredPlugins([ "CuraEngineBackend", "UserAgreement", @@ -327,11 +323,6 @@ class CuraApplication(QtApplication): self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") - # Set the active sidebar view based on user preferences - preferences.addPreference("cura/active_sidebar_view", "default") - active_sidebar_view = preferences.getValue("cura/active_sidebar_view") - self._sidebar_controller.setActiveSidebarView(active_sidebar_view) - for key in [ "dialog_load_path", # dialog_save_path is in LocalFileOutputDevicePlugin "dialog_profile_path", @@ -737,6 +728,10 @@ class CuraApplication(QtApplication): if not run_headless: self.initializeEngine() + # Now that the SidebarViewModel has been created we can set the default sidebar view + # TODO: put this in a more elegant place + self._setDefaultSidebarView() + if run_headless or self._engine.rootObjects: self.closeSplash() @@ -1324,6 +1319,19 @@ class CuraApplication(QtApplication): def _addProfileWriter(self, profile_writer): pass + ## Create and register the default sidebar component (settings) + def _setDefaultSidebarView(self): + + # Register the default settings sidebar manually + settings_sidebar_view = SettingsSidebarView() + self._sidebar_controller.addSidebarView(settings_sidebar_view) + + # Set the default sidebar view depending on user preferences. + preferences = Preferences.getInstance() + preferences.addPreference("cura/active_sidebar_view", settings_sidebar_view.getPluginId()) + active_sidebar_view = preferences.getValue("cura/active_sidebar_view") + self._sidebar_controller.setActiveSidebarView(active_sidebar_view) + @pyqtSlot("QSize") def setMinimumWindowSize(self, size): self.getMainWindow().setMinimumSize(size) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py index b1cb88182b..8b861fbaf6 100644 --- a/cura/Settings/SettingsSidebarView.py +++ b/cura/Settings/SettingsSidebarView.py @@ -1,8 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. -import os.path -from PyQt5.QtCore import QObject, QUrl +from PyQt5.QtCore import QObject from UM.i18n import i18nCatalog + from cura.Sidebar.SidebarView import SidebarView i18n_catalog = i18nCatalog("cura") @@ -19,11 +19,10 @@ class SettingsSidebarView(QObject, SidebarView): def getMetaData(self): return { "sidebar_view": { - "name": i18n_catalog.i18nc("", "Print settings"), + "name": i18n_catalog.i18nc("@item:inmenu", "Print settings"), "weight": 0 } } - ## As the default sidebar is not a plugin, we have a get component path method here to allow the sidebar controller to get the needed data. - def getComponentPath(self): - return QUrl("SidebarSettings.qml") + def getComponent(self): + return None diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index d7789b9fb8..420f00a489 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -1,5 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. from UM.Logger import Logger +from UM.Preferences import Preferences from UM.Signal import Signal from UM.PluginRegistry import PluginRegistry @@ -52,5 +53,7 @@ class SidebarController: ## Change the active sidebar view to one of the registered views. def setActiveSidebarView(self, sidebar_view_id: str): - self._active_sidebar_view = self._sidebar_views[sidebar_view_id] - self.activeSidebarViewChanged.emit() + if sidebar_view_id in self._sidebar_views: + self._active_sidebar_view = self._sidebar_views[sidebar_view_id] + Preferences.getInstance().setValue("cura/active_sidebar_view", sidebar_view_id) + self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarControllerProxy.py b/cura/Sidebar/SidebarControllerProxy.py index 1278d1cea8..c373dc0a0a 100644 --- a/cura/Sidebar/SidebarControllerProxy.py +++ b/cura/Sidebar/SidebarControllerProxy.py @@ -4,33 +4,41 @@ from UM.Application import Application ## The sidebar controller proxy acts a proxy between the sidebar controller and the QMl context of the controller. +from UM.Logger import Logger + + class SidebarControllerProxy(QObject): def __init__(self, parent = None): super().__init__(parent) self._controller = Application.getInstance().getSidebarController() - self._controller.activeSidebarViewChanged.connect(self._onActiveSidebarComponentChanged) + self._controller.activeSidebarViewChanged.connect(self._onActiveSidebarViewChanged) - ## Emitted when the active view changes. activeSidebarViewChanged = pyqtSignal() @classmethod def createSidebarControllerProxy(self, engine, script_engine): return SidebarControllerProxy() - @pyqtSlot() - def setActiveView(self, sidebar_view): - self._controller.setActiveSidebarView(sidebar_view) + @pyqtProperty(str, notify = activeSidebarViewChanged) + def activeSidebarId(self): + if self._controller.getActiveSidebarView() is not None: + return self._controller.getActiveSidebarView().getPluginId() + else: + return "default" - @pyqtProperty(QUrl, notify = activeSidebarViewChanged) - def activeComponentPath(self): - if not self._controller.getActiveSidebarView(): - return QUrl() - return self._controller.getActiveSidebarView().getComponentPath() + @pyqtSlot(str) + def setActiveSidebarView(self, sidebar_view_id): + Logger.log("d", "Setting active sidebar view to %s", sidebar_view_id) + self._controller.setActiveSidebarView(sidebar_view_id) - @pyqtSlot(QUrl) + @pyqtSlot(str, result = QObject) + def getSidebarComponent(self, sidebar_id): + return self._controller.getSidebarView(sidebar_id).getComponent() + + @pyqtSlot(str, result = QUrl) def getSidebarComponentPath(self, sidebar_id): - self._controller.getSidebarView(sidebar_id).getComponentPath() + return self._controller.getSidebarView(sidebar_id).getComponentPath() - def _onActiveSidebarComponentChanged(self): - self.activeSidebarViewChanged.emit() + def _onActiveSidebarViewChanged(self): + self.activeSidebarViewChanged.emit() \ No newline at end of file diff --git a/cura/Sidebar/SidebarView.py b/cura/Sidebar/SidebarView.py index 6b78de1f17..d5c20e0858 100644 --- a/cura/Sidebar/SidebarView.py +++ b/cura/Sidebar/SidebarView.py @@ -1,6 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. -from PyQt5.QtCore import QUrl +import os.path +from UM.Application import Application from UM.Logger import Logger from UM.PluginObject import PluginObject from UM.PluginRegistry import PluginRegistry @@ -14,11 +15,21 @@ class SidebarView(PluginObject): super().__init__() self._view = None + def getComponent(self): + if not self._view: + self.createView() + return self._view + + def createView(self): + component_path = self.getComponentPath() + self._view = Application.getInstance().createQmlComponent(component_path, {"manager": self}) + ## Get the path to the component QML file as QUrl def getComponentPath(self): try: + plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) sidebar_component_file_path = PluginRegistry.getInstance().getMetaData(self.getPluginId())["sidebar_view"]["sidebar_component"] - return QUrl.fromLocalFile(sidebar_component_file_path) + return os.path.join(plugin_path, sidebar_component_file_path) except KeyError: Logger.log("w", "Could not find sidebar component QML file for %s", self.getPluginId()) - return QUrl() + return "" diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index 4ed1ca60cb..de0aae182c 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -26,17 +26,18 @@ class SidebarViewModel(ListModel): ## Update the model when new views are added or another view is made the active view. def _onSidebarViewsChanged(self): items = [] + current_view_id = None + sidebar_views = self._controller.getAllSidebarViews() current_view = self._controller.getActiveSidebarView() + if current_view: + current_view_id = current_view.getPluginId() for sidebar_view_id, sidebar_view in sidebar_views.items(): - plugin_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id) - if plugin_metadata: - # Check if the registered view came from a plugin and extract the metadata if so. - sidebar_view_metadata = plugin_metadata.get("sidebar_view", {}) + if sidebar_view_id != "default": + sidebar_view_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id).get("sidebar_view", {}) else: - # Get the meta data directly from the plugin - sidebar_view_metadata = sidebar_view.getMetaData() + sidebar_view_metadata = sidebar_view.getMetaData().get("sidebar_view", {}) # Skip view modes that are marked as not visible if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: @@ -48,7 +49,7 @@ class SidebarViewModel(ListModel): items.append({ "id": sidebar_view_id, "name": name, - "active": sidebar_view_id == current_view.getPluginId(), + "active": sidebar_view_id == current_view_id, "weight": weight }) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 9385b36b60..5f421881c0 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -331,7 +331,7 @@ UM.MainWindow text: catalog.i18nc("@action:button","Open File"); iconSource: UM.Theme.getIcon("load") style: UM.Theme.styles.tool_button - tooltip: ''; + tooltip: "" anchors { top: topbar.bottom; @@ -366,7 +366,7 @@ UM.MainWindow onStopMonitoringPrint: base.showPrintMonitor = false } - Loader + Rectangle { id: sidebar @@ -379,11 +379,30 @@ UM.MainWindow width: UM.Theme.getSize("sidebar").width - // all sidebar components will have access to the show print monitor flag - property bool showPrintMonitor: base.showPrintMonitor + // The sidebarRepeater exposes sidebar views provided by plugins. + // Whenever a plugin sidebar view is active (e.g. not "default"), that sidebar view is shown. + Repeater + { + id: sidebarRepeater - // dynamically get the component from the sidebar controller - source: Cura.SidebarController.activeComponentPath + model: Cura.SidebarViewModel { } + + delegate: Loader + { + id: delegate + asynchronous: true + visible: model.active + + // dynamically get the component from the sidebar controller or set the default sidebar + sourceComponent: { + if (model.id !== "default") { + return Cura.SidebarController.getSidebarComponent(model.id) + } else { + return defaultSidebar + } + } + } + } } Rectangle @@ -434,6 +453,27 @@ UM.MainWindow } } + // This is the default sidebar view. + // It is used as sourceComponent for the default sidebar view. + Component + { + id: defaultSidebar + + Sidebar + { +// anchors { +// top: parent.top +// bottom: parent.bottom +// left: parent.left +// right: parent.right +// } +// +// width: parent.width +// +// monitoringPrint: base.showPrintMonitor + } + } + UM.PreferencesDialog { id: preferences diff --git a/resources/qml/SidebarSettings.qml b/resources/qml/SidebarSettings.qml deleted file mode 100644 index 85bee1f096..0000000000 --- a/resources/qml/SidebarSettings.qml +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 - -Sidebar -{ - id: sidebarSettings - - property bool showPrintMonitor: false - - anchors { - top: parent.top - bottom: parent.bottom - left: parent.left - right: parent.right - } - - width: parent.width - monitoringPrint: showPrintMonitor -} From 5673a834bc16edd0c4afaa79c3258ad7bc63401a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 4 Dec 2017 19:48:42 +0100 Subject: [PATCH 494/764] Fix showing default sidebar, cleanup needed --- resources/qml/Cura.qml | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 5f421881c0..c08080f276 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -379,6 +379,25 @@ UM.MainWindow width: UM.Theme.getSize("sidebar").width + // This is the default sidebar view. + // It is hidden when the active sidebar view ID is not default. + Sidebar + { + id: defaultSidebar + + anchors { + top: parent.top + bottom: parent.bottom + left: parent.left + right: parent.right + } + + width: parent.width + z: 1 + monitoringPrint: base.showPrintMonitor + visible: Cura.SidebarController.activeSidebarId == "default" + } + // The sidebarRepeater exposes sidebar views provided by plugins. // Whenever a plugin sidebar view is active (e.g. not "default"), that sidebar view is shown. Repeater @@ -397,8 +416,6 @@ UM.MainWindow sourceComponent: { if (model.id !== "default") { return Cura.SidebarController.getSidebarComponent(model.id) - } else { - return defaultSidebar } } } @@ -453,27 +470,6 @@ UM.MainWindow } } - // This is the default sidebar view. - // It is used as sourceComponent for the default sidebar view. - Component - { - id: defaultSidebar - - Sidebar - { -// anchors { -// top: parent.top -// bottom: parent.bottom -// left: parent.left -// right: parent.right -// } -// -// width: parent.width -// -// monitoringPrint: base.showPrintMonitor - } - } - UM.PreferencesDialog { id: preferences From 6f8ed09d3d43347e4328409995bfb729d36697c5 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Tue, 5 Dec 2017 00:14:19 +0100 Subject: [PATCH 495/764] SidebarHeader: Adding missing comment about "extruder row" Just read the code and noticed that. --- resources/qml/SidebarHeader.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 07ce75d738..3e1e85824a 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -34,6 +34,7 @@ Column width: height } + // Extruder Row Item { id: extruderSelectionRow From ce78bddfbb4e0130df01124253d5e9ff3e013955 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 5 Dec 2017 09:51:57 +0100 Subject: [PATCH 496/764] Prefer a read-only material in findDefaultMaterial. Contributes to CURA-4243. --- cura/Settings/CuraContainerStack.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index bf001c7f08..9e30e3dd66 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -487,11 +487,17 @@ class CuraContainerStack(ContainerStack): search_criteria.pop("name", None) materials = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) - if materials: - return materials[0] + if not materials: + Logger.log("w", "Could not find a valid material for stack {stack}", stack = self.id) + return None + + for material in materials: + # Prefer a read-only material + if ContainerRegistry.getInstance().isReadOnly(material.getId()): + return material + + return materials[0] - Logger.log("w", "Could not find a valid material for stack {stack}", stack = self.id) - return None ## Find the quality that should be used as "default" quality. # From e33288b7c8cf7b4f3e739cf2d2dcb086d4e782d0 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 5 Dec 2017 10:56:59 +0100 Subject: [PATCH 497/764] Move sidebar target for plugins to only middle section --- cura/CuraApplication.py | 11 +---- cura/Settings/SettingsSidebarView.py | 28 ----------- cura/Sidebar/SidebarController.py | 9 +++- cura/Sidebar/SidebarControllerProxy.py | 5 +- cura/Sidebar/SidebarViewModel.py | 16 +++++-- resources/qml/Cura.qml | 24 ---------- resources/qml/Sidebar.qml | 66 +++++++++++++++++--------- 7 files changed, 67 insertions(+), 92 deletions(-) delete mode 100644 cura/Settings/SettingsSidebarView.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e9e521fb49..997ed7782e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -79,7 +79,6 @@ from cura.Settings.ExtruderStack import ExtruderStack from cura.Sidebar.SidebarController import SidebarController from cura.Sidebar.SidebarControllerProxy import SidebarControllerProxy from cura.Sidebar.SidebarViewModel import SidebarViewModel -from cura.Settings.SettingsSidebarView import SettingsSidebarView from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from UM.FlameProfiler import pyqtSlot @@ -1319,16 +1318,10 @@ class CuraApplication(QtApplication): def _addProfileWriter(self, profile_writer): pass - ## Create and register the default sidebar component (settings) + ## Set the default sidebar view to "default" def _setDefaultSidebarView(self): - - # Register the default settings sidebar manually - settings_sidebar_view = SettingsSidebarView() - self._sidebar_controller.addSidebarView(settings_sidebar_view) - - # Set the default sidebar view depending on user preferences. preferences = Preferences.getInstance() - preferences.addPreference("cura/active_sidebar_view", settings_sidebar_view.getPluginId()) + preferences.addPreference("cura/active_sidebar_view", "default") active_sidebar_view = preferences.getValue("cura/active_sidebar_view") self._sidebar_controller.setActiveSidebarView(active_sidebar_view) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py deleted file mode 100644 index 8b861fbaf6..0000000000 --- a/cura/Settings/SettingsSidebarView.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -from PyQt5.QtCore import QObject - -from UM.i18n import i18nCatalog - -from cura.Sidebar.SidebarView import SidebarView -i18n_catalog = i18nCatalog("cura") - -class SettingsSidebarView(QObject, SidebarView): - - def __init__(self, parent = None): - super().__init__(parent) - - ## As the default sidebar is not a plugin, we have a get plugin ID method to allow the sidebar view model to get the needed data. - def getPluginId(self): - return "default" - - ## As the default sidebar is not a plugin, we have a add meta data method here to allow the sidebar view model to get the needed data. - def getMetaData(self): - return { - "sidebar_view": { - "name": i18n_catalog.i18nc("@item:inmenu", "Print settings"), - "weight": 0 - } - } - - def getComponent(self): - return None diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index 420f00a489..a40ee07157 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -10,7 +10,7 @@ class SidebarController: def __init__(self, application): self._application = application - self._sidebar_views = {} + self._sidebar_views = {"default": {}} # default is needed for the default settings sidebar self._active_sidebar_view = None # Register the sidebar_view plugin type so plugins can expose custom sidebar views. @@ -51,6 +51,13 @@ class SidebarController: def getActiveSidebarView(self): return self._active_sidebar_view + ## Get the ID of the active sidebar view. + def getActiveSidebarViewId(self): + if self._active_sidebar_view: + if hasattr(self._active_sidebar_view, "getPluginId"): + return self._active_sidebar_view.getPluginId() + return "default" + ## Change the active sidebar view to one of the registered views. def setActiveSidebarView(self, sidebar_view_id: str): if sidebar_view_id in self._sidebar_views: diff --git a/cura/Sidebar/SidebarControllerProxy.py b/cura/Sidebar/SidebarControllerProxy.py index c373dc0a0a..a9b23fa08e 100644 --- a/cura/Sidebar/SidebarControllerProxy.py +++ b/cura/Sidebar/SidebarControllerProxy.py @@ -22,10 +22,7 @@ class SidebarControllerProxy(QObject): @pyqtProperty(str, notify = activeSidebarViewChanged) def activeSidebarId(self): - if self._controller.getActiveSidebarView() is not None: - return self._controller.getActiveSidebarView().getPluginId() - else: - return "default" + return self._controller.getActiveSidebarViewId() @pyqtSlot(str) def setActiveSidebarView(self, sidebar_view_id): diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index de0aae182c..f6dcb4455b 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -34,10 +34,18 @@ class SidebarViewModel(ListModel): current_view_id = current_view.getPluginId() for sidebar_view_id, sidebar_view in sidebar_views.items(): - if sidebar_view_id != "default": - sidebar_view_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id).get("sidebar_view", {}) - else: - sidebar_view_metadata = sidebar_view.getMetaData().get("sidebar_view", {}) + + # Override fields for default settings sidebar + if sidebar_view_id == "default": + items.append({ + "id": "default", + "name": "Print settings", + "weight": 0, + "active": current_view_id == "default" + }) + continue + + sidebar_view_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id).get("sidebar_view", {}) # Skip view modes that are marked as not visible if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index c08080f276..3e5527c75c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -395,30 +395,6 @@ UM.MainWindow width: parent.width z: 1 monitoringPrint: base.showPrintMonitor - visible: Cura.SidebarController.activeSidebarId == "default" - } - - // The sidebarRepeater exposes sidebar views provided by plugins. - // Whenever a plugin sidebar view is active (e.g. not "default"), that sidebar view is shown. - Repeater - { - id: sidebarRepeater - - model: Cura.SidebarViewModel { } - - delegate: Loader - { - id: delegate - asynchronous: true - visible: model.active - - // dynamically get the component from the sidebar controller or set the default sidebar - sourceComponent: { - if (model.id !== "default") { - return Cura.SidebarController.getSidebarComponent(model.id) - } - } - } } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index bed5b4c873..9d0957806d 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,25 +87,6 @@ Rectangle } } - SidebarHeader { - id: header - width: parent.width - visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - Rectangle { - id: headerSeparator - width: parent.width - visible: settingsModeSelection.visible && header.visible - height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 - color: UM.Theme.getColor("sidebar_lining") - anchors.top: header.bottom - anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 - } - onCurrentModeIndexChanged: { UM.Preferences.setValue("cura/active_mode", currentModeIndex); @@ -115,6 +96,24 @@ Rectangle } } + SidebarHeader { + id: header + width: parent.width + visible: (machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants) && Cura.SidebarController.activeSidebarId == "default" + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + Rectangle { + id: headerSeparator + width: parent.width + visible: settingsModeSelection.visible && header.visible && Cura.SidebarController.activeSidebarId == "default" + height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 + color: UM.Theme.getColor("sidebar_lining") + anchors.top: header.bottom + anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 + } + Label { id: settingsModeLabel text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); @@ -125,7 +124,7 @@ Rectangle width: Math.floor(parent.width * 0.45) font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") - visible: !monitoringPrint && !hideView + visible: !monitoringPrint && !hideView && Cura.SidebarController.activeSidebarId == "default" } Rectangle { @@ -147,7 +146,7 @@ Rectangle } } anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - visible: !monitoringPrint && !hideSettings && !hideView + visible: !monitoringPrint && !hideSettings && !hideView && Cura.SidebarController.activeSidebarId == "default" Component{ id: wizardDelegate Button { @@ -228,7 +227,7 @@ Rectangle anchors.topMargin: UM.Theme.getSize("sidebar_margin").height anchors.left: base.left anchors.right: base.right - visible: !monitoringPrint && !hideSettings + visible: !monitoringPrint && !hideSettings && Cura.SidebarController.activeSidebarId == "default" delegate: StackViewDelegate { @@ -259,6 +258,29 @@ Rectangle } } + // The sidebarRepeater exposes sidebar views provided by plugins. + // Whenever a plugin sidebar view is active (e.g. not "default"), that sidebar view is shown. + Repeater + { + id: sidebarRepeater + + model: Cura.SidebarViewModel { } + + delegate: Loader + { + id: delegate + asynchronous: true + visible: model.active + + // dynamically get the component from the sidebar controller or set the default sidebar + sourceComponent: { + if (model.id !== "default") { + return Cura.SidebarController.getSidebarComponent(model.id) + } + } + } + } + Loader { id: controlItem From 7d24933835b073b63ed3d50431f153c3a81ce9f5 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 5 Dec 2017 11:55:54 +0100 Subject: [PATCH 498/764] Fix save to file. Changed order of setting metadata for correct overwriting. Contributes to issue CURA-4243. --- plugins/GCodeWriter/GCodeWriter.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 1e4fb666b7..c992a548de 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -74,11 +74,14 @@ class GCodeWriter(MeshWriter): ## Create a new container with container 2 as base and container 1 written over it. def _createFlattenedContainerInstance(self, instance_container1, instance_container2): flat_container = InstanceContainer(instance_container2.getName()) + + # The metadata includes id, name and definition + flat_container.setMetaData(copy.deepcopy(instance_container2.getMetaData())) + if instance_container1.getDefinition(): flat_container.setDefinition(instance_container1.getDefinition().getId()) else: flat_container.setDefinition(instance_container2.getDefinition().getId()) - flat_container.setMetaData(copy.deepcopy(instance_container2.getMetaData())) for key in instance_container2.getAllKeys(): flat_container.setProperty(key, "value", instance_container2.getProperty(key, "value")) From 030dc74f3f44c548a4af592bede0c3067114518c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 5 Dec 2017 12:19:00 +0100 Subject: [PATCH 499/764] Fix now showing any sidebar when in monitor mode --- resources/qml/Cura.qml | 22 +++------------------- resources/qml/Sidebar.qml | 18 +++++++++--------- 2 files changed, 12 insertions(+), 28 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3e5527c75c..bf67efdba3 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -366,7 +366,7 @@ UM.MainWindow onStopMonitoringPrint: base.showPrintMonitor = false } - Rectangle + Sidebar { id: sidebar @@ -378,24 +378,8 @@ UM.MainWindow } width: UM.Theme.getSize("sidebar").width - - // This is the default sidebar view. - // It is hidden when the active sidebar view ID is not default. - Sidebar - { - id: defaultSidebar - - anchors { - top: parent.top - bottom: parent.bottom - left: parent.left - right: parent.right - } - - width: parent.width - z: 1 - monitoringPrint: base.showPrintMonitor - } + z: 1 + monitoringPrint: base.showPrintMonitor } Rectangle diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 9d0957806d..4a8a0c6a32 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,15 +87,6 @@ Rectangle } } - onCurrentModeIndexChanged: - { - UM.Preferences.setValue("cura/active_mode", currentModeIndex); - if(modesListModel.count > base.currentModeIndex) - { - sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "replace": true }); - } - } - SidebarHeader { id: header width: parent.width @@ -114,6 +105,15 @@ Rectangle anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 } + onCurrentModeIndexChanged: + { + UM.Preferences.setValue("cura/active_mode", currentModeIndex); + if(modesListModel.count > base.currentModeIndex) + { + sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "replace": true }); + } + } + Label { id: settingsModeLabel text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); From a6a360284017592c284efa2149f888411fb936d8 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 5 Dec 2017 12:27:13 +0100 Subject: [PATCH 500/764] View default view selected in view menu --- cura/Sidebar/SidebarControllerProxy.py | 2 +- cura/Sidebar/SidebarViewModel.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cura/Sidebar/SidebarControllerProxy.py b/cura/Sidebar/SidebarControllerProxy.py index a9b23fa08e..00a898301a 100644 --- a/cura/Sidebar/SidebarControllerProxy.py +++ b/cura/Sidebar/SidebarControllerProxy.py @@ -38,4 +38,4 @@ class SidebarControllerProxy(QObject): return self._controller.getSidebarView(sidebar_id).getComponentPath() def _onActiveSidebarViewChanged(self): - self.activeSidebarViewChanged.emit() \ No newline at end of file + self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index f6dcb4455b..8000d87cc5 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -26,11 +26,11 @@ class SidebarViewModel(ListModel): ## Update the model when new views are added or another view is made the active view. def _onSidebarViewsChanged(self): items = [] - current_view_id = None + current_view_id = "default" sidebar_views = self._controller.getAllSidebarViews() current_view = self._controller.getActiveSidebarView() - if current_view: + if current_view and hasattr(current_view, "getPluginId"): current_view_id = current_view.getPluginId() for sidebar_view_id, sidebar_view in sidebar_views.items(): @@ -39,9 +39,9 @@ class SidebarViewModel(ListModel): if sidebar_view_id == "default": items.append({ "id": "default", - "name": "Print settings", - "weight": 0, - "active": current_view_id == "default" + "name": "Print settings sidebar", + "active": sidebar_view_id == current_view_id, + "weight": 0 }) continue @@ -52,7 +52,7 @@ class SidebarViewModel(ListModel): continue name = sidebar_view_metadata.get("name", sidebar_view_id) - weight = sidebar_view_metadata.get("weight", 0) + weight = sidebar_view_metadata.get("weight", 1) items.append({ "id": sidebar_view_id, From 51405ca0f770fbf9e631fa16f43ae5c1e52140f9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 5 Dec 2017 13:29:04 +0100 Subject: [PATCH 501/764] tmp --- resources/qml/Sidebar.qml | 9 ---- resources/qml/Sidebar/PrinterOutput.qml | 65 +++++++++++++++++++++++++ resources/qml/Sidebar/Settings.qml | 0 3 files changed, 65 insertions(+), 9 deletions(-) create mode 100644 resources/qml/Sidebar/PrinterOutput.qml create mode 100644 resources/qml/Sidebar/Settings.qml diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 4a8a0c6a32..d5af3e939b 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -105,15 +105,6 @@ Rectangle anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 } - onCurrentModeIndexChanged: - { - UM.Preferences.setValue("cura/active_mode", currentModeIndex); - if(modesListModel.count > base.currentModeIndex) - { - sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "replace": true }); - } - } - Label { id: settingsModeLabel text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); diff --git a/resources/qml/Sidebar/PrinterOutput.qml b/resources/qml/Sidebar/PrinterOutput.qml new file mode 100644 index 0000000000..5506944154 --- /dev/null +++ b/resources/qml/Sidebar/PrinterOutput.qml @@ -0,0 +1,65 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Item +{ + id: printerOutputSection + + UM.I18nCatalog { + id: catalog + name: "cura" + } + + color: UM.Theme.getColor("sidebar") + + // status + property bool isMonitoring: false + + // printer data + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + property int backendState: UM.Backend.state + + // print job data + property variant printDuration: PrintInformation.currentPrintTime + property variant printMaterialLengths: PrintInformation.materialLengths + property variant printMaterialWeights: PrintInformation.materialWeights + property variant printMaterialCosts: PrintInformation.materialCosts + property variant printMaterialNames: PrintInformation.materialNames + + // helper function for padding pretty time + function strPadLeft(string, pad, length) { + return (new Array(length + 1).join(pad) + string).slice(-length); + } + + // convert a timestamp to a human readable pretty time + function getPrettyTime (time) { + var hours = Math.floor(time / 3600) + time -= hours * 3600 + var minutes = Math.floor(time / 60) + time -= minutes * 60 + var seconds = Math.floor(time) + var finalTime = strPadLeft(hours, "0", 2) + ":" + strPadLeft(minutes, "0", 2) + ":" + strPadLeft(seconds, "0", 2) + return finalTime + } + + // TODO: change name of this component + MonitorButton + { + id: monitorButton + implicitWidth: base.width + anchors.top: footerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + visible: monitoringPrint + } +} diff --git a/resources/qml/Sidebar/Settings.qml b/resources/qml/Sidebar/Settings.qml new file mode 100644 index 0000000000..e69de29bb2 From 13c7099e2fc748f2fa50b06eb8296de548657ddf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 5 Dec 2017 13:29:12 +0100 Subject: [PATCH 502/764] Don't show slice info message if the preference is set to not send it If the preference was set to not send it but the user never clicked on the message, don't show the message. Fixes #2840. --- plugins/SliceInfoPlugin/SliceInfo.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 79963a4740..67f977adce 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -39,7 +39,7 @@ class SliceInfo(Extension): Preferences.getInstance().addPreference("info/send_slice_info", True) Preferences.getInstance().addPreference("info/asked_send_slice_info", False) - if not Preferences.getInstance().getValue("info/asked_send_slice_info"): + if not Preferences.getInstance().getValue("info/asked_send_slice_info") and Preferences.getInstance().getValue("info/send_slice_info"): self.send_slice_info_message = Message(catalog.i18nc("@info", "Cura collects anonymised slicing statistics. You can disable this in the preferences."), lifetime = 0, dismissable = False, From 9a538b330aeee88494e452ef4133139a14548db9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 5 Dec 2017 14:14:52 +0100 Subject: [PATCH 503/764] Ignore new plugins --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f67add62cf..7284597fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -45,6 +45,7 @@ plugins/cura-big-flame-graph plugins/cura-siemensnx-plugin plugins/CuraVariSlicePlugin plugins/CuraLiveScriptingPlugin +plugins/CuraPrintProfileCreator #Build stuff CMakeCache.txt From aa727df525f1f73e3030852189323fe7fdb36560 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 6 Dec 2017 00:53:43 +0100 Subject: [PATCH 504/764] Correct description of SOLIDWORKS macro The original description was factually incorrect. Fixes #2839. --- plugins/ChangeLogPlugin/ChangeLog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 673f2ad7c6..de895b3e41 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -109,7 +109,7 @@ The build plate now shows graduations of 10 mm and 1 mm for easy model positioni Extruder tabs have become buttons and icons have been updated. *Add an "Export to Cura" button in SOLIDWORKS -SOLIDWORKS plugin can now be installed using an automatic installer. +A macro can be added to your SOLIDWORKS installation that loads your model into Ultimaker Cura. *Siemens NX macro When a user updates models in Siemens NX and clicks the button, the updated models replace the models opened in Ultimaker Cura. From f6909619003cd18d4888f58f2c23fb93d32e42ad Mon Sep 17 00:00:00 2001 From: Adam Rumjahn Date: Tue, 5 Dec 2017 21:20:43 -0500 Subject: [PATCH 505/764] Deactivated G32 autoleveling Update form last commit, complied with new syntax --- resources/definitions/innovo_inventor.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index ea54e1fcc9..d574a435de 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -53,7 +53,7 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\n;G32 S3 ; auto level\nG92 E0 ; Reset extruder position" + "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\nM190 S{material_bed_temperature}\nM104 T0 S{material_print_temperature}\nM109 T0 S{material_print_temperature}\nM104 T1 S{material_print_temperature}\nM109 T1 S{material_print_temperature}\n;G32 S3 ; auto level\nG92 E0 ; Reset extruder position" }, "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruders\nM140 S0 ; heated bed heater off\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" From ab5449b01e75bfa2e2834b2efcd7875707d10dcd Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:10:19 +0100 Subject: [PATCH 506/764] Add CuraStage --- cura/Stages/CuraStage.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 cura/Stages/CuraStage.py diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py new file mode 100644 index 0000000000..77d0deb21f --- /dev/null +++ b/cura/Stages/CuraStage.py @@ -0,0 +1,12 @@ +from UM.Stage import Stage + +class CuraStage(Stage): + + def __init__(self): + super().__init__() + + def getMainView(self): + return None + + def getSidebarView(self): + return None From 44c66e2ad269e6a01b8fd731c3a7554995ec8222 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:26:37 +0100 Subject: [PATCH 507/764] Get named view in CuraStage --- cura/Stages/CuraStage.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py index 77d0deb21f..52793134cf 100644 --- a/cura/Stages/CuraStage.py +++ b/cura/Stages/CuraStage.py @@ -6,7 +6,7 @@ class CuraStage(Stage): super().__init__() def getMainView(self): - return None + return self.getView("main") def getSidebarView(self): - return None + return self.getView("sidebar") From 840e80a1fb99ed5b1890a3864e4c19fd2ebb8b74 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:29:09 +0100 Subject: [PATCH 508/764] Add missing init --- cura/Stages/__init__.py | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 cura/Stages/__init__.py diff --git a/cura/Stages/__init__.py b/cura/Stages/__init__.py new file mode 100644 index 0000000000..2977645166 --- /dev/null +++ b/cura/Stages/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. From 84ba486d57bf953b169174b7c6161cc9eb17fe53 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:34:09 +0100 Subject: [PATCH 509/764] Add plugins for prepare and monitor stages --- cura/Stages/CuraStage.py | 3 +++ plugins/MonitorStage/__init__.py | 0 plugins/PrepareStage/PrepareStage.py | 11 +++++++++++ plugins/PrepareStage/__init__.py | 18 ++++++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 plugins/MonitorStage/__init__.py create mode 100644 plugins/PrepareStage/PrepareStage.py create mode 100644 plugins/PrepareStage/__init__.py diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py index 52793134cf..d4def4c00e 100644 --- a/cura/Stages/CuraStage.py +++ b/cura/Stages/CuraStage.py @@ -1,3 +1,6 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Stage import Stage class CuraStage(Stage): diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/PrepareStage/PrepareStage.py b/plugins/PrepareStage/PrepareStage.py new file mode 100644 index 0000000000..bbd2275d2e --- /dev/null +++ b/plugins/PrepareStage/PrepareStage.py @@ -0,0 +1,11 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.Stages.CuraStage import CuraStage + + +## Stage for preparing model (slicing). +class PrepareStage(CuraStage): + + def __init__(self): + super().__init__() diff --git a/plugins/PrepareStage/__init__.py b/plugins/PrepareStage/__init__.py new file mode 100644 index 0000000000..d74cf27e39 --- /dev/null +++ b/plugins/PrepareStage/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import PrepareStage + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "stage": { + "name": i18n_catalog.i18nc("@item:inmenu", "Prepare"), + "weight": 0 + } + } + +def register(app): + return { "stage": PrepareStage.PrepareStage() } From a5b99bd8624c8a2db866ab37c1f31563178993c8 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:36:09 +0100 Subject: [PATCH 510/764] Scaffold monitor stage --- plugins/MonitorStage/MonitorStage.py | 11 +++++++++++ plugins/MonitorStage/__init__.py | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 plugins/MonitorStage/MonitorStage.py diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py new file mode 100644 index 0000000000..e9d8f75645 --- /dev/null +++ b/plugins/MonitorStage/MonitorStage.py @@ -0,0 +1,11 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.Stages.CuraStage import CuraStage + + +## Stage for monitoring a 3D printing while it's printing. +class MonitorStage(CuraStage): + + def __init__(self): + super().__init__() diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py index e69de29bb2..c1f7cf0f6b 100644 --- a/plugins/MonitorStage/__init__.py +++ b/plugins/MonitorStage/__init__.py @@ -0,0 +1,19 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from . import MonitorStage + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "stage": { + "name": i18n_catalog.i18nc("@item:inmenu", "Monitor"), + "weight": 0, + "icon": "" + } + } + +def register(app): + return { "stage": MonitorStage.MonitorStage() } From f1b9a17611a379ff8a15d701b0fa748573ef35fb Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:44:30 +0100 Subject: [PATCH 511/764] Remove sidebar controller implementation in favor of stages --- cura/CuraApplication.py | 26 ---- resources/qml/Sidebar.qml | 33 +---- resources/qml/Sidebar/PrinterOutput.qml | 65 --------- resources/qml/Sidebar/Settings.qml | 0 resources/qml/Topbar.qml | 174 +++++++++++++----------- 5 files changed, 101 insertions(+), 197 deletions(-) delete mode 100644 resources/qml/Sidebar/PrinterOutput.qml delete mode 100644 resources/qml/Sidebar/Settings.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 997ed7782e..5acaecbdd5 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -76,10 +76,6 @@ from cura.Settings.ContainerManager import ContainerManager from cura.Settings.GlobalStack import GlobalStack from cura.Settings.ExtruderStack import ExtruderStack -from cura.Sidebar.SidebarController import SidebarController -from cura.Sidebar.SidebarControllerProxy import SidebarControllerProxy -from cura.Sidebar.SidebarViewModel import SidebarViewModel - from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from UM.FlameProfiler import pyqtSlot from PyQt5.QtGui import QColor, QIcon @@ -200,10 +196,6 @@ class CuraApplication(QtApplication): } ) - ## As of Cura 3.2, the sidebar is controlled by a controller. - # This functionality was added to allow plugins registering custom sidebar views. - self._sidebar_controller = SidebarController(self) - self._currently_loading_files = [] self._non_sliceable_extensions = [] @@ -727,10 +719,6 @@ class CuraApplication(QtApplication): if not run_headless: self.initializeEngine() - # Now that the SidebarViewModel has been created we can set the default sidebar view - # TODO: put this in a more elegant place - self._setDefaultSidebarView() - if run_headless or self._engine.rootObjects: self.closeSplash() @@ -743,11 +731,6 @@ class CuraApplication(QtApplication): self.exec_() - ## Get the SidebarController of this application. - # \returns SidebarControllers \type{SidebarController} - def getSidebarController(self) -> SidebarController: - return self._sidebar_controller - def getMachineManager(self, *args): if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() @@ -807,7 +790,6 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") - qmlRegisterType(SidebarViewModel, "Cura", 1, 0, "SidebarViewModel") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) @@ -819,7 +801,6 @@ class CuraApplication(QtApplication): qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) - qmlRegisterSingletonType(SidebarControllerProxy, "Cura", 1, 0, "SidebarController", SidebarControllerProxy.createSidebarControllerProxy) # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) @@ -1318,13 +1299,6 @@ class CuraApplication(QtApplication): def _addProfileWriter(self, profile_writer): pass - ## Set the default sidebar view to "default" - def _setDefaultSidebarView(self): - preferences = Preferences.getInstance() - preferences.addPreference("cura/active_sidebar_view", "default") - active_sidebar_view = preferences.getValue("cura/active_sidebar_view") - self._sidebar_controller.setActiveSidebarView(active_sidebar_view) - @pyqtSlot("QSize") def setMinimumWindowSize(self, size): self.getMainWindow().setMinimumSize(size) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index d5af3e939b..3bfc803a78 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -90,7 +90,7 @@ Rectangle SidebarHeader { id: header width: parent.width - visible: (machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants) && Cura.SidebarController.activeSidebarId == "default" + visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariantst onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() } @@ -98,7 +98,7 @@ Rectangle Rectangle { id: headerSeparator width: parent.width - visible: settingsModeSelection.visible && header.visible && Cura.SidebarController.activeSidebarId == "default" + visible: settingsModeSelection.visible && header.visible height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 color: UM.Theme.getColor("sidebar_lining") anchors.top: header.bottom @@ -115,7 +115,7 @@ Rectangle width: Math.floor(parent.width * 0.45) font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") - visible: !monitoringPrint && !hideView && Cura.SidebarController.activeSidebarId == "default" + visible: !monitoringPrint && !hideView } Rectangle { @@ -137,7 +137,7 @@ Rectangle } } anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - visible: !monitoringPrint && !hideSettings && !hideView && Cura.SidebarController.activeSidebarId == "default" + visible: !monitoringPrint && !hideSettings && !hideView Component{ id: wizardDelegate Button { @@ -218,7 +218,7 @@ Rectangle anchors.topMargin: UM.Theme.getSize("sidebar_margin").height anchors.left: base.left anchors.right: base.right - visible: !monitoringPrint && !hideSettings && Cura.SidebarController.activeSidebarId == "default" + visible: !monitoringPrint && !hideSettings delegate: StackViewDelegate { @@ -249,29 +249,6 @@ Rectangle } } - // The sidebarRepeater exposes sidebar views provided by plugins. - // Whenever a plugin sidebar view is active (e.g. not "default"), that sidebar view is shown. - Repeater - { - id: sidebarRepeater - - model: Cura.SidebarViewModel { } - - delegate: Loader - { - id: delegate - asynchronous: true - visible: model.active - - // dynamically get the component from the sidebar controller or set the default sidebar - sourceComponent: { - if (model.id !== "default") { - return Cura.SidebarController.getSidebarComponent(model.id) - } - } - } - } - Loader { id: controlItem diff --git a/resources/qml/Sidebar/PrinterOutput.qml b/resources/qml/Sidebar/PrinterOutput.qml deleted file mode 100644 index 5506944154..0000000000 --- a/resources/qml/Sidebar/PrinterOutput.qml +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) 2017 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.1 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -Item -{ - id: printerOutputSection - - UM.I18nCatalog { - id: catalog - name: "cura" - } - - color: UM.Theme.getColor("sidebar") - - // status - property bool isMonitoring: false - - // printer data - property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 - property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property int backendState: UM.Backend.state - - // print job data - property variant printDuration: PrintInformation.currentPrintTime - property variant printMaterialLengths: PrintInformation.materialLengths - property variant printMaterialWeights: PrintInformation.materialWeights - property variant printMaterialCosts: PrintInformation.materialCosts - property variant printMaterialNames: PrintInformation.materialNames - - // helper function for padding pretty time - function strPadLeft(string, pad, length) { - return (new Array(length + 1).join(pad) + string).slice(-length); - } - - // convert a timestamp to a human readable pretty time - function getPrettyTime (time) { - var hours = Math.floor(time / 3600) - time -= hours * 3600 - var minutes = Math.floor(time / 60) - time -= minutes * 60 - var seconds = Math.floor(time) - var finalTime = strPadLeft(hours, "0", 2) + ":" + strPadLeft(minutes, "0", 2) + ":" + strPadLeft(seconds, "0", 2) - return finalTime - } - - // TODO: change name of this component - MonitorButton - { - id: monitorButton - implicitWidth: base.width - anchors.top: footerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.bottom: parent.bottom - visible: monitoringPrint - } -} diff --git a/resources/qml/Sidebar/Settings.qml b/resources/qml/Sidebar/Settings.qml deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index db9abafb5c..f2d053ce70 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -67,91 +67,109 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width - Button + // The topbar is dynamically filled with all available stages + Repeater { - id: showSettings - height: UM.Theme.getSize("sidebar_header").height - text: catalog.i18nc("@title:tab", "Prepare") - checkable: true - checked: isChecked() - exclusiveGroup: sidebarHeaderBarGroup - style: UM.Theme.styles.topbar_header_tab + id: stagesMenu - // We use a Qt.binding to re-bind the checkbox state after manually setting it - // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing - onClicked: { - base.stopMonitoringPrint() - checked = Qt.binding(isChecked) - } + model: UM.StageModel{} - function isChecked () { - return !base.monitoringPrint - } - - property color overlayColor: "transparent" - property string overlayIconSource: "" - } - - Button - { - id: showMonitor - width: UM.Theme.getSize("topbar_button").width - height: UM.Theme.getSize("sidebar_header").height - text: catalog.i18nc("@title:tab", "Monitor") - checkable: true - checked: isChecked() - exclusiveGroup: sidebarHeaderBarGroup - style: UM.Theme.styles.topbar_header_tab_no_overlay - - // We use a Qt.binding to re-bind the checkbox state after manually setting it - // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing - onClicked: { - base.startMonitoringPrint() - checked = Qt.binding(isChecked) - } - - function isChecked () { - return base.monitoringPrint - } - - property string iconSource: + delegate: Button { - if (!printerConnected) - { - return UM.Theme.getIcon("tab_status_unknown"); - } - else if (!printerAcceptsCommands) - { - return UM.Theme.getIcon("tab_status_unknown"); - } - - if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") - { - return UM.Theme.getIcon("tab_status_busy"); - } - - switch (Cura.MachineManager.printerOutputDevices[0].jobState) - { - case "printing": - case "pre_print": - case "pausing": - case "resuming": - return UM.Theme.getIcon("tab_status_busy"); - case "wait_cleanup": - return UM.Theme.getIcon("tab_status_finished"); - case "ready": - case "": - return UM.Theme.getIcon("tab_status_connected") - case "paused": - return UM.Theme.getIcon("tab_status_paused") - case "error": - return UM.Theme.getIcon("tab_status_stopped") - default: - return UM.Theme.getIcon("tab_status_unknown") - } + text: model.name + checkable: true + checked: model.active + exclusiveGroup: sidebarHeaderBarGroup + style: UM.Theme.styles.topbar_header_tab + height: UM.Theme.getSize("sidebar_header").height } } +// Button +// { +// id: showSettings +// height: UM.Theme.getSize("sidebar_header").height +// text: catalog.i18nc("@title:tab", "Prepare") +// checkable: true +// checked: isChecked() +// exclusiveGroup: sidebarHeaderBarGroup +// style: UM.Theme.styles.topbar_header_tab +// +// // We use a Qt.binding to re-bind the checkbox state after manually setting it +// // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing +// onClicked: { +// base.stopMonitoringPrint() +// checked = Qt.binding(isChecked) +// } +// +// function isChecked () { +// return !base.monitoringPrint +// } +// +// property color overlayColor: "transparent" +// property string overlayIconSource: "" +// } + +// Button +// { +// id: showMonitor +// width: UM.Theme.getSize("topbar_button").width +// height: UM.Theme.getSize("sidebar_header").height +// text: catalog.i18nc("@title:tab", "Monitor") +// checkable: true +// checked: isChecked() +// exclusiveGroup: sidebarHeaderBarGroup +// style: UM.Theme.styles.topbar_header_tab_no_overlay +// +// // We use a Qt.binding to re-bind the checkbox state after manually setting it +// // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing +// onClicked: { +// base.startMonitoringPrint() +// checked = Qt.binding(isChecked) +// } +// +// function isChecked () { +// return base.monitoringPrint +// } +// +// property string iconSource: +// { +// if (!printerConnected) +// { +// return UM.Theme.getIcon("tab_status_unknown"); +// } +// else if (!printerAcceptsCommands) +// { +// return UM.Theme.getIcon("tab_status_unknown"); +// } +// +// if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") +// { +// return UM.Theme.getIcon("tab_status_busy"); +// } +// +// switch (Cura.MachineManager.printerOutputDevices[0].jobState) +// { +// case "printing": +// case "pre_print": +// case "pausing": +// case "resuming": +// return UM.Theme.getIcon("tab_status_busy"); +// case "wait_cleanup": +// return UM.Theme.getIcon("tab_status_finished"); +// case "ready": +// case "": +// return UM.Theme.getIcon("tab_status_connected") +// case "paused": +// return UM.Theme.getIcon("tab_status_paused") +// case "error": +// return UM.Theme.getIcon("tab_status_stopped") +// default: +// return UM.Theme.getIcon("tab_status_unknown") +// } +// } +// } + ExclusiveGroup { id: sidebarHeaderBarGroup } } From 9b4b6b2eaeb986c7592f59cea6e8c8bac1806c0f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:44:59 +0100 Subject: [PATCH 512/764] Remove sidebar views from views menu --- resources/qml/Menus/ViewMenu.qml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index b5e4c5765f..a610bb0009 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -30,25 +30,6 @@ Menu } ExclusiveGroup { id: group } - MenuSeparator {} - - // sidebar views - Instantiator - { - model: Cura.SidebarViewModel{} - MenuItem - { - text: model.name - checkable: true - checked: model.active - exclusiveGroup: sidebarGroup - onTriggered: Cura.SidebarController.setActiveSidebarView(model.id) - } - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) - } - ExclusiveGroup { id: sidebarGroup } - MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; } } From 0e1c9146cfa62209d09b71424bc8831e5f2a6ab6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 09:58:50 +0100 Subject: [PATCH 513/764] Implement stage model in top bar --- cura/CuraApplication.py | 7 +++++-- plugins/MonitorStage/__init__.py | 2 +- plugins/MonitorStage/plugin.json | 8 ++++++++ plugins/PrepareStage/plugin.json | 8 ++++++++ resources/qml/Topbar.qml | 1 + 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 plugins/MonitorStage/plugin.json create mode 100644 plugins/PrepareStage/plugin.json diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5acaecbdd5..c83ed04c82 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -229,7 +229,9 @@ class CuraApplication(QtApplication): "TranslateTool", "FileLogger", "XmlMaterialProfile", - "PluginBrowser" + "PluginBrowser", + "PrepareStage", + "MonitorStage" ]) self._physics = None self._volume = None @@ -668,13 +670,14 @@ class CuraApplication(QtApplication): controller = self.getController() + controller.setActiveStage("PrepareStage") controller.setActiveView("SolidView") controller.setCameraTool("CameraTool") controller.setSelectionTool("SelectionTool") t = controller.getTool("TranslateTool") if t: - t.setEnabledAxis([ToolHandle.XAxis, ToolHandle.YAxis,ToolHandle.ZAxis]) + t.setEnabledAxis([ToolHandle.XAxis, ToolHandle.YAxis, ToolHandle.ZAxis]) Selection.selectionChanged.connect(self.onSelectionChanged) diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py index c1f7cf0f6b..e18ecba7f9 100644 --- a/plugins/MonitorStage/__init__.py +++ b/plugins/MonitorStage/__init__.py @@ -10,7 +10,7 @@ def getMetaData(): return { "stage": { "name": i18n_catalog.i18nc("@item:inmenu", "Monitor"), - "weight": 0, + "weight": 1, "icon": "" } } diff --git a/plugins/MonitorStage/plugin.json b/plugins/MonitorStage/plugin.json new file mode 100644 index 0000000000..cb3f55a80d --- /dev/null +++ b/plugins/MonitorStage/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Monitor Stage", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides a monitor stage in Cura.", + "api": 4, + "i18n-catalog": "cura" +} \ No newline at end of file diff --git a/plugins/PrepareStage/plugin.json b/plugins/PrepareStage/plugin.json new file mode 100644 index 0000000000..4fd55e955e --- /dev/null +++ b/plugins/PrepareStage/plugin.json @@ -0,0 +1,8 @@ +{ + "name": "Prepare Stage", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides a prepare stage in Cura.", + "api": 4, + "i18n-catalog": "cura" +} \ No newline at end of file diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index f2d053ce70..50e90a9a37 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -82,6 +82,7 @@ Rectangle exclusiveGroup: sidebarHeaderBarGroup style: UM.Theme.styles.topbar_header_tab height: UM.Theme.getSize("sidebar_header").height + onClicked: UM.Controller.setActiveStage(model.id) } } From 3e2e1336823f85a3f6cb3b23c10b898153cafb88 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 6 Dec 2017 10:37:06 +0100 Subject: [PATCH 514/764] Add type hinting for getMachineManager I like it when my IDE can give me hints, so return types are important. Contributes to issue CURA-4243. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a395329552..9293a7e07b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -725,7 +725,7 @@ class CuraApplication(QtApplication): self.exec_() - def getMachineManager(self, *args): + def getMachineManager(self, *args) -> MachineManager: if self._machine_manager is None: self._machine_manager = MachineManager.createMachineManager() return self._machine_manager From 80f4c9181d87c39cb7417ff32d05bf4cbbcf4701 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 6 Dec 2017 10:40:58 +0100 Subject: [PATCH 515/764] Correct variant name when duplicating materials It needs to be the variant name (swapping spaces for underscores) to be consistent with the deserialize functions. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index c552a6fe8c..e3b14bf210 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -789,7 +789,8 @@ class ContainerManager(QObject): if container_to_copy.getMetaDataEntry("definition") != "fdmprinter": new_id += "_" + container_to_copy.getMetaDataEntry("definition") if container_to_copy.getMetaDataEntry("variant"): - new_id += "_" + container_to_copy.getMetaDataEntry("variant") + variant = self._container_registry.findContainers(id = container_to_copy.getMetaDataEntry("variant"))[0] + new_id += "_" + variant.getName().replace(" ", "_") if current_id == material_id: clone_of_original = new_id From ec36424a4d2a3ea6721e741f33404d5a824a28b4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 6 Dec 2017 10:42:02 +0100 Subject: [PATCH 516/764] Update UserProfilesModel when metadata of materials changes The metadata may influence which profiles are being shown. Contributes to issue CURA-4243. --- cura/Settings/UserProfilesModel.py | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index 2db07942a7..f69c0ff7d1 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.Application import Application +from UM.Application import Application from cura.QualityManager import QualityManager from cura.Settings.ProfilesModel import ProfilesModel from cura.Settings.ExtruderManager import ExtruderManager @@ -12,6 +12,16 @@ class UserProfilesModel(ProfilesModel): def __init__(self, parent = None): super().__init__(parent) + #Need to connect to the metaDataChanged signal of the active materials. + self.__current_extruders = [] + self.__current_materials = [] + + Application.getInstance().getExtruderManager().extrudersChanged.connect(self.__onExtrudersChanged) + self.__onExtrudersChanged() + self.__current_materials = [extruder.material for extruder in self.__current_extruders] + for material in self.__current_materials: + material.metaDataChanged.connect(self._onContainerChanged) + ## Fetch the list of containers to display. # # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). @@ -43,3 +53,28 @@ class UserProfilesModel(ProfilesModel): qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} return filtered_quality_changes, {} + + ## Called when a container changed on an extruder stack. + # + # If it's the material we need to connect to the metaDataChanged signal of + # that. + def __onContainerChanged(self, new_container): + #Careful not to update when a quality or quality changes profile changed! + #If you then update you're going to have an infinite recursion because the update may change the container. + if new_container.getMetaDataEntry("type") == "material": + for material in self.__current_materials: + material.metaDataChanged.disconnect(self._onContainerChanged) + self.__current_materials = [extruder.material for extruder in self.__current_extruders] + for material in self.__current_materials: + material.metaDataChanged.connect(self._onContainerChanged) + + ## Called when the current set of extruders change. + # + # This makes sure that we are listening to the signal for when the + # materials change. + def __onExtrudersChanged(self): + for extruder in self.__current_extruders: + extruder.containersChanged.disconnect(self.__onContainerChanged) + self.__current_extruders = Application.getInstance().getExtruderManager().getExtruderStacks() + for extruder in self.__current_extruders: + extruder.containersChanged.connect(self.__onContainerChanged) \ No newline at end of file From eb171231c21426d2f6e927fe6e780c934e1f6e46 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 6 Dec 2017 11:02:50 +0100 Subject: [PATCH 517/764] Fix removeMaterial. The base_file must be removed first, or it gets loaded halfway during remove containers. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 2 +- cura/Settings/MaterialsModel.py | 1 + resources/qml/Preferences/MaterialsPage.qml | 9 ++++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index c552a6fe8c..2c98030cfd 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -118,7 +118,7 @@ class ContainerManager(QObject): def removeContainer(self, container_id): containers = self._container_registry.findContainers(id = container_id) if not containers: - Logger.log("w", "Could remove container %s because it was not found.", container_id) + Logger.log("w", "Could not remove container %s because it was not found.", container_id) return False self._container_registry.removeContainer(containers[0].getId()) diff --git a/cura/Settings/MaterialsModel.py b/cura/Settings/MaterialsModel.py index 1b9b015108..c4b0329336 100644 --- a/cura/Settings/MaterialsModel.py +++ b/cura/Settings/MaterialsModel.py @@ -32,5 +32,6 @@ class MaterialsModel(InstanceContainersModel): result.append(item["metadata"]["material"]) result.append(item["metadata"]["name"]) result.append(item["metadata"]["color_name"]) + result.append(item["metadata"]["id"]) result.extend(super()._sortKey(item)) return result diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index cd04b79b20..c33cdbfc89 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -182,6 +182,7 @@ UM.ManagementPage { Cura.MachineManager.setActiveMaterial(material_id) } + // TODO: this doesn't work because the source is a bit delayed base.objectList.currentIndex = base.getIndexById(material_id); } }, @@ -292,10 +293,16 @@ UM.ManagementPage base_file = base.currentItem.id } var guid = Cura.ContainerManager.getContainerMetaDataEntry(base.currentItem.id, "GUID") + // remove base container first, it otherwise triggers loading the base file while removing other containers + var base_containers = Cura.ContainerManager.findInstanceContainers({"GUID": guid, "id": base_file, "base_file": base_file, "type": "material"}) + for(var i in base_containers) + { + Cura.ContainerManager.removeContainer(base_containers[i]); + } var containers = Cura.ContainerManager.findInstanceContainers({"GUID": guid, "base_file": base_file, "type": "material"}) for(var i in containers) { - Cura.ContainerManager.removeContainer(containers[i]) + Cura.ContainerManager.removeContainer(containers[i]); } if(base.objectList.currentIndex > 0) { From c0a502f99c637898a59721907e2c824356d48ead Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 6 Dec 2017 11:47:31 +0100 Subject: [PATCH 518/764] Check if there is an active machine before doing anything else CURA-4680 --- cura/Settings/MachineManager.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f1bb8b6648..253c5f793c 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -498,6 +498,11 @@ class MachineManager(QObject): @pyqtProperty("QVariantList", notify=activeVariantChanged) def activeVariantNames(self) -> List[str]: result = [] + + # it can happen when there is no active machine + if self._global_container_stack is None: + return result + active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks is not None: for stack in active_stacks: @@ -510,6 +515,11 @@ class MachineManager(QObject): @pyqtProperty("QVariantList", notify = activeMaterialChanged) def activeMaterialNames(self) -> List[str]: result = [] + + # it can happen when there is no active machine + if self._global_container_stack is None: + return result + active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks is not None: for stack in active_stacks: @@ -530,6 +540,11 @@ class MachineManager(QObject): @pyqtProperty("QVariantMap", notify = activeVariantChanged) def allActiveVariantIds(self) -> Dict[str, str]: result = {} + + # it can happen when there is no active machine + if self._global_container_stack is None: + return result + active_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() if active_stacks is not None: #If we have a global stack. for stack in active_stacks: @@ -548,6 +563,11 @@ class MachineManager(QObject): @pyqtProperty("QVariantMap", notify = activeMaterialChanged) def allActiveMaterialIds(self) -> Dict[str, str]: result = {} + + # it can happen when there is no active machine + if self._global_container_stack is None: + return result + active_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() result[self._global_container_stack.getId()] = self._global_container_stack.material.getId() From a57a5aab6b6fcd44a3e1dd65988600e899e1c0ff Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 12:23:41 +0100 Subject: [PATCH 519/764] Make sidebar view working for active stage --- cura/CuraApplication.py | 1 + cura/Sidebar/SidebarController.py | 66 -- cura/Sidebar/SidebarControllerProxy.py | 41 - cura/Sidebar/SidebarView.py | 35 - cura/Sidebar/SidebarViewModel.py | 66 -- cura/Sidebar/__init__.py | 0 cura/Stages/CuraStage.py | 11 +- plugins/MonitorStage/MonitorStage.py | 6 +- plugins/MonitorStage/__init__.py | 7 +- plugins/PrepareStage/PrepareStage.py | 10 +- plugins/PrepareStage/__init__.py | 4 +- resources/qml/Cura.qml | 6 +- resources/qml/Sidebar.qml | 1133 ++++++++++++------------ resources/qml/Topbar.qml | 31 +- 14 files changed, 605 insertions(+), 812 deletions(-) delete mode 100644 cura/Sidebar/SidebarController.py delete mode 100644 cura/Sidebar/SidebarControllerProxy.py delete mode 100644 cura/Sidebar/SidebarView.py delete mode 100644 cura/Sidebar/SidebarViewModel.py delete mode 100644 cura/Sidebar/__init__.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c83ed04c82..eec6c7f503 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -721,6 +721,7 @@ class CuraApplication(QtApplication): run_headless = self.getCommandLineOption("headless", False) if not run_headless: self.initializeEngine() + controller.setActiveStage("PrepareStage") if run_headless or self._engine.rootObjects: self.closeSplash() diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py deleted file mode 100644 index a40ee07157..0000000000 --- a/cura/Sidebar/SidebarController.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -from UM.Logger import Logger -from UM.Preferences import Preferences -from UM.Signal import Signal -from UM.PluginRegistry import PluginRegistry - -# The sidebar controller manages available sidebar components and decides which one to display. -# The cura.qml file uses this controller to repeat over the sidebars and show the active index. -class SidebarController: - - def __init__(self, application): - self._application = application - self._sidebar_views = {"default": {}} # default is needed for the default settings sidebar - self._active_sidebar_view = None - - # Register the sidebar_view plugin type so plugins can expose custom sidebar views. - PluginRegistry.addType("sidebar_view", self.addSidebarView) - - ## Emitted when the list of views changes. - sidebarViewsChanged = Signal() - - ## Emitted when the active view changes. - activeSidebarViewChanged = Signal() - - ## Get the active application instance. - def getApplication(self): - return self._application - - ## Get all sidebar views registered in this controller. - def getAllSidebarViews(self): - return self._sidebar_views - - ## Add a sidebar view to the registry. - # It get's a unique name based on the plugin ID. - def addSidebarView(self, sidebar_view): - sidebar_view_id = sidebar_view.getPluginId() - if sidebar_view_id not in self._sidebar_views: - self._sidebar_views[sidebar_view_id] = sidebar_view - self.sidebarViewsChanged.emit() - - ## Get a registered sidebar view by name. - # The name is the ID of the plugin that registered the view. - def getSidebarView(self, name: str): - try: - return self._sidebar_views[name] - except KeyError: - Logger.log("e", "Unable to find %s in sidebar view list", name) - return None - - ## Get the active sidebar view. - def getActiveSidebarView(self): - return self._active_sidebar_view - - ## Get the ID of the active sidebar view. - def getActiveSidebarViewId(self): - if self._active_sidebar_view: - if hasattr(self._active_sidebar_view, "getPluginId"): - return self._active_sidebar_view.getPluginId() - return "default" - - ## Change the active sidebar view to one of the registered views. - def setActiveSidebarView(self, sidebar_view_id: str): - if sidebar_view_id in self._sidebar_views: - self._active_sidebar_view = self._sidebar_views[sidebar_view_id] - Preferences.getInstance().setValue("cura/active_sidebar_view", sidebar_view_id) - self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarControllerProxy.py b/cura/Sidebar/SidebarControllerProxy.py deleted file mode 100644 index 00a898301a..0000000000 --- a/cura/Sidebar/SidebarControllerProxy.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -from PyQt5.QtCore import QObject, pyqtSlot, QUrl, pyqtProperty, pyqtSignal -from UM.Application import Application - - -## The sidebar controller proxy acts a proxy between the sidebar controller and the QMl context of the controller. -from UM.Logger import Logger - - -class SidebarControllerProxy(QObject): - - def __init__(self, parent = None): - super().__init__(parent) - self._controller = Application.getInstance().getSidebarController() - self._controller.activeSidebarViewChanged.connect(self._onActiveSidebarViewChanged) - - activeSidebarViewChanged = pyqtSignal() - - @classmethod - def createSidebarControllerProxy(self, engine, script_engine): - return SidebarControllerProxy() - - @pyqtProperty(str, notify = activeSidebarViewChanged) - def activeSidebarId(self): - return self._controller.getActiveSidebarViewId() - - @pyqtSlot(str) - def setActiveSidebarView(self, sidebar_view_id): - Logger.log("d", "Setting active sidebar view to %s", sidebar_view_id) - self._controller.setActiveSidebarView(sidebar_view_id) - - @pyqtSlot(str, result = QObject) - def getSidebarComponent(self, sidebar_id): - return self._controller.getSidebarView(sidebar_id).getComponent() - - @pyqtSlot(str, result = QUrl) - def getSidebarComponentPath(self, sidebar_id): - return self._controller.getSidebarView(sidebar_id).getComponentPath() - - def _onActiveSidebarViewChanged(self): - self.activeSidebarViewChanged.emit() diff --git a/cura/Sidebar/SidebarView.py b/cura/Sidebar/SidebarView.py deleted file mode 100644 index d5c20e0858..0000000000 --- a/cura/Sidebar/SidebarView.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -import os.path - -from UM.Application import Application -from UM.Logger import Logger -from UM.PluginObject import PluginObject -from UM.PluginRegistry import PluginRegistry - -# Abstract class for sidebar view objects. -# By default the sidebar is Cura's settings, slicing and printing overview. -# The last plugin to claim the sidebar QML target will be displayed. -class SidebarView(PluginObject): - - def __init__(self): - super().__init__() - self._view = None - - def getComponent(self): - if not self._view: - self.createView() - return self._view - - def createView(self): - component_path = self.getComponentPath() - self._view = Application.getInstance().createQmlComponent(component_path, {"manager": self}) - - ## Get the path to the component QML file as QUrl - def getComponentPath(self): - try: - plugin_path = PluginRegistry.getInstance().getPluginPath(self.getPluginId()) - sidebar_component_file_path = PluginRegistry.getInstance().getMetaData(self.getPluginId())["sidebar_view"]["sidebar_component"] - return os.path.join(plugin_path, sidebar_component_file_path) - except KeyError: - Logger.log("w", "Could not find sidebar component QML file for %s", self.getPluginId()) - return "" diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py deleted file mode 100644 index 8000d87cc5..0000000000 --- a/cura/Sidebar/SidebarViewModel.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -from PyQt5.QtCore import Qt -from UM.Qt.ListModel import ListModel -from UM.Application import Application -from UM.PluginRegistry import PluginRegistry - -## The SidebarViewModel is the default sidebar view in Cura with all the print settings and print button. -class SidebarViewModel(ListModel): - IdRole = Qt.UserRole + 1 - NameRole = Qt.UserRole + 2 - ActiveRole = Qt.UserRole + 3 - - def __init__(self, parent = None): - super().__init__(parent) - - # connect views changed signals - self._controller = Application.getInstance().getSidebarController() - self._controller.sidebarViewsChanged.connect(self._onSidebarViewsChanged) - self._controller.activeSidebarViewChanged.connect(self._onSidebarViewsChanged) - - # register Qt list roles - self.addRoleName(self.IdRole, "id") - self.addRoleName(self.NameRole, "name") - self.addRoleName(self.ActiveRole, "active") - - ## Update the model when new views are added or another view is made the active view. - def _onSidebarViewsChanged(self): - items = [] - current_view_id = "default" - - sidebar_views = self._controller.getAllSidebarViews() - current_view = self._controller.getActiveSidebarView() - if current_view and hasattr(current_view, "getPluginId"): - current_view_id = current_view.getPluginId() - - for sidebar_view_id, sidebar_view in sidebar_views.items(): - - # Override fields for default settings sidebar - if sidebar_view_id == "default": - items.append({ - "id": "default", - "name": "Print settings sidebar", - "active": sidebar_view_id == current_view_id, - "weight": 0 - }) - continue - - sidebar_view_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id).get("sidebar_view", {}) - - # Skip view modes that are marked as not visible - if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: - continue - - name = sidebar_view_metadata.get("name", sidebar_view_id) - weight = sidebar_view_metadata.get("weight", 1) - - items.append({ - "id": sidebar_view_id, - "name": name, - "active": sidebar_view_id == current_view_id, - "weight": weight - }) - - # Sort the views by weight - items.sort(key=lambda t: t["weight"]) - self.setItems(items) diff --git a/cura/Sidebar/__init__.py b/cura/Sidebar/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py index d4def4c00e..6d4e56473d 100644 --- a/cura/Stages/CuraStage.py +++ b/cura/Stages/CuraStage.py @@ -1,5 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from PyQt5.QtCore import pyqtProperty, QObject from UM.Stage import Stage @@ -8,8 +9,10 @@ class CuraStage(Stage): def __init__(self): super().__init__() - def getMainView(self): - return self.getView("main") + @pyqtProperty(QObject, constant = True) + def mainComponent(self): + return self.getDisplayComponent("main") - def getSidebarView(self): - return self.getView("sidebar") + @pyqtProperty(QObject, constant = True) + def sidebarComponent(self): + return self.getDisplayComponent("sidebar") diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index e9d8f75645..8b98f2872c 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -1,6 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +from UM.Application import Application from cura.Stages.CuraStage import CuraStage @@ -9,3 +9,7 @@ class MonitorStage(CuraStage): def __init__(self): super().__init__() + Application.getInstance().engineCreatedSignal.connect(self._engineCreated) + + def _engineCreated(self): + self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py index e18ecba7f9..884d43a8af 100644 --- a/plugins/MonitorStage/__init__.py +++ b/plugins/MonitorStage/__init__.py @@ -10,10 +10,11 @@ def getMetaData(): return { "stage": { "name": i18n_catalog.i18nc("@item:inmenu", "Monitor"), - "weight": 1, - "icon": "" + "weight": 1 } } def register(app): - return { "stage": MonitorStage.MonitorStage() } + return { + "stage": MonitorStage.MonitorStage() + } diff --git a/plugins/PrepareStage/PrepareStage.py b/plugins/PrepareStage/PrepareStage.py index bbd2275d2e..63086b3e93 100644 --- a/plugins/PrepareStage/PrepareStage.py +++ b/plugins/PrepareStage/PrepareStage.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +import os.path +from UM.Application import Application +from UM.Resources import Resources from cura.Stages.CuraStage import CuraStage @@ -9,3 +11,9 @@ class PrepareStage(CuraStage): def __init__(self): super().__init__() + Application.getInstance().engineCreatedSignal.connect(self._engineCreated) + + def _engineCreated(self): + sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") + sidebar_component = Application.getInstance().createQmlComponent(sidebar_component_path) + self.addDisplayComponent("sidebar", sidebar_component) diff --git a/plugins/PrepareStage/__init__.py b/plugins/PrepareStage/__init__.py index d74cf27e39..f085d788f9 100644 --- a/plugins/PrepareStage/__init__.py +++ b/plugins/PrepareStage/__init__.py @@ -15,4 +15,6 @@ def getMetaData(): } def register(app): - return { "stage": PrepareStage.PrepareStage() } + return { + "stage": PrepareStage.PrepareStage() + } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index bf67efdba3..3c9ca25b05 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -366,8 +366,7 @@ UM.MainWindow onStopMonitoringPrint: base.showPrintMonitor = false } - Sidebar - { + Loader { id: sidebar anchors @@ -379,7 +378,8 @@ UM.MainWindow width: UM.Theme.getSize("sidebar").width z: 1 - monitoringPrint: base.showPrintMonitor + + sourceComponent: UM.Controller.activeStage.sidebarComponent } Rectangle diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 3bfc803a78..7429ef26df 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -10,603 +10,606 @@ import UM 1.2 as UM import Cura 1.0 as Cura import "Menus" -Rectangle +Component { - id: base; - - property int currentModeIndex; - property bool hideSettings: PrintInformation.preSliced - property bool hideView: Cura.MachineManager.activeMachineName == "" - - // Is there an output device for this printer? - property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 - property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property int backendState: UM.Backend.state - - property bool monitoringPrint: false - - property variant printDuration: PrintInformation.currentPrintTime - property variant printMaterialLengths: PrintInformation.materialLengths - property variant printMaterialWeights: PrintInformation.materialWeights - property variant printMaterialCosts: PrintInformation.materialCosts - property variant printMaterialNames: PrintInformation.materialNames - - color: UM.Theme.getColor("sidebar") - UM.I18nCatalog { id: catalog; name:"cura"} - - Timer { - id: tooltipDelayTimer - interval: 500 - repeat: false - property var item - property string text - - onTriggered: - { - base.showTooltip(base, {x: 0, y: item.y}, text); - } - } - - function showTooltip(item, position, text) - { - tooltip.text = text; - position = item.mapToItem(base, position.x - UM.Theme.getSize("default_arrow").width, position.y); - tooltip.show(position); - } - - function hideTooltip() - { - tooltip.hide(); - } - - function strPadLeft(string, pad, length) { - return (new Array(length + 1).join(pad) + string).slice(-length); - } - - function getPrettyTime(time) - { - var hours = Math.floor(time / 3600) - time -= hours * 3600 - var minutes = Math.floor(time / 60); - time -= minutes * 60 - var seconds = Math.floor(time); - - var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2); - return finalTime; - } - - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.AllButtons; - - onWheel: - { - wheel.accepted = true; - } - } - - SidebarHeader { - id: header - width: parent.width - visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariantst - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - Rectangle { - id: headerSeparator - width: parent.width - visible: settingsModeSelection.visible && header.visible - height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 - color: UM.Theme.getColor("sidebar_lining") - anchors.top: header.bottom - anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 - } - - Label { - id: settingsModeLabel - text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width - anchors.top: headerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - width: Math.floor(parent.width * 0.45) - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - visible: !monitoringPrint && !hideView - } - - Rectangle { - id: settingsModeSelection - color: "transparent" - width: Math.floor(parent.width * 0.55) - height: UM.Theme.getSize("sidebar_header_mode_toggle").height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - anchors.top: - { - if (settingsModeLabel.contentWidth >= parent.width - width - UM.Theme.getSize("sidebar_margin").width * 2) - { - return settingsModeLabel.bottom; - } - else - { - return headerSeparator.bottom; - } - } - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - visible: !monitoringPrint && !hideSettings && !hideView - Component{ - id: wizardDelegate - Button { - height: settingsModeSelection.height - anchors.left: parent.left - anchors.leftMargin: model.index * Math.floor(settingsModeSelection.width / 2) - anchors.verticalCenter: parent.verticalCenter - width: Math.floor(0.5 * parent.width) - text: model.text - exclusiveGroup: modeMenuGroup; - checkable: true; - checked: base.currentModeIndex == index - onClicked: base.currentModeIndex = index - - onHoveredChanged: { - if (hovered) - { - tooltipDelayTimer.item = settingsModeSelection - tooltipDelayTimer.text = model.tooltipText - tooltipDelayTimer.start(); - } - else - { - tooltipDelayTimer.stop(); - base.hideTooltip(); - } - } - - style: ButtonStyle { - background: Rectangle { - border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : - UM.Theme.getColor("action_button_border") - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : - UM.Theme.getColor("action_button") - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") - font: UM.Theme.getFont("default") - text: control.text - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideMiddle - } - } - label: Item { } - } - } - } - ExclusiveGroup { id: modeMenuGroup; } - - ListView - { - id: modesList - property var index: 0 - model: modesListModel - delegate: wizardDelegate - anchors.top: parent.top - anchors.left: parent.left - width: parent.width - } - } - - StackView - { - id: sidebarContents - - anchors.bottom: footerSeparator.top - anchors.top: settingsModeSelection.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.left: base.left - anchors.right: base.right - visible: !monitoringPrint && !hideSettings - - delegate: StackViewDelegate - { - function transitionFinished(properties) - { - properties.exitItem.opacity = 1 - } - - pushTransition: StackViewTransition - { - PropertyAnimation - { - target: enterItem - property: "opacity" - from: 0 - to: 1 - duration: 100 - } - PropertyAnimation - { - target: exitItem - property: "opacity" - from: 1 - to: 0 - duration: 100 - } - } - } - } - - Loader - { - id: controlItem - anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom - anchors.left: base.left - anchors.right: base.right - sourceComponent: - { - if(monitoringPrint && connectedPrinter != null) - { - if(connectedPrinter.controlItem != null) - { - return connectedPrinter.controlItem - } - } - return null - } - } - - Loader - { - anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom - anchors.left: base.left - anchors.right: base.right - source: - { - if(controlItem.sourceComponent == null) - { - if(monitoringPrint) - { - return "PrintMonitor.qml" - } else - { - return "SidebarContents.qml" - } - } - else - { - return "" - } - } - } - Rectangle { - id: footerSeparator - width: parent.width - height: UM.Theme.getSize("sidebar_lining").height - color: UM.Theme.getColor("sidebar_lining") - anchors.bottom: printSpecs.top - anchors.bottomMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2 + UM.Theme.getSize("progressbar").height + UM.Theme.getFont("default_bold").pixelSize) - } + id: base; - Item - { - id: printSpecs - anchors.left: parent.left - anchors.bottom: parent.bottom - anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width - anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height - height: timeDetails.height + costSpec.height - width: base.width - (saveButton.buttonRowWidth + UM.Theme.getSize("sidebar_margin").width) - visible: !monitoringPrint - clip: true + property int currentModeIndex; + property bool hideSettings: PrintInformation.preSliced + property bool hideView: Cura.MachineManager.activeMachineName == "" - Label - { - id: timeDetails - anchors.left: parent.left - anchors.bottom: costSpec.top - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text_subtext") - text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label Hours and minutes", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) + // Is there an output device for this printer? + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + property int backendState: UM.Backend.state - MouseArea + property bool monitoringPrint: false + + property variant printDuration: PrintInformation.currentPrintTime + property variant printMaterialLengths: PrintInformation.materialLengths + property variant printMaterialWeights: PrintInformation.materialWeights + property variant printMaterialCosts: PrintInformation.materialCosts + property variant printMaterialNames: PrintInformation.materialNames + + color: UM.Theme.getColor("sidebar") + UM.I18nCatalog { id: catalog; name:"cura"} + + Timer { + id: tooltipDelayTimer + interval: 500 + repeat: false + property var item + property string text + + onTriggered: { - id: timeDetailsMouseArea - anchors.fill: parent - hoverEnabled: true - - onEntered: - { - if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) - { - // All the time information for the different features is achieved - var print_time = PrintInformation.getFeaturePrintTimes(); - var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) - - // A message is created and displayed when the user hover the time label - var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); - for(var feature in print_time) - { - if(!print_time[feature].isTotalDurationZero) - { - tooltip_html += "" + - "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + - "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + - ""; - } - } - tooltip_html += "
    " + feature + ":  %1  %1%
    "; - - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), tooltip_html); - } - } - onExited: - { - base.hideTooltip(); - } + base.showTooltip(base, {x: 0, y: item.y}, text); } } - Label + function showTooltip(item, position, text) { - function formatRow(items) + tooltip.text = text; + position = item.mapToItem(base, position.x - UM.Theme.getSize("default_arrow").width, position.y); + tooltip.show(position); + } + + function hideTooltip() + { + tooltip.hide(); + } + + function strPadLeft(string, pad, length) { + return (new Array(length + 1).join(pad) + string).slice(-length); + } + + function getPrettyTime(time) + { + var hours = Math.floor(time / 3600) + time -= hours * 3600 + var minutes = Math.floor(time / 60); + time -= minutes * 60 + var seconds = Math.floor(time); + + var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2); + return finalTime; + } + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.AllButtons; + + onWheel: { - var row_html = ""; - for(var item = 0; item < items.length; item++) - { - if (item == 0) - { - row_html += "%1".arg(items[item]); - } - else - { - row_html += "  %1".arg(items[item]); - } - } - row_html += ""; - return row_html; + wheel.accepted = true; } + } - function getSpecsData() - { - var lengths = []; - var total_length = 0; - var weights = []; - var total_weight = 0; - var costs = []; - var total_cost = 0; - var some_costs_known = false; - var names = []; - if(base.printMaterialLengths) - { - for(var index = 0; index < base.printMaterialLengths.length; index++) - { - if(base.printMaterialLengths[index] > 0) - { - names.push(base.printMaterialNames[index]); - lengths.push(base.printMaterialLengths[index].toFixed(2)); - weights.push(String(Math.floor(base.printMaterialWeights[index]))); - var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); - costs.push(cost); - if(cost > 0) - { - some_costs_known = true; - } - - total_length += base.printMaterialLengths[index]; - total_weight += base.printMaterialWeights[index]; - total_cost += base.printMaterialCosts[index]; - } - } - } - if(lengths.length == 0) - { - lengths = ["0.00"]; - weights = ["0"]; - costs = ["0.00"]; - } - - var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); - for(var index = 0; index < lengths.length; index++) - { - tooltip_html += formatRow([ - "%1:".arg(names[index]), - catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), - catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), - ]); - } - if(lengths.length > 1) - { - tooltip_html += formatRow([ - catalog.i18nc("@label", "Total:"), - catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), - catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), - ]); - } - tooltip_html += "
    "; - tooltipText = tooltip_html; - - return tooltipText - } - - id: costSpec - anchors.left: parent.left - anchors.bottom: parent.bottom - font: UM.Theme.getFont("very_small") - color: UM.Theme.getColor("text_subtext") - elide: Text.ElideMiddle + SidebarHeader { + id: header width: parent.width - property string tooltipText - text: + visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariantst + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + Rectangle { + id: headerSeparator + width: parent.width + visible: settingsModeSelection.visible && header.visible + height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 + color: UM.Theme.getColor("sidebar_lining") + anchors.top: header.bottom + anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 + } + + Label { + id: settingsModeLabel + text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.top: headerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + width: Math.floor(parent.width * 0.45) + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + visible: !monitoringPrint && !hideView + } + + Rectangle { + id: settingsModeSelection + color: "transparent" + width: Math.floor(parent.width * 0.55) + height: UM.Theme.getSize("sidebar_header_mode_toggle").height + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.top: { - var lengths = []; - var weights = []; - var costs = []; - var someCostsKnown = false; - if(base.printMaterialLengths) { - for(var index = 0; index < base.printMaterialLengths.length; index++) - { - if(base.printMaterialLengths[index] > 0) - { - lengths.push(base.printMaterialLengths[index].toFixed(2)); - weights.push(String(Math.floor(base.printMaterialWeights[index]))); - var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); - costs.push(cost); - if(cost > 0) - { - someCostsKnown = true; - } - } - } - } - if(lengths.length == 0) + if (settingsModeLabel.contentWidth >= parent.width - width - UM.Theme.getSize("sidebar_margin").width * 2) { - lengths = ["0.00"]; - weights = ["0"]; - costs = ["0.00"]; - } - if(someCostsKnown) - { - return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) - .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); + return settingsModeLabel.bottom; } else { - return catalog.i18nc("@label Print estimates: m for meters, g for grams", "%1m / ~ %2g").arg(lengths.join(" + ")).arg(weights.join(" + ")); + return headerSeparator.bottom; } } - MouseArea - { - id: costSpecMouseArea - anchors.fill: parent - hoverEnabled: true + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + visible: !monitoringPrint && !hideSettings && !hideView + Component{ + id: wizardDelegate + Button { + height: settingsModeSelection.height + anchors.left: parent.left + anchors.leftMargin: model.index * Math.floor(settingsModeSelection.width / 2) + anchors.verticalCenter: parent.verticalCenter + width: Math.floor(0.5 * parent.width) + text: model.text + exclusiveGroup: modeMenuGroup; + checkable: true; + checked: base.currentModeIndex == index + onClicked: base.currentModeIndex = index - onEntered: - { + onHoveredChanged: { + if (hovered) + { + tooltipDelayTimer.item = settingsModeSelection + tooltipDelayTimer.text = model.tooltipText + tooltipDelayTimer.start(); + } + else + { + tooltipDelayTimer.stop(); + base.hideTooltip(); + } + } - if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) - { - var show_data = costSpec.getSpecsData() - - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), show_data); + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : + control.hovered ? UM.Theme.getColor("action_button_hovered_border") : + UM.Theme.getColor("action_button_border") + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : + control.hovered ? UM.Theme.getColor("action_button_hovered") : + UM.Theme.getColor("action_button") + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : + UM.Theme.getColor("action_button_text") + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } + } + label: Item { } } } - onExited: + } + ExclusiveGroup { id: modeMenuGroup; } + + ListView + { + id: modesList + property var index: 0 + model: modesListModel + delegate: wizardDelegate + anchors.top: parent.top + anchors.left: parent.left + width: parent.width + } + } + + StackView + { + id: sidebarContents + + anchors.bottom: footerSeparator.top + anchors.top: settingsModeSelection.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.left: base.left + anchors.right: base.right + visible: !monitoringPrint && !hideSettings + + delegate: StackViewDelegate + { + function transitionFinished(properties) { - base.hideTooltip(); + properties.exitItem.opacity = 1 + } + + pushTransition: StackViewTransition + { + PropertyAnimation + { + target: enterItem + property: "opacity" + from: 0 + to: 1 + duration: 100 + } + PropertyAnimation + { + target: exitItem + property: "opacity" + from: 1 + to: 0 + duration: 100 + } } } } - } - // SaveButton and MonitorButton are actually the bottom footer panels. - // "!monitoringPrint" currently means "show-settings-mode" - SaveButton - { - id: saveButton - implicitWidth: base.width - anchors.top: footerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.bottom: parent.bottom - visible: !monitoringPrint - } - - MonitorButton - { - id: monitorButton - implicitWidth: base.width - anchors.top: footerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.bottom: parent.bottom - visible: monitoringPrint - } - - - SidebarTooltip - { - id: tooltip; - } - - // Setting mode: Recommended or Custom - ListModel - { - id: modesListModel; - } - - SidebarSimple - { - id: sidebarSimple; - visible: false; - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - SidebarAdvanced - { - id: sidebarAdvanced; - visible: false; - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - Component.onCompleted: - { - modesListModel.append({ - text: catalog.i18nc("@title:tab", "Recommended"), - tooltipText: catalog.i18nc("@tooltip", "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality."), - item: sidebarSimple - }) - modesListModel.append({ - text: catalog.i18nc("@title:tab", "Custom"), - tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process."), - item: sidebarAdvanced - }) - sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true }); - - var index = Math.floor(UM.Preferences.getValue("cura/active_mode")) - if(index) + Loader { - currentModeIndex = index; + id: controlItem + anchors.bottom: footerSeparator.top + anchors.top: headerSeparator.bottom + anchors.left: base.left + anchors.right: base.right + sourceComponent: + { + if(monitoringPrint && connectedPrinter != null) + { + if(connectedPrinter.controlItem != null) + { + return connectedPrinter.controlItem + } + } + return null + } + } + + Loader + { + anchors.bottom: footerSeparator.top + anchors.top: headerSeparator.bottom + anchors.left: base.left + anchors.right: base.right + source: + { + if(controlItem.sourceComponent == null) + { + if(monitoringPrint) + { + return "PrintMonitor.qml" + } else + { + return "SidebarContents.qml" + } + } + else + { + return "" + } + } + } + + Rectangle + { + id: footerSeparator + width: parent.width + height: UM.Theme.getSize("sidebar_lining").height + color: UM.Theme.getColor("sidebar_lining") + anchors.bottom: printSpecs.top + anchors.bottomMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2 + UM.Theme.getSize("progressbar").height + UM.Theme.getFont("default_bold").pixelSize) + } + + Item + { + id: printSpecs + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height + height: timeDetails.height + costSpec.height + width: base.width - (saveButton.buttonRowWidth + UM.Theme.getSize("sidebar_margin").width) + visible: !monitoringPrint + clip: true + + Label + { + id: timeDetails + anchors.left: parent.left + anchors.bottom: costSpec.top + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text_subtext") + text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label Hours and minutes", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) + + MouseArea + { + id: timeDetailsMouseArea + anchors.fill: parent + hoverEnabled: true + + onEntered: + { + if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) + { + // All the time information for the different features is achieved + var print_time = PrintInformation.getFeaturePrintTimes(); + var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) + + // A message is created and displayed when the user hover the time label + var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); + for(var feature in print_time) + { + if(!print_time[feature].isTotalDurationZero) + { + tooltip_html += "" + + "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + + "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + + ""; + } + } + tooltip_html += "
    " + feature + ":  %1  %1%
    "; + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), tooltip_html); + } + } + onExited: + { + base.hideTooltip(); + } + } + } + + Label + { + function formatRow(items) + { + var row_html = ""; + for(var item = 0; item < items.length; item++) + { + if (item == 0) + { + row_html += "%1".arg(items[item]); + } + else + { + row_html += "  %1".arg(items[item]); + } + } + row_html += ""; + return row_html; + } + + function getSpecsData() + { + var lengths = []; + var total_length = 0; + var weights = []; + var total_weight = 0; + var costs = []; + var total_cost = 0; + var some_costs_known = false; + var names = []; + if(base.printMaterialLengths) + { + for(var index = 0; index < base.printMaterialLengths.length; index++) + { + if(base.printMaterialLengths[index] > 0) + { + names.push(base.printMaterialNames[index]); + lengths.push(base.printMaterialLengths[index].toFixed(2)); + weights.push(String(Math.floor(base.printMaterialWeights[index]))); + var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); + costs.push(cost); + if(cost > 0) + { + some_costs_known = true; + } + + total_length += base.printMaterialLengths[index]; + total_weight += base.printMaterialWeights[index]; + total_cost += base.printMaterialCosts[index]; + } + } + } + if(lengths.length == 0) + { + lengths = ["0.00"]; + weights = ["0"]; + costs = ["0.00"]; + } + + var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); + for(var index = 0; index < lengths.length; index++) + { + tooltip_html += formatRow([ + "%1:".arg(names[index]), + catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), + catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), + ]); + } + if(lengths.length > 1) + { + tooltip_html += formatRow([ + catalog.i18nc("@label", "Total:"), + catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), + catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), + ]); + } + tooltip_html += "
    "; + tooltipText = tooltip_html; + + return tooltipText + } + + id: costSpec + anchors.left: parent.left + anchors.bottom: parent.bottom + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text_subtext") + elide: Text.ElideMiddle + width: parent.width + property string tooltipText + text: + { + var lengths = []; + var weights = []; + var costs = []; + var someCostsKnown = false; + if(base.printMaterialLengths) { + for(var index = 0; index < base.printMaterialLengths.length; index++) + { + if(base.printMaterialLengths[index] > 0) + { + lengths.push(base.printMaterialLengths[index].toFixed(2)); + weights.push(String(Math.floor(base.printMaterialWeights[index]))); + var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); + costs.push(cost); + if(cost > 0) + { + someCostsKnown = true; + } + } + } + } + if(lengths.length == 0) + { + lengths = ["0.00"]; + weights = ["0"]; + costs = ["0.00"]; + } + if(someCostsKnown) + { + return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) + .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); + } + else + { + return catalog.i18nc("@label Print estimates: m for meters, g for grams", "%1m / ~ %2g").arg(lengths.join(" + ")).arg(weights.join(" + ")); + } + } + MouseArea + { + id: costSpecMouseArea + anchors.fill: parent + hoverEnabled: true + + onEntered: + { + + if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) + { + var show_data = costSpec.getSpecsData() + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), show_data); + } + } + onExited: + { + base.hideTooltip(); + } + } + } + } + + // SaveButton and MonitorButton are actually the bottom footer panels. + // "!monitoringPrint" currently means "show-settings-mode" + SaveButton + { + id: saveButton + implicitWidth: base.width + anchors.top: footerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + visible: !monitoringPrint + } + + MonitorButton + { + id: monitorButton + implicitWidth: base.width + anchors.top: footerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + visible: monitoringPrint + } + + + SidebarTooltip + { + id: tooltip; + } + + // Setting mode: Recommended or Custom + ListModel + { + id: modesListModel; + } + + SidebarSimple + { + id: sidebarSimple; + visible: false; + + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + SidebarAdvanced + { + id: sidebarAdvanced; + visible: false; + + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + Component.onCompleted: + { + modesListModel.append({ + text: catalog.i18nc("@title:tab", "Recommended"), + tooltipText: catalog.i18nc("@tooltip", "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality."), + item: sidebarSimple + }) + modesListModel.append({ + text: catalog.i18nc("@title:tab", "Custom"), + tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process."), + item: sidebarAdvanced + }) + sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true }); + + var index = Math.floor(UM.Preferences.getValue("cura/active_mode")) + if(index) + { + currentModeIndex = index; + } + } + + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: machineHeatedBed + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_heated_bed" + watchedProperties: [ "value" ] + storeIndex: 0 } } - - UM.SettingPropertyProvider - { - id: machineExtruderCount - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_extruder_count" - watchedProperties: [ "value" ] - storeIndex: 0 - } - - UM.SettingPropertyProvider - { - id: machineHeatedBed - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_heated_bed" - watchedProperties: [ "value" ] - storeIndex: 0 - } } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 50e90a9a37..5817aff13b 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -6,7 +6,7 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.2 as UM +import UM 1.4 as UM import Cura 1.0 as Cura import "Menus" @@ -83,34 +83,13 @@ Rectangle style: UM.Theme.styles.topbar_header_tab height: UM.Theme.getSize("sidebar_header").height onClicked: UM.Controller.setActiveStage(model.id) + iconSource: model.stage.iconSource + + property color overlayColor: "transparent" + property string overlayIconSource: "" } } -// Button -// { -// id: showSettings -// height: UM.Theme.getSize("sidebar_header").height -// text: catalog.i18nc("@title:tab", "Prepare") -// checkable: true -// checked: isChecked() -// exclusiveGroup: sidebarHeaderBarGroup -// style: UM.Theme.styles.topbar_header_tab -// -// // We use a Qt.binding to re-bind the checkbox state after manually setting it -// // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing -// onClicked: { -// base.stopMonitoringPrint() -// checked = Qt.binding(isChecked) -// } -// -// function isChecked () { -// return !base.monitoringPrint -// } -// -// property color overlayColor: "transparent" -// property string overlayIconSource: "" -// } - // Button // { // id: showMonitor From 2d044a37ae364accfbd86dcf25c026046e0a7228 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 13:33:05 +0100 Subject: [PATCH 520/764] Sidebar and main view via loader --- plugins/MonitorStage/MonitorStage.py | 7 ++++ resources/qml/Cura.qml | 45 ++++++++++---------------- resources/qml/Settings/SettingView.qml | 2 +- resources/qml/Sidebar.qml | 2 +- resources/qml/SidebarHeader.qml | 8 ++--- resources/qml/Topbar.qml | 45 ++++++++++++-------------- 6 files changed, 50 insertions(+), 59 deletions(-) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 8b98f2872c..7cd6fe5063 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import os.path from UM.Application import Application +from UM.Resources import Resources from cura.Stages.CuraStage import CuraStage @@ -10,6 +12,11 @@ class MonitorStage(CuraStage): def __init__(self): super().__init__() Application.getInstance().engineCreatedSignal.connect(self._engineCreated) + # TODO: connect output device state to icon source def _engineCreated(self): + # Note: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! + sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") + sidebar_component = Application.getInstance().createQmlComponent(sidebar_component_path) + self.addDisplayComponent("sidebar", sidebar_component) self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3c9ca25b05..662de05063 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -358,15 +358,13 @@ UM.MainWindow Topbar { id: topbar - anchors.left:parent.left + anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top - monitoringPrint: base.showPrintMonitor - onStartMonitoringPrint: base.showPrintMonitor = true - onStopMonitoringPrint: base.showPrintMonitor = false } - Loader { + Loader + { id: sidebar anchors @@ -382,39 +380,30 @@ UM.MainWindow sourceComponent: UM.Controller.activeStage.sidebarComponent } - Rectangle + Loader { - id: viewportOverlay + id: main - color: UM.Theme.getColor("viewport_overlay") anchors { top: topbar.bottom bottom: parent.bottom - left:parent.left + left: parent.left right: sidebar.left +// horizontalCenter: parent.horizontalCenter +// verticalCenter: parent.verticalCenter +// horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2 +// verticalCenterOffset: UM.Theme.getSize("sidebar_header").height / 2 } - visible: opacity > 0 - opacity: base.showPrintMonitor ? 1 : 0 - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.AllButtons +// MouseArea +// { +// anchors.fill: parent +// acceptedButtons: Qt.AllButtons +// onWheel: wheel.accepted = true +// } - onWheel: wheel.accepted = true - } - } - - Loader - { - sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null - visible: base.showPrintMonitor - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2 - anchors.verticalCenterOffset: UM.Theme.getSize("sidebar_header").height / 2 - property real maximumWidth: viewportOverlay.width - property real maximumHeight: viewportOverlay.height + sourceComponent: UM.Controller.activeStage.mainComponent } UM.MessageStack diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 1ebb5cc40e..2079710315 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -24,7 +24,7 @@ Item { id: globalProfileRow height: UM.Theme.getSize("sidebar_setup").height - visible: !sidebar.monitoringPrint && !sidebar.hideSettings +// visible: !sidebar.monitoringPrint && !sidebar.hideSettings anchors { diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 7429ef26df..992ad1f848 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -26,7 +26,7 @@ Component property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null property int backendState: UM.Backend.state - property bool monitoringPrint: false + property bool monitoringPrint: UM.Controller.activeStage.id == "MonitorStage" property variant printDuration: PrintInformation.currentPrintTime property variant printMaterialLengths: PrintInformation.materialLengths diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 3e1e85824a..0f0572a48a 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -40,7 +40,7 @@ Column id: extruderSelectionRow width: parent.width height: Math.floor(UM.Theme.getSize("sidebar_tabs").height * 2 / 3) - visible: machineExtruderCount.properties.value > 1 && !sidebar.monitoringPrint + visible: machineExtruderCount.properties.value > 1 anchors { @@ -229,7 +229,7 @@ Column { id: materialRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasMaterials && !sidebar.monitoringPrint && !sidebar.hideSettings + visible: Cura.MachineManager.hasMaterials anchors { @@ -279,7 +279,7 @@ Column { id: variantRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings + visible: Cura.MachineManager.hasVariants anchors { @@ -319,7 +319,7 @@ Column { id: materialInfoRow height: Math.floor(UM.Theme.getSize("sidebar_setup").height / 2) - visible: (Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials) && !sidebar.monitoringPrint && !sidebar.hideSettings + visible: Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials anchors { diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 5817aff13b..d50cc64608 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -16,27 +16,22 @@ Rectangle anchors.left: parent.left anchors.right: parent.right height: UM.Theme.getSize("sidebar_header").height - color: base.monitoringPrint ? UM.Theme.getColor("topbar_background_color_monitoring") : UM.Theme.getColor("topbar_background_color") + color: UM.Controller.activeStage.id == "MonitorStage" ? UM.Theme.getColor("topbar_background_color_monitoring") : UM.Theme.getColor("topbar_background_color") property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property bool monitoringPrint: false - - // outgoing signal - signal startMonitoringPrint() - signal stopMonitoringPrint() // update monitoring status when event was triggered outside topbar - Component.onCompleted: { - startMonitoringPrint.connect(function () { - base.monitoringPrint = true - UM.Controller.disableModelRendering() - }) - stopMonitoringPrint.connect(function () { - base.monitoringPrint = false - UM.Controller.enableModelRendering() - }) - } +// Component.onCompleted: { +// startMonitoringPrint.connect(function () { +// base.monitoringPrint = true +// UM.Controller.disableModelRendering() +// }) +// stopMonitoringPrint.connect(function () { +// base.monitoringPrint = false +// UM.Controller.enableModelRendering() +// }) +// } UM.I18nCatalog { @@ -79,9 +74,10 @@ Rectangle text: model.name checkable: true checked: model.active - exclusiveGroup: sidebarHeaderBarGroup + exclusiveGroup: topbarMenuGroup style: UM.Theme.styles.topbar_header_tab height: UM.Theme.getSize("sidebar_header").height + width: UM.Theme.getSize("topbar_button").width onClicked: UM.Controller.setActiveStage(model.id) iconSource: model.stage.iconSource @@ -90,6 +86,8 @@ Rectangle } } + ExclusiveGroup { id: topbarMenuGroup } + // Button // { // id: showMonitor @@ -149,8 +147,6 @@ Rectangle // } // } // } - - ExclusiveGroup { id: sidebarHeaderBarGroup } } ToolButton @@ -218,17 +214,16 @@ Rectangle menu: PrinterMenu { } } - //View orientation Item + // View orientation Item Row { id: viewOrientationControl height: 30 - spacing: 2 + visible: UM.Controller.activeStage.id != "MonitorStage" - visible: !base.monitoringPrint - - anchors { + anchors + { verticalCenter: base.verticalCenter right: viewModeButton.right rightMargin: UM.Theme.getSize("default_margin").width + viewModeButton.width @@ -306,7 +301,7 @@ Rectangle } style: UM.Theme.styles.combobox - visible: !base.monitoringPrint + visible: UM.Controller.activeStage.id != "MonitorStage" model: UM.ViewModel { } textRole: "name" From f0c3aaf532ccd228ba28304f9e5f88f0c7d2389d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 6 Dec 2017 14:05:09 +0100 Subject: [PATCH 521/764] Add built-in profiles to profiles screen. Contributes to issue CURA-4243. --- cura/Settings/QualityAndUserProfilesModel.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 52333c3b6e..8d47f1d4ab 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -40,4 +40,7 @@ class QualityAndUserProfilesModel(ProfilesModel): qc.getMetaDataEntry("extruder") is not None and (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} - return filtered_quality_changes, {} + + result = filtered_quality_changes + result.update({q.getId():q for q in quality_list}) + return result, {} From 9561827bdad91604fc70e0c448c9b8c657c83a83 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 6 Dec 2017 14:12:51 +0100 Subject: [PATCH 522/764] CURA-4680 Checking if there is global stack in the ExtruderManager. Intead of checking for it in all the methods in MachineManager, now the check is done in ExtruderManager when there is no printer in the list. --- cura/Settings/ExtruderManager.py | 8 +++++--- cura/Settings/MachineManager.py | 19 ------------------- 2 files changed, 5 insertions(+), 22 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 34b283107d..32e3867300 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -356,14 +356,16 @@ class ExtruderManager(QObject): # \return \type{List[ContainerStack]} a list of def getActiveExtruderStacks(self) -> List["ExtruderStack"]: global_stack = Application.getInstance().getGlobalContainerStack() + if not global_stack: + return None result = [] - machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") - - if global_stack and global_stack.getId() in self._extruder_trains: + if global_stack.getId() in self._extruder_trains: for extruder in sorted(self._extruder_trains[global_stack.getId()]): result.append(self._extruder_trains[global_stack.getId()][extruder]) + machine_extruder_count = global_stack.getProperty("machine_extruder_count", "value") + return result[:machine_extruder_count] def __globalContainerStackChanged(self) -> None: diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 253c5f793c..afd038b45d 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -499,10 +499,6 @@ class MachineManager(QObject): def activeVariantNames(self) -> List[str]: result = [] - # it can happen when there is no active machine - if self._global_container_stack is None: - return result - active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks is not None: for stack in active_stacks: @@ -516,10 +512,6 @@ class MachineManager(QObject): def activeMaterialNames(self) -> List[str]: result = [] - # it can happen when there is no active machine - if self._global_container_stack is None: - return result - active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks is not None: for stack in active_stacks: @@ -541,10 +533,6 @@ class MachineManager(QObject): def allActiveVariantIds(self) -> Dict[str, str]: result = {} - # it can happen when there is no active machine - if self._global_container_stack is None: - return result - active_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() if active_stacks is not None: #If we have a global stack. for stack in active_stacks: @@ -564,14 +552,7 @@ class MachineManager(QObject): def allActiveMaterialIds(self) -> Dict[str, str]: result = {} - # it can happen when there is no active machine - if self._global_container_stack is None: - return result - active_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - - result[self._global_container_stack.getId()] = self._global_container_stack.material.getId() - if active_stacks is not None: # If we have extruder stacks for stack in active_stacks: material_container = stack.material From 569e040955f9f924040d18b52f3e30f54fe1a196 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 6 Dec 2017 14:45:47 +0100 Subject: [PATCH 523/764] Add more complete version info in project files CURA-4683 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 9c143f0057..3953bea229 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -59,7 +59,9 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): version_file = zipfile.ZipInfo("Cura/version.ini") version_config_parser = configparser.ConfigParser() version_config_parser.add_section("versions") - version_config_parser.set("versions", "cura_version", Application.getStaticVersion()) + version_config_parser.set("versions", "cura_version", Application.getInstance().getVersion()) + version_config_parser.set("versions", "build_type", Application.getInstance().getBuildType()) + version_config_parser.set("versions", "is_debug_mode", Application.getInstance().getIsDebugMode()) version_file_string = StringIO() version_config_parser.write(version_file_string) From 298a659c094bb31e7ad86b4688a40a9a12161dfc Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 6 Dec 2017 14:48:58 +0100 Subject: [PATCH 524/764] Save is_debug_mode as string CURA-4683 --- plugins/3MFWriter/ThreeMFWorkspaceWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index 3953bea229..4f1ff9494f 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -61,7 +61,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): version_config_parser.add_section("versions") version_config_parser.set("versions", "cura_version", Application.getInstance().getVersion()) version_config_parser.set("versions", "build_type", Application.getInstance().getBuildType()) - version_config_parser.set("versions", "is_debug_mode", Application.getInstance().getIsDebugMode()) + version_config_parser.set("versions", "is_debug_mode", str(Application.getInstance().getIsDebugMode())) version_file_string = StringIO() version_config_parser.write(version_file_string) From 4245847dabe03c1a8824db8f5acc9f0081498a87 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 6 Dec 2017 16:39:59 +0100 Subject: [PATCH 525/764] Moved saveSettings and saveStack to Uraniums ContainerRegistry. Contributes to issue CURA-4342. --- cura/CuraApplication.py | 74 +++++------------------------------------ 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9293a7e07b..b02903dc98 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -171,13 +171,13 @@ class CuraApplication(QtApplication): Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") Resources.addStorageType(self.ResourceTypes.DefinitionChangesContainer, "definition_changes") - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.ExtruderStack) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack) - ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.DefinitionChangesContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer, "quality") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer, "variant") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer, "material") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer, "user") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.ExtruderStack, "extruder_train") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack, "machine") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.DefinitionChangesContainer, "definition_changes") ## Initialise the version upgrade manager with Cura's storage paths. import UM.VersionUpgradeManager #Needs to be here to prevent circular dependencies. @@ -465,66 +465,10 @@ class CuraApplication(QtApplication): if not self._started: # Do not do saving during application start return - # Lock file for "more" atomically loading and saving to/from config dir. - with ContainerRegistry.getInstance().lockFile(): - for instance in ContainerRegistry.getInstance().findDirtyContainers(container_type = InstanceContainer): - try: - data = instance.serialize() - except NotImplementedError: - continue - except Exception: - Logger.logException("e", "An exception occurred when serializing container %s", instance.getId()) - continue - - mime_type = ContainerRegistry.getMimeTypeForContainer(type(instance)) - file_name = urllib.parse.quote_plus(instance.getId()) + "." + mime_type.preferredSuffix - instance_type = instance.getMetaDataEntry("type") - path = None - if instance_type == "material": - path = Resources.getStoragePath(self.ResourceTypes.MaterialInstanceContainer, file_name) - elif instance_type == "quality" or instance_type == "quality_changes": - path = Resources.getStoragePath(self.ResourceTypes.QualityInstanceContainer, file_name) - elif instance_type == "user": - path = Resources.getStoragePath(self.ResourceTypes.UserInstanceContainer, file_name) - elif instance_type == "variant": - path = Resources.getStoragePath(self.ResourceTypes.VariantInstanceContainer, file_name) - elif instance_type == "definition_changes": - path = Resources.getStoragePath(self.ResourceTypes.DefinitionChangesContainer, file_name) - - if path: - instance.setPath(path) - with SaveFile(path, "wt") as f: - f.write(data) - - for stack in ContainerRegistry.getInstance().findContainerStacks(): - self.saveStack(stack) + ContainerRegistry.getInstance().saveDirtyContainers() def saveStack(self, stack): - if not stack.isDirty(): - return - try: - data = stack.serialize() - except NotImplementedError: - return - except Exception: - Logger.logException("e", "An exception occurred when serializing container %s", stack.getId()) - return - - mime_type = ContainerRegistry.getMimeTypeForContainer(type(stack)) - file_name = urllib.parse.quote_plus(stack.getId()) + "." + mime_type.preferredSuffix - - path = None - if isinstance(stack, GlobalStack): - path = Resources.getStoragePath(self.ResourceTypes.MachineStack, file_name) - elif isinstance(stack, ExtruderStack): - path = Resources.getStoragePath(self.ResourceTypes.ExtruderStack, file_name) - else: - path = Resources.getStoragePath(Resources.ContainerStacks, file_name) - - stack.setPath(path) - with SaveFile(path, "wt") as f: - f.write(data) - + ContainerRegistry.getInstance().saveStack(stack) @pyqtSlot(str, result = QUrl) def getDefaultPath(self, key): From ee643610e5a4de384aa09f5ef5399c94a4972574 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 17:46:18 +0100 Subject: [PATCH 526/764] Fix sidebar loading and unloading depending on active stage --- cura/CuraApplication.py | 1 - cura/Stages/CuraStage.py | 14 +- plugins/MonitorStage/MonitorStage.py | 7 +- plugins/PrepareStage/PrepareStage.py | 7 +- resources/qml/Cura.qml | 10 +- resources/qml/Sidebar.qml | 1145 +++++++++++++------------- resources/qml/SidebarSimple.qml | 20 +- 7 files changed, 601 insertions(+), 603 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index eec6c7f503..c9466a0093 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1,6 +1,5 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - from PyQt5.QtNetwork import QLocalServer from PyQt5.QtNetwork import QLocalSocket diff --git a/cura/Stages/CuraStage.py b/cura/Stages/CuraStage.py index 6d4e56473d..8b7822ed7a 100644 --- a/cura/Stages/CuraStage.py +++ b/cura/Stages/CuraStage.py @@ -1,18 +1,22 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtProperty, QObject +from PyQt5.QtCore import pyqtProperty, QUrl, QObject from UM.Stage import Stage class CuraStage(Stage): - def __init__(self): - super().__init__() + def __init__(self, parent = None): + super().__init__(parent) - @pyqtProperty(QObject, constant = True) + @pyqtProperty(str, constant = True) + def stageId(self): + return self.getPluginId() + + @pyqtProperty(QUrl, constant = True) def mainComponent(self): return self.getDisplayComponent("main") - @pyqtProperty(QObject, constant = True) + @pyqtProperty(QUrl, constant = True) def sidebarComponent(self): return self.getDisplayComponent("sidebar") diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 7cd6fe5063..6131e5538b 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -9,14 +9,13 @@ from cura.Stages.CuraStage import CuraStage ## Stage for monitoring a 3D printing while it's printing. class MonitorStage(CuraStage): - def __init__(self): - super().__init__() + def __init__(self, parent = None): + super().__init__(parent) Application.getInstance().engineCreatedSignal.connect(self._engineCreated) # TODO: connect output device state to icon source def _engineCreated(self): # Note: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") - sidebar_component = Application.getInstance().createQmlComponent(sidebar_component_path) - self.addDisplayComponent("sidebar", sidebar_component) + self.addDisplayComponent("sidebar", sidebar_component_path) self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) diff --git a/plugins/PrepareStage/PrepareStage.py b/plugins/PrepareStage/PrepareStage.py index 63086b3e93..9d4d632845 100644 --- a/plugins/PrepareStage/PrepareStage.py +++ b/plugins/PrepareStage/PrepareStage.py @@ -9,11 +9,10 @@ from cura.Stages.CuraStage import CuraStage ## Stage for preparing model (slicing). class PrepareStage(CuraStage): - def __init__(self): - super().__init__() + def __init__(self, parent = None): + super().__init__(parent) Application.getInstance().engineCreatedSignal.connect(self._engineCreated) def _engineCreated(self): sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") - sidebar_component = Application.getInstance().createQmlComponent(sidebar_component_path) - self.addDisplayComponent("sidebar", sidebar_component) + self.addDisplayComponent("sidebar", sidebar_component_path) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 662de05063..445325df90 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -377,7 +377,8 @@ UM.MainWindow width: UM.Theme.getSize("sidebar").width z: 1 - sourceComponent: UM.Controller.activeStage.sidebarComponent + source: UM.Controller.activeStage.sidebarComponent + asynchronous: true } Loader @@ -390,10 +391,6 @@ UM.MainWindow bottom: parent.bottom left: parent.left right: sidebar.left -// horizontalCenter: parent.horizontalCenter -// verticalCenter: parent.verticalCenter -// horizontalCenterOffset: - UM.Theme.getSize("sidebar").width / 2 -// verticalCenterOffset: UM.Theme.getSize("sidebar_header").height / 2 } // MouseArea @@ -403,7 +400,8 @@ UM.MainWindow // onWheel: wheel.accepted = true // } - sourceComponent: UM.Controller.activeStage.mainComponent + source: UM.Controller.activeStage.mainComponent + asynchronous: true } UM.MessageStack diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 992ad1f848..a02454d298 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -10,606 +10,601 @@ import UM 1.2 as UM import Cura 1.0 as Cura import "Menus" -Component + +Rectangle { - Rectangle + id: base; + + property int currentModeIndex; + property bool hideSettings: PrintInformation.preSliced + property bool hideView: Cura.MachineManager.activeMachineName == "" + + // Is there an output device for this printer? + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + property int backendState: UM.Backend.state + + property bool monitoringPrint: UM.Controller.activeStage.stageId == "MonitorStage" + + property variant printDuration: PrintInformation.currentPrintTime + property variant printMaterialLengths: PrintInformation.materialLengths + property variant printMaterialWeights: PrintInformation.materialWeights + property variant printMaterialCosts: PrintInformation.materialCosts + property variant printMaterialNames: PrintInformation.materialNames + + color: UM.Theme.getColor("sidebar") + UM.I18nCatalog { id: catalog; name:"cura"} + + Timer { + id: tooltipDelayTimer + interval: 500 + repeat: false + property var item + property string text + + onTriggered: + { + base.showTooltip(base, {x: 0, y: item.y}, text); + } + } + + function showTooltip(item, position, text) { - id: base; + tooltip.text = text; + position = item.mapToItem(base, position.x - UM.Theme.getSize("default_arrow").width, position.y); + tooltip.show(position); + } - property int currentModeIndex; - property bool hideSettings: PrintInformation.preSliced - property bool hideView: Cura.MachineManager.activeMachineName == "" + function hideTooltip() + { + tooltip.hide(); + } - // Is there an output device for this printer? - property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 - property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property int backendState: UM.Backend.state + function strPadLeft(string, pad, length) { + return (new Array(length + 1).join(pad) + string).slice(-length); + } - property bool monitoringPrint: UM.Controller.activeStage.id == "MonitorStage" + function getPrettyTime(time) + { + var hours = Math.floor(time / 3600) + time -= hours * 3600 + var minutes = Math.floor(time / 60); + time -= minutes * 60 + var seconds = Math.floor(time); - property variant printDuration: PrintInformation.currentPrintTime - property variant printMaterialLengths: PrintInformation.materialLengths - property variant printMaterialWeights: PrintInformation.materialWeights - property variant printMaterialCosts: PrintInformation.materialCosts - property variant printMaterialNames: PrintInformation.materialNames + var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2); + return finalTime; + } - color: UM.Theme.getColor("sidebar") - UM.I18nCatalog { id: catalog; name:"cura"} + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.AllButtons; - Timer { - id: tooltipDelayTimer - interval: 500 - repeat: false - property var item - property string text + onWheel: + { + wheel.accepted = true; + } + } - onTriggered: + SidebarHeader { + id: header + width: parent.width + visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + Rectangle { + id: headerSeparator + width: parent.width + visible: settingsModeSelection.visible && header.visible + height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 + color: UM.Theme.getColor("sidebar_lining") + anchors.top: header.bottom + anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 + } + + Label { + id: settingsModeLabel + text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.top: headerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + width: Math.floor(parent.width * 0.45) + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + visible: !monitoringPrint && !hideView + } + + Rectangle { + id: settingsModeSelection + color: "transparent" + width: Math.floor(parent.width * 0.55) + height: UM.Theme.getSize("sidebar_header_mode_toggle").height + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.top: + { + if (settingsModeLabel.contentWidth >= parent.width - width - UM.Theme.getSize("sidebar_margin").width * 2) { - base.showTooltip(base, {x: 0, y: item.y}, text); + return settingsModeLabel.bottom; + } + else + { + return headerSeparator.bottom; } } - - function showTooltip(item, position, text) - { - tooltip.text = text; - position = item.mapToItem(base, position.x - UM.Theme.getSize("default_arrow").width, position.y); - tooltip.show(position); - } - - function hideTooltip() - { - tooltip.hide(); - } - - function strPadLeft(string, pad, length) { - return (new Array(length + 1).join(pad) + string).slice(-length); - } - - function getPrettyTime(time) - { - var hours = Math.floor(time / 3600) - time -= hours * 3600 - var minutes = Math.floor(time / 60); - time -= minutes * 60 - var seconds = Math.floor(time); - - var finalTime = strPadLeft(hours, "0", 2) + ':' + strPadLeft(minutes,'0',2)+ ':' + strPadLeft(seconds,'0',2); - return finalTime; - } - - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.AllButtons; - - onWheel: - { - wheel.accepted = true; - } - } - - SidebarHeader { - id: header - width: parent.width - visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariantst - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - Rectangle { - id: headerSeparator - width: parent.width - visible: settingsModeSelection.visible && header.visible - height: visible ? UM.Theme.getSize("sidebar_lining").height : 0 - color: UM.Theme.getColor("sidebar_lining") - anchors.top: header.bottom - anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 - } - - Label { - id: settingsModeLabel - text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width - anchors.top: headerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - width: Math.floor(parent.width * 0.45) - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - visible: !monitoringPrint && !hideView - } - - Rectangle { - id: settingsModeSelection - color: "transparent" - width: Math.floor(parent.width * 0.55) - height: UM.Theme.getSize("sidebar_header_mode_toggle").height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - anchors.top: - { - if (settingsModeLabel.contentWidth >= parent.width - width - UM.Theme.getSize("sidebar_margin").width * 2) - { - return settingsModeLabel.bottom; - } - else - { - return headerSeparator.bottom; - } - } - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - visible: !monitoringPrint && !hideSettings && !hideView - Component{ - id: wizardDelegate - Button { - height: settingsModeSelection.height - anchors.left: parent.left - anchors.leftMargin: model.index * Math.floor(settingsModeSelection.width / 2) - anchors.verticalCenter: parent.verticalCenter - width: Math.floor(0.5 * parent.width) - text: model.text - exclusiveGroup: modeMenuGroup; - checkable: true; - checked: base.currentModeIndex == index - onClicked: base.currentModeIndex = index - - onHoveredChanged: { - if (hovered) - { - tooltipDelayTimer.item = settingsModeSelection - tooltipDelayTimer.text = model.tooltipText - tooltipDelayTimer.start(); - } - else - { - tooltipDelayTimer.stop(); - base.hideTooltip(); - } - } - - style: ButtonStyle { - background: Rectangle { - border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : - UM.Theme.getColor("action_button_border") - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : - UM.Theme.getColor("action_button") - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") - font: UM.Theme.getFont("default") - text: control.text - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideMiddle - } - } - label: Item { } - } - } - } - ExclusiveGroup { id: modeMenuGroup; } - - ListView - { - id: modesList - property var index: 0 - model: modesListModel - delegate: wizardDelegate - anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + visible: !monitoringPrint && !hideSettings && !hideView + Component{ + id: wizardDelegate + Button { + height: settingsModeSelection.height anchors.left: parent.left - width: parent.width - } - } + anchors.leftMargin: model.index * Math.floor(settingsModeSelection.width / 2) + anchors.verticalCenter: parent.verticalCenter + width: Math.floor(0.5 * parent.width) + text: model.text + exclusiveGroup: modeMenuGroup; + checkable: true; + checked: base.currentModeIndex == index + onClicked: base.currentModeIndex = index - StackView - { - id: sidebarContents - - anchors.bottom: footerSeparator.top - anchors.top: settingsModeSelection.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.left: base.left - anchors.right: base.right - visible: !monitoringPrint && !hideSettings - - delegate: StackViewDelegate - { - function transitionFinished(properties) - { - properties.exitItem.opacity = 1 - } - - pushTransition: StackViewTransition - { - PropertyAnimation + onHoveredChanged: { + if (hovered) { - target: enterItem - property: "opacity" - from: 0 - to: 1 - duration: 100 - } - PropertyAnimation - { - target: exitItem - property: "opacity" - from: 1 - to: 0 - duration: 100 - } - } - } - } - - Loader - { - id: controlItem - anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom - anchors.left: base.left - anchors.right: base.right - sourceComponent: - { - if(monitoringPrint && connectedPrinter != null) - { - if(connectedPrinter.controlItem != null) - { - return connectedPrinter.controlItem - } - } - return null - } - } - - Loader - { - anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom - anchors.left: base.left - anchors.right: base.right - source: - { - if(controlItem.sourceComponent == null) - { - if(monitoringPrint) - { - return "PrintMonitor.qml" - } else - { - return "SidebarContents.qml" - } - } - else - { - return "" - } - } - } - - Rectangle - { - id: footerSeparator - width: parent.width - height: UM.Theme.getSize("sidebar_lining").height - color: UM.Theme.getColor("sidebar_lining") - anchors.bottom: printSpecs.top - anchors.bottomMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2 + UM.Theme.getSize("progressbar").height + UM.Theme.getFont("default_bold").pixelSize) - } - - Item - { - id: printSpecs - anchors.left: parent.left - anchors.bottom: parent.bottom - anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width - anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height - height: timeDetails.height + costSpec.height - width: base.width - (saveButton.buttonRowWidth + UM.Theme.getSize("sidebar_margin").width) - visible: !monitoringPrint - clip: true - - Label - { - id: timeDetails - anchors.left: parent.left - anchors.bottom: costSpec.top - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text_subtext") - text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label Hours and minutes", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) - - MouseArea - { - id: timeDetailsMouseArea - anchors.fill: parent - hoverEnabled: true - - onEntered: - { - if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) - { - // All the time information for the different features is achieved - var print_time = PrintInformation.getFeaturePrintTimes(); - var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) - - // A message is created and displayed when the user hover the time label - var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); - for(var feature in print_time) - { - if(!print_time[feature].isTotalDurationZero) - { - tooltip_html += "" + - "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + - "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + - ""; - } - } - tooltip_html += "
    " + feature + ":  %1  %1%
    "; - - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), tooltip_html); - } - } - onExited: - { - base.hideTooltip(); - } - } - } - - Label - { - function formatRow(items) - { - var row_html = ""; - for(var item = 0; item < items.length; item++) - { - if (item == 0) - { - row_html += "%1".arg(items[item]); - } - else - { - row_html += "  %1".arg(items[item]); - } - } - row_html += ""; - return row_html; - } - - function getSpecsData() - { - var lengths = []; - var total_length = 0; - var weights = []; - var total_weight = 0; - var costs = []; - var total_cost = 0; - var some_costs_known = false; - var names = []; - if(base.printMaterialLengths) - { - for(var index = 0; index < base.printMaterialLengths.length; index++) - { - if(base.printMaterialLengths[index] > 0) - { - names.push(base.printMaterialNames[index]); - lengths.push(base.printMaterialLengths[index].toFixed(2)); - weights.push(String(Math.floor(base.printMaterialWeights[index]))); - var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); - costs.push(cost); - if(cost > 0) - { - some_costs_known = true; - } - - total_length += base.printMaterialLengths[index]; - total_weight += base.printMaterialWeights[index]; - total_cost += base.printMaterialCosts[index]; - } - } - } - if(lengths.length == 0) - { - lengths = ["0.00"]; - weights = ["0"]; - costs = ["0.00"]; - } - - var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); - for(var index = 0; index < lengths.length; index++) - { - tooltip_html += formatRow([ - "%1:".arg(names[index]), - catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), - catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), - ]); - } - if(lengths.length > 1) - { - tooltip_html += formatRow([ - catalog.i18nc("@label", "Total:"), - catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), - catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), - "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), - ]); - } - tooltip_html += "
    "; - tooltipText = tooltip_html; - - return tooltipText - } - - id: costSpec - anchors.left: parent.left - anchors.bottom: parent.bottom - font: UM.Theme.getFont("very_small") - color: UM.Theme.getColor("text_subtext") - elide: Text.ElideMiddle - width: parent.width - property string tooltipText - text: - { - var lengths = []; - var weights = []; - var costs = []; - var someCostsKnown = false; - if(base.printMaterialLengths) { - for(var index = 0; index < base.printMaterialLengths.length; index++) - { - if(base.printMaterialLengths[index] > 0) - { - lengths.push(base.printMaterialLengths[index].toFixed(2)); - weights.push(String(Math.floor(base.printMaterialWeights[index]))); - var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); - costs.push(cost); - if(cost > 0) - { - someCostsKnown = true; - } - } - } - } - if(lengths.length == 0) - { - lengths = ["0.00"]; - weights = ["0"]; - costs = ["0.00"]; - } - if(someCostsKnown) - { - return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) - .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); + tooltipDelayTimer.item = settingsModeSelection + tooltipDelayTimer.text = model.tooltipText + tooltipDelayTimer.start(); } else { - return catalog.i18nc("@label Print estimates: m for meters, g for grams", "%1m / ~ %2g").arg(lengths.join(" + ")).arg(weights.join(" + ")); - } - } - MouseArea - { - id: costSpecMouseArea - anchors.fill: parent - hoverEnabled: true - - onEntered: - { - - if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) - { - var show_data = costSpec.getSpecsData() - - base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), show_data); - } - } - onExited: - { + tooltipDelayTimer.stop(); base.hideTooltip(); } } + + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_border") : + control.hovered ? UM.Theme.getColor("action_button_hovered_border") : + UM.Theme.getColor("action_button_border") + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active") : + control.hovered ? UM.Theme.getColor("action_button_hovered") : + UM.Theme.getColor("action_button") + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : + UM.Theme.getColor("action_button_text") + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } + } + label: Item { } + } } } + ExclusiveGroup { id: modeMenuGroup; } - // SaveButton and MonitorButton are actually the bottom footer panels. - // "!monitoringPrint" currently means "show-settings-mode" - SaveButton + ListView { - id: saveButton - implicitWidth: base.width - anchors.top: footerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.bottom: parent.bottom - visible: !monitoringPrint - } - - MonitorButton - { - id: monitorButton - implicitWidth: base.width - anchors.top: footerSeparator.bottom - anchors.topMargin: UM.Theme.getSize("sidebar_margin").height - anchors.bottom: parent.bottom - visible: monitoringPrint - } - - - SidebarTooltip - { - id: tooltip; - } - - // Setting mode: Recommended or Custom - ListModel - { - id: modesListModel; - } - - SidebarSimple - { - id: sidebarSimple; - visible: false; - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - SidebarAdvanced - { - id: sidebarAdvanced; - visible: false; - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - - Component.onCompleted: - { - modesListModel.append({ - text: catalog.i18nc("@title:tab", "Recommended"), - tooltipText: catalog.i18nc("@tooltip", "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality."), - item: sidebarSimple - }) - modesListModel.append({ - text: catalog.i18nc("@title:tab", "Custom"), - tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process."), - item: sidebarAdvanced - }) - sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true }); - - var index = Math.floor(UM.Preferences.getValue("cura/active_mode")) - if(index) - { - currentModeIndex = index; - } - } - - UM.SettingPropertyProvider - { - id: machineExtruderCount - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_extruder_count" - watchedProperties: [ "value" ] - storeIndex: 0 - } - - UM.SettingPropertyProvider - { - id: machineHeatedBed - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_heated_bed" - watchedProperties: [ "value" ] - storeIndex: 0 + id: modesList + property var index: 0 + model: modesListModel + delegate: wizardDelegate + anchors.top: parent.top + anchors.left: parent.left + width: parent.width } } + + StackView + { + id: sidebarContents + + anchors.bottom: footerSeparator.top + anchors.top: settingsModeSelection.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.left: base.left + anchors.right: base.right + visible: !monitoringPrint && !hideSettings + + delegate: StackViewDelegate + { + function transitionFinished(properties) + { + properties.exitItem.opacity = 1 + } + + pushTransition: StackViewTransition + { + PropertyAnimation + { + target: enterItem + property: "opacity" + from: 0 + to: 1 + duration: 100 + } + PropertyAnimation + { + target: exitItem + property: "opacity" + from: 1 + to: 0 + duration: 100 + } + } + } + } + + Loader + { + id: controlItem + anchors.bottom: footerSeparator.top + anchors.top: headerSeparator.bottom + anchors.left: base.left + anchors.right: base.right + sourceComponent: + { + if(monitoringPrint && connectedPrinter != null) + { + if(connectedPrinter.controlItem != null) + { + return connectedPrinter.controlItem + } + } + return null + } + } + + Loader + { + anchors.bottom: footerSeparator.top + anchors.top: headerSeparator.bottom + anchors.left: base.left + anchors.right: base.right + source: + { + if(controlItem.sourceComponent == null) + { + if(monitoringPrint) + { + return "PrintMonitor.qml" + } else + { + return "SidebarContents.qml" + } + } + else + { + return "" + } + } + } + + Rectangle + { + id: footerSeparator + width: parent.width + height: UM.Theme.getSize("sidebar_lining").height + color: UM.Theme.getColor("sidebar_lining") + anchors.bottom: printSpecs.top + anchors.bottomMargin: Math.floor(UM.Theme.getSize("sidebar_margin").height * 2 + UM.Theme.getSize("progressbar").height + UM.Theme.getFont("default_bold").pixelSize) + } + + Item + { + id: printSpecs + anchors.left: parent.left + anchors.bottom: parent.bottom + anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width + anchors.bottomMargin: UM.Theme.getSize("sidebar_margin").height + height: timeDetails.height + costSpec.height + width: base.width - (saveButton.buttonRowWidth + UM.Theme.getSize("sidebar_margin").width) + visible: !monitoringPrint + clip: true + + Label + { + id: timeDetails + anchors.left: parent.left + anchors.bottom: costSpec.top + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text_subtext") + text: (!base.printDuration || !base.printDuration.valid) ? catalog.i18nc("@label Hours and minutes", "00h 00min") : base.printDuration.getDisplayString(UM.DurationFormat.Short) + + MouseArea + { + id: timeDetailsMouseArea + anchors.fill: parent + hoverEnabled: true + + onEntered: + { + if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) + { + // All the time information for the different features is achieved + var print_time = PrintInformation.getFeaturePrintTimes(); + var total_seconds = parseInt(base.printDuration.getDisplayString(UM.DurationFormat.Seconds)) + + // A message is created and displayed when the user hover the time label + var tooltip_html = "%1
    ".arg(catalog.i18nc("@tooltip", "Time specification")); + for(var feature in print_time) + { + if(!print_time[feature].isTotalDurationZero) + { + tooltip_html += "" + + "".arg(print_time[feature].getDisplayString(UM.DurationFormat.ISO8601).slice(0,-3)) + + "".arg(Math.round(100 * parseInt(print_time[feature].getDisplayString(UM.DurationFormat.Seconds)) / total_seconds)) + + ""; + } + } + tooltip_html += "
    " + feature + ":  %1  %1%
    "; + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), tooltip_html); + } + } + onExited: + { + base.hideTooltip(); + } + } + } + + Label + { + function formatRow(items) + { + var row_html = ""; + for(var item = 0; item < items.length; item++) + { + if (item == 0) + { + row_html += "%1".arg(items[item]); + } + else + { + row_html += "  %1".arg(items[item]); + } + } + row_html += ""; + return row_html; + } + + function getSpecsData() + { + var lengths = []; + var total_length = 0; + var weights = []; + var total_weight = 0; + var costs = []; + var total_cost = 0; + var some_costs_known = false; + var names = []; + if(base.printMaterialLengths) + { + for(var index = 0; index < base.printMaterialLengths.length; index++) + { + if(base.printMaterialLengths[index] > 0) + { + names.push(base.printMaterialNames[index]); + lengths.push(base.printMaterialLengths[index].toFixed(2)); + weights.push(String(Math.floor(base.printMaterialWeights[index]))); + var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); + costs.push(cost); + if(cost > 0) + { + some_costs_known = true; + } + + total_length += base.printMaterialLengths[index]; + total_weight += base.printMaterialWeights[index]; + total_cost += base.printMaterialCosts[index]; + } + } + } + if(lengths.length == 0) + { + lengths = ["0.00"]; + weights = ["0"]; + costs = ["0.00"]; + } + + var tooltip_html = "%1
    ".arg(catalog.i18nc("@label", "Cost specification")); + for(var index = 0; index < lengths.length; index++) + { + tooltip_html += formatRow([ + "%1:".arg(names[index]), + catalog.i18nc("@label m for meter", "%1m").arg(lengths[index]), + catalog.i18nc("@label g for grams", "%1g").arg(weights[index]), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(costs[index]), + ]); + } + if(lengths.length > 1) + { + tooltip_html += formatRow([ + catalog.i18nc("@label", "Total:"), + catalog.i18nc("@label m for meter", "%1m").arg(total_length.toFixed(2)), + catalog.i18nc("@label g for grams", "%1g").arg(Math.round(total_weight)), + "%1 %2".arg(UM.Preferences.getValue("cura/currency")).arg(total_cost.toFixed(2)), + ]); + } + tooltip_html += "
    "; + tooltipText = tooltip_html; + + return tooltipText + } + + id: costSpec + anchors.left: parent.left + anchors.bottom: parent.bottom + font: UM.Theme.getFont("very_small") + color: UM.Theme.getColor("text_subtext") + elide: Text.ElideMiddle + width: parent.width + property string tooltipText + text: + { + var lengths = []; + var weights = []; + var costs = []; + var someCostsKnown = false; + if(base.printMaterialLengths) { + for(var index = 0; index < base.printMaterialLengths.length; index++) + { + if(base.printMaterialLengths[index] > 0) + { + lengths.push(base.printMaterialLengths[index].toFixed(2)); + weights.push(String(Math.floor(base.printMaterialWeights[index]))); + var cost = base.printMaterialCosts[index] == undefined ? 0 : base.printMaterialCosts[index].toFixed(2); + costs.push(cost); + if(cost > 0) + { + someCostsKnown = true; + } + } + } + } + if(lengths.length == 0) + { + lengths = ["0.00"]; + weights = ["0"]; + costs = ["0.00"]; + } + if(someCostsKnown) + { + return catalog.i18nc("@label Print estimates: m for meters, g for grams, %4 is currency and %3 is print cost", "%1m / ~ %2g / ~ %4 %3").arg(lengths.join(" + ")) + .arg(weights.join(" + ")).arg(costs.join(" + ")).arg(UM.Preferences.getValue("cura/currency")); + } + else + { + return catalog.i18nc("@label Print estimates: m for meters, g for grams", "%1m / ~ %2g").arg(lengths.join(" + ")).arg(weights.join(" + ")); + } + } + MouseArea + { + id: costSpecMouseArea + anchors.fill: parent + hoverEnabled: true + + onEntered: + { + + if(base.printDuration.valid && !base.printDuration.isTotalDurationZero) + { + var show_data = costSpec.getSpecsData() + + base.showTooltip(parent, Qt.point(-UM.Theme.getSize("sidebar_margin").width, 0), show_data); + } + } + onExited: + { + base.hideTooltip(); + } + } + } + } + + // SaveButton and MonitorButton are actually the bottom footer panels. + // "!monitoringPrint" currently means "show-settings-mode" + SaveButton + { + id: saveButton + implicitWidth: base.width + anchors.top: footerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + visible: !monitoringPrint + } + + MonitorButton + { + id: monitorButton + implicitWidth: base.width + anchors.top: footerSeparator.bottom + anchors.topMargin: UM.Theme.getSize("sidebar_margin").height + anchors.bottom: parent.bottom + visible: monitoringPrint + } + + SidebarTooltip + { + id: tooltip; + } + + // Setting mode: Recommended or Custom + ListModel + { + id: modesListModel; + } + + SidebarSimple + { + id: sidebarSimple; + visible: false; + + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + SidebarAdvanced + { + id: sidebarAdvanced; + visible: false; + + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() + } + + Component.onCompleted: + { + modesListModel.append({ + text: catalog.i18nc("@title:tab", "Recommended"), + tooltipText: catalog.i18nc("@tooltip", "Recommended Print Setup

    Print with the recommended settings for the selected printer, material and quality."), + item: sidebarSimple + }) + modesListModel.append({ + text: catalog.i18nc("@title:tab", "Custom"), + tooltipText: catalog.i18nc("@tooltip", "Custom Print Setup

    Print with finegrained control over every last bit of the slicing process."), + item: sidebarAdvanced + }) + sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "immediate": true }); + + var index = Math.floor(UM.Preferences.getValue("cura/active_mode")) + if(index) + { + currentModeIndex = index; + } + } + + UM.SettingPropertyProvider + { + id: machineExtruderCount + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: machineHeatedBed + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_heated_bed" + watchedProperties: [ "value" ] + storeIndex: 0 + } } diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index e923963355..4b182c7a72 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -403,8 +403,6 @@ Item } } - - // // Infill // @@ -568,18 +566,24 @@ Item model: infillModel anchors.fill: parent - property int activeIndex: { + function activeIndex () { for (var i = 0; i < infillModel.count; i++) { var density = parseInt(infillDensity.properties.value) var steps = parseInt(infillSteps.properties.value) var infillModelItem = infillModel.get(i) - if (density >= infillModelItem.percentageMin + // TODO: somehow this print causes this method not to crash QML when the sidebar view gets unloaded (when switching states) + // TODO: That should be fixed :P + print("test", density, steps, infillModelItem) + + if (infillModelItem + && density >= infillModelItem.percentageMin && density <= infillModelItem.percentageMax && steps >= infillModelItem.stepsMin - && steps <= infillModelItem.stepsMax){ - return i - } + && steps <= infillModelItem.stepsMax + ){ + return i + } } return -1 } @@ -587,7 +591,7 @@ Item Rectangle { anchors.fill: parent - visible: infillIconList.activeIndex == index + visible: infillIconList.activeIndex() == index border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("quality_slider_unavailable") From 9702ffb79432f0c7ed7242c9d59bee78c4bd2984 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 18:09:02 +0100 Subject: [PATCH 527/764] Small fixes to sidebar layout after refactoring --- resources/qml/Settings/SettingView.qml | 2 +- resources/qml/Sidebar.qml | 14 +++++++++++++- resources/qml/SidebarHeader.qml | 8 ++++---- resources/qml/SidebarSimple.qml | 6 +----- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 2079710315..1ebb5cc40e 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -24,7 +24,7 @@ Item { id: globalProfileRow height: UM.Theme.getSize("sidebar_setup").height -// visible: !sidebar.monitoringPrint && !sidebar.hideSettings + visible: !sidebar.monitoringPrint && !sidebar.hideSettings anchors { diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index a02454d298..6bc0903059 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -10,7 +10,6 @@ import UM 1.2 as UM import Cura 1.0 as Cura import "Menus" - Rectangle { id: base; @@ -92,6 +91,7 @@ Rectangle id: header width: parent.width visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants + onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() } @@ -106,6 +106,15 @@ Rectangle anchors.topMargin: visible ? UM.Theme.getSize("sidebar_margin").height : 0 } + onCurrentModeIndexChanged: + { + UM.Preferences.setValue("cura/active_mode", currentModeIndex); + if(modesListModel.count > base.currentModeIndex) + { + sidebarContents.push({ "item": modesListModel.get(base.currentModeIndex).item, "replace": true }); + } + } + Label { id: settingsModeLabel text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); @@ -540,6 +549,7 @@ Rectangle visible: monitoringPrint } + SidebarTooltip { id: tooltip; @@ -593,6 +603,7 @@ Rectangle UM.SettingPropertyProvider { id: machineExtruderCount + containerStackId: Cura.MachineManager.activeMachineId key: "machine_extruder_count" watchedProperties: [ "value" ] @@ -602,6 +613,7 @@ Rectangle UM.SettingPropertyProvider { id: machineHeatedBed + containerStackId: Cura.MachineManager.activeMachineId key: "machine_heated_bed" watchedProperties: [ "value" ] diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 0f0572a48a..3e1e85824a 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -40,7 +40,7 @@ Column id: extruderSelectionRow width: parent.width height: Math.floor(UM.Theme.getSize("sidebar_tabs").height * 2 / 3) - visible: machineExtruderCount.properties.value > 1 + visible: machineExtruderCount.properties.value > 1 && !sidebar.monitoringPrint anchors { @@ -229,7 +229,7 @@ Column { id: materialRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasMaterials + visible: Cura.MachineManager.hasMaterials && !sidebar.monitoringPrint && !sidebar.hideSettings anchors { @@ -279,7 +279,7 @@ Column { id: variantRow height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasVariants + visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings anchors { @@ -319,7 +319,7 @@ Column { id: materialInfoRow height: Math.floor(UM.Theme.getSize("sidebar_setup").height / 2) - visible: Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials + visible: (Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials) && !sidebar.monitoringPrint && !sidebar.hideSettings anchors { diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 4b182c7a72..62cf6f9d34 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -572,11 +572,7 @@ Item var steps = parseInt(infillSteps.properties.value) var infillModelItem = infillModel.get(i) - // TODO: somehow this print causes this method not to crash QML when the sidebar view gets unloaded (when switching states) - // TODO: That should be fixed :P - print("test", density, steps, infillModelItem) - - if (infillModelItem + if (infillModelItem != "undefined" && density >= infillModelItem.percentageMin && density <= infillModelItem.percentageMax && steps >= infillModelItem.stepsMin From 28c5debd61e664a03f72ac27b3f715ade8fcf0fc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 18:11:46 +0100 Subject: [PATCH 528/764] Fix hiding topbar buttons in monitor stage --- resources/qml/Topbar.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index d50cc64608..550b2dc007 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -220,7 +220,7 @@ Rectangle id: viewOrientationControl height: 30 spacing: 2 - visible: UM.Controller.activeStage.id != "MonitorStage" + visible: UM.Controller.activeStage.stageId != "MonitorStage" anchors { @@ -301,7 +301,7 @@ Rectangle } style: UM.Theme.styles.combobox - visible: UM.Controller.activeStage.id != "MonitorStage" + visible: UM.Controller.activeStage.stageId != "MonitorStage" model: UM.ViewModel { } textRole: "name" From 548761fcc35d6a68f94a5d0b817eacb8d8152e36 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 18:15:17 +0100 Subject: [PATCH 529/764] Some cleanup --- plugins/MonitorStage/MonitorStage.py | 37 +++++++++++++++++ resources/qml/Topbar.qml | 62 +--------------------------- 2 files changed, 38 insertions(+), 61 deletions(-) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 6131e5538b..dd1eca9682 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -19,3 +19,40 @@ class MonitorStage(CuraStage): sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") self.addDisplayComponent("sidebar", sidebar_component_path) self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) + +# property string iconSource: +# // { +# // if (!printerConnected) +# // { +# // return UM.Theme.getIcon("tab_status_unknown"); +# // } +# // else if (!printerAcceptsCommands) +# // { +# // return UM.Theme.getIcon("tab_status_unknown"); +# // } +# // +# // if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") +# // { +# // return UM.Theme.getIcon("tab_status_busy"); +# // } +# // +# // switch (Cura.MachineManager.printerOutputDevices[0].jobState) +# // { +# // case "printing": +# // case "pre_print": +# // case "pausing": +# // case "resuming": +# // return UM.Theme.getIcon("tab_status_busy"); +# // case "wait_cleanup": +# // return UM.Theme.getIcon("tab_status_finished"); +# // case "ready": +# // case "": +# // return UM.Theme.getIcon("tab_status_connected") +# // case "paused": +# // return UM.Theme.getIcon("tab_status_paused") +# // case "error": +# // return UM.Theme.getIcon("tab_status_stopped") +# // default: +# // return UM.Theme.getIcon("tab_status_unknown") +# // } +# // } \ No newline at end of file diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 550b2dc007..98f9f94528 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -16,7 +16,7 @@ Rectangle anchors.left: parent.left anchors.right: parent.right height: UM.Theme.getSize("sidebar_header").height - color: UM.Controller.activeStage.id == "MonitorStage" ? UM.Theme.getColor("topbar_background_color_monitoring") : UM.Theme.getColor("topbar_background_color") + color: UM.Controller.activeStage.stageId == "MonitorStage" ? UM.Theme.getColor("topbar_background_color_monitoring") : UM.Theme.getColor("topbar_background_color") property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands @@ -87,66 +87,6 @@ Rectangle } ExclusiveGroup { id: topbarMenuGroup } - -// Button -// { -// id: showMonitor -// width: UM.Theme.getSize("topbar_button").width -// height: UM.Theme.getSize("sidebar_header").height -// text: catalog.i18nc("@title:tab", "Monitor") -// checkable: true -// checked: isChecked() -// exclusiveGroup: sidebarHeaderBarGroup -// style: UM.Theme.styles.topbar_header_tab_no_overlay -// -// // We use a Qt.binding to re-bind the checkbox state after manually setting it -// // https://stackoverflow.com/questions/38798450/qt-5-7-qml-why-are-my-checkbox-property-bindings-disappearing -// onClicked: { -// base.startMonitoringPrint() -// checked = Qt.binding(isChecked) -// } -// -// function isChecked () { -// return base.monitoringPrint -// } -// -// property string iconSource: -// { -// if (!printerConnected) -// { -// return UM.Theme.getIcon("tab_status_unknown"); -// } -// else if (!printerAcceptsCommands) -// { -// return UM.Theme.getIcon("tab_status_unknown"); -// } -// -// if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") -// { -// return UM.Theme.getIcon("tab_status_busy"); -// } -// -// switch (Cura.MachineManager.printerOutputDevices[0].jobState) -// { -// case "printing": -// case "pre_print": -// case "pausing": -// case "resuming": -// return UM.Theme.getIcon("tab_status_busy"); -// case "wait_cleanup": -// return UM.Theme.getIcon("tab_status_finished"); -// case "ready": -// case "": -// return UM.Theme.getIcon("tab_status_connected") -// case "paused": -// return UM.Theme.getIcon("tab_status_paused") -// case "error": -// return UM.Theme.getIcon("tab_status_stopped") -// default: -// return UM.Theme.getIcon("tab_status_unknown") -// } -// } -// } } ToolButton From 9e3c681d669894c0742a72b00e183a014598428d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 6 Dec 2017 18:47:11 +0100 Subject: [PATCH 530/764] Fix top bar tab layout when it has an icon --- resources/qml/Topbar.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 98f9f94528..9ad91615ad 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -75,9 +75,8 @@ Rectangle checkable: true checked: model.active exclusiveGroup: topbarMenuGroup - style: UM.Theme.styles.topbar_header_tab + style: (model.stage.iconSource != "") ? UM.Theme.styles.topbar_header_tab_no_overlay : UM.Theme.styles.topbar_header_tab height: UM.Theme.getSize("sidebar_header").height - width: UM.Theme.getSize("topbar_button").width onClicked: UM.Controller.setActiveStage(model.id) iconSource: model.stage.iconSource From f6b570e299a70ee3f96f2798a8becf16b0901283 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 09:13:46 +0100 Subject: [PATCH 531/764] Back to QUrl, fix monitor view overlay --- plugins/MonitorStage/MonitorMainView.qml | 16 ++++++++++++++++ plugins/MonitorStage/MonitorStage.py | 22 +++++++++++++++++++--- resources/qml/Cura.qml | 13 +++++++------ 3 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 plugins/MonitorStage/MonitorMainView.qml diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml new file mode 100644 index 0000000000..b5008ba795 --- /dev/null +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -0,0 +1,16 @@ +// Copyright (c) 2017 Ultimaker B.V. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.3 as UM +import Cura 1.0 as Cura + +Loader +{ + property real maximumWidth: parent.width + property real maximumHeight: parent.height + + sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null + visible: sourceComponent != null +} diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index dd1eca9682..f577016b2e 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import os.path from UM.Application import Application +from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources from cura.Stages.CuraStage import CuraStage @@ -11,14 +12,29 @@ class MonitorStage(CuraStage): def __init__(self, parent = None): super().__init__(parent) - Application.getInstance().engineCreatedSignal.connect(self._engineCreated) + + # Wait until QML engine is created, otherwise creating the new QML components will fail + Application.getInstance().engineCreatedSignal.connect(self._setComponents) + # TODO: connect output device state to icon source - def _engineCreated(self): + def _setComponents(self): + self._setMainOverlay() + self._setSidebar() + self._setIconSource() + + def _setMainOverlay(self): + main_component_path = os.path.join(PluginRegistry.getInstance().getPluginPath("MonitorStage"), "MonitorMainView.qml") + self.addDisplayComponent("main", main_component_path) + + def _setSidebar(self): # Note: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") self.addDisplayComponent("sidebar", sidebar_component_path) - self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) + + def _setIconSource(self): + if Application.getInstance().getTheme() is not None: + self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) # property string iconSource: # // { diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 445325df90..3e21bf0468 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -393,12 +393,13 @@ UM.MainWindow right: sidebar.left } -// MouseArea -// { -// anchors.fill: parent -// acceptedButtons: Qt.AllButtons -// onWheel: wheel.accepted = true -// } + MouseArea + { + visible: UM.Controller.activeStage.mainComponent != "" + anchors.fill: parent + acceptedButtons: Qt.AllButtons + onWheel: wheel.accepted = true + } source: UM.Controller.activeStage.mainComponent asynchronous: true From dd92d8d5e093c225f4ccf86b8519551ff8fb548a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 09:22:02 +0100 Subject: [PATCH 532/764] Re-implement monitor view overlay when there is no monitor component --- plugins/MonitorStage/MonitorMainView.qml | 33 ++++++++++++++++++++---- plugins/MonitorStage/MonitorStage.py | 2 +- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index b5008ba795..038403e6d3 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -6,11 +6,34 @@ import QtQuick.Controls 1.1 import UM 1.3 as UM import Cura 1.0 as Cura -Loader +Item { - property real maximumWidth: parent.width - property real maximumHeight: parent.height + // We show a nice overlay on the 3D viewer when the current output device has no monitor view + Rectangle + { + id: viewportOverlay - sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null - visible: sourceComponent != null + color: UM.Theme.getColor("viewport_overlay") + width: parent.width + height: parent.height + visible: monitorViewComponent.sourceComponent == null ? 1 : 0 + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.AllButtons + onWheel: wheel.accepted = true + } + } + + Loader + { + id: monitorViewComponent + + property real maximumWidth: parent.width + property real maximumHeight: parent.height + + sourceComponent: Cura.MachineManager.printerOutputDevices.length > 0 ? Cura.MachineManager.printerOutputDevices[0].monitorItem: null + visible: sourceComponent != null + } } diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index f577016b2e..f19d1f895e 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -28,7 +28,7 @@ class MonitorStage(CuraStage): self.addDisplayComponent("main", main_component_path) def _setSidebar(self): - # Note: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! + # TODO: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") self.addDisplayComponent("sidebar", sidebar_component_path) From 9d2529c6d4f0ec06e11fcd533f80daf97c796155 Mon Sep 17 00:00:00 2001 From: gitname Date: Thu, 7 Dec 2017 00:54:20 -0800 Subject: [PATCH 533/764] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ba6a986093..90f17a5463 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Cura This is the new, shiny frontend for Cura. [daid/Cura](https://github.com/daid/Cura.git) is the old legacy Cura that everyone knows and loves/hates. -We re-worked the whole GUI code at Ultimaker, because the old code started to become a unmaintainable. +We re-worked the whole GUI code at Ultimaker, because the old code started to become unmaintainable. Logging Issues From a387c10686f347e4431e99977a887864550fa182 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 7 Dec 2017 09:59:00 +0100 Subject: [PATCH 534/764] Fix serialize hotend id in xml material. Contributes to issue CURA-4243. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 940f88773f..c4912826ee 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -238,7 +238,8 @@ class XmlMaterialProfile(InstanceContainer): if not variant_containers: continue - builder.start("hotend", {"id": variant_containers[0]["id"]}) + # The hotend identifier is not the containers name, but its "name". + builder.start("hotend", {"id": variant_containers[0]["name"]}) # Compatible is a special case, as it's added as a meta data entry (instead of an instance). compatible = hotend.getMetaDataEntry("compatible") @@ -897,4 +898,4 @@ def _fillMissingVariants(): Logger.log("w", "Could not find variant for variant-specific material {material_id}.".format(material_id = variant_metadata["id"])) continue variant_metadata["variant"] = variants[0]["id"] -ContainerRegistry.allMetadataLoaded.connect(_fillMissingVariants) \ No newline at end of file +ContainerRegistry.allMetadataLoaded.connect(_fillMissingVariants) From f91a4db6173bc3e264da53eb8368e78b01104975 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 10:38:06 +0100 Subject: [PATCH 535/764] Set stage icon for monitor depending on output device state, prevent crash when accessing back-end from unloaded component --- plugins/MonitorStage/MonitorStage.py | 75 ++++++++++++++-------------- resources/qml/Cura.qml | 2 - resources/qml/SaveButton.qml | 2 +- 3 files changed, 38 insertions(+), 41 deletions(-) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index f19d1f895e..0736f49858 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -16,7 +16,8 @@ class MonitorStage(CuraStage): # Wait until QML engine is created, otherwise creating the new QML components will fail Application.getInstance().engineCreatedSignal.connect(self._setComponents) - # TODO: connect output device state to icon source + # Update the status icon when the output device is changed + Application.getInstance().getOutputDeviceManager().activeDeviceChanged.connect(self._setIconSource) def _setComponents(self): self._setMainOverlay() @@ -34,41 +35,39 @@ class MonitorStage(CuraStage): def _setIconSource(self): if Application.getInstance().getTheme() is not None: - self.setIconSource(Application.getInstance().getTheme().getIcon("tab_status_connected")) + icon_name = self._getActiveOutputDeviceStatusIcon() + self.setIconSource(Application.getInstance().getTheme().getIcon(icon_name)) -# property string iconSource: -# // { -# // if (!printerConnected) -# // { -# // return UM.Theme.getIcon("tab_status_unknown"); -# // } -# // else if (!printerAcceptsCommands) -# // { -# // return UM.Theme.getIcon("tab_status_unknown"); -# // } -# // -# // if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") -# // { -# // return UM.Theme.getIcon("tab_status_busy"); -# // } -# // -# // switch (Cura.MachineManager.printerOutputDevices[0].jobState) -# // { -# // case "printing": -# // case "pre_print": -# // case "pausing": -# // case "resuming": -# // return UM.Theme.getIcon("tab_status_busy"); -# // case "wait_cleanup": -# // return UM.Theme.getIcon("tab_status_finished"); -# // case "ready": -# // case "": -# // return UM.Theme.getIcon("tab_status_connected") -# // case "paused": -# // return UM.Theme.getIcon("tab_status_paused") -# // case "error": -# // return UM.Theme.getIcon("tab_status_stopped") -# // default: -# // return UM.Theme.getIcon("tab_status_unknown") -# // } -# // } \ No newline at end of file + ## Find the correct status icon depending on the active output device state + def _getActiveOutputDeviceStatusIcon(self): + output_device = Application.getInstance().getOutputDeviceManager().getActiveDevice() + + if not output_device: + return "tab_status_unknown" + + if hasattr(output_device, "acceptsCommands") and not output_device.acceptsCommands: + return "tab_status_unknown" + + if not hasattr(output_device, "printerState") or not hasattr(output_device, "jobState"): + return "tab_status_unknown" + + # TODO: refactor to use enum instead of hardcoded strings? + if output_device.printerState == "maintenance": + return "tab_status_busy" + + if output_device.jobState in ["printing", "pre_print", "pausing", "resuming"]: + return "tab_status_busy" + + if output_device.jobState == "wait_cleanup": + return "tab_status_finished" + + if output_device.jobState in ["ready", ""]: + return "tab_status_connected" + + if output_device.jobState == "paused": + return "tab_status_paused" + + if output_device.jobState == "error": + return "tab_status_stopped" + + return "tab_status_unknown" diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 3e21bf0468..0bab1ee5d7 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -378,7 +378,6 @@ UM.MainWindow z: 1 source: UM.Controller.activeStage.sidebarComponent - asynchronous: true } Loader @@ -402,7 +401,6 @@ UM.MainWindow } source: UM.Controller.activeStage.mainComponent - asynchronous: true } UM.MessageStack diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index b258ecad43..390b868a9b 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -46,7 +46,7 @@ Item { } function sliceOrStopSlicing() { - if ([1, 5].indexOf(UM.Backend.state) != -1) { + if (backend != "undefined" && [1, 5].indexOf(UM.Backend.state) != -1) { backend.forceSlice(); } else { backend.stopSlicing(); From 79d5282b36da1c5ae8ebf2b8d92d5e4cd2789f10 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 7 Dec 2017 10:39:13 +0100 Subject: [PATCH 536/764] Added quality_changes to ContainerRegistry, rename saveStack to saveContainer. Contributes to issue CURA-4243. --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b02903dc98..692fb14af8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -172,6 +172,7 @@ class CuraApplication(QtApplication): Resources.addStorageType(self.ResourceTypes.DefinitionChangesContainer, "definition_changes") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer, "quality") + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer, "quality_changes") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer, "variant") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer, "material") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer, "user") @@ -468,7 +469,7 @@ class CuraApplication(QtApplication): ContainerRegistry.getInstance().saveDirtyContainers() def saveStack(self, stack): - ContainerRegistry.getInstance().saveStack(stack) + ContainerRegistry.getInstance().saveContainer(stack) @pyqtSlot(str, result = QUrl) def getDefaultPath(self, key): From 71ae78f7b6213884ba126d2d0168b95b1c8e8ee2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 10:45:54 +0100 Subject: [PATCH 537/764] Fix monitoring sidebar top margin --- resources/qml/Sidebar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 6bc0903059..8744b17906 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -282,7 +282,7 @@ Rectangle Loader { anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom + anchors.top: monitoringPrint ? base.top : headerSeparator.bottom anchors.left: base.left anchors.right: base.right source: From 7a6d75fd08cbae3c6e55ff09c1c3f4857c939033 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 11:02:52 +0100 Subject: [PATCH 538/764] Fix sidebar top margin for um3 network monitor controls --- resources/qml/Sidebar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 8744b17906..a459b481db 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -263,7 +263,7 @@ Rectangle { id: controlItem anchors.bottom: footerSeparator.top - anchors.top: headerSeparator.bottom + anchors.top: monitoringPrint ? base.top : headerSeparator.bottom anchors.left: base.left anchors.right: base.right sourceComponent: From faf77b27954491eac9f19122a33241528391c6e1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 11:50:01 +0100 Subject: [PATCH 539/764] Cleanup --- resources/qml/Topbar.qml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 9ad91615ad..99910b24a2 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -21,18 +21,6 @@ Rectangle property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - // update monitoring status when event was triggered outside topbar -// Component.onCompleted: { -// startMonitoringPrint.connect(function () { -// base.monitoringPrint = true -// UM.Controller.disableModelRendering() -// }) -// stopMonitoringPrint.connect(function () { -// base.monitoringPrint = false -// UM.Controller.enableModelRendering() -// }) -// } - UM.I18nCatalog { id: catalog From acbef72b68e041ff5502f961464e61116611b973 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 11:52:15 +0100 Subject: [PATCH 540/764] Cleanup --- resources/qml/Cura.qml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 0bab1ee5d7..f5fa922794 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -18,19 +18,6 @@ UM.MainWindow //: Cura application window title title: catalog.i18nc("@title:window","Ultimaker Cura"); viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) - property bool showPrintMonitor: false - - Connections - { - target: Printer - onShowPrintMonitor: { - if (show) { - topbar.startMonitoringPrint() - } else { - topbar.stopMonitoringPrint() - } - } - } Component.onCompleted: { From 9bf954643c2fc2b71f938980efb68350a2fbcd6e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 11:56:52 +0100 Subject: [PATCH 541/764] Use new method of setting active stage when needing to switch to monitor --- cura/CuraApplication.py | 1 - .../UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 2 +- plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py | 6 +++--- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c9466a0093..a5ae286b1e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -391,7 +391,6 @@ class CuraApplication(QtApplication): def needToShowUserAgreement(self): return self._need_to_show_user_agreement - def setNeedToShowUserAgreement(self, set_value = True): self._need_to_show_user_agreement = set_value diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 44a2e8b743..853ef72f72 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -698,7 +698,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte if self._reply: self._reply.abort() self._stage = OutputStage.ready - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") @pyqtSlot(int, result=str) def formatDuration(self, seconds): diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py index d8dd780ed5..3a48bab11b 100755 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py @@ -672,7 +672,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): Logger.log("d", "Attempting to perform an action without authentication for printer %s. Auth state is %s", self._key, self._authentication_state) return - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self._print_finished = True self.writeStarted.emit(self) self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") @@ -767,7 +767,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): if button == QMessageBox.Yes: self.startPrint() else: - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") # For some unknown reason Cura on OSX will hang if we do the call back code # immediately without first returning and leaving QML's event system. QTimer.singleShot(100, delayedCallback) @@ -850,7 +850,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice): self._write_finished = True # post_reply does not always exist, so make sure we unblock writing if self._post_reply: self._finalizePostReply() - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") ## Attempt to start a new print. # This function can fail to actually start a print due to not being authenticated or another print already diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 77f45ee6d4..1930f5402b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -490,7 +490,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.setJobName(file_name) self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self.startPrint() def _setEndstopState(self, endstop_key, value): @@ -698,7 +698,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._is_printing = False self._is_paused = False self._updateJobState("ready") - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") ## Check if the process did not encounter an error yet. def hasError(self): From c6e72abfbe8d8a8a58c7de67070402adb243f1f2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 7 Dec 2017 12:00:07 +0100 Subject: [PATCH 542/764] Add switch to monitor support for legacy plugin that emit signal to switch --- resources/qml/Cura.qml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index f5fa922794..aedf5d0fa8 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -18,6 +18,21 @@ UM.MainWindow //: Cura application window title title: catalog.i18nc("@title:window","Ultimaker Cura"); viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) + property bool showPrintMonitor: false + + // This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage + // It should be phased out in newer plugin versions. + Connections + { + target: Printer + onShowPrintMonitor: { + if (show) { + UM.Controller.setActiveStage("MonitorStage") + } else { + UM.Controller.setActiveStage("PrepareStage") + } + } + } Component.onCompleted: { From 21fffcc099f527d74f4290677a49deca6c6a861c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 8 Dec 2017 10:40:20 +0100 Subject: [PATCH 543/764] Compare linux distro names in lower cases --- cura_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index c6fcb5cf5b..7583dd054e 100755 --- a/cura_app.py +++ b/cura_app.py @@ -12,7 +12,8 @@ from UM.Platform import Platform #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 - if platform.linux_distribution()[0] in ("debian", "Ubuntu", "LinuxMint", "Fedora"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. + linux_distro_name = platform.linux_distribution()[0].lower() + if linux_distro_name in ("debian", "ubuntu", "linuxmint", "fedora"): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. import ctypes from ctypes.util import find_library libGL = find_library("GL") From b4e7216f5b4744bb36093df12c37b10d4f9a60a6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 8 Dec 2017 11:08:24 +0100 Subject: [PATCH 544/764] Always show extruder tabs in Machine Settings dialog CURA-4693 --- .../MachineSettingsAction/MachineSettingsAction.qml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index f50dd9d206..b36fb989f0 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -22,7 +22,7 @@ Cura.MachineAction onModelChanged: { var extruderCount = base.extrudersModel.rowCount(); - base.extruderTabsCount = extruderCount > 1 ? extruderCount : 0; + base.extruderTabsCount = extruderCount; } } @@ -241,7 +241,6 @@ Cura.MachineAction UM.TooltipArea { - visible: manager.definedExtruderCount > 1 height: childrenRect.height width: childrenRect.width text: machineExtruderCountProvider.properties.description @@ -291,15 +290,6 @@ Cura.MachineAction property var afterOnEditingFinished: manager.updateMaterialForDiameter property string label: catalog.i18nc("@label", "Material diameter") } - Loader - { - id: nozzleSizeField - visible: !Cura.MachineManager.hasVariants && machineExtruderCountProvider.properties.value == 1 - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_size" - property string label: catalog.i18nc("@label", "Nozzle size") - property string unit: catalog.i18nc("@label", "mm") - } } } From e621ace3e49b721cea9870fae67e5ff618779092 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 8 Dec 2017 12:42:19 +0100 Subject: [PATCH 545/764] Remove unnecessarily setting definition This definition is included in the metadata of container 2. Contributes to issue CURA-4243. --- plugins/GCodeWriter/GCodeWriter.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index c992a548de..f30e2dd43a 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -80,8 +80,6 @@ class GCodeWriter(MeshWriter): if instance_container1.getDefinition(): flat_container.setDefinition(instance_container1.getDefinition().getId()) - else: - flat_container.setDefinition(instance_container2.getDefinition().getId()) for key in instance_container2.getAllKeys(): flat_container.setProperty(key, "value", instance_container2.getProperty(key, "value")) From 8cd943949792152796859b55b84b56afeb2fc68f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 8 Dec 2017 14:33:21 +0100 Subject: [PATCH 546/764] ignore octoprint plugin --- .gitignore | 1 + resources/qml/MonitorButton.qml | 2 +- resources/qml/SaveButton.qml | 22 +++++++++++----------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 7284597fa9..8d9ba4b2d2 100644 --- a/.gitignore +++ b/.gitignore @@ -46,6 +46,7 @@ plugins/cura-siemensnx-plugin plugins/CuraVariSlicePlugin plugins/CuraLiveScriptingPlugin plugins/CuraPrintProfileCreator +plugins/OctoPrintPlugin #Build stuff CMakeCache.txt diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 29b00f50e6..87eceb69cd 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -18,7 +18,6 @@ Item property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0 - property int backendState: UM.Backend.state property bool showProgress: { // determine if we need to show the progress bar + percentage @@ -203,6 +202,7 @@ Item target: Printer onAdditionalComponentsChanged: { + print("areaId", areaId) if(areaId == "monitorButtons") { for (var component in CuraApplication.additionalComponents["monitorButtons"]) { CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 390b868a9b..25bc10d122 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -28,6 +28,10 @@ Item { return catalog.i18nc("@label:PrintjobStatus", "Please load a 3D model"); } + if (base.backendState == "undefined") { + return "" + } + switch(base.backendState) { case 1: @@ -81,7 +85,7 @@ Item { height: parent.height color: UM.Theme.getColor("progressbar_control") radius: UM.Theme.getSize("progressbar_radius").width - visible: base.backendState == 2 ? true : false + visible: (base.backendState != "undefined" && base.backendState == 2) ? true : false } } @@ -159,10 +163,8 @@ Item { tooltip: [1, 5].indexOf(UM.Backend.state) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing - enabled: (base.backendState == 1 || base.backendState == 2) && base.activity == true - visible: { - return !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true; - } + enabled: base.backendState != "undefined" && (base.backendState == 1 || base.backendState == 2) && base.activity == true + visible: base.backendState != "undefined" && !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true property bool autoSlice height: UM.Theme.getSize("save_button_save_to_button").height @@ -235,10 +237,8 @@ Item { tooltip: UM.OutputDeviceManager.activeDeviceDescription; // 3 = done, 5 = disabled - enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true - visible: { - return autoSlice || ((base.backendState == 3 || base.backendState == 5) && base.activity == true); - } + enabled: base.backendState != "undefined" && (base.backendState == 3 || base.backendState == 5) && base.activity == true + visible: base.backendState != "undefined" && autoSlice || ((base.backendState == 3 || base.backendState == 5) && base.activity == true) property bool autoSlice height: UM.Theme.getSize("save_button_save_to_button").height @@ -315,8 +315,8 @@ Item { width: UM.Theme.getSize("save_button_save_to_button").height height: UM.Theme.getSize("save_button_save_to_button").height // 3 = Done, 5 = Disabled - enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true - visible: (devicesModel.deviceCount > 1) && (base.backendState == 3 || base.backendState == 5) && base.activity == true + enabled: base.backendState != "undefined" && (base.backendState == 3 || base.backendState == 5) && base.activity == true + visible: base.backendState != "undefined" && (devicesModel.deviceCount > 1) && (base.backendState == 3 || base.backendState == 5) && base.activity == true style: ButtonStyle { From c4d7a33c31463c56ab0cf4247c1c3e51f4cbbb6b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 8 Dec 2017 14:56:03 +0100 Subject: [PATCH 547/764] Monitor view component loader should have width and height from parent --- plugins/MonitorStage/MonitorMainView.qml | 7 ++++++- resources/qml/MonitorButton.qml | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index 038403e6d3..15b05bed0a 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -8,6 +8,9 @@ import Cura 1.0 as Cura Item { + width: parent.width + height: parent.height + // We show a nice overlay on the 3D viewer when the current output device has no monitor view Rectangle { @@ -16,7 +19,6 @@ Item color: UM.Theme.getColor("viewport_overlay") width: parent.width height: parent.height - visible: monitorViewComponent.sourceComponent == null ? 1 : 0 MouseArea { @@ -30,6 +32,9 @@ Item { id: monitorViewComponent + width: parent.width + height: parent.height + property real maximumWidth: parent.width property real maximumHeight: parent.height diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 87eceb69cd..6454e32117 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -202,7 +202,6 @@ Item target: Printer onAdditionalComponentsChanged: { - print("areaId", areaId) if(areaId == "monitorButtons") { for (var component in CuraApplication.additionalComponents["monitorButtons"]) { CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow From 6d190479ac27fa9cc4aefeef1ad78d6b6d56583a Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 14:56:09 +0100 Subject: [PATCH 548/764] Getting logs earlier! Have currently the issue here, that when running Cura as a COM service, that the Cura.exe is popping up for (feels like) 1s or less and crashes. --- cura_app.py | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/cura_app.py b/cura_app.py index 7583dd054e..cae0821825 100755 --- a/cura_app.py +++ b/cura_app.py @@ -2,13 +2,28 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. + import os import sys +from UM.Platform import Platform + +def get_cura_dir_path(): + if Platform.isWindows(): + return os.path.expanduser("~/AppData/Local/cura/") + elif Platform.isLinux(): + return os.path.expanduser("~/.local/share/cura") + elif Platform.isOSX(): + return os.path.expanduser("~/Library/Logs/cura") + +if hasattr(sys, "frozen"): + dirpath = get_cura_dir_path() + os.makedirs(dirpath, exist_ok = True) + sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") + sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") + import platform import faulthandler -from UM.Platform import Platform - #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 @@ -47,7 +62,6 @@ def exceptHook(hook_type, value, traceback): _crash_handler = CrashHandler(hook_type, value, traceback) _crash_handler.show() - sys.excepthook = exceptHook # Workaround for a race condition on certain systems where there @@ -58,21 +72,6 @@ import Arcus #@UnusedImport import cura.CuraApplication import cura.Settings.CuraContainerRegistry -def get_cura_dir_path(): - if Platform.isWindows(): - return os.path.expanduser("~/AppData/Local/cura/") - elif Platform.isLinux(): - return os.path.expanduser("~/.local/share/cura") - elif Platform.isOSX(): - return os.path.expanduser("~/Library/Logs/cura") - - -if hasattr(sys, "frozen"): - dirpath = get_cura_dir_path() - os.makedirs(dirpath, exist_ok = True) - sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") - sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") - faulthandler.enable() # Force an instance of CuraContainerRegistry to be created and reused later. From e5096f731c06f94ba18fb336883d803471bf101c Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 14:58:24 +0100 Subject: [PATCH 549/764] cura_app: We store logs now at "Roaming" --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index cae0821825..fd36aa5a24 100755 --- a/cura_app.py +++ b/cura_app.py @@ -9,7 +9,7 @@ from UM.Platform import Platform def get_cura_dir_path(): if Platform.isWindows(): - return os.path.expanduser("~/AppData/Local/cura/") + return os.path.expanduser("~/AppData/Roaming/cura/") elif Platform.isLinux(): return os.path.expanduser("~/.local/share/cura") elif Platform.isOSX(): From 00a77da9d449244f62dc61a4f8a554893be17b3f Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 15:19:28 +0100 Subject: [PATCH 550/764] COM: Adding missing argument for DCOM --- cura/CuraApplication.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a5ae286b1e..e02c44d205 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -570,6 +570,7 @@ class CuraApplication(QtApplication): parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("--single-instance", action="store_true", default=False) parser.add_argument("--headless", action = "store_true", default=False) + parser.add_argument("-Embedding", action="store_true", default=False) # Commandline option set my DCOM (Windows Automation) # Set up a local socket server which listener which coordinates single instances Curas and accepts commands. def _setUpSingleInstanceServer(self): From 83d8c693bc0280019830f84d589872fbc32b866c Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 15:23:35 +0100 Subject: [PATCH 551/764] CuraApplication: Removing superflous check Imagine that there was no "single_instance" in parsed_command_line, then the second half of the if-clause would automatically crash. Also we defined single_instance to be False, whenever not set. Therefore it is always there. Also since no issues ever happened here, let's remove this check. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e02c44d205..45ed6b8260 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -630,7 +630,7 @@ class CuraApplication(QtApplication): CuraApplication.addCommandLineOptions(parser) parsed_command_line = vars(parser.parse_args()) - if "single_instance" in parsed_command_line and parsed_command_line["single_instance"]: + if parsed_command_line["single_instance"]: Logger.log("i", "Checking for the presence of an ready running Cura instance.") single_instance_socket = QLocalSocket() Logger.log("d", "preStartUp(): full server name: " + single_instance_socket.fullServerName()) From 11cf642a6e3c881a6a7918c6c8d5377c346403a6 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 15:43:28 +0100 Subject: [PATCH 552/764] COM: Prevent splash screen, when Embedding is set. So when dispatching our service we won't see any splash screen. Just like we want for headless applications. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 45ed6b8260..a6a54ad832 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -660,6 +660,8 @@ class CuraApplication(QtApplication): single_instance_socket.flush() single_instance_socket.waitForDisconnected() return False + if parsed_command_line["Embedding"]: + self._splash_prevent = True return True def run(self): From 2986a17c1d64ac25eef716a1ef83029559ef4825 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 8 Dec 2017 16:02:22 +0100 Subject: [PATCH 553/764] Fix for showing printer connect button on component load, use newer CuraApplication as target --- resources/qml/Cura.qml | 7 +++---- resources/qml/MonitorButton.qml | 19 ++++++++++++------- resources/qml/Preferences/MachinesPage.qml | 19 ++++++++++++------- resources/qml/SaveButton.qml | 19 ++++++++++++------- resources/qml/Sidebar.qml | 1 - 5 files changed, 39 insertions(+), 26 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index aedf5d0fa8..5530468c4c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -24,7 +24,7 @@ UM.MainWindow // It should be phased out in newer plugin versions. Connections { - target: Printer + target: CuraApplication onShowPrintMonitor: { if (show) { UM.Controller.setActiveStage("MonitorStage") @@ -377,7 +377,6 @@ UM.MainWindow } width: UM.Theme.getSize("sidebar").width - z: 1 source: UM.Controller.activeStage.sidebarComponent } @@ -819,7 +818,7 @@ UM.MainWindow Connections { - target: Printer + target: CuraApplication onShowMessageBox: { messageDialog.title = title @@ -865,7 +864,7 @@ UM.MainWindow Connections { - target: Printer + target: CuraApplication onRequestAddPrinter: { addMachineDialog.visible = true diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 6454e32117..9305e2261a 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -198,14 +198,19 @@ Item spacing: UM.Theme.getSize("default_margin").width } + Component.onCompleted: { + updateAdditionalComponents("monitorButtons") + } + Connections { - target: Printer - onAdditionalComponentsChanged: - { - if(areaId == "monitorButtons") { - for (var component in CuraApplication.additionalComponents["monitorButtons"]) { - CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow - } + target: CuraApplication + onAdditionalComponentsChanged: updateAdditionalComponents + } + + function updateAdditionalComponents (areaId) { + if(areaId == "monitorButtons") { + for (var component in CuraApplication.additionalComponents["monitorButtons"]) { + CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow } } } diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index dc978c0f7a..a8e25155e1 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -222,14 +222,19 @@ UM.ManagementPage } } + Component.onCompleted: { + addAdditionalComponents("machinesDetailPane") + } + Connections { - target: Printer - onAdditionalComponentsChanged: - { - if(areaId == "machinesDetailPane") { - for (var component in CuraApplication.additionalComponents["machinesDetailPane"]) { - CuraApplication.additionalComponents["machinesDetailPane"][component].parent = additionalComponentsColumn - } + target: CuraApplication + onAdditionalComponentsChanged: addAdditionalComponents + } + + function addAdditionalComponents (areaId) { + if(areaId == "machinesDetailPane") { + for (var component in CuraApplication.additionalComponents["machinesDetailPane"]) { + CuraApplication.additionalComponents["machinesDetailPane"][component].parent = additionalComponentsColumn } } } diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 25bc10d122..c83e344876 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -135,14 +135,19 @@ Item { spacing: UM.Theme.getSize("default_margin").width } + Component.onCompleted: { + addAdditionalComponents("saveButton") + } + Connections { - target: Printer - onAdditionalComponentsChanged: - { - if(areaId == "saveButton") { - for (var component in CuraApplication.additionalComponents["saveButton"]) { - CuraApplication.additionalComponents["saveButton"][component].parent = additionalComponentsRow - } + target: CuraApplication + onAdditionalComponentsChanged: addAdditionalComponents + } + + function addAdditionalComponents (areaId) { + if(areaId == "saveButton") { + for (var component in CuraApplication.additionalComponents["saveButton"]) { + CuraApplication.additionalComponents["saveButton"][component].parent = additionalComponentsRow } } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index a459b481db..ea66aca50f 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -549,7 +549,6 @@ Rectangle visible: monitoringPrint } - SidebarTooltip { id: tooltip; From b22981d08973e8d08c3ae3f0c5cbf1cf45ab2f26 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 16:12:56 +0100 Subject: [PATCH 554/764] It is cls not self! --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a6a54ad832..30ce730562 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -661,7 +661,7 @@ class CuraApplication(QtApplication): single_instance_socket.waitForDisconnected() return False if parsed_command_line["Embedding"]: - self._splash_prevent = True + cls._splash_prevent = True return True def run(self): From 430f3dad27b2ad6e5d1eeddd258c045ef585fa08 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 8 Dec 2017 16:57:48 +0100 Subject: [PATCH 555/764] Use GlobalContainerStack.definition instead of .getBottom If we know it's a CuraContainerStack we can use .definition safely. Contributes to issue CURA-4243. --- cura/Settings/ContainerManager.py | 4 ++-- cura/Settings/MachineManager.py | 30 +++++++++++++----------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 9108f563ab..bbabdadbde 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -324,8 +324,8 @@ class ContainerManager(QObject): ## Find instance containers matching certain criteria. # - # This effectively forwards to - # ContainerRegistry::findInstanceContainersMetadata. + # This effectively forwards to + # ContainerRegistry::findInstanceContainersMetadata. # # \param criteria A dict of key - value pairs to search for. # diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2e6fc8d07a..16d42ce653 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -171,7 +171,7 @@ class MachineManager(QObject): if not self._global_container_stack: return - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self._global_container_stack.getBottom().getId(), name = hotend_id) + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self._global_container_stack.definition.getId(), name = hotend_id) if containers: # New material ID is known extruder_manager = ExtruderManager.getInstance() machine_id = self.activeMachineId @@ -186,7 +186,7 @@ class MachineManager(QObject): self._auto_hotends_changed[str(index)] = containers[0]["id"] self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) else: - Logger.log("w", "No variant found for printer definition %s with id %s" % (self._global_container_stack.getBottom().getId(), hotend_id)) + Logger.log("w", "No variant found for printer definition %s with id %s" % (self._global_container_stack.definition.getId(), hotend_id)) def _onMaterialIdChanged(self, index: Union[str, int], material_id: str): if not self._global_container_stack: @@ -207,8 +207,8 @@ class MachineManager(QObject): if matching_extruder and matching_extruder.material.getMetaDataEntry("GUID") != material_id: # Save the material that needs to be changed. Multiple changes will be handled by the callback. - if self._global_container_stack.getBottom().getMetaDataEntry("has_variants") and matching_extruder.variant: - variant_id = self.getQualityVariantId(self._global_container_stack.getBottom(), matching_extruder.variant) + if self._global_container_stack.definition.getMetaDataEntry("has_variants") and matching_extruder.variant: + variant_id = self.getQualityVariantId(self._global_container_stack.definition, matching_extruder.variant) for container in containers: if container.get("variant") == variant_id: self._auto_materials_changed[str(index)] = container["id"] @@ -824,7 +824,7 @@ class MachineManager(QObject): preferred_material_name = None if old_material: preferred_material_name = old_material.getName() - preferred_material_id = self._updateMaterialContainer(self._global_container_stack.getBottom(), self._global_container_stack, containers[0], preferred_material_name).id + preferred_material_id = self._updateMaterialContainer(self._global_container_stack.definition, self._global_container_stack, containers[0], preferred_material_name).id self.setActiveMaterial(preferred_material_id) else: Logger.log("w", "While trying to set the active variant, no variant was found to replace.") @@ -941,7 +941,7 @@ class MachineManager(QObject): if not global_container_stack: return [] - global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + global_machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.definition) extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() # find qualities for extruders @@ -1093,18 +1093,14 @@ class MachineManager(QObject): @pyqtProperty(str, notify = globalContainerChanged) def activeDefinitionId(self) -> str: if self._global_container_stack: - definition = self._global_container_stack.getBottom() - if definition: - return definition.id + return self._global_container_stack.definition.id return "" @pyqtProperty(str, notify=globalContainerChanged) def activeDefinitionName(self) -> str: if self._global_container_stack: - definition = self._global_container_stack.getBottom() - if definition: - return definition.getName() + return self._global_container_stack.definition.getName() return "" @@ -1114,7 +1110,7 @@ class MachineManager(QObject): @pyqtProperty(str, notify = globalContainerChanged) def activeQualityDefinitionId(self) -> str: if self._global_container_stack: - return self.getQualityDefinitionId(self._global_container_stack.getBottom()) + return self.getQualityDefinitionId(self._global_container_stack.definition) return "" ## Get the Definition ID to use to select quality profiles for machines of the specified definition @@ -1132,7 +1128,7 @@ class MachineManager(QObject): if self._active_container_stack: variant = self._active_container_stack.variant if variant: - return self.getQualityVariantId(self._global_container_stack.getBottom(), variant) + return self.getQualityVariantId(self._global_container_stack.definition, variant) return "" ## Get the Variant ID to use to select quality profiles for variants of the specified definitions @@ -1156,7 +1152,7 @@ class MachineManager(QObject): def activeDefinitionVariantsName(self) -> str: fallback_title = catalog.i18nc("@label", "Nozzle") if self._global_container_stack: - return self._global_container_stack.getBottom().getMetaDataEntry("variants_name", fallback_title) + return self._global_container_stack.definition.getMetaDataEntry("variants_name", fallback_title) return fallback_title @@ -1165,7 +1161,7 @@ class MachineManager(QObject): container_registry = ContainerRegistry.getInstance() machine_stack = container_registry.findContainerStacks(id = machine_id) if machine_stack: - new_name = container_registry.createUniqueName("machine", machine_stack[0].getName(), new_name, machine_stack[0].getBottom().getName()) + new_name = container_registry.createUniqueName("machine", machine_stack[0].getName(), new_name, machine_stack[0].definition.getName()) machine_stack[0].setName(new_name) self.globalContainerChanged.emit() @@ -1223,7 +1219,7 @@ class MachineManager(QObject): def getDefinitionByMachineId(self, machine_id: str) -> str: containers = ContainerRegistry.getInstance().findContainerStacks(id = machine_id) if containers: - return containers[0].getBottom().getId() + return containers[0].definition.getId() @staticmethod def createMachineManager(): From abc2cdb7010bd06d3cbb46f89d7287b3d6d9c169 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 20:18:11 +0100 Subject: [PATCH 556/764] CuraApplication: Adding important note about the argparser --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 30ce730562..1c610eebb6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -628,6 +628,8 @@ class CuraApplication(QtApplication): # Peek the arguments and look for the 'single-instance' flag. parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) + # Important: It is important to keep this line here! + # In Uranium we allow to pass unknown arguments to the final executable or script. parsed_command_line = vars(parser.parse_args()) if parsed_command_line["single_instance"]: From 8c74092f48d3b9322dbca3b9abf1c7bdbaf816a2 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 20:18:38 +0100 Subject: [PATCH 557/764] CuraApplication: Getting argparser from Uranium --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1c610eebb6..f897c19f0b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -626,7 +626,7 @@ class CuraApplication(QtApplication): @classmethod def preStartUp(cls): # Peek the arguments and look for the 'single-instance' flag. - parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace + parser = cls.getCommandlineParser() CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. From 315efae53b68c9530bc2a2c15f46b876081cfd30 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 20:27:25 +0100 Subject: [PATCH 558/764] CuraApplication: Making use of Uranium commandline tools --- cura/CuraApplication.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f897c19f0b..5cced81260 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -628,11 +628,9 @@ class CuraApplication(QtApplication): # Peek the arguments and look for the 'single-instance' flag. parser = cls.getCommandlineParser() CuraApplication.addCommandLineOptions(parser) - # Important: It is important to keep this line here! - # In Uranium we allow to pass unknown arguments to the final executable or script. - parsed_command_line = vars(parser.parse_args()) + cls.parseCommandLine() - if parsed_command_line["single_instance"]: + if cls.getCommandLineOption("single_instance"): Logger.log("i", "Checking for the presence of an ready running Cura instance.") single_instance_socket = QLocalSocket() Logger.log("d", "preStartUp(): full server name: " + single_instance_socket.fullServerName()) @@ -651,8 +649,8 @@ class CuraApplication(QtApplication): payload = {"command": "focus"} single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII")) - if len(parsed_command_line["file"]) != 0: - for filename in parsed_command_line["file"]: + if len(cls.getCommandLineOption("file")) != 0: + for filename in cls.getCommandLineOption("file"): payload = {"command": "open", "filePath": filename} single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII")) @@ -662,7 +660,7 @@ class CuraApplication(QtApplication): single_instance_socket.flush() single_instance_socket.waitForDisconnected() return False - if parsed_command_line["Embedding"]: + if cls.getCommandLineOption("Embedding"): cls._splash_prevent = True return True From 0967651a491d644be9ad4b36051945f5dafa8032 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 20:28:46 +0100 Subject: [PATCH 559/764] CuraApplication: Adding last check for unknown arguments into _onEngineCreated So after everything is loaded, we can blame the user about wrong arguments. --- cura/CuraApplication.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5cced81260..2d6254cc2e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -385,6 +385,10 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") def _onEngineCreated(self): + # Last check for unknown commandline arguments + parser = self.getCommandlineParser() + parser.parse_args() + self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @pyqtProperty(bool) From 9210d38412598f413952614a45151f6ad7b95f74 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 21:31:41 +0100 Subject: [PATCH 560/764] Revert "CuraApplication: Getting argparser from Uranium" This reverts commit 8c74092f48d3b9322dbca3b9abf1c7bdbaf816a2. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2d6254cc2e..972074816b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -630,7 +630,7 @@ class CuraApplication(QtApplication): @classmethod def preStartUp(cls): # Peek the arguments and look for the 'single-instance' flag. - parser = cls.getCommandlineParser() + parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) cls.parseCommandLine() From 35ed042a72c5504a00973d10f47e904eb6163312 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 21:49:00 +0100 Subject: [PATCH 561/764] Revert "CuraApplication: Making use of Uranium commandline tools" This reverts commit 315efae53b68c9530bc2a2c15f46b876081cfd30. --- cura/CuraApplication.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 972074816b..4349ae792d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -632,9 +632,11 @@ class CuraApplication(QtApplication): # Peek the arguments and look for the 'single-instance' flag. parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) - cls.parseCommandLine() + # Important: It is important to keep this line here! + # In Uranium we allow to pass unknown arguments to the final executable or script. + parsed_command_line = vars(parser.parse_args()) - if cls.getCommandLineOption("single_instance"): + if parsed_command_line["single_instance"]: Logger.log("i", "Checking for the presence of an ready running Cura instance.") single_instance_socket = QLocalSocket() Logger.log("d", "preStartUp(): full server name: " + single_instance_socket.fullServerName()) @@ -653,8 +655,8 @@ class CuraApplication(QtApplication): payload = {"command": "focus"} single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII")) - if len(cls.getCommandLineOption("file")) != 0: - for filename in cls.getCommandLineOption("file"): + if len(parsed_command_line["file"]) != 0: + for filename in parsed_command_line["file"]: payload = {"command": "open", "filePath": filename} single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ASCII")) @@ -664,7 +666,7 @@ class CuraApplication(QtApplication): single_instance_socket.flush() single_instance_socket.waitForDisconnected() return False - if cls.getCommandLineOption("Embedding"): + if parsed_command_line["Embedding"]: cls._splash_prevent = True return True From 044c538887acad4b4b5dbae37c2747df36a87d54 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 22:09:49 +0100 Subject: [PATCH 562/764] CuraApplication: Allow unknown arguments --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4349ae792d..11ea6b3edb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -634,7 +634,7 @@ class CuraApplication(QtApplication): CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. - parsed_command_line = vars(parser.parse_args()) + parsed_command_line = vars(parser.known_args()[0]) if parsed_command_line["single_instance"]: Logger.log("i", "Checking for the presence of an ready running Cura instance.") From b098b167e51757294deddf3737bd1faf87a71caa Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Fri, 8 Dec 2017 22:31:04 +0100 Subject: [PATCH 563/764] Fixing name --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 11ea6b3edb..39da5868dd 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -634,7 +634,7 @@ class CuraApplication(QtApplication): CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. - parsed_command_line = vars(parser.known_args()[0]) + parsed_command_line = vars(parser.parse_known_args()[0]) if parsed_command_line["single_instance"]: Logger.log("i", "Checking for the presence of an ready running Cura instance.") From 1a9c15204122073691744a58964bc8ed21fe966c Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 00:08:13 +0100 Subject: [PATCH 564/764] CuraApplication: Don't parse -h or --help before last check --- cura/CuraApplication.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 39da5868dd..069b80101b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -386,7 +386,7 @@ class CuraApplication(QtApplication): def _onEngineCreated(self): # Last check for unknown commandline arguments - parser = self.getCommandlineParser() + parser = self.getCommandlineParser(with_help = True) parser.parse_args() self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -630,7 +630,8 @@ class CuraApplication(QtApplication): @classmethod def preStartUp(cls): # Peek the arguments and look for the 'single-instance' flag. - parser = argparse.ArgumentParser(prog="cura") # pylint: disable=bad-whitespace + parser = argparse.ArgumentParser(prog = "cura", + add_help = False) # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. From 61b6831e62598e8f91edd0365f8b373e2588422a Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 01:21:58 +0100 Subject: [PATCH 565/764] CuraApplication: Making it one line again Don't know why the pylint marker is here.. --- cura/CuraApplication.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 069b80101b..4af5e4f88a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -630,8 +630,7 @@ class CuraApplication(QtApplication): @classmethod def preStartUp(cls): # Peek the arguments and look for the 'single-instance' flag. - parser = argparse.ArgumentParser(prog = "cura", - add_help = False) # pylint: disable=bad-whitespace + parser = argparse.ArgumentParser(prog = "cura", add_help = False) # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. From ab6508657da4482c74d65b10f7e0b95fd05927d2 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 02:13:31 +0100 Subject: [PATCH 566/764] Creating an argparser early and add a "debug" option Makes sure we don't log anything at the moment, when debug is passed. Otherwise early errors are not displayed and passed to log files. --- cura/CuraApplication.py | 7 ++++--- cura_app.py | 39 +++++++++++++++++++++++++-------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4af5e4f88a..040f601cfe 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -628,13 +628,14 @@ class CuraApplication(QtApplication): # This should be called directly before creating an instance of CuraApplication. # \returns \type{bool} True if the whole Cura app should continue running. @classmethod - def preStartUp(cls): + def preStartUp(cls, parser = None, parsed_command_line = {}): # Peek the arguments and look for the 'single-instance' flag. - parser = argparse.ArgumentParser(prog = "cura", add_help = False) # pylint: disable=bad-whitespace + if not parser: + parser = argparse.ArgumentParser(prog = "cura", add_help = False) # pylint: disable=bad-whitespace CuraApplication.addCommandLineOptions(parser) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. - parsed_command_line = vars(parser.parse_known_args()[0]) + parsed_command_line.update(vars(parser.parse_known_args()[0])) if parsed_command_line["single_instance"]: Logger.log("i", "Checking for the presence of an ready running Cura instance.") diff --git a/cura_app.py b/cura_app.py index fd36aa5a24..c719fe3e10 100755 --- a/cura_app.py +++ b/cura_app.py @@ -3,23 +3,34 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import argparse import os import sys + from UM.Platform import Platform -def get_cura_dir_path(): - if Platform.isWindows(): - return os.path.expanduser("~/AppData/Roaming/cura/") - elif Platform.isLinux(): - return os.path.expanduser("~/.local/share/cura") - elif Platform.isOSX(): - return os.path.expanduser("~/Library/Logs/cura") +parser = argparse.ArgumentParser() +parser.add_argument('--debug', + action='store_true', + default = False + ) +known_args, unknown_args = parser.parse_known_args() +known_args = vars(known_args) -if hasattr(sys, "frozen"): - dirpath = get_cura_dir_path() - os.makedirs(dirpath, exist_ok = True) - sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") - sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") +if known_args["debug"]: + def get_cura_dir_path(): + if Platform.isWindows(): + return os.path.expanduser("~/AppData/Roaming/cura/") + elif Platform.isLinux(): + return os.path.expanduser("~/.local/share/cura") + elif Platform.isOSX(): + return os.path.expanduser("~/Library/Logs/cura") + + if hasattr(sys, "frozen"): + dirpath = get_cura_dir_path() + os.makedirs(dirpath, exist_ok = True) + sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") + sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") import platform import faulthandler @@ -78,8 +89,8 @@ faulthandler.enable() cura.Settings.CuraContainerRegistry.CuraContainerRegistry.getInstance() # This pre-start up check is needed to determine if we should start the application at all. -if not cura.CuraApplication.CuraApplication.preStartUp(): +if not cura.CuraApplication.CuraApplication.preStartUp(parser = parser, parsed_command_line = known_args): sys.exit(0) -app = cura.CuraApplication.CuraApplication.getInstance() +app = cura.CuraApplication.CuraApplication.getInstance(parser = parser, parsed_command_line = known_args) app.run() From bc7cb1491d735f48041384d7fc61f676477c65a2 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 02:13:47 +0100 Subject: [PATCH 567/764] Removing "Embedding" option again --- cura/CuraApplication.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 040f601cfe..a5d55773d7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -574,7 +574,6 @@ class CuraApplication(QtApplication): parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("--single-instance", action="store_true", default=False) parser.add_argument("--headless", action = "store_true", default=False) - parser.add_argument("-Embedding", action="store_true", default=False) # Commandline option set my DCOM (Windows Automation) # Set up a local socket server which listener which coordinates single instances Curas and accepts commands. def _setUpSingleInstanceServer(self): @@ -667,8 +666,6 @@ class CuraApplication(QtApplication): single_instance_socket.flush() single_instance_socket.waitForDisconnected() return False - if parsed_command_line["Embedding"]: - cls._splash_prevent = True return True def run(self): From 2614c8a623155ce3b257d22fc9d95d108b18a2d9 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 02:40:46 +0100 Subject: [PATCH 568/764] Don't hook to CrashHandler, if we are debugging Getting an early crash here. Hope that one helps. --- cura_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index c719fe3e10..a09b5b07dc 100755 --- a/cura_app.py +++ b/cura_app.py @@ -73,7 +73,8 @@ def exceptHook(hook_type, value, traceback): _crash_handler = CrashHandler(hook_type, value, traceback) _crash_handler.show() -sys.excepthook = exceptHook +if not known_args["debug"]: + sys.excepthook = exceptHook # Workaround for a race condition on certain systems where there # is a race condition between Arcus and PyQt. Importing Arcus From 63acaed0a5439d05c46c43b6f6db1ac105d1805a Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 02:52:51 +0100 Subject: [PATCH 569/764] Correcting if clause We don't want logs, when debugging. --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index a09b5b07dc..627583d384 100755 --- a/cura_app.py +++ b/cura_app.py @@ -17,7 +17,7 @@ parser.add_argument('--debug', known_args, unknown_args = parser.parse_known_args() known_args = vars(known_args) -if known_args["debug"]: +if not known_args["debug"]: def get_cura_dir_path(): if Platform.isWindows(): return os.path.expanduser("~/AppData/Roaming/cura/") From e578014a2eb6e82f5b9db0b0bb7c805c955b6ae9 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 11:25:01 +0100 Subject: [PATCH 570/764] Passing the already parsed args --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a5d55773d7..37e5e1f2da 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -569,8 +569,8 @@ class CuraApplication(QtApplication): self._plugins_loaded = True @classmethod - def addCommandLineOptions(self, parser): - super().addCommandLineOptions(parser) + def addCommandLineOptions(self, parser, parsed_command_line = {}): + super().addCommandLineOptions(parser, parsed_command_line = parsed_command_line) parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("--single-instance", action="store_true", default=False) parser.add_argument("--headless", action = "store_true", default=False) @@ -631,7 +631,7 @@ class CuraApplication(QtApplication): # Peek the arguments and look for the 'single-instance' flag. if not parser: parser = argparse.ArgumentParser(prog = "cura", add_help = False) # pylint: disable=bad-whitespace - CuraApplication.addCommandLineOptions(parser) + CuraApplication.addCommandLineOptions(parser, parsed_command_line = parsed_command_line) # Important: It is important to keep this line here! # In Uranium we allow to pass unknown arguments to the final executable or script. parsed_command_line.update(vars(parser.parse_known_args()[0])) From 74be22e68223e38dfdbda144d25ac69470f1704b Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 11:26:04 +0100 Subject: [PATCH 571/764] Adding the application name Maybe it is possible to set this value later. Eg. in Uranium, so we can get the name from .getApplicationName(). --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 627583d384..9167829754 100755 --- a/cura_app.py +++ b/cura_app.py @@ -9,7 +9,7 @@ import sys from UM.Platform import Platform -parser = argparse.ArgumentParser() +parser = argparse.ArgumentParser(prog = "cura") parser.add_argument('--debug', action='store_true', default = False From f9554475be1363d235b6a4c1e8d62b0b00179d64 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 11:47:23 +0100 Subject: [PATCH 572/764] CuraApplication: Allow getting kwargs and pass them to super().__init__() --- cura/CuraApplication.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 37e5e1f2da..72ba21edab 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -127,7 +127,7 @@ class CuraApplication(QtApplication): # Cura will always show the Add Machine Dialog upon start. stacksValidationFinished = pyqtSignal() # Emitted whenever a validation is finished - def __init__(self): + def __init__(self, **kwargs): # this list of dir names will be used by UM to detect an old cura directory for dir_name in ["extruders", "machine_instances", "materials", "plugins", "quality", "user", "variants"]: @@ -207,9 +207,12 @@ class CuraApplication(QtApplication): self._additional_components = {} # Components to add to certain areas in the interface - super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType, + super().__init__(name = "cura", + version = CuraVersion, + buildtype = CuraBuildType, is_debug_mode = CuraDebugMode, - tray_icon_name = "cura-icon-32.png") + tray_icon_name = "cura-icon-32.png" + **kwargs) self.default_theme = "cura-light" From 97196190d612699420f67a142bf33875adb2d854 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 12:04:53 +0100 Subject: [PATCH 573/764] cura_app: Adding help text for debug --- cura_app.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 9167829754..118ea97c30 100755 --- a/cura_app.py +++ b/cura_app.py @@ -12,7 +12,9 @@ from UM.Platform import Platform parser = argparse.ArgumentParser(prog = "cura") parser.add_argument('--debug', action='store_true', - default = False + default = False, + help="Turn on the debug mode by setting this option." + ) ) known_args, unknown_args = parser.parse_known_args() known_args = vars(known_args) From bae6f2cfb56bead58ea8c6117b0f9f42d3edea1b Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 12:43:41 +0100 Subject: [PATCH 574/764] Typo --- cura_app.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 118ea97c30..3e91235d96 100755 --- a/cura_app.py +++ b/cura_app.py @@ -15,7 +15,6 @@ parser.add_argument('--debug', default = False, help="Turn on the debug mode by setting this option." ) - ) known_args, unknown_args = parser.parse_known_args() known_args = vars(known_args) From 3e775f71fd17cabd11048acabaee720fe42997a5 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 13:00:41 +0100 Subject: [PATCH 575/764] Typo --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 72ba21edab..fb6c4b451b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -211,7 +211,7 @@ class CuraApplication(QtApplication): version = CuraVersion, buildtype = CuraBuildType, is_debug_mode = CuraDebugMode, - tray_icon_name = "cura-icon-32.png" + tray_icon_name = "cura-icon-32.png", **kwargs) self.default_theme = "cura-light" From c62b04089fd1fcafba002a4e18d650ea12754f53 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 15:43:05 +0100 Subject: [PATCH 576/764] Moving setActiveStage("PrepareStage") to initializeEngine() in UM --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index fb6c4b451b..f43c10ebe4 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -729,7 +729,6 @@ class CuraApplication(QtApplication): run_headless = self.getCommandLineOption("headless", False) if not run_headless: self.initializeEngine() - controller.setActiveStage("PrepareStage") if run_headless or self._engine.rootObjects: self.closeSplash() From 4b8d05092d4cb0eca43bbe9d9402e893f2e2f040 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 15:56:06 +0100 Subject: [PATCH 577/764] Adding preRun and move last commandline argument check to it. --- cura/CuraApplication.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f43c10ebe4..db03d7440a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -388,10 +388,6 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") def _onEngineCreated(self): - # Last check for unknown commandline arguments - parser = self.getCommandlineParser(with_help = True) - parser.parse_args() - self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @pyqtProperty(bool) @@ -671,7 +667,14 @@ class CuraApplication(QtApplication): return False return True + def preRun(self): + # Last check for unknown commandline arguments + parser = self.getCommandlineParser(with_help = True) + parser.parse_args() + def run(self): + self.preRun() + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) self._setUpSingleInstanceServer() From 37cf78487ef8a433239ff2ade03f9ea97ecbf2ea Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 15:56:52 +0100 Subject: [PATCH 578/764] headless+invidible: It is all about being hidden So don't show any gui. --- cura/CuraApplication.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index db03d7440a..f0bdcff3e3 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -729,11 +729,11 @@ class CuraApplication(QtApplication): self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - run_headless = self.getCommandLineOption("headless", False) - if not run_headless: + run_without_gui = self.getCommandLineOption("headless", False) or self.getCommandLineOption("headless", False) + if not run_without_gui: self.initializeEngine() - if run_headless or self._engine.rootObjects: + if run_without_gui or self._engine.rootObjects: self.closeSplash() for file_name in self.getCommandLineOption("file", []): From 904f7c53ccd9edf98c4a929c97a1a6e1599c904e Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 16:00:34 +0100 Subject: [PATCH 579/764] Code style --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 3e91235d96..af4e1f2a48 100755 --- a/cura_app.py +++ b/cura_app.py @@ -13,7 +13,7 @@ parser = argparse.ArgumentParser(prog = "cura") parser.add_argument('--debug', action='store_true', default = False, - help="Turn on the debug mode by setting this option." + help = "Turn on the debug mode by setting this option." ) known_args, unknown_args = parser.parse_known_args() known_args = vars(known_args) From 7e7303a7e3a37c71a94728c7dd7c5f27dd223d96 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 16:00:56 +0100 Subject: [PATCH 580/764] Code style --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f0bdcff3e3..03429fb690 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1431,7 +1431,8 @@ class CuraApplication(QtApplication): # If a model is to small then it will not contain any points if offset_shape_arr is None and hull_shape_arr is None: Message(self._i18n_catalog.i18nc("@info:status", "The selected model was too small to load."), - title=self._i18n_catalog.i18nc("@info:title", "Warning")).show() + title=self._i18n_catalog.i18nc("@info:title", "Warning") + ).show() return # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher From 8e89c1b36144d4861f58093de15b6f2a480964c8 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 17:40:06 +0100 Subject: [PATCH 581/764] No comment on this.. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 03429fb690..d6b8d416cd 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -729,7 +729,7 @@ class CuraApplication(QtApplication): self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - run_without_gui = self.getCommandLineOption("headless", False) or self.getCommandLineOption("headless", False) + run_without_gui = self.getCommandLineOption("headless", False) or self.getCommandLineOption("invisible", False) if not run_without_gui: self.initializeEngine() From bcc31fb19b378eb2f024ef194b4324a0a0d2baa3 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 22:26:52 +0100 Subject: [PATCH 582/764] Tell early parser not to add help --- cura_app.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index af4e1f2a48..56ae51aaa3 100755 --- a/cura_app.py +++ b/cura_app.py @@ -9,7 +9,8 @@ import sys from UM.Platform import Platform -parser = argparse.ArgumentParser(prog = "cura") +parser = argparse.ArgumentParser(prog = "cura", + add_help = False) parser.add_argument('--debug', action='store_true', default = False, From b4aed1da22de53306ef7fa812a3380503b2f18a7 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 22:27:15 +0100 Subject: [PATCH 583/764] Simplify getting known args --- cura_app.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura_app.py b/cura_app.py index 56ae51aaa3..b5844055ab 100755 --- a/cura_app.py +++ b/cura_app.py @@ -16,8 +16,7 @@ parser.add_argument('--debug', default = False, help = "Turn on the debug mode by setting this option." ) -known_args, unknown_args = parser.parse_known_args() -known_args = vars(known_args) +known_args = vars(parser.parse_known_args()[0]) if not known_args["debug"]: def get_cura_dir_path(): From f1d5bc38dcf07802827ca426cf05614239601a29 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sat, 9 Dec 2017 23:01:26 +0100 Subject: [PATCH 584/764] Adding help arguments manually .. and also print and exit as it normally does, when enabled. --- cura/CuraApplication.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index d6b8d416cd..7b067f452c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -669,8 +669,16 @@ class CuraApplication(QtApplication): def preRun(self): # Last check for unknown commandline arguments - parser = self.getCommandlineParser(with_help = True) - parser.parse_args() + parser = self.getCommandlineParser() + parser.add_argument("--help", "-h", + action='store_true', + default = False, + help = "Show this help message and exit." + ) + parsed_args = vars(parser.parse_args()) # This won't allow unknown arguments + if parsed_args["help"]: + parser.print_help() + sys.exit(0) def run(self): self.preRun() From 1cd107965c320a4d3f6cd88a960b0a7a5124b635 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sun, 10 Dec 2017 00:39:20 +0100 Subject: [PATCH 585/764] Close all windows, if there is no main window --- cura/CuraApplication.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7b067f452c..fc675e549b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -401,7 +401,11 @@ class CuraApplication(QtApplication): @pyqtSlot() def closeApplication(self): Logger.log("i", "Close application") - self._main_window.close() + main_window = self.getMainWindow() + if main_window is not None: + main_window.close() + else: + self.closeAllWindows() ## A reusable dialogbox # From 79cb1a1293f4e6874f596288e611e91d5814c153 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Sun, 10 Dec 2017 01:08:06 +0100 Subject: [PATCH 586/764] closeAllWindows seems to take no effect - use exit instead Looks like it does not work, because there was never a window or any other window on top of QApplication. .exit() should let us out of the main loop. --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index fc675e549b..abe1ddf374 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -405,7 +405,7 @@ class CuraApplication(QtApplication): if main_window is not None: main_window.close() else: - self.closeAllWindows() + self.exit(0) ## A reusable dialogbox # From 097cc72d89882b0bb05fb2627f91f5d36dbf7042 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 11 Dec 2017 09:44:56 +0100 Subject: [PATCH 587/764] Document why we're only returning full profiles It's a limitation of the quality manager that would require major refactoring there to fix. Contributes to issue CURA-4243. --- cura/Settings/ProfilesModel.py | 2 +- cura/Settings/QualityAndUserProfilesModel.py | 2 +- cura/Settings/UserProfilesModel.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index b32776f465..849d6959b9 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -87,7 +87,7 @@ class ProfilesModel(InstanceContainersModel): not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] result.append(not_supported_container) - return {item.getId():item for item in result}, {} + return {item.getId():item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index 8d47f1d4ab..bc81df976b 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -43,4 +43,4 @@ class QualityAndUserProfilesModel(ProfilesModel): result = filtered_quality_changes result.update({q.getId():q for q in quality_list}) - return result, {} + return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py index f69c0ff7d1..e093c6c132 100644 --- a/cura/Settings/UserProfilesModel.py +++ b/cura/Settings/UserProfilesModel.py @@ -52,7 +52,7 @@ class UserProfilesModel(ProfilesModel): (qc.getMetaDataEntry("extruder") == active_extruder.definition.getMetaDataEntry("quality_definition") or qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} - return filtered_quality_changes, {} + return filtered_quality_changes, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Called when a container changed on an extruder stack. # From a5cb4cd316fcea12af92762900d5942b9d2fbdb7 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 11 Dec 2017 10:53:48 +0100 Subject: [PATCH 588/764] Expand/Collapse sidebar CURA-4234 --- resources/qml/Actions.qml | 8 ++++ resources/qml/Cura.qml | 78 +++++++++++++++++++++++++++++++++++---- resources/qml/Sidebar.qml | 67 +++++++++++++++++++++++++++++++++ resources/qml/Topbar.qml | 64 -------------------------------- 4 files changed, 146 insertions(+), 71 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 054a6bed09..cf3581ca0c 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -18,6 +18,7 @@ Item property alias redo: redoAction; property alias homeCamera: homeCameraAction; + property alias expandSidebar: expandSidebarAction; property alias deleteSelection: deleteSelectionAction; property alias centerSelection: centerSelectionAction; @@ -389,4 +390,11 @@ Item text: catalog.i18nc("@action:menu", "Installed plugins..."); iconName: "plugins_configure" } + + Action + { + id: expandSidebarAction; + text: catalog.i18nc("@action:inmenu menubar:view","Expand/Collapse sidebar"); + shortcut: "Ctrl+E"; + } } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 5530468c4c..37607d237d 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -17,7 +17,7 @@ UM.MainWindow id: base //: Cura application window title title: catalog.i18nc("@title:window","Ultimaker Cura"); - viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) + //viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) property bool showPrintMonitor: false // This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage @@ -34,6 +34,24 @@ UM.MainWindow } } + onWidthChanged: + { + // If slidebar is collapsed then it should be invisible + // otherwise after the main_window resize the sidebar will be fully re-drawn + if (sidebar.collapsed){ + if (sidebar.visible == true){ + sidebar.visible = false + sidebar.initialWidth = 0 + } + } + else{ + if (sidebar.visible == false){ + sidebar.visible = true + sidebar.initialWidth = UM.Theme.getSize("sidebar").width + } + } + } + Component.onCompleted: { CuraApplication.setMinimumWindowSize(UM.Theme.getSize("window_minimum_size")) @@ -49,6 +67,15 @@ UM.MainWindow // This has been fixed for QtQuick Controls 2 since the Shortcut item has a context property. Cura.Actions.parent = backgroundItem CuraApplication.purgeWindows() + + + var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collaps") + + if (sidebarCollaps == true){ + sidebar.collapsed = true; + collapsSidebarAnimation.start(); + + } } Item @@ -369,16 +396,46 @@ UM.MainWindow { id: sidebar - anchors - { - top: topbar.bottom - bottom: parent.bottom - right: parent.right + property bool collapsed: false; + property var initialWidth: UM.Theme.getSize("sidebar").width; + + function callExpandOrCollapse(){ + if(collapsed){ + sidebar.visible = true + sidebar.initialWidth = UM.Theme.getSize("sidebar").width + expandSidebarAnimation.start(); + }else{ + collapsSidebarAnimation.start(); + } + collapsed = !collapsed; + UM.Preferences.setValue("general/sidebar_collaps", collapsed); } - width: UM.Theme.getSize("sidebar").width + anchors + { + top: topbar.top + bottom: parent.bottom + } + width: initialWidth + x: base.width - sidebar.width source: UM.Controller.activeStage.sidebarComponent + + NumberAnimation { + id: collapsSidebarAnimation + target: sidebar + properties: "x" + to: base.width + duration: 500 + } + + NumberAnimation { + id: expandSidebarAnimation + target: sidebar + properties: "x" + to: base.width - sidebar.width + duration: 500 + } } Loader @@ -417,6 +474,13 @@ UM.MainWindow } } + // Expand or collapse sidebar + Connections + { + target: Cura.Actions.expandSidebar + onTriggered: sidebar.callExpandOrCollapse() + } + UM.PreferencesDialog { id: preferences diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ea66aca50f..a45303aab8 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,10 +87,77 @@ Rectangle } } + ToolButton + { + id: machineSelection + text: Cura.MachineManager.activeMachineName + + width: base.width + height: UM.Theme.getSize("sidebar_header").height + tooltip: Cura.MachineManager.activeMachineName + + anchors.top: base.top + //anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + style: ButtonStyle + { + background: Rectangle + { + color: + { + if(control.pressed) + { + return UM.Theme.getColor("sidebar_header_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("sidebar_header_hover"); + } + else + { + return UM.Theme.getColor("sidebar_header_bar"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_emphasis") + source: UM.Theme.getIcon("arrow_bottom") + } + Label + { + id: sidebarComboBoxLabel + color: UM.Theme.getColor("sidebar_header_text_active") + text: control.text; + elide: Text.ElideRight; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 + anchors.right: downArrow.left; + anchors.rightMargin: control.rightMargin; + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large") + } + } + label: Label {} + } + + menu: PrinterMenu { } + } + SidebarHeader { id: header width: parent.width visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants + anchors.top: machineSelection.bottom onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 99910b24a2..865cd287c3 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -76,70 +76,6 @@ Rectangle ExclusiveGroup { id: topbarMenuGroup } } - ToolButton - { - id: machineSelection - text: Cura.MachineManager.activeMachineName - - width: UM.Theme.getSize("sidebar").width - height: UM.Theme.getSize("sidebar_header").height - tooltip: Cura.MachineManager.activeMachineName - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - style: ButtonStyle - { - background: Rectangle - { - color: - { - if(control.pressed) - { - return UM.Theme.getColor("sidebar_header_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("sidebar_header_hover"); - } - else - { - return UM.Theme.getColor("sidebar_header_bar"); - } - } - Behavior on color { ColorAnimation { duration: 50; } } - - UM.RecolorImage - { - id: downArrow - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_emphasis") - source: UM.Theme.getIcon("arrow_bottom") - } - Label - { - id: sidebarComboBoxLabel - color: UM.Theme.getColor("sidebar_header_text_active") - text: control.text; - elide: Text.ElideRight; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 - anchors.right: downArrow.left; - anchors.rightMargin: control.rightMargin; - anchors.verticalCenter: parent.verticalCenter; - font: UM.Theme.getFont("large") - } - } - label: Label {} - } - - menu: PrinterMenu { } - } // View orientation Item Row From c6cdc1d1dbb649b73e66d93fe8584cf57dfcb2cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 11 Dec 2017 14:33:59 +0100 Subject: [PATCH 589/764] Container cfg files need to be parsed without interpolation CURA-4701 --- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index bacd3f73d5..8c5a160ff4 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -179,7 +179,7 @@ class VersionUpgrade30to31(VersionUpgrade): if not os.path.isfile(file_path): continue - parser = configparser.ConfigParser() + parser = configparser.ConfigParser(interpolation = None) try: parser.read([file_path]) except: @@ -213,7 +213,7 @@ class VersionUpgrade30to31(VersionUpgrade): new_filename = machine_name + "_" + "fdmextruder" + suffix - extruder_quality_changes_parser = configparser.ConfigParser() + extruder_quality_changes_parser = configparser.ConfigParser(interpolation = None) extruder_quality_changes_parser.add_section("general") extruder_quality_changes_parser["general"]["version"] = str(2) extruder_quality_changes_parser["general"]["name"] = global_quality_changes["general"]["name"] From 300f29e11bf5cb80488ec1553a9ca325b039c0d7 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 11 Dec 2017 15:30:13 +0100 Subject: [PATCH 590/764] Add expand button to menu CURA-4234 --- resources/qml/Menus/ViewMenu.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index a610bb0009..c8243ad2ed 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -32,4 +32,5 @@ Menu MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; } + MenuItem { action: Cura.Actions.expandSidebar; } } From 00529f37d91bcd3e89d5c352e6b46721a17b179d Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 11 Dec 2017 18:51:53 +0100 Subject: [PATCH 591/764] After sidebar expanding the builplate stays in center of the screen CURA-4234 --- resources/qml/Cura.qml | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 37607d237d..62968d66f0 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -17,7 +17,7 @@ UM.MainWindow id: base //: Cura application window title title: catalog.i18nc("@title:window","Ultimaker Cura"); - //viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) + viewportRect: Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) property bool showPrintMonitor: false // This connection is here to support legacy printer output devices that use the showPrintMonitor signal on Application to switch to the monitor stage @@ -67,15 +67,6 @@ UM.MainWindow // This has been fixed for QtQuick Controls 2 since the Shortcut item has a context property. Cura.Actions.parent = backgroundItem CuraApplication.purgeWindows() - - - var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collaps") - - if (sidebarCollaps == true){ - sidebar.collapsed = true; - collapsSidebarAnimation.start(); - - } } Item @@ -403,8 +394,10 @@ UM.MainWindow if(collapsed){ sidebar.visible = true sidebar.initialWidth = UM.Theme.getSize("sidebar").width + viewportRect = Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) expandSidebarAnimation.start(); }else{ + viewportRect = Qt.rect(0, 0, 1, 1.0) collapsSidebarAnimation.start(); } collapsed = !collapsed; @@ -436,6 +429,17 @@ UM.MainWindow to: base.width - sidebar.width duration: 500 } + + Component.onCompleted: + { + var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collaps") + + if (sidebarCollaps == true){ + sidebar.collapsed = true; + viewportRect = Qt.rect(0, 0, 1, 1.0) + collapsSidebarAnimation.start(); + } + } } Loader From fb91edd7ebb9b47a45504cc74e1a293de1e403b2 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 12 Dec 2017 10:43:19 +0100 Subject: [PATCH 592/764] Solve arrange and multiply models issue CURA-4703 --- cura/ConvexHullDecorator.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index fc72ea34de..50fa8ce7f6 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -56,11 +56,6 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._node is None: return None - if getattr(self._node, "_non_printing_mesh", False): - # infill_mesh, cutting_mesh and anti_overhang_mesh do not need a convex hull - # node._non_printing_mesh is set in SettingOverrideDecorator - return None - hull = self._compute2DConvexHull() if self._global_stack and self._node: From 84aa9367c7576d3b7b1de5f0961a0204c182cf86 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 12 Dec 2017 10:54:54 +0100 Subject: [PATCH 593/764] Cleanup --- resources/qml/SaveButton.qml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index c83e344876..a8c330ada1 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -12,11 +12,10 @@ Item { id: base; UM.I18nCatalog { id: catalog; name:"cura"} - property real progress: UM.Backend.progress; - property int backendState: UM.Backend.state; - - property var backend: CuraApplication.getBackend(); - property bool activity: CuraApplication.platformActivity; + property real progress: UM.Backend.progress + property int backendState: UM.Backend.state + property var backend: CuraApplication.getBackend() + property bool activity: CuraApplication.platformActivity property alias buttonRowWidth: saveRow.width From ca413e049690772759b6e9432f7a9601717e045e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 12 Dec 2017 11:16:40 +0100 Subject: [PATCH 594/764] Add extra checks to ensure backend exists, use same state everywhere --- resources/qml/SaveButton.qml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index a8c330ada1..d53b43e459 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -49,10 +49,12 @@ Item { } function sliceOrStopSlicing() { - if (backend != "undefined" && [1, 5].indexOf(UM.Backend.state) != -1) { - backend.forceSlice(); - } else { - backend.stopSlicing(); + if (base.backendState != "undefined" && backend !== "undefined") { + if ([1, 5].indexOf(base.backendState) != -1) { + backend.forceSlice(); + } else { + backend.stopSlicing(); + } } } @@ -165,7 +167,7 @@ Item { Button { id: prepareButton - tooltip: [1, 5].indexOf(UM.Backend.state) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") + tooltip: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing enabled: base.backendState != "undefined" && (base.backendState == 1 || base.backendState == 2) && base.activity == true visible: base.backendState != "undefined" && !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true @@ -177,7 +179,7 @@ Item { anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width // 1 = not started, 5 = disabled - text: [1, 5].indexOf(UM.Backend.state) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") + text: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { sliceOrStopSlicing(); From 6968c089db1de2c01b97cd218e4f59a7a1d6ebe2 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 12 Dec 2017 11:26:17 +0100 Subject: [PATCH 595/764] Add sidebar_collapse to the saved preferences, typos, move back machine selection to the top bar CURA-4234 --- cura/CuraApplication.py | 2 ++ resources/qml/Actions.qml | 2 +- resources/qml/Cura.qml | 10 +++--- resources/qml/Sidebar.qml | 67 --------------------------------------- resources/qml/Topbar.qml | 64 +++++++++++++++++++++++++++++++++++++ 5 files changed, 72 insertions(+), 73 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a5ae286b1e..7925a63038 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -384,6 +384,8 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") + preferences.addPreference("general/sidebar_collapse", False) + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index cf3581ca0c..aa185f8615 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -394,7 +394,7 @@ Item Action { id: expandSidebarAction; - text: catalog.i18nc("@action:inmenu menubar:view","Expand/Collapse sidebar"); + text: catalog.i18nc("@action:inmenu menubar:view","Expand/Collapse Sidebar"); shortcut: "Ctrl+E"; } } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 62968d66f0..ccd89eb916 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -401,12 +401,12 @@ UM.MainWindow collapsSidebarAnimation.start(); } collapsed = !collapsed; - UM.Preferences.setValue("general/sidebar_collaps", collapsed); + UM.Preferences.setValue("general/sidebar_collapse", collapsed); } anchors { - top: topbar.top + top: topbar.bottom bottom: parent.bottom } @@ -419,7 +419,7 @@ UM.MainWindow target: sidebar properties: "x" to: base.width - duration: 500 + duration: 100 } NumberAnimation { @@ -427,12 +427,12 @@ UM.MainWindow target: sidebar properties: "x" to: base.width - sidebar.width - duration: 500 + duration: 100 } Component.onCompleted: { - var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collaps") + var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collapse") if (sidebarCollaps == true){ sidebar.collapsed = true; diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index a45303aab8..ea66aca50f 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,77 +87,10 @@ Rectangle } } - ToolButton - { - id: machineSelection - text: Cura.MachineManager.activeMachineName - - width: base.width - height: UM.Theme.getSize("sidebar_header").height - tooltip: Cura.MachineManager.activeMachineName - - anchors.top: base.top - //anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - style: ButtonStyle - { - background: Rectangle - { - color: - { - if(control.pressed) - { - return UM.Theme.getColor("sidebar_header_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("sidebar_header_hover"); - } - else - { - return UM.Theme.getColor("sidebar_header_bar"); - } - } - Behavior on color { ColorAnimation { duration: 50; } } - - UM.RecolorImage - { - id: downArrow - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_emphasis") - source: UM.Theme.getIcon("arrow_bottom") - } - Label - { - id: sidebarComboBoxLabel - color: UM.Theme.getColor("sidebar_header_text_active") - text: control.text; - elide: Text.ElideRight; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 - anchors.right: downArrow.left; - anchors.rightMargin: control.rightMargin; - anchors.verticalCenter: parent.verticalCenter; - font: UM.Theme.getFont("large") - } - } - label: Label {} - } - - menu: PrinterMenu { } - } - SidebarHeader { id: header width: parent.width visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants - anchors.top: machineSelection.bottom onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 865cd287c3..99910b24a2 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -76,6 +76,70 @@ Rectangle ExclusiveGroup { id: topbarMenuGroup } } + ToolButton + { + id: machineSelection + text: Cura.MachineManager.activeMachineName + + width: UM.Theme.getSize("sidebar").width + height: UM.Theme.getSize("sidebar_header").height + tooltip: Cura.MachineManager.activeMachineName + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + style: ButtonStyle + { + background: Rectangle + { + color: + { + if(control.pressed) + { + return UM.Theme.getColor("sidebar_header_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("sidebar_header_hover"); + } + else + { + return UM.Theme.getColor("sidebar_header_bar"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_emphasis") + source: UM.Theme.getIcon("arrow_bottom") + } + Label + { + id: sidebarComboBoxLabel + color: UM.Theme.getColor("sidebar_header_text_active") + text: control.text; + elide: Text.ElideRight; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 + anchors.right: downArrow.left; + anchors.rightMargin: control.rightMargin; + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large") + } + } + label: Label {} + } + + menu: PrinterMenu { } + } // View orientation Item Row From d70bd0ebc95818f0e4ad89676c762111b4a5e167 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 12 Dec 2017 13:45:35 +0100 Subject: [PATCH 596/764] CURA-4649 Blocking printers that have localhost IP address. --- .../UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py index 46538f1af9..0d3ed52f03 100644 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py @@ -43,6 +43,7 @@ class NetworkPrinterOutputDevicePlugin(QObject, OutputDevicePlugin): # List of old printer names. This is used to ensure that a refresh of zeroconf does not needlessly forces # authentication requests. self._old_printers = [] + self._excluded_addresses = ["127.0.0.1"] # Adding a list of not allowed IP addresses. At this moment, just localhost # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. self.addPrinterSignal.connect(self.addPrinter) @@ -300,6 +301,9 @@ class NetworkPrinterOutputDevicePlugin(QObject, OutputDevicePlugin): if type_of_device: if type_of_device == b"printer": address = '.'.join(map(lambda n: str(n), info.address)) + if address in self._excluded_addresses: + Logger.log("d", "The IP address %s of the printer \'%s\' is not correct. Trying to reconnect.", address, name) + return False # When getting the localhost IP, then try to reconnect self.addPrinterSignal.emit(str(name), address, info.properties) else: Logger.log("w", "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device ) From 3516d01f3d750a841e549def7787edc2348031e3 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 12 Dec 2017 15:30:19 +0100 Subject: [PATCH 597/764] Move back machine selection CURA-4234 --- cura/CuraApplication.py | 3 +- resources/qml/Cura.qml | 2 +- resources/qml/Sidebar.qml | 67 +++++++++++++++++++++++++++++++++++++++ resources/qml/Topbar.qml | 67 --------------------------------------- 4 files changed, 69 insertions(+), 70 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7925a63038..94afec7d5a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -312,6 +312,7 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/material_settings", "{}") preferences.addPreference("view/invert_zoom", False) + preferences.addPreference("general/sidebar_collapse", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") @@ -384,8 +385,6 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") - preferences.addPreference("general/sidebar_collapse", False) - def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index ccd89eb916..8cce20d19f 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -406,7 +406,7 @@ UM.MainWindow anchors { - top: topbar.bottom + top: topbar.top bottom: parent.bottom } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ea66aca50f..a45303aab8 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,10 +87,77 @@ Rectangle } } + ToolButton + { + id: machineSelection + text: Cura.MachineManager.activeMachineName + + width: base.width + height: UM.Theme.getSize("sidebar_header").height + tooltip: Cura.MachineManager.activeMachineName + + anchors.top: base.top + //anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + style: ButtonStyle + { + background: Rectangle + { + color: + { + if(control.pressed) + { + return UM.Theme.getColor("sidebar_header_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("sidebar_header_hover"); + } + else + { + return UM.Theme.getColor("sidebar_header_bar"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_emphasis") + source: UM.Theme.getIcon("arrow_bottom") + } + Label + { + id: sidebarComboBoxLabel + color: UM.Theme.getColor("sidebar_header_text_active") + text: control.text; + elide: Text.ElideRight; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 + anchors.right: downArrow.left; + anchors.rightMargin: control.rightMargin; + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large") + } + } + label: Label {} + } + + menu: PrinterMenu { } + } + SidebarHeader { id: header width: parent.width visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants + anchors.top: machineSelection.bottom onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 99910b24a2..796eb6fce5 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -46,8 +46,6 @@ Rectangle { anchors.left: logo.right anchors.leftMargin: UM.Theme.getSize("topbar_logo_right_margin").width - anchors.right: machineSelection.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width // The topbar is dynamically filled with all available stages @@ -76,71 +74,6 @@ Rectangle ExclusiveGroup { id: topbarMenuGroup } } - ToolButton - { - id: machineSelection - text: Cura.MachineManager.activeMachineName - - width: UM.Theme.getSize("sidebar").width - height: UM.Theme.getSize("sidebar_header").height - tooltip: Cura.MachineManager.activeMachineName - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - style: ButtonStyle - { - background: Rectangle - { - color: - { - if(control.pressed) - { - return UM.Theme.getColor("sidebar_header_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("sidebar_header_hover"); - } - else - { - return UM.Theme.getColor("sidebar_header_bar"); - } - } - Behavior on color { ColorAnimation { duration: 50; } } - - UM.RecolorImage - { - id: downArrow - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_emphasis") - source: UM.Theme.getIcon("arrow_bottom") - } - Label - { - id: sidebarComboBoxLabel - color: UM.Theme.getColor("sidebar_header_text_active") - text: control.text; - elide: Text.ElideRight; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 - anchors.right: downArrow.left; - anchors.rightMargin: control.rightMargin; - anchors.verticalCenter: parent.verticalCenter; - font: UM.Theme.getFont("large") - } - } - label: Label {} - } - - menu: PrinterMenu { } - } - // View orientation Item Row { From a85bea4baedff3659421bab50e96a592872fd8da Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 12 Dec 2017 16:37:21 +0100 Subject: [PATCH 598/764] CURA-4707 fix extruder setting not triggering reslice --- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index d35df967b2..b9e8a22614 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -86,6 +86,7 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + Application.getInstance().getExtruderManager().extrudersChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From e10ba065ca61a445dc39accb857e010fc785c410 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 12 Dec 2017 17:06:23 +0100 Subject: [PATCH 599/764] CURA-4707 better signal to connect solving this issue --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b9e8a22614..4581a78479 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -86,7 +86,7 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().extrudersChanged.connect(self._onGlobalStackChanged) + Application.getInstance().getExtruderManager().activeExtruderChanged.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From 3666b35ff3f0a8ddeb7b6b23f4814508a86493f9 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 13 Dec 2017 01:41:36 +0100 Subject: [PATCH 600/764] Fix winding order of 3D tubes Adding a copy of the first vertex causes the winding order to reverse. --- plugins/SimulationView/layers3d.shader | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 2633b54787..14a766f764 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -192,6 +192,7 @@ geometry41core = } else { // All normal lines are rendered as 3d tubes. myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); From 79d7de050e86128b6b140508eef79df66051f4d4 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 13 Dec 2017 01:42:24 +0100 Subject: [PATCH 601/764] Enable backface culling for layer view This effectively doubles the rendering performance of layer view. --- plugins/SimulationView/SimulationPass.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index 46fa7f1240..24bdedd368 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -92,7 +92,7 @@ class SimulationPass(RenderPass): self.bind() - tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) + tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -149,7 +149,7 @@ class SimulationPass(RenderPass): self._current_shader = self._layer_shader self._switching_layers = True - layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end)) + layers_batch = RenderBatch(self._current_shader, type = RenderBatch.RenderType.Solid, mode = RenderBatch.RenderMode.Lines, range = (start, end), backface_cull = True) layers_batch.addItem(node.getWorldTransformation(), layer_data) layers_batch.render(self._scene.getActiveCamera()) From e36099a3807f62ed1a811dd637a5313e149fa792 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 13 Dec 2017 01:44:05 +0100 Subject: [PATCH 602/764] Draw backside of travel lines inverted This adds a front-facing primitive towards the back side of every travel line, causing those lines to be visible from both sides regardless of backface culling. This doubles the number of vertices for travel moves, but due to backface culling it comes down to approximately the same performance as the original. --- plugins/SimulationView/layers3d.shader | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 14a766f764..cbd27a2660 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -187,6 +187,13 @@ geometry41core = myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); + //And reverse so that the line is also visible from the back side. + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); EndPrimitive(); } else { From e14d78b32abe62ea39543fd6af6c378fdd801ea5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 13 Dec 2017 10:16:06 +0100 Subject: [PATCH 603/764] Generate more possible machine IDs in XML material profile --- .../XmlMaterialProfile/XmlMaterialProfile.py | 350 ++++++++++-------- 1 file changed, 191 insertions(+), 159 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index c4912826ee..08530f96e2 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -212,11 +212,12 @@ class XmlMaterialProfile(InstanceContainer): for definition_id, container in machine_container_map.items(): definition = container.getDefinition() - try: - product = UM.Dictionary.findKey(product_id_map, definition_id) - except ValueError: - # An unknown product id; export it anyway - product = definition_id + + product = definition_id + for product_name, product_id_list in product_id_map.items(): + if definition_id in product_id_list: + product = product_name + break builder.start("machine") builder.start("machine_identifier", { @@ -530,106 +531,110 @@ class XmlMaterialProfile(InstanceContainer): identifiers = machine.iterfind("./um:machine_identifier", self.__namespaces) for identifier in identifiers: - machine_id = product_id_map.get(identifier.get("product"), None) - if machine_id is None: - # Lets try again with some naive heuristics. - machine_id = identifier.get("product").replace(" ", "").lower() + machine_id_list = product_id_map.get(identifier.get("product"), []) + if not machine_id_list: + machine_id_list.append(identifier.get("product").replace(" ", "").lower()) - definitions = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) - if not definitions: - Logger.log("w", "No definition found for machine ID %s", machine_id) - continue - - definition = definitions[0] - - machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - - if machine_compatibility: - new_material_id = self.getId() + "_" + machine_id - - # The child or derived material container may already exist. This can happen when a material in a - # project file and the a material in Cura have the same ID. - # In the case if a derived material already exists, override that material container because if - # the data in the parent material has been changed, the derived ones should be updated too. - if ContainerRegistry.getInstance().isLoaded(new_material_id): - new_material = ContainerRegistry.getInstance().findContainers(id = new_material_id)[0] - is_new_material = False - else: - new_material = XmlMaterialProfile(new_material_id) - is_new_material = True - - new_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_material.getMetaData()["id"] = new_material_id - new_material.getMetaData()["name"] = self.getName() - new_material.setDefinition(machine_id) - # Don't use setMetadata, as that overrides it for all materials with same base file - new_material.getMetaData()["compatible"] = machine_compatibility - new_material.getMetaData()["machine_manufacturer"] = machine_manufacturer - new_material.getMetaData()["definition"] = machine_id - - new_material.setCachedValues(cached_machine_setting_properties) - - new_material._dirty = False - - if is_new_material: - containers_to_add.append(new_material) - - hotends = machine.iterfind("./um:hotend", self.__namespaces) - for hotend in hotends: - hotend_id = hotend.get("id") - if hotend_id is None: + for machine_id in machine_id_list: + definitions = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) + if not definitions: + Logger.log("w", "No definition found for machine ID %s", machine_id) continue - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) - if not variant_containers: - # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition["id"], name = hotend_id) + definition = definitions[0] - if not variant_containers: - continue + machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - hotend_compatibility = machine_compatibility - hotend_setting_values = {} - settings = hotend.iterfind("./um:setting", self.__namespaces) - for entry in settings: - key = entry.get("key") - if key in self.__material_settings_setting_map: - hotend_setting_values[self.__material_settings_setting_map[key]] = entry.text - elif key in self.__unmapped_settings: - if key == "hardware compatible": - hotend_compatibility = self._parseCompatibleValue(entry.text) + if machine_compatibility: + new_material_id = self.getId() + "_" + machine_id + + # The child or derived material container may already exist. This can happen when a material in a + # project file and the a material in Cura have the same ID. + # In the case if a derived material already exists, override that material container because if + # the data in the parent material has been changed, the derived ones should be updated too. + if ContainerRegistry.getInstance().isLoaded(new_material_id): + new_material = ContainerRegistry.getInstance().findContainers(id = new_material_id)[0] + is_new_material = False else: - Logger.log("d", "Unsupported material setting %s", key) + new_material = XmlMaterialProfile(new_material_id) + is_new_material = True - new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + new_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_material.getMetaData()["id"] = new_material_id + new_material.getMetaData()["name"] = self.getName() + new_material.setDefinition(machine_id) + # Don't use setMetadata, as that overrides it for all materials with same base file + new_material.getMetaData()["compatible"] = machine_compatibility + new_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_material.getMetaData()["definition"] = machine_id - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - if ContainerRegistry.getInstance().isLoaded(new_hotend_id): - new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] - is_new_material = False - else: - new_hotend_material = XmlMaterialProfile(new_hotend_id) - is_new_material = True + new_material.setCachedValues(cached_machine_setting_properties) - new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_hotend_material.getMetaData()["id"] = new_hotend_id - new_hotend_material.getMetaData()["name"] = self.getName() - new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] - # Don't use setMetadata, as that overrides it for all materials with same base file - new_hotend_material.getMetaData()["compatible"] = hotend_compatibility - new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer - new_hotend_material.getMetaData()["definition"] = machine_id + new_material._dirty = False - cached_hotend_setting_properties = cached_machine_setting_properties.copy() - cached_hotend_setting_properties.update(hotend_setting_values) + if is_new_material: + containers_to_add.append(new_material) - new_hotend_material.setCachedValues(cached_hotend_setting_properties) + hotends = machine.iterfind("./um:hotend", self.__namespaces) + for hotend in hotends: + hotend_id = hotend.get("id") + if hotend_id is None: + continue - new_hotend_material._dirty = False + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition["id"], name = hotend_id) - if is_new_material: - containers_to_add.append(new_hotend_material) + if not variant_containers: + continue + + hotend_compatibility = machine_compatibility + hotend_setting_values = {} + settings = hotend.iterfind("./um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__material_settings_setting_map: + hotend_setting_values[self.__material_settings_setting_map[key]] = entry.text + elif key in self.__unmapped_settings: + if key == "hardware compatible": + hotend_compatibility = self._parseCompatibleValue(entry.text) + else: + Logger.log("d", "Unsupported material setting %s", key) + + new_hotend_id = self.getId() + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + if ContainerRegistry.getInstance().isLoaded(new_hotend_id): + new_hotend_material = ContainerRegistry.getInstance().findContainers(id = new_hotend_id)[0] + is_new_material = False + else: + new_hotend_material = XmlMaterialProfile(new_hotend_id) + is_new_material = True + + new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.getMetaData()["id"] = new_hotend_id + new_hotend_material.getMetaData()["name"] = self.getName() + new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] + # Don't use setMetadata, as that overrides it for all materials with same base file + new_hotend_material.getMetaData()["compatible"] = hotend_compatibility + new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer + new_hotend_material.getMetaData()["definition"] = machine_id + + cached_hotend_setting_properties = cached_machine_setting_properties.copy() + cached_hotend_setting_properties.update(hotend_setting_values) + + new_hotend_material.setCachedValues(cached_hotend_setting_properties) + + new_hotend_material._dirty = False + + if is_new_material: + containers_to_add.append(new_hotend_material) + + # there is only one ID for a machine. Once we have reached here, it means we have already found + # a workable ID for that machine, so there is no need to continue + break for container_to_add in containers_to_add: ContainerRegistry.getInstance().addContainer(container_to_add) @@ -720,79 +725,84 @@ class XmlMaterialProfile(InstanceContainer): machine_compatibility = cls._parseCompatibleValue(entry.text) for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces): - machine_id = product_id_map.get(identifier.get("product"), None) - if machine_id is None: - # Lets try again with some naive heuristics. - machine_id = identifier.get("product").replace(" ", "").lower() - definition_metadata = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) - if not definition_metadata: - Logger.log("w", "No definition found for machine ID %s", machine_id) - continue - definition_metadata = definition_metadata[0] + machine_id_list = product_id_map.get(identifier.get("product"), []) + if not machine_id_list: + machine_id_list.append(identifier.get("product").replace(" ", "").lower()) - machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - - if machine_compatibility: - new_material_id = container_id + "_" + machine_id - - # The child or derived material container may already exist. This can happen when a material in a - # project file and the a material in Cura have the same ID. - # In the case if a derived material already exists, override that material container because if - # the data in the parent material has been changed, the derived ones should be updated too. - found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_material_id) - if found_materials: - new_material_metadata = found_materials[0] - else: - new_material_metadata = {} - - new_material_metadata.update(base_metadata) - new_material_metadata["id"] = new_material_id - new_material_metadata["compatible"] = machine_compatibility - new_material_metadata["machine_manufacturer"] = machine_manufacturer - new_material_metadata["definition"] = machine_id - - if len(found_materials) == 0: #This is a new material. - result_metadata.append(new_material_metadata) - - for hotend in machine.iterfind("./um:hotend", cls.__namespaces): - hotend_id = hotend.get("id") - if hotend_id is None: + for machine_id in machine_id_list: + definition_metadata = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) + if not definition_metadata: + Logger.log("w", "No definition found for machine ID %s", machine_id) continue + definition_metadata = definition_metadata[0] - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) - if not variant_containers: - # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = hotend_id) + machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - hotend_compatibility = machine_compatibility - for entry in hotend.iterfind("./um:setting", cls.__namespaces): - key = entry.get("key") - if key == "hardware compatible": - hotend_compatibility = cls._parseCompatibleValue(entry.text) + if machine_compatibility: + new_material_id = container_id + "_" + machine_id - new_hotend_id = container_id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + # The child or derived material container may already exist. This can happen when a material in a + # project file and the a material in Cura have the same ID. + # In the case if a derived material already exists, override that material container because if + # the data in the parent material has been changed, the derived ones should be updated too. + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_material_id) + if found_materials: + new_material_metadata = found_materials[0] + else: + new_material_metadata = {} - # Same as machine compatibility, keep the derived material containers consistent with the parent - # material - found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) - if found_materials: - new_hotend_material_metadata = found_materials[0] - else: - new_hotend_material_metadata = {} + new_material_metadata.update(base_metadata) + new_material_metadata["id"] = new_material_id + new_material_metadata["compatible"] = machine_compatibility + new_material_metadata["machine_manufacturer"] = machine_manufacturer + new_material_metadata["definition"] = machine_id - new_hotend_material_metadata.update(base_metadata) - if variant_containers: - new_hotend_material_metadata["variant"] = variant_containers[0]["id"] - else: - new_hotend_material_metadata["variant"] = hotend_id - _with_missing_variants.append(new_hotend_material_metadata) - new_hotend_material_metadata["compatible"] = hotend_compatibility - new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer - new_hotend_material_metadata["id"] = new_hotend_id - new_hotend_material_metadata["definition"] = machine_id + if len(found_materials) == 0: #This is a new material. + result_metadata.append(new_material_metadata) - if len(found_materials) == 0: - result_metadata.append(new_hotend_material_metadata) + for hotend in machine.iterfind("./um:hotend", cls.__namespaces): + hotend_id = hotend.get("id") + if hotend_id is None: + continue + + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = hotend_id) + + hotend_compatibility = machine_compatibility + for entry in hotend.iterfind("./um:setting", cls.__namespaces): + key = entry.get("key") + if key == "hardware compatible": + hotend_compatibility = cls._parseCompatibleValue(entry.text) + + new_hotend_id = container_id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") + + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_id) + if found_materials: + new_hotend_material_metadata = found_materials[0] + else: + new_hotend_material_metadata = {} + + new_hotend_material_metadata.update(base_metadata) + if variant_containers: + new_hotend_material_metadata["variant"] = variant_containers[0]["id"] + else: + new_hotend_material_metadata["variant"] = hotend_id + _with_missing_variants.append(new_hotend_material_metadata) + new_hotend_material_metadata["compatible"] = hotend_compatibility + new_hotend_material_metadata["machine_manufacturer"] = machine_manufacturer + new_hotend_material_metadata["id"] = new_hotend_id + new_hotend_material_metadata["definition"] = machine_id + + if len(found_materials) == 0: + result_metadata.append(new_hotend_material_metadata) + + # there is only one ID for a machine. Once we have reached here, it means we have already found + # a workable ID for that machine, so there is no need to continue + break return result_metadata @@ -818,10 +828,32 @@ class XmlMaterialProfile(InstanceContainer): # # This loads the mapping from a file. @classmethod - def getProductIdMap(cls) -> Dict[str, str]: + def getProductIdMap(cls) -> Dict[str, List[str]]: product_to_id_file = os.path.join(os.path.dirname(sys.modules[cls.__module__].__file__), "product_to_id.json") with open(product_to_id_file) as f: - return json.load(f) + product_to_id_map = json.load(f) + + # generate a few more combinations so it can be smart about finding IDs + product_to_id_map = {key: [value] for key, value in product_to_id_map.items()} + for name, id_list in product_to_id_map.items(): + name_parts = name.split(" ") + merged_name_parts = [] + for part in name_parts: + if len(part) == 0: + continue + if len(merged_name_parts) == 0: + merged_name_parts.append(part.lower()) + continue + if part.isdigit(): + # for names with digit(s) such as Ultimaker 3 Extended, we generate an ID like + # "ultimaker3_extended", ignoring the space between "Ultimaker" and "3". + merged_name_parts[-1] = merged_name_parts[-1] + part.lower() + + generated_id = "_".join(merged_name_parts) + if generated_id not in id_list: + id_list.append(generated_id) + + return product_to_id_map ## Parse the value of the "material compatible" property. @classmethod From 7cd344978149997d91d91c1f20788e42fe3de91e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 13 Dec 2017 11:26:16 +0100 Subject: [PATCH 604/764] Fix material loading --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 08530f96e2..4de49817bc 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -632,9 +632,9 @@ class XmlMaterialProfile(InstanceContainer): if is_new_material: containers_to_add.append(new_hotend_material) - # there is only one ID for a machine. Once we have reached here, it means we have already found - # a workable ID for that machine, so there is no need to continue - break + # there is only one ID for a machine. Once we have reached here, it means we have already found + # a workable ID for that machine, so there is no need to continue + break for container_to_add in containers_to_add: ContainerRegistry.getInstance().addContainer(container_to_add) @@ -800,9 +800,9 @@ class XmlMaterialProfile(InstanceContainer): if len(found_materials) == 0: result_metadata.append(new_hotend_material_metadata) - # there is only one ID for a machine. Once we have reached here, it means we have already found - # a workable ID for that machine, so there is no need to continue - break + # there is only one ID for a machine. Once we have reached here, it means we have already found + # a workable ID for that machine, so there is no need to continue + break return result_metadata From 5c5f08e9ca3bdf84f04a7e9c6d31c73c52d3f93b Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 13 Dec 2017 11:58:59 +0100 Subject: [PATCH 605/764] Do not slice a model if it is only one on a build plane and has setting from non_printing_mesh CURA-4703 --- plugins/CuraEngineBackend/StartSliceJob.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 876b4685cc..7cfccb2b1f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -131,12 +131,21 @@ class StartSliceJob(Job): Logger.log("w", "No objects suitable for one at a time found, or no correct order found") else: temp_list = [] + is_non_printing_mesh = False for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - if not getattr(node, "_outside_buildarea", False) or getattr(node, "_non_printing_mesh", False): + _non_printing_mesh = getattr(node, "_non_printing_mesh", False) + if not getattr(node, "_outside_buildarea", False) or _non_printing_mesh: temp_list.append(node) + if _non_printing_mesh: + is_non_printing_mesh = True Job.yieldThread() + #If list has one node and it has non printing settings then remove it from list + # otherwise CuraEngine will crash + if len(temp_list) == 1 and is_non_printing_mesh: + temp_list.clear() + if temp_list: object_groups.append(temp_list) From 6e6dc493f1bdd8f9027341dcc869cab295f7625e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 13 Dec 2017 12:27:15 +0100 Subject: [PATCH 606/764] Fix material loading for unknown names --- cura/Settings/CuraContainerStack.py | 4 +- .../XmlMaterialProfile/XmlMaterialProfile.py | 54 +++++++++++-------- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 9e30e3dd66..61c28df570 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -508,7 +508,7 @@ class CuraContainerStack(ContainerStack): def findDefaultQuality(self) -> Optional[ContainerInterface]: definition = self._getMachineDefinition() registry = ContainerRegistry.getInstance() - material_container = self.material if self.material != self._empty_instance_container else None + material_container = self.material if self.material.getId() not in (self._empty_material.getId(), self._empty_instance_container.getId()) else None search_criteria = {"type": "quality"} @@ -552,7 +552,7 @@ class CuraContainerStack(ContainerStack): material_search_criteria = {"type": "material", "material": material_container.getMetaDataEntry("material"), "color_name": "Generic"} if definition.getMetaDataEntry("has_machine_quality"): if self.material != self._empty_instance_container: - material_search_criteria["definition"] = material_container.getDefinition().id + material_search_criteria["definition"] = material_container.getMetaDataEntry("definition") if definition.getMetaDataEntry("has_variants"): material_search_criteria["variant"] = material_container.getMetaDataEntry("variant") diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 4de49817bc..e212ab9b7c 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -533,7 +533,7 @@ class XmlMaterialProfile(InstanceContainer): for identifier in identifiers: machine_id_list = product_id_map.get(identifier.get("product"), []) if not machine_id_list: - machine_id_list.append(identifier.get("product").replace(" ", "").lower()) + machine_id_list = self.getPossibleDefinitionIDsFromName(identifier.get("product")) for machine_id in machine_id_list: definitions = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) @@ -541,6 +541,7 @@ class XmlMaterialProfile(InstanceContainer): Logger.log("w", "No definition found for machine ID %s", machine_id) continue + Logger.log("d", "Found definition for machine ID %s", machine_id) definition = definitions[0] machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. @@ -584,7 +585,7 @@ class XmlMaterialProfile(InstanceContainer): variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = hotend_id) if not variant_containers: # It is not really properly defined what "ID" is so also search for variants by name. - variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = definition["id"], name = hotend_id) + variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = hotend_id) if not variant_containers: continue @@ -617,6 +618,7 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material.getMetaData()["id"] = new_hotend_id new_hotend_material.getMetaData()["name"] = self.getName() new_hotend_material.getMetaData()["variant"] = variant_containers[0]["id"] + new_hotend_material.setDefinition(machine_id) # Don't use setMetadata, as that overrides it for all materials with same base file new_hotend_material.getMetaData()["compatible"] = hotend_compatibility new_hotend_material.getMetaData()["machine_manufacturer"] = machine_manufacturer @@ -727,13 +729,15 @@ class XmlMaterialProfile(InstanceContainer): for identifier in machine.iterfind("./um:machine_identifier", cls.__namespaces): machine_id_list = product_id_map.get(identifier.get("product"), []) if not machine_id_list: - machine_id_list.append(identifier.get("product").replace(" ", "").lower()) + machine_id_list = cls.getPossibleDefinitionIDsFromName(identifier.get("product")) for machine_id in machine_id_list: definition_metadata = ContainerRegistry.getInstance().findDefinitionContainersMetadata(id = machine_id) if not definition_metadata: Logger.log("w", "No definition found for machine ID %s", machine_id) continue + + Logger.log("d", "========= Found def for machine [%s]", machine_id) definition_metadata = definition_metadata[0] machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. @@ -823,6 +827,30 @@ class XmlMaterialProfile(InstanceContainer): else: return material_name + @classmethod + def getPossibleDefinitionIDsFromName(cls, name): + name_parts = name.lower().split(" ") + merged_name_parts = [] + for part in name_parts: + if len(part) == 0: + continue + if len(merged_name_parts) == 0: + merged_name_parts.append(part) + continue + if part.isdigit(): + # for names with digit(s) such as Ultimaker 3 Extended, we generate an ID like + # "ultimaker3_extended", ignoring the space between "Ultimaker" and "3". + merged_name_parts[-1] = merged_name_parts[-1] + part + else: + merged_name_parts.append(part) + + id_list = [name.lower().replace(" ", ""), # simply removing all spaces + name.lower().replace(" ", "_"), # simply replacing all spaces with underscores + "_".join(merged_name_parts), + ] + + return id_list + ## Gets a mapping from product names in the XML files to their definition # IDs. # @@ -832,27 +860,7 @@ class XmlMaterialProfile(InstanceContainer): product_to_id_file = os.path.join(os.path.dirname(sys.modules[cls.__module__].__file__), "product_to_id.json") with open(product_to_id_file) as f: product_to_id_map = json.load(f) - - # generate a few more combinations so it can be smart about finding IDs product_to_id_map = {key: [value] for key, value in product_to_id_map.items()} - for name, id_list in product_to_id_map.items(): - name_parts = name.split(" ") - merged_name_parts = [] - for part in name_parts: - if len(part) == 0: - continue - if len(merged_name_parts) == 0: - merged_name_parts.append(part.lower()) - continue - if part.isdigit(): - # for names with digit(s) such as Ultimaker 3 Extended, we generate an ID like - # "ultimaker3_extended", ignoring the space between "Ultimaker" and "3". - merged_name_parts[-1] = merged_name_parts[-1] + part.lower() - - generated_id = "_".join(merged_name_parts) - if generated_id not in id_list: - id_list.append(generated_id) - return product_to_id_map ## Parse the value of the "material compatible" property. From 9ea011901132bfa16ab99cb56a39ecb7bd116493 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 13 Dec 2017 12:58:24 +0100 Subject: [PATCH 607/764] Rename 'exception' to 'error' Error is a less technical term, so it's more user friendly. --- cura/CrashHandler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index cb0f121d47..81eca67a46 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -59,7 +59,7 @@ class CrashHandler: self.data = dict() self.data["time_stamp"] = time.time() - Logger.log("c", "An uncaught exception has occurred!") + Logger.log("c", "An uncaught error has occurred!") for line in traceback.format_exception(exception_type, value, tb): for part in line.rstrip("\n").split("\n"): Logger.log("c", part) @@ -90,7 +90,7 @@ class CrashHandler: def _messageWidget(self): label = QLabel() - label.setText(catalog.i18nc("@label crash message", """

    A fatal exception has occurred. Please send us this Crash Report to fix the problem

    + label.setText(catalog.i18nc("@label crash message", """

    A fatal error has occurred. Please send us this Crash Report to fix the problem

    Please use the "Send report" button to post a bug report automatically to our servers

    """)) @@ -143,7 +143,7 @@ class CrashHandler: def _exceptionInfoWidget(self): group = QGroupBox() - group.setTitle(catalog.i18nc("@title:groupbox", "Exception traceback")) + group.setTitle(catalog.i18nc("@title:groupbox", "Error traceback")) layout = QVBoxLayout() text_area = QTextEdit() From 19b56404c61c4569b47dcda1b31389dd07653365 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 13:33:05 +0100 Subject: [PATCH 608/764] Fix empty quality slider on start. It seemed that: - MachineManager was not connected to all the correct signals - After connecting to the correct signal, ProfilesModel was not yet updated when looping over it in SidebarSimple Because ProfilesModel's constructor already requests the MachineManager, we cannot do connect itemsChanged the way around as well. CURA-4707 --- cura/Settings/MachineManager.py | 19 ++++++++++++++++--- cura/Settings/ProfilesModel.py | 5 ++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 16d42ce653..7c0adb5043 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -32,6 +32,7 @@ from .CuraStackBuilder import CuraStackBuilder from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +from cura.Settings.ProfilesModel import ProfilesModel from typing import TYPE_CHECKING, Optional if TYPE_CHECKING: @@ -60,9 +61,11 @@ class MachineManager(QObject): self._instance_container_timer = QTimer() self._instance_container_timer.setInterval(250) self._instance_container_timer.setSingleShot(True) - self._instance_container_timer.timeout.connect(self.__onInstanceContainersChanged) + self._instance_container_timer.timeout.connect(self.__emitChangedSignals) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + Application.getInstance().getContainerRegistry().containerLoadComplete.connect(self._onInstanceContainersChanged) + self._connected_to_profiles_model = False ## When the global container is changed, active material probably needs to be updated. self.globalContainerChanged.connect(self.activeMaterialChanged) @@ -333,14 +336,24 @@ class MachineManager(QObject): # on _active_container_stack. If it changes, then the properties change. self.activeQualityChanged.emit() - def __onInstanceContainersChanged(self): + def __emitChangedSignals(self): self.activeQualityChanged.emit() self.activeVariantChanged.emit() self.activeMaterialChanged.emit() self._updateStacksHaveErrors() # Prevents unwanted re-slices after changing machine self._error_check_timer.start() + def _onProfilesModelChanged(self, *args): + self.__emitChangedSignals() + def _onInstanceContainersChanged(self, container): + # This should not trigger the ProfilesModel to be created, or there will be an infinite recursion + if not self._connected_to_profiles_model and ProfilesModel.hasInstance(): + # This triggers updating the qualityModel in SidebarSimple whenever ProfilesModel is updated + Logger.log("d", "Connecting profiles model...") + ProfilesModel.getInstance().itemsChanged.connect(self._onProfilesModelChanged) + self._connected_to_profiles_model = True + self._instance_container_timer.start() def _onPropertyChanged(self, key: str, property_name: str): @@ -360,7 +373,7 @@ class MachineManager(QObject): if containers: Application.getInstance().setGlobalContainerStack(containers[0]) - self.__onInstanceContainersChanged() + self.__emitChangedSignals() @pyqtSlot(str, str) def addMachine(self, name: str, definition_id: str) -> None: diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 849d6959b9..3b43e2740a 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -49,6 +49,10 @@ class ProfilesModel(InstanceContainersModel): ProfilesModel.__instance = cls() return ProfilesModel.__instance + @classmethod + def hasInstance(cls) -> bool: + return ProfilesModel.__instance is not None + __instance = None # type: "ProfilesModel" ## Fetch the list of containers to display. @@ -91,7 +95,6 @@ class ProfilesModel(InstanceContainersModel): ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): - # Some globals that we can re-use. global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack is None: From 4519f9b46ace2b1490dae12b08fa024a9022edfd Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 14:04:02 +0100 Subject: [PATCH 609/764] CURA-4234 rename to cura/sidebar_collapse, fix spelling errors, styling --- cura/CuraApplication.py | 2 +- resources/qml/Cura.qml | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 46e73e6194..c4e1c416dd 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -313,7 +313,7 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/material_settings", "{}") preferences.addPreference("view/invert_zoom", False) - preferences.addPreference("general/sidebar_collapse", False) + preferences.addPreference("cura/sidebar_collapse", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 8cce20d19f..91098bbb29 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -390,18 +390,18 @@ UM.MainWindow property bool collapsed: false; property var initialWidth: UM.Theme.getSize("sidebar").width; - function callExpandOrCollapse(){ - if(collapsed){ - sidebar.visible = true - sidebar.initialWidth = UM.Theme.getSize("sidebar").width - viewportRect = Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0) + function callExpandOrCollapse() { + if (collapsed) { + sidebar.visible = true; + sidebar.initialWidth = UM.Theme.getSize("sidebar").width; + viewportRect = Qt.rect(0, 0, (base.width - sidebar.width) / base.width, 1.0); expandSidebarAnimation.start(); - }else{ - viewportRect = Qt.rect(0, 0, 1, 1.0) - collapsSidebarAnimation.start(); + } else { + viewportRect = Qt.rect(0, 0, 1, 1.0); + collapseSidebarAnimation.start(); } collapsed = !collapsed; - UM.Preferences.setValue("general/sidebar_collapse", collapsed); + UM.Preferences.setValue("cura/sidebar_collapse", collapsed); } anchors @@ -415,7 +415,7 @@ UM.MainWindow source: UM.Controller.activeStage.sidebarComponent NumberAnimation { - id: collapsSidebarAnimation + id: collapseSidebarAnimation target: sidebar properties: "x" to: base.width @@ -432,12 +432,12 @@ UM.MainWindow Component.onCompleted: { - var sidebarCollaps = UM.Preferences.getValue("general/sidebar_collapse") + var sidebarCollapsed = UM.Preferences.getValue("cura/sidebar_collapse"); - if (sidebarCollaps == true){ + if (sidebarCollapsed) { sidebar.collapsed = true; viewportRect = Qt.rect(0, 0, 1, 1.0) - collapsSidebarAnimation.start(); + collapseSidebarAnimation.start(); } } } From 63eec848fcf9eb0b37eab27a64b42a777bce5733 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 14:15:27 +0100 Subject: [PATCH 610/764] CURA-4234 view mode button now also moves with the sidebar --- resources/qml/Topbar.qml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 796eb6fce5..e6cddae3cf 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -153,11 +153,21 @@ Rectangle ComboBox { id: viewModeButton + property int rightMargin: UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; anchors { verticalCenter: parent.verticalCenter right: parent.right - rightMargin: UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width + rightMargin: rightMargin + } + + function updateMargins() { + CuraApplication.log("update margin"); + if (UM.Preferences.getValue("cura/sidebar_collapse")) { + rightMargin = UM.Theme.getSize("default_margin").width; + } else { + rightMargin = UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; + } } style: UM.Theme.styles.combobox @@ -201,6 +211,13 @@ Rectangle } } + // Expand or collapse sidebar + Connections + { + target: Cura.Actions.expandSidebar + onTriggered: viewModeButton.updateMargins() + } + Loader { id: view_panel From 3605edc56595e0f8fa723fdf2860b09480239013 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 14:16:35 +0100 Subject: [PATCH 611/764] CURA-4234 remove debugging logline --- resources/qml/Topbar.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index e6cddae3cf..d2f1db37b2 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -162,7 +162,6 @@ Rectangle } function updateMargins() { - CuraApplication.log("update margin"); if (UM.Preferences.getValue("cura/sidebar_collapse")) { rightMargin = UM.Theme.getSize("default_margin").width; } else { From a44cea7ac6f3572e4eed4a9c024ee8395cb635f8 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 14:48:25 +0100 Subject: [PATCH 612/764] Update log line --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index e212ab9b7c..c31a60c778 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -737,7 +737,7 @@ class XmlMaterialProfile(InstanceContainer): Logger.log("w", "No definition found for machine ID %s", machine_id) continue - Logger.log("d", "========= Found def for machine [%s]", machine_id) + Logger.log("d", "Found def for machine [%s]", machine_id) definition_metadata = definition_metadata[0] machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. From 88af41769e4feb690b1561c5ab14a9b675c9a369 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 13 Dec 2017 16:04:01 +0100 Subject: [PATCH 613/764] Check multiple models with non_printing settings CURA-4703 --- plugins/CuraEngineBackend/StartSliceJob.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 7cfccb2b1f..3c1998094c 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -131,19 +131,19 @@ class StartSliceJob(Job): Logger.log("w", "No objects suitable for one at a time found, or no correct order found") else: temp_list = [] - is_non_printing_mesh = False + has_printing_mesh = False for node in DepthFirstIterator(self._scene.getRoot()): if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: _non_printing_mesh = getattr(node, "_non_printing_mesh", False) if not getattr(node, "_outside_buildarea", False) or _non_printing_mesh: temp_list.append(node) - if _non_printing_mesh: - is_non_printing_mesh = True + if not _non_printing_mesh: + has_printing_mesh = True Job.yieldThread() - #If list has one node and it has non printing settings then remove it from list + #If the list doesn't have any model with suitable settings then clean the list # otherwise CuraEngine will crash - if len(temp_list) == 1 and is_non_printing_mesh: + if not has_printing_mesh: temp_list.clear() if temp_list: From f3a6f50e2c6d273c363fda4c8e1b1c0d8cc69ea0 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 13 Dec 2017 16:47:38 +0100 Subject: [PATCH 614/764] CURA-4234 fix topbar resize issues and removed hard coding numbers --- resources/qml/Topbar.qml | 59 ++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index d2f1db37b2..9b67856fc8 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -21,6 +21,22 @@ Rectangle property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands + property int rightMargin: UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; + property int allItemsWidth: 0; + + function updateMarginsAndSizes() { + if (UM.Preferences.getValue("cura/sidebar_collapse")) { + rightMargin = UM.Theme.getSize("default_margin").width; + } else { + rightMargin = UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; + } + allItemsWidth = ( + logo.width + UM.Theme.getSize("topbar_logo_right_margin").width + + UM.Theme.getSize("topbar_logo_right_margin").width + stagesMenuContainer.width + + UM.Theme.getSize("default_margin").width + viewModeButton.width + + rightMargin); + } + UM.I18nCatalog { id: catalog @@ -44,6 +60,7 @@ Rectangle Row { + id: stagesMenuContainer anchors.left: logo.right anchors.leftMargin: UM.Theme.getSize("topbar_logo_right_margin").width spacing: UM.Theme.getSize("default_margin").width @@ -85,8 +102,8 @@ Rectangle anchors { verticalCenter: base.verticalCenter - right: viewModeButton.right - rightMargin: UM.Theme.getSize("default_margin").width + viewModeButton.width + right: viewModeButton.left + rightMargin: UM.Theme.getSize("default_margin").width } // #1 3d view @@ -98,7 +115,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("3d", 0); } - visible: base.width > 1100 + visible: base.width - allItemsWidth - 4 * this.width > 0; } // #2 Front view @@ -110,7 +127,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("home", 0); } - visible: base.width > 1130 + visible: base.width - allItemsWidth - 3 * this.width > 0; } // #3 Top view @@ -122,7 +139,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("y", 90); } - visible: base.width > 1160 + visible: base.width - allItemsWidth - 2 * this.width > 0; } // #4 Left view @@ -134,7 +151,7 @@ Rectangle onClicked:{ UM.Controller.rotateView("x", 90); } - visible: base.width > 1190 + visible: base.width - allItemsWidth - 1 * this.width > 0; } // #5 Left view @@ -146,14 +163,13 @@ Rectangle onClicked:{ UM.Controller.rotateView("x", -90); } - visible: base.width > 1210 + visible: base.width - allItemsWidth > 0; } } ComboBox { id: viewModeButton - property int rightMargin: UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; anchors { verticalCenter: parent.verticalCenter @@ -161,14 +177,6 @@ Rectangle rightMargin: rightMargin } - function updateMargins() { - if (UM.Preferences.getValue("cura/sidebar_collapse")) { - rightMargin = UM.Theme.getSize("default_margin").width; - } else { - rightMargin = UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; - } - } - style: UM.Theme.styles.combobox visible: UM.Controller.activeStage.stageId != "MonitorStage" @@ -210,13 +218,6 @@ Rectangle } } - // Expand or collapse sidebar - Connections - { - target: Cura.Actions.expandSidebar - onTriggered: viewModeButton.updateMargins() - } - Loader { id: view_panel @@ -233,4 +234,16 @@ Rectangle source: UM.ActiveView.valid ? UM.ActiveView.activeViewPanel : ""; } + // Expand or collapse sidebar + Connections + { + target: Cura.Actions.expandSidebar + onTriggered: updateMarginsAndSizes() + } + + Component.onCompleted: + { + updateMarginsAndSizes(); + } + } From f69375691f0e7933e897e34c4535fe4fcb07a22b Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 13 Dec 2017 18:58:05 +0100 Subject: [PATCH 615/764] Reduce vertices per tube by 1 Since the tubes are symmetrical, instead of using an extra vertex to flip the winding order, I just mirror all horizontal coordinates so that the triangles flip inside out. --- plugins/SimulationView/layers3d.shader | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index cbd27a2660..86a88fab83 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -198,17 +198,16 @@ geometry41core = EndPrimitive(); } else { // All normal lines are rendered as 3d tubes. - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); - myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz)); EndPrimitive(); From cda6aa25477107bab996db8bb37cf271f1342d4e Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 14 Dec 2017 14:49:18 +0100 Subject: [PATCH 616/764] CURA-4234 splitted MachineSelection into a separate file and add it to PrintMonitor as well, because now it's part of the sidebar --- resources/qml/MachineSelection.qml | 71 ++++++++++++++++++++++++++++++ resources/qml/PrintMonitor.qml | 10 ++++- resources/qml/Sidebar.qml | 60 +------------------------ 3 files changed, 81 insertions(+), 60 deletions(-) create mode 100644 resources/qml/MachineSelection.qml diff --git a/resources/qml/MachineSelection.qml b/resources/qml/MachineSelection.qml new file mode 100644 index 0000000000..e40731f3ca --- /dev/null +++ b/resources/qml/MachineSelection.qml @@ -0,0 +1,71 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura +import "Menus" + +ToolButton +{ + text: Cura.MachineManager.activeMachineName + + tooltip: Cura.MachineManager.activeMachineName + + style: ButtonStyle + { + background: Rectangle + { + color: + { + if(control.pressed) + { + return UM.Theme.getColor("sidebar_header_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("sidebar_header_hover"); + } + else + { + return UM.Theme.getColor("sidebar_header_bar"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("text_emphasis") + source: UM.Theme.getIcon("arrow_bottom") + } + Label + { + id: sidebarComboBoxLabel + color: UM.Theme.getColor("sidebar_header_text_active") + text: control.text; + elide: Text.ElideRight; + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 + anchors.right: downArrow.left; + anchors.rightMargin: control.rightMargin; + anchors.verticalCenter: parent.verticalCenter; + font: UM.Theme.getFont("large") + } + } + label: Label {} + } + + menu: PrinterMenu { } +} diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index e69f7cf4fd..806e302047 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -20,6 +20,14 @@ Column simpleNames: true } + MachineSelection { + id: machineSelection + width: base.width + height: UM.Theme.getSize("sidebar_header").height + anchors.top: base.top + anchors.right: parent.right + } + Rectangle { id: connectedPrinterHeader @@ -1171,4 +1179,4 @@ Column } } } -} \ No newline at end of file +} diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index a45303aab8..66c23752ce 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -87,70 +87,12 @@ Rectangle } } - ToolButton - { + MachineSelection { id: machineSelection - text: Cura.MachineManager.activeMachineName - width: base.width height: UM.Theme.getSize("sidebar_header").height - tooltip: Cura.MachineManager.activeMachineName - anchors.top: base.top - //anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - style: ButtonStyle - { - background: Rectangle - { - color: - { - if(control.pressed) - { - return UM.Theme.getColor("sidebar_header_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("sidebar_header_hover"); - } - else - { - return UM.Theme.getColor("sidebar_header_bar"); - } - } - Behavior on color { ColorAnimation { duration: 50; } } - - UM.RecolorImage - { - id: downArrow - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width - sourceSize.height: width - color: UM.Theme.getColor("text_emphasis") - source: UM.Theme.getIcon("arrow_bottom") - } - Label - { - id: sidebarComboBoxLabel - color: UM.Theme.getColor("sidebar_header_text_active") - text: control.text; - elide: Text.ElideRight; - anchors.left: parent.left; - anchors.leftMargin: UM.Theme.getSize("default_margin").width * 2 - anchors.right: downArrow.left; - anchors.rightMargin: control.rightMargin; - anchors.verticalCenter: parent.verticalCenter; - font: UM.Theme.getFont("large") - } - } - label: Label {} - } - - menu: PrinterMenu { } } SidebarHeader { From c056fcb23d3d9a7530cf9a21bbf0a83e63660908 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 14 Dec 2017 14:58:51 +0100 Subject: [PATCH 617/764] Fix monitor sidebar machine selection - CURA-4234 --- resources/qml/PrintMonitor.qml | 8 -------- resources/qml/Sidebar.qml | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 806e302047..5a5c160b51 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -20,14 +20,6 @@ Column simpleNames: true } - MachineSelection { - id: machineSelection - width: base.width - height: UM.Theme.getSize("sidebar_header").height - anchors.top: base.top - anchors.right: parent.right - } - Rectangle { id: connectedPrinterHeader diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 66c23752ce..d5cffb30a6 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -272,7 +272,7 @@ Rectangle { id: controlItem anchors.bottom: footerSeparator.top - anchors.top: monitoringPrint ? base.top : headerSeparator.bottom + anchors.top: monitoringPrint ? machineSelection.bottom : headerSeparator.bottom anchors.left: base.left anchors.right: base.right sourceComponent: @@ -291,7 +291,7 @@ Rectangle Loader { anchors.bottom: footerSeparator.top - anchors.top: monitoringPrint ? base.top : headerSeparator.bottom + anchors.top: monitoringPrint ? machineSelection.bottom : headerSeparator.bottom anchors.left: base.left anchors.right: base.right source: From 47e5303a893dd5b1879a9ecd4f762278807961fd Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 14 Dec 2017 15:16:17 +0100 Subject: [PATCH 618/764] Catch situations where backend is not correctly set --- resources/qml/SaveButton.qml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index d53b43e459..9ecde4d72a 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,7 +14,7 @@ Item { property real progress: UM.Backend.progress property int backendState: UM.Backend.state - property var backend: CuraApplication.getBackend() + property var backend: CuraApplication.getBackend() || "undefined" property bool activity: CuraApplication.platformActivity property alias buttonRowWidth: saveRow.width @@ -49,12 +49,16 @@ Item { } function sliceOrStopSlicing() { - if (base.backendState != "undefined" && backend !== "undefined") { - if ([1, 5].indexOf(base.backendState) != -1) { - backend.forceSlice(); - } else { - backend.stopSlicing(); + try { + if (base.backendState != "undefined" && base.backend != "undefined") { + if ([1, 5].indexOf(base.backendState) != -1) { + backend.forceSlice(); + } else { + backend.stopSlicing(); + } } + } catch (e) { + console.log('Could not start or stop slicing', e) } } From 9db320bf352c04c0e31f98d55b20f92d716fae1b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 14 Dec 2017 15:34:58 +0100 Subject: [PATCH 619/764] Remove unused backend property --- resources/qml/Sidebar.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index d5cffb30a6..db7851a101 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -22,7 +22,6 @@ Rectangle property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property int backendState: UM.Backend.state property bool monitoringPrint: UM.Controller.activeStage.stageId == "MonitorStage" From cac561600e99eec39c036c7126b8cd2dc2f7a121 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 14 Dec 2017 15:44:11 +0100 Subject: [PATCH 620/764] Use pyqtProperty instead of slot to bind backend --- resources/qml/SaveButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 9ecde4d72a..2b938c1745 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,7 +14,7 @@ Item { property real progress: UM.Backend.progress property int backendState: UM.Backend.state - property var backend: CuraApplication.getBackend() || "undefined" + property var backend: CuraApplication.backend property bool activity: CuraApplication.platformActivity property alias buttonRowWidth: saveRow.width From 2c18127cc1bc2801a7fdf6f7ec8f8ecca048757e Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 15 Dec 2017 09:43:02 +0100 Subject: [PATCH 621/764] Tests: Removed python circular import dependency and added empty containers CURA-4687 --- cura/Settings/CuraContainerStack.py | 2 +- tests/Settings/TestCuraContainerRegistry.py | 95 ++++++++++++++------- tests/Settings/TestExtruderStack.py | 29 +++++++ tests/Settings/TestGlobalStack.py | 29 +++++++ 4 files changed, 121 insertions(+), 34 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index 61c28df570..8e13b24358 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -377,7 +377,7 @@ class CuraContainerStack(ContainerStack): if not container or not isinstance(container, DefinitionContainer): definition = self.findContainer(container_type = DefinitionContainer) if not definition: - raise InvalidContainerStackError("Stack {id} does not have a definition!".format(id = self._id)) + raise InvalidContainerStackError("Stack {id} does not have a definition!".format(id = self.getId())) new_containers[index] = definition continue diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index e6dc6b99d8..9e5692b565 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -6,7 +6,9 @@ import pytest #This module contains unit tests. import shutil #To copy files to make a temporary file. import unittest.mock #To mock and monkeypatch stuff. import urllib.parse +import copy +import cura.CuraApplication from cura.Settings.CuraContainerRegistry import CuraContainerRegistry #The class we're testing. from cura.Settings.ExtruderStack import ExtruderStack #Testing for returning the correct types of stacks. from cura.Settings.GlobalStack import GlobalStack #Testing for returning the correct types of stacks. @@ -15,6 +17,32 @@ import UM.Settings.InstanceContainer #Creating instance containers to register. import UM.Settings.ContainerRegistry #Making empty container stacks. import UM.Settings.ContainerStack #Setting the container registry here properly. from UM.Settings.DefinitionContainer import DefinitionContainer +from UM.Settings.ContainerRegistry import ContainerRegistry + +def creteEmptyContainers(): + empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) + empty_variant_container.setMetaDataEntry("id", "empty_variant") + empty_variant_container.addMetaDataEntry("type", "variant") + ContainerRegistry.getInstance().addContainer(empty_variant_container) + + empty_material_container = copy.deepcopy(empty_container) + empty_material_container.setMetaDataEntry("id", "empty_material") + empty_material_container.addMetaDataEntry("type", "material") + ContainerRegistry.getInstance().addContainer(empty_material_container) + + empty_quality_container = copy.deepcopy(empty_container) + empty_quality_container.setMetaDataEntry("id", "empty_quality") + empty_quality_container.setName("Not Supported") + empty_quality_container.addMetaDataEntry("quality_type", "not_supported") + empty_quality_container.addMetaDataEntry("type", "quality") + empty_quality_container.addMetaDataEntry("supported", False) + ContainerRegistry.getInstance().addContainer(empty_quality_container) + + empty_quality_changes_container = copy.deepcopy(empty_container) + empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes") + empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") + ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) ## Gives a fresh CuraContainerRegistry instance. @pytest.fixture() @@ -37,6 +65,7 @@ def teardown(): ## Tests whether addContainer properly converts to ExtruderStack. def test_addContainerExtruderStack(container_registry, definition_container): + creteEmptyContainers() container_registry.addContainer(definition_container) container_stack = UM.Settings.ContainerStack.ContainerStack(stack_id = "Test Container Stack") #A container we're going to convert. @@ -113,36 +142,36 @@ def test_addContainerBadSettingVersion(container_registry, definition_container) mock_super_add_container.assert_not_called() #Should not get passed on to UM.Settings.ContainerRegistry.addContainer, because the setting_version doesn't match its definition! ## Tests whether loading gives objects of the correct type. -@pytest.mark.parametrize("filename, output_class", [ - ("ExtruderLegacy.stack.cfg", ExtruderStack), - ("MachineLegacy.stack.cfg", GlobalStack), - ("Left.extruder.cfg", ExtruderStack), - ("Global.global.cfg", GlobalStack), - ("Global.stack.cfg", GlobalStack) -]) -def test_loadTypes(filename, output_class, container_registry): - #Mock some dependencies. - Resources.getAllResourcesOfType = unittest.mock.MagicMock(return_value = [os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks", filename)]) #Return just this tested file. - - def findContainers(container_type = 0, id = None): - if id == "some_instance": - return [UM.Settings.ContainerRegistry._EmptyInstanceContainer(id)] - elif id == "some_definition": - return [DefinitionContainer(container_id = id)] - else: - return [] - - container_registry.findContainers = findContainers - - with unittest.mock.patch("cura.Settings.GlobalStack.GlobalStack.findContainer"): - with unittest.mock.patch("os.remove"): - container_registry.load() - - #Check whether the resulting type was correct. - stack_id = filename.split(".")[0] - for container_id, container in container_registry._containers.items(): #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates. - if container_id == stack_id: #This is the one we're testing. - assert type(container) == output_class - break - else: - assert False #Container stack with specified ID was not loaded. \ No newline at end of file +# @pytest.mark.parametrize("filename, output_class", [ +# ("ExtruderLegacy.stack.cfg", ExtruderStack), +# ("MachineLegacy.stack.cfg", GlobalStack), +# ("Left.extruder.cfg", ExtruderStack), +# ("Global.global.cfg", GlobalStack), +# ("Global.stack.cfg", GlobalStack) +# ]) +# def test_loadTypes(filename, output_class, container_registry): +# #Mock some dependencies. +# Resources.getAllResourcesOfType = unittest.mock.MagicMock(return_value = [os.path.join(os.path.dirname(os.path.abspath(__file__)), "stacks", filename)]) #Return just this tested file. +# +# def findContainers(container_type = 0, id = None): +# if id == "some_instance": +# return [UM.Settings.ContainerRegistry._EmptyInstanceContainer(id)] +# elif id == "some_definition": +# return [DefinitionContainer(container_id = id)] +# else: +# return [] +# +# container_registry.findContainers = findContainers +# +# with unittest.mock.patch("cura.Settings.GlobalStack.GlobalStack.findContainer"): +# with unittest.mock.patch("os.remove"): +# container_registry.load() +# +# #Check whether the resulting type was correct. +# stack_id = filename.split(".")[0] +# for container_id, container in container_registry._containers.items(): #Stupid ContainerRegistry class doesn't expose any way of getting at this except by prodding the privates. +# if container_id == stack_id: #This is the one we're testing. +# assert type(container) == output_class +# break +# else: +# assert False #Container stack with specified ID was not loaded. \ No newline at end of file diff --git a/tests/Settings/TestExtruderStack.py b/tests/Settings/TestExtruderStack.py index 6ed2c6649b..2a8d19b80f 100644 --- a/tests/Settings/TestExtruderStack.py +++ b/tests/Settings/TestExtruderStack.py @@ -3,7 +3,9 @@ import pytest #This module contains automated tests. import unittest.mock #For the mocking and monkeypatching functionality. +import copy +import cura.CuraApplication import UM.Settings.ContainerRegistry #To create empty instance containers. import UM.Settings.ContainerStack #To set the container registry the container stacks use. from UM.Settings.DefinitionContainer import DefinitionContainer #To check against the class of DefinitionContainer. @@ -12,6 +14,7 @@ import cura.Settings.ExtruderStack #The module we're testing. from cura.Settings.Exceptions import InvalidContainerError, InvalidOperationError #To check whether the correct exceptions are raised. from cura.Settings.ExtruderManager import ExtruderManager +from UM.Settings.ContainerRegistry import ContainerRegistry ## Fake container registry that always provides all containers you ask of. @pytest.yield_fixture() @@ -32,6 +35,7 @@ def container_registry(): ## An empty extruder stack to test with. @pytest.fixture() def extruder_stack() -> cura.Settings.ExtruderStack.ExtruderStack: + creteEmptyContainers() return cura.Settings.ExtruderStack.ExtruderStack("TestStack") ## Gets an instance container with a specified container type. @@ -43,6 +47,31 @@ def getInstanceContainer(container_type) -> InstanceContainer: container.addMetaDataEntry("type", container_type) return container +def creteEmptyContainers(): + empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) + empty_variant_container.setMetaDataEntry("id", "empty_variant") + empty_variant_container.addMetaDataEntry("type", "variant") + ContainerRegistry.getInstance().addContainer(empty_variant_container) + + empty_material_container = copy.deepcopy(empty_container) + empty_material_container.setMetaDataEntry("id", "empty_material") + empty_material_container.addMetaDataEntry("type", "material") + ContainerRegistry.getInstance().addContainer(empty_material_container) + + empty_quality_container = copy.deepcopy(empty_container) + empty_quality_container.setMetaDataEntry("id", "empty_quality") + empty_quality_container.setName("Not Supported") + empty_quality_container.addMetaDataEntry("quality_type", "not_supported") + empty_quality_container.addMetaDataEntry("type", "quality") + empty_quality_container.addMetaDataEntry("supported", False) + ContainerRegistry.getInstance().addContainer(empty_quality_container) + + empty_quality_changes_container = copy.deepcopy(empty_container) + empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes") + empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") + ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) + class DefinitionContainerSubClass(DefinitionContainer): def __init__(self): super().__init__(container_id = "SubDefinitionContainer") diff --git a/tests/Settings/TestGlobalStack.py b/tests/Settings/TestGlobalStack.py index afd3d2b425..9b0735c8f2 100755 --- a/tests/Settings/TestGlobalStack.py +++ b/tests/Settings/TestGlobalStack.py @@ -3,7 +3,9 @@ import pytest #This module contains unit tests. import unittest.mock #To monkeypatch some mocks in place of dependencies. +import copy +import cura.CuraApplication import cura.Settings.GlobalStack #The module we're testing. import cura.Settings.CuraContainerStack #To get the list of container types. from cura.Settings.Exceptions import TooManyExtrudersError, InvalidContainerError, InvalidOperationError #To test raising these errors. @@ -13,6 +15,7 @@ from UM.Settings.SettingInstance import InstanceState import UM.Settings.ContainerRegistry import UM.Settings.ContainerStack import UM.Settings.SettingDefinition #To add settings to the definition. +from UM.Settings.ContainerRegistry import ContainerRegistry ## Fake container registry that always provides all containers you ask of. @pytest.yield_fixture() @@ -33,6 +36,7 @@ def container_registry(): #An empty global stack to test with. @pytest.fixture() def global_stack() -> cura.Settings.GlobalStack.GlobalStack: + creteEmptyContainers() return cura.Settings.GlobalStack.GlobalStack("TestStack") ## Gets an instance container with a specified container type. @@ -44,6 +48,31 @@ def getInstanceContainer(container_type) -> InstanceContainer: container.addMetaDataEntry("type", container_type) return container +def creteEmptyContainers(): + empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) + empty_variant_container.setMetaDataEntry("id", "empty_variant") + empty_variant_container.addMetaDataEntry("type", "variant") + ContainerRegistry.getInstance().addContainer(empty_variant_container) + + empty_material_container = copy.deepcopy(empty_container) + empty_material_container.setMetaDataEntry("id", "empty_material") + empty_material_container.addMetaDataEntry("type", "material") + ContainerRegistry.getInstance().addContainer(empty_material_container) + + empty_quality_container = copy.deepcopy(empty_container) + empty_quality_container.setMetaDataEntry("id", "empty_quality") + empty_quality_container.setName("Not Supported") + empty_quality_container.addMetaDataEntry("quality_type", "not_supported") + empty_quality_container.addMetaDataEntry("type", "quality") + empty_quality_container.addMetaDataEntry("supported", False) + ContainerRegistry.getInstance().addContainer(empty_quality_container) + + empty_quality_changes_container = copy.deepcopy(empty_container) + empty_quality_changes_container.setMetaDataEntry("id", "empty_quality_changes") + empty_quality_changes_container.addMetaDataEntry("type", "quality_changes") + ContainerRegistry.getInstance().addContainer(empty_quality_changes_container) + class DefinitionContainerSubClass(DefinitionContainer): def __init__(self): super().__init__(container_id = "SubDefinitionContainer") From 79028388a28c54320b2fa334477db802f5689494 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 15 Dec 2017 11:05:42 +0100 Subject: [PATCH 622/764] Add option for custom reset handler in setting item --- resources/qml/Settings/SettingItem.qml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 6234e5f1f7..6899d20678 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -179,8 +179,13 @@ Item { iconSource: UM.Theme.getIcon("reset") onClicked: { - revertButton.focus = true; - Cura.MachineManager.clearUserSettingAllCurrentStacks(propertyProvider.key); + revertButton.focus = true + + if (resetHandler) { + resetHandler(propertyProvider.key) + } else { + Cura.MachineManager.clearUserSettingAllCurrentStacks(propertyProvider.key) + } } onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) } From 876ad0159731ad0e347293fba85198534766ced4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 15 Dec 2017 13:32:45 +0100 Subject: [PATCH 623/764] Directly use CuraApplication.backend instead of via property --- resources/qml/SaveButton.qml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 2b938c1745..c5025dea78 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,7 +14,6 @@ Item { property real progress: UM.Backend.progress property int backendState: UM.Backend.state - property var backend: CuraApplication.backend property bool activity: CuraApplication.platformActivity property alias buttonRowWidth: saveRow.width @@ -50,12 +49,10 @@ Item { function sliceOrStopSlicing() { try { - if (base.backendState != "undefined" && base.backend != "undefined") { - if ([1, 5].indexOf(base.backendState) != -1) { - backend.forceSlice(); - } else { - backend.stopSlicing(); - } + if ([1, 5].indexOf(base.backendState) != -1) { + CuraApplication.backend.forceSlice(); + } else { + CuraApplication.backend.stopSlicing(); } } catch (e) { console.log('Could not start or stop slicing', e) From 57651e837fd549c6531416450113a9addb43aab2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 15 Dec 2017 14:17:18 +0100 Subject: [PATCH 624/764] Fix setting the right extruder temperatures in start and end gcode --- plugins/CuraEngineBackend/StartSliceJob.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 3c1998094c..efa0e87b9e 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -218,7 +218,7 @@ class StartSliceJob(Job): result[key] = stack.getProperty(key, "value") Job.yieldThread() - result["print_bed_temperature"] = result["material_bed_temperature"] #Renamed settings. + result["print_bed_temperature"] = result["material_bed_temperature"] # Renamed settings. result["print_temperature"] = result["material_print_temperature"] result["time"] = time.strftime("%H:%M:%S") #Some extra settings. result["date"] = time.strftime("%d-%m-%Y") @@ -246,10 +246,10 @@ class StartSliceJob(Job): settings = self._buildReplacementTokens(stack) - #Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. + # Also send the material GUID. This is a setting in fdmprinter, but we have no interface for it. settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "") - #Replace the setting tokens in start and end g-code. + # Replace the setting tokens in start and end g-code. settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings) settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], settings) @@ -269,18 +269,23 @@ class StartSliceJob(Job): def _buildGlobalSettingsMessage(self, stack): settings = self._buildReplacementTokens(stack) + # Pre-compute material material_bed_temp_prepend and material_print_temp_prepend start_gcode = settings["machine_start_gcode"] - #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend bed_temperature_settings = {"material_bed_temperature", "material_bed_temperature_layer_0"} settings["material_bed_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in bed_temperature_settings)) print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) - #Replace the setting tokens in start and end g-code. - settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], settings) - settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], settings) + # Find the correct temperatures from the first used extruder + extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0] + extruder_0_settings = self._buildReplacementTokens(extruder_stack) - for key, value in settings.items(): #Add all submessages for each individual setting. + # Replace the setting tokens in start and end g-code. + settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], extruder_0_settings) + settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], extruder_0_settings) + + # Add all sub-messages for each individual setting. + for key, value in settings.items(): setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key setting_message.value = str(value).encode("utf-8") From f26872ec1f6b1a4a6fa0f71e307a96e3b956845c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 15 Dec 2017 14:45:06 +0100 Subject: [PATCH 625/764] Apply fix for single extrusion machines when a new global stack is added CURA-4713 Now the machines are not all loaded in the beginning, so the old way of adding extruder stacks for old single-extrusion machines don't work. With this fix, it now happens whenever a global stack is added to the registry. --- cura/Settings/CuraContainerRegistry.py | 22 ++++++++++++++++++++-- cura/Settings/MachineManager.py | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 07eb357f39..dc1cc726c4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -36,6 +36,11 @@ class CuraContainerRegistry(ContainerRegistry): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # We don't have all the machines loaded in the beginning, so in order to add the missing extruder stack + # for single extrusion machines, we subscribe to the containerAdded signal, and whenever a global stack + # is added, we check to see if an extruder stack needs to be added. + self.containerAdded.connect(self._onContainerAdded) + ## Overridden from ContainerRegistry # # Adds a container to the registry. @@ -410,6 +415,17 @@ class CuraContainerRegistry(ContainerRegistry): if not extruder_stacks: self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + def _onContainerAdded(self, container): + # We don't have all the machines loaded in the beginning, so in order to add the missing extruder stack + # for single extrusion machines, we subscribe to the containerAdded signal, and whenever a global stack + # is added, we check to see if an extruder stack needs to be added. + if not isinstance(container, ContainerStack) or container.getMetaDataEntry("type") != "machine": + return + + extruder_stacks = self.findContainerStacks(type = "extruder_train", machine = container.getId()) + if not extruder_stacks: + self.addExtruderStackForSingleExtrusionMachine(container, "fdmextruder") + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id @@ -425,7 +441,6 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setName(extruder_definition.getName()) extruder_stack.setDefinition(extruder_definition) extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) - extruder_stack.setNextStack(machine) # create empty user changes container otherwise user_container = InstanceContainer(extruder_stack.id + "_user") @@ -444,8 +459,8 @@ class CuraContainerRegistry(ContainerRegistry): user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) - extruder_stack.setUserChanges(user_container) self.addContainer(user_container) + extruder_stack.setUserChanges(user_container) variant_id = "default" if machine.variant.getId() not in ("empty", "empty_variant"): @@ -491,6 +506,9 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(extruder_stack) + # Set next stack at the end + extruder_stack.setNextStack(machine) + return extruder_stack def _findQualityChangesContainerInCuraFolder(self, name): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7c0adb5043..05aed1f5e2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -369,7 +369,9 @@ class MachineManager(QObject): self.blurSettings.emit() # Ensure no-one has focus. self._cancelDelayedActiveContainerStackChanges() - containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + container_registry = ContainerRegistry.getInstance() + + containers = container_registry.findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) From 248fe37ed92450f374c230c1bc8e78dcaa7293f7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 15 Dec 2017 14:54:23 +0100 Subject: [PATCH 626/764] setDefinition() takes the ID instead of the container CURA-4713 --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index dc1cc726c4..43e2e072b0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -448,7 +448,7 @@ class CuraContainerRegistry(ContainerRegistry): user_container.addMetaDataEntry("machine", extruder_stack.getId()) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(machine.definition) + user_container.setDefinition(machine.definition.getId()) if machine.userChanges: # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes From 421d93baa36f0eea332c29b70a5a451f7bba3ad0 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 15 Dec 2017 16:30:38 +0100 Subject: [PATCH 627/764] Fix potential crash on missing index in extruder dict --- plugins/SliceInfoPlugin/SliceInfo.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 67f977adce..508d174cf2 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -99,7 +99,9 @@ class SliceInfo(Extension): "type": extruder.material.getMetaData().get("material", ""), "brand": extruder.material.getMetaData().get("brand", "") } - extruder_dict["material_used"] = print_information.materialLengths[int(extruder.getMetaDataEntry("position", "0"))] + extruder_position = int(extruder.getMetaDataEntry("position", "0")) + if extruder_position in print_information.materialLengths: + extruder_dict["material_used"] = print_information.materialLengths[extruder_position] extruder_dict["variant"] = extruder.variant.getName() extruder_dict["nozzle_size"] = extruder.getProperty("machine_nozzle_size", "value") From 3bef7dd9b179a12ab17d479acdbdf5fb97c5fac6 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 15 Dec 2017 16:32:41 +0100 Subject: [PATCH 628/764] CURA-4716 Add Fine quality profile for Breakaway AA0.4 in UM3 --- .../um3_aa0.4_BAM_Normal_Quality.inst.cfg | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5f69e43e2f --- /dev/null +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 2 +name = Fine +definition = ultimaker3 + +[metadata] +type = quality +quality_type = normal +material = generic_bam_ultimaker3_AA_0.4 +weight = 0 +setting_version = 4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 10 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +skin_overlap = 10 +speed_layer_0 = 20 +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = 10 +top_bottom_thickness = 1 +wall_thickness = 1 From 54bc7dd348d77efa7f2dc3f420200df9864b8d37 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 15 Dec 2017 18:13:29 +0100 Subject: [PATCH 629/764] Version upgrade for nozzle_size CURA-4708 --- .../VersionUpgrade30to31.py | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index 8c5a160ff4..c01ff158b1 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -122,6 +122,21 @@ class VersionUpgrade30to31(VersionUpgrade): if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) + if parser["metadata"]["type"] == "definition_changes": + if parser["general"]["definition"] == "custom": + + # We are only interested in machine_nozzle_size + if parser.has_option("values", "machine_nozzle_size"): + machine_nozzle_size = parser["values"]["machine_nozzle_size"] + + definition_name = parser["general"]["name"] + machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) + + #For single extuder machine we nee only first extruder + if len(machine_extruders) !=0: + if self._updateSingleExtuderDefinitionFile(machine_extruders, machine_nozzle_size): + parser.remove_option("values", "machine_nozzle_size") + # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" @@ -200,6 +215,133 @@ class VersionUpgrade30to31(VersionUpgrade): return quality_changes_containers + def _getSingleExtrusionMachineExtruders(self, definition_name): + + machine_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.MachineStack) + + machine_instances = [] + + #Find all machine instances + for item in os.listdir(machine_instances_dir): + file_path = os.path.join(machine_instances_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "machine" != parser["metadata"]["type"]: + continue + + if not parser.has_option("general", "id"): + continue + + machine_instances.append(parser) + + #Find for extruders + extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) + #"machine",[extruders] + extruder_instances_per_machine = {} + + #Find all custom extruders for founded machines + for item in os.listdir(extruders_instances_dir): + file_path = os.path.join(extruders_instances_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "extruder_train" != parser["metadata"]["type"]: + continue + + if not parser.has_option("metadata", "machine"): + continue + if not parser.has_option("metadata", "position"): + continue + + + for machine_instace in machine_instances: + + machine_id = machine_instace["general"]["id"] + if machine_id != parser["metadata"]["machine"]: + continue + + if machine_id + "_settings" != definition_name: + continue + + if extruder_instances_per_machine.get(machine_id) is None: + extruder_instances_per_machine.update({machine_id:[]}) + + extruder_instances_per_machine.get(machine_id).append(parser) + #the extruder can be related only to one machine + break + + return extruder_instances_per_machine + + #Find extruder defition at index 0 and update its values + def _updateSingleExtuderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): + + defintion_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer) + + for item in os.listdir(defintion_instances_dir): + file_path = os.path.join(defintion_instances_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("general", "name"): + continue + name = parser["general"]["name"] + custom_extruder_at_0_position = None + for machine_extruders in extruder_instances_per_machine: + for extruder_instance in extruder_instances_per_machine[machine_extruders]: + + if extruder_instance["general"]["id"] + "_settings" == name: + defition_position = extruder_instance["metadata"]["position"] + + if defition_position == "0": + custom_extruder_at_0_position = extruder_instance + break + if custom_extruder_at_0_position is not None: + break + + #If not null, then parsed file is for first extuder and then can be updated. I need to update only + # first, because this update for single extuder machine + if custom_extruder_at_0_position is not None: + + #Add new value + parser["values"]["machine_nozzle_size"] = machine_nozzle_size + + definition_output = io.StringIO() + parser.write(definition_output) + + with open(file_path, "w") as f: + f.write(definition_output.getvalue()) + + return True + + return False + + def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) machine_name = os.path.os.path.basename(filename).replace(".inst.cfg", "").replace(suffix, "") From 43db06db2de1d886654b4271ea902ec8a1341531 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 18 Dec 2017 09:39:20 +0100 Subject: [PATCH 630/764] CURA-4721 removed comment from breakaway 0.1mm quality profile --- .../quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg index 5f69e43e2f..3ced3a0417 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_BAM_Normal_Quality.inst.cfg @@ -17,7 +17,6 @@ cool_min_speed = 7 machine_nozzle_cool_down_speed = 0.75 machine_nozzle_heat_up_speed = 1.6 material_print_temperature = =default_material_print_temperature - 10 -# prime_tower_enable: see CURA-4248 prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 skin_overlap = 10 speed_layer_0 = 20 From c3ce3724e5fa0625c87b60c39c033fff79ad3efa Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 18 Dec 2017 10:00:08 +0100 Subject: [PATCH 631/764] Fix small issue when resetHandler is not defined --- resources/qml/Settings/SettingItem.qml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 6899d20678..dd15877f48 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -14,11 +14,13 @@ import "." Item { id: base; - height: UM.Theme.getSize("section").height; + height: UM.Theme.getSize("section").height - property alias contents: controlContainer.children; + property alias contents: controlContainer.children property alias hovered: mouse.containsMouse + property var resetHandler: false + property var showRevertButton: true property var showInheritButton: true property var showLinkedSettingIcon: true From 443e155cf7b37cd8a0a222b5019c7c6c7de97eee Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 10:50:50 +0100 Subject: [PATCH 632/764] Adding set stage back --- cura/CuraApplication.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 62ece1ef1e..987bb98acb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -687,6 +687,7 @@ class CuraApplication(QtApplication): run_without_gui = self.getCommandLineOption("headless", False) or self.getCommandLineOption("invisible", False) if not run_without_gui: self.initializeEngine() + controller.setActiveStage("PrepareStage") if run_without_gui or self._engine.rootObjects: self.closeSplash() From d5b3f18da8b96bc46779abb8d04f6a85a024780e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 18 Dec 2017 11:00:55 +0100 Subject: [PATCH 633/764] Split all non-word characters for making abbreviations So now cases like CR-10 are more appropriately split into ['CR', '10']. Fixes #2910. --- cura/PrintInformation.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index ca5433f305..5e64413d27 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -16,6 +16,7 @@ import math import os.path import unicodedata import json +import re #To create abbreviations for printer names. from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -316,15 +317,14 @@ class PrintInformation(QObject): return global_stack_name = global_container_stack.getName() - split_name = global_stack_name.split(" ") abbr_machine = "" - for word in split_name: + for word in re.findall(r"[\w']+", global_stack_name): if word.lower() == "ultimaker": abbr_machine += "UM" elif word.isdigit(): abbr_machine += word else: - stripped_word = self._stripAccents(word.strip("()[]{}#").upper()) + stripped_word = self._stripAccents(word.upper()) # - use only the first character if the word is too long (> 3 characters) # - use the whole word if it's not too long (<= 3 characters) if len(stripped_word) > 3: From e3a996073e6414eae43e446d69fb4bb218b2e80b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 11:09:41 +0100 Subject: [PATCH 634/764] Remove duplicate --headless argument as it is now in Uranium --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 987bb98acb..18d1bde57e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -519,7 +519,6 @@ class CuraApplication(QtApplication): super().addCommandLineOptions(parser, parsed_command_line = parsed_command_line) parser.add_argument("file", nargs="*", help="Files to load after starting the application.") parser.add_argument("--single-instance", action="store_true", default=False) - parser.add_argument("--headless", action = "store_true", default=False) # Set up a local socket server which listener which coordinates single instances Curas and accepts commands. def _setUpSingleInstanceServer(self): From 4a211c6ac6b2e49e76b4e568fda7d0df73910367 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 18 Dec 2017 11:58:34 +0100 Subject: [PATCH 635/764] CURA-4495 Change property name and add default values --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 1 + resources/qml/Settings/SettingItem.qml | 6 ++---- resources/qml/Settings/SettingView.qml | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 65b67791c7..ea126bfd44 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -145,6 +145,7 @@ Item { property var settingDefinitionsModel: addedSettingsModel property var propertyProvider: provider property var globalPropertyProvider: inheritStackProvider + property var externalResetHandler: false //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index dd15877f48..1fa83cb6d4 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -19,8 +19,6 @@ Item { property alias contents: controlContainer.children property alias hovered: mouse.containsMouse - property var resetHandler: false - property var showRevertButton: true property var showInheritButton: true property var showLinkedSettingIcon: true @@ -183,8 +181,8 @@ Item { onClicked: { revertButton.focus = true - if (resetHandler) { - resetHandler(propertyProvider.key) + if (externalResetHandler) { + externalResetHandler(propertyProvider.key) } else { Cura.MachineManager.clearUserSettingAllCurrentStacks(propertyProvider.key) } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 1ebb5cc40e..5d39572647 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -287,6 +287,7 @@ Item property var settingDefinitionsModel: definitionsModel property var propertyProvider: provider property var globalPropertyProvider: inheritStackProvider + property var externalResetHandler: false //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, From d839b62e4211f72a1e432427d103a1efbffb571d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 18 Dec 2017 11:58:28 +0100 Subject: [PATCH 636/764] Prevent CrashHandler creating a QWidget before QApplication is created --- cura/CrashHandler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 81eca67a46..5e4b409939 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -53,7 +53,7 @@ class CrashHandler: self.exception_type = exception_type self.value = value self.traceback = tb - self.dialog = QDialog() + self.dialog = None # Don't create a QDialog before there is a QApplication # While we create the GUI, the information will be stored for sending afterwards self.data = dict() @@ -71,6 +71,7 @@ class CrashHandler: if not application: sys.exit(1) + self.dialog = QDialog() self._createDialog() ## Creates a modal dialog. From 77daad1f981c978c1ee61aba0052cfc0967cc351 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 18 Dec 2017 12:19:56 +0100 Subject: [PATCH 637/764] Also exit when the crash handler dialog is not created --- cura/CrashHandler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 5e4b409939..b5d4001fe2 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -37,7 +37,7 @@ else: # List of exceptions that should be considered "fatal" and abort the program. # These are primarily some exception types that we simply cannot really recover from # (MemoryError and SystemError) and exceptions that indicate grave errors in the -# code that cause the Python interpreter to fail (SyntaxError, ImportError). +# code that cause the Python interpreter to fail (SyntaxError, ImportError). fatal_exception_types = [ MemoryError, SyntaxError, @@ -289,4 +289,4 @@ class CrashHandler: # When the exception is not in the fatal_exception_types list, the dialog is not created, so we don't need to show it if self.dialog: self.dialog.exec_() - os._exit(1) + os._exit(1) From 8f66db6565e891f7e29f4d528d005dc88fc1916b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 18 Dec 2017 13:29:10 +0100 Subject: [PATCH 638/764] Remove overzealeous log message This message appears on every machine in every material, which is far too much. --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index c31a60c778..125fe1e344 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -737,7 +737,6 @@ class XmlMaterialProfile(InstanceContainer): Logger.log("w", "No definition found for machine ID %s", machine_id) continue - Logger.log("d", "Found def for machine [%s]", machine_id) definition_metadata = definition_metadata[0] machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. From d6c6aa1c7197775d51292d3c746369875b41e983 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 18 Dec 2017 17:03:18 +0100 Subject: [PATCH 639/764] CURA-4715 fix updating custom profile --- cura/Settings/ContainerManager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index bbabdadbde..209e1ec8fd 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -514,7 +514,7 @@ class ContainerManager(QObject): for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): # Find the quality_changes container for this stack and merge the contents of the top container into it. quality_changes = stack.qualityChanges - if not quality_changes or quality_changes.isReadOnly(): + if not quality_changes or self._container_registry.isReadOnly(quality_changes.getId()): Logger.log("e", "Could not update quality of a nonexistant or read only quality profile in stack %s", stack.getId()) continue @@ -687,7 +687,7 @@ class ContainerManager(QObject): global_stack = Application.getInstance().getGlobalContainerStack() if not global_stack or not quality_name: return "" - machine_definition = global_stack.getBottom() + machine_definition = global_stack.definition active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() if active_stacks is None: From cab27711ad94a3ce0e8b9a3239d24757349c49d5 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 20:50:45 +0100 Subject: [PATCH 640/764] Cleanup readme Cleanup readme now that we have better Wiki content --- README.md | 55 +++++++++++++------------------------------------------ 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 90f17a5463..a94ca853e6 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,16 @@ Cura ==== - -This is the new, shiny frontend for Cura. [daid/Cura](https://github.com/daid/Cura.git) is the old legacy Cura that everyone knows and loves/hates. - -We re-worked the whole GUI code at Ultimaker, because the old code started to become unmaintainable. - +This is the new, shiny frontend for Cura. [daid/Cura](https://github.com/daid/Cura.git) is the old legacy Cura that everyone knows and loves/hates. We re-worked the whole GUI code at Ultimaker, because the old code started to become unmaintainable. Logging Issues ------------ -Use [this](https://github.com/Ultimaker/Uranium/wiki/Bug-Reporting-Template) template to report issues. New issues that do not adhere to this template will take us a lot longer to handle and will therefore have a lower pirority. - For crashes and similar issues, please attach the following information: * (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output) * The Cura GUI log file, located at - * %APPDATA%\cura\\``\cura.log (Windows), or usually C:\Users\\``\AppData\Roaming\cura\\``\cura.log - * $User/Library/Application Support/cura/``/cura.log (OSX) - * $USER/.local/share/cura/``/cura.log (Ubuntu/Linux) + * `%APPDATA%\cura\\cura.log` (Windows), or usually `C:\Users\\\AppData\Roaming\cura\\cura.log` + * `$USER/Library/Application Support/cura//cura.log` (OSX) + * `$USER/.local/share/cura//cura.log` (Ubuntu/Linux) If the Cura user interface still starts, you can also reach this directory from the application menu in Help -> Show settings folder @@ -24,15 +18,10 @@ For additional support, you could also ask in the #cura channel on FreeNode IRC. Dependencies ------------ - -* [Uranium](https://github.com/Ultimaker/Uranium) - Cura is built on top of the Uranium framework. -* [CuraEngine](https://github.com/Ultimaker/CuraEngine) - This will be needed at runtime to perform the actual slicing. -* [PySerial](https://github.com/pyserial/pyserial) - Only required for USB printing support. -* [python-zeroconf](https://github.com/jstasiak/python-zeroconf) - Only required to detect mDNS-enabled printers +* [Uranium](https://github.com/Ultimaker/Uranium) Cura is built on top of the Uranium framework. +* [CuraEngine](https://github.com/Ultimaker/CuraEngine) This will be needed at runtime to perform the actual slicing. +* [PySerial](https://github.com/pyserial/pyserial) Only required for USB printing support. +* [python-zeroconf](https://github.com/jstasiak/python-zeroconf) Only required to detect mDNS-enabled printers Configuring Cura ---------------- @@ -44,33 +33,15 @@ location = /[path_to_the..]/CuraEngine/build/CuraEngine Build scripts ------------- - Please checkout [cura-build](https://github.com/Ultimaker/cura-build) -Third party plugins +Plugins ------------- -* [Post Processing Plugin](https://github.com/nallath/PostProcessingPlugin): Allows for post-processing scripts to run on g-code. -* [Barbarian Plugin](https://github.com/nallath/BarbarianPlugin): Simple scale tool for imperial to metric. -* [X3G Writer](https://github.com/Ghostkeeper/X3GWriter): Adds support for exporting X3G files. -* [Auto orientation](https://github.com/nallath/CuraOrientationPlugin): Calculate the optimal orientation for a model. -* [OctoPrint Plugin](https://github.com/fieldofview/OctoPrintPlugin): Send printjobs directly to OctoPrint and monitor their progress in Cura. -* [Electric Print Cost Calculator Plugin](https://github.com/zoff99/ElectricPrintCostCalculator): Calculate the electric costs of a print. +Please check our [Wiki](https://github.com/Ultimaker/Cura/wiki/Plugin-Directory) for details about creating and using plugins. -Making profiles for other printers ----------------------------------- -If your make of printer is not in the list of supported printers, and using the "Custom FDM Printer" does not offer enough flexibility, you can use [this](https://github.com/Ultimaker/Cura/blob/master/resources/definitions/ultimaker_original.def.json) as a template. - -* Change the machine ID to something unique -* Change the machine_name to your printer's name -* If you have a 3D model of your platform you can put it in resources/meshes and put its name under platform -* Set your machine's dimensions with machine_width, machine_depth, and machine_height -* If your printer's origin is in the center of the bed, set machine_center_is_zero to true. -* Set your print head dimensions with the machine_head_shape parameters -* Set the start and end gcode in machine_start_gcode and machine_end_gcode - -Once you are done, put the profile you have made into resources/definitions, or in definitions in your cura profile folder. - -If you want to make a definition for a multi-extrusion printer, have a look at [this](https://github.com/Ultimaker/Cura/blob/master/resources/definitions/ultimaker_original_dual.def.json) as a template, along with the two extruder definitions it references [here](https://github.com/Ultimaker/Cura/blob/master/resources/extruders/ultimaker_original_dual_1st.def.json) and [here](https://github.com/Ultimaker/Cura/blob/master/resources/extruders/ultimaker_original_dual_2nd.def.json) +Supported printers +------------- +Please check our [Wiki](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura/_edit) for guidelines about adding support for new machines. Translating Cura ---------------- From 16ce1e870e782e974c94255967131895d0c64a9c Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 20:57:43 +0100 Subject: [PATCH 641/764] Create GitHub issue template Might help streamlining issue creation and handling. --- .github/ISSUE_TEMPLATE.md | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..7bdf35455c --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,32 @@ + + +Application Version: + + +Platform: + + +Qt: + + +PyQt: + + +Display Driver: + + +Steps to Reproduce: + + +Actual Results: + + +Expected results: + + +Additional Information: + From 06512e53acf1d2d2c587098fa0c315bc1d459987 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 21:16:11 +0100 Subject: [PATCH 642/764] Move configuration options info to a wiki page As all other info was there already. --- README.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a94ca853e6..e620e6dd6f 100644 --- a/README.md +++ b/README.md @@ -23,25 +23,21 @@ Dependencies * [PySerial](https://github.com/pyserial/pyserial) Only required for USB printing support. * [python-zeroconf](https://github.com/jstasiak/python-zeroconf) Only required to detect mDNS-enabled printers -Configuring Cura ----------------- -Link your CuraEngine backend by inserting the following lines in `$HOME/.config/cura/config.cfg` : -``` -[backend] -location = /[path_to_the..]/CuraEngine/build/CuraEngine -``` - Build scripts ------------- -Please checkout [cura-build](https://github.com/Ultimaker/cura-build) +Please checkout [cura-build](https://github.com/Ultimaker/cura-build) for detailed building instructions. Plugins ------------- -Please check our [Wiki](https://github.com/Ultimaker/Cura/wiki/Plugin-Directory) for details about creating and using plugins. +Please check our [Wiki page](https://github.com/Ultimaker/Cura/wiki/Plugin-Directory) for details about creating and using plugins. Supported printers ------------- -Please check our [Wiki](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura/_edit) for guidelines about adding support for new machines. +Please check our [Wiki page](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura/_edit) for guidelines about adding support for new machines. + +Configuring Cura +---------------- +Please check out [Wiki page](https://github.com/Ultimaker/Cura/wiki/Cura-Settings) about configuration options for developers. Translating Cura ---------------- From 80880a871f956e00076c20aac6f52d5fdf1b2803 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 21:17:37 +0100 Subject: [PATCH 643/764] Fixed legacy cura repo link. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e620e6dd6f..80f4968cdd 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ Cura ==== -This is the new, shiny frontend for Cura. [daid/Cura](https://github.com/daid/Cura.git) is the old legacy Cura that everyone knows and loves/hates. We re-worked the whole GUI code at Ultimaker, because the old code started to become unmaintainable. +This is the new, shiny frontend for Cura. Check [daid/LegacyCura](https://github.com/daid/LegacyCura) for the legacy Cura that everyone knows and loves/hates. We re-worked the whole GUI code at Ultimaker, because the old code started to become unmaintainable. Logging Issues ------------ From c58b11611152ba2ffa4622c8635379652c689ef9 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 21:22:42 +0100 Subject: [PATCH 644/764] Added a license reference to the readme As is custom on most GitHub repositories. --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 80f4968cdd..363ff52876 100644 --- a/README.md +++ b/README.md @@ -60,3 +60,7 @@ To submit your translation, ideally you would make two pull requests where all ` After the translation is submitted, the Cura maintainers will check for its completeness and check whether it is consistent. We will take special care to look for common mistakes, such as translating mark-up `` code and such. We are often not fluent in every language, so we expect the translator and the international users to make corrections where necessary. Of course, there will always be some mistakes in every translation. When the next Cura release comes around, some of the texts will have changed and some new texts will have been added. Around the time when the beta is released we will invoke a string freeze, meaning that no developer is allowed to make changes to the texts. Then we will update the translation template `.pot` files and ask all our translators to update their translations. If you are unable to update the translation in time for the actual release, we will remove the language from the drop-down menu in the Preferences window. The translation stays in Cura however, so that someone might pick it up again later and update it with the newest texts. Also, users who had previously selected the language can still continue Cura in their language but English text will appear among the original text. + +License +---------------- +Cura is released under the terms of the LGPLv3 or higher. A copy of this license should be included with the software. From 47822148937705af14cccac049f1791119ccb11e Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 18 Dec 2017 23:18:22 +0100 Subject: [PATCH 645/764] Fix adding printer support wiki link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 363ff52876..6ea839a300 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Please check our [Wiki page](https://github.com/Ultimaker/Cura/wiki/Plugin-Direc Supported printers ------------- -Please check our [Wiki page](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura/_edit) for guidelines about adding support for new machines. +Please check our [Wiki page](https://github.com/Ultimaker/Cura/wiki/Adding-new-machine-profiles-to-Cura) for guidelines about adding support for new machines. Configuring Cura ---------------- From 7a3d05ae8a96976d8acc94d81a56e3c1cf966b21 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 19 Dec 2017 09:20:53 +0100 Subject: [PATCH 646/764] Ignore new plugins --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 8d9ba4b2d2..88c4d5b6eb 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ plugins/CuraVariSlicePlugin plugins/CuraLiveScriptingPlugin plugins/CuraPrintProfileCreator plugins/OctoPrintPlugin +plugins/CuraCloudPlugin #Build stuff CMakeCache.txt From b3758be12e7567ccaffcd56d3e607124cf6d46d4 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 19 Dec 2017 11:55:08 +0100 Subject: [PATCH 647/764] Fix selecting cura connect printer preference --- plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 853ef72f72..7143b462e6 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -234,7 +234,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte def spawnPrintView(self): if self._print_view is None: path = os.path.join(self._plugin_path, "PrintWindow.qml") - self._print_view = Application.getInstance().createQmlComponent(path, {"OutputDevice", self}) + self._print_view = Application.getInstance().createQmlComponent(path, {"OutputDevice": self}) if self._print_view is not None: self._print_view.show() From fd6d3e76a3754dae14f83a45d20685b4ddae6062 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 19 Dec 2017 13:17:53 +0100 Subject: [PATCH 648/764] Simplified upgrade funtion, typos, check extruder count CURA-4708 --- .../VersionUpgrade30to31.py | 123 +++++++++--------- 1 file changed, 59 insertions(+), 64 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c01ff158b1..c350dadefe 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -129,12 +129,17 @@ class VersionUpgrade30to31(VersionUpgrade): if parser.has_option("values", "machine_nozzle_size"): machine_nozzle_size = parser["values"]["machine_nozzle_size"] - definition_name = parser["general"]["name"] - machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) + machine_extruder_count = '1' # by default it is 1 and the value cannot be stored in the global stack + if parser.has_option("values", "machine_extruder_count"): + machine_extruder_count = parser["values"]["machine_extruder_count"] - #For single extuder machine we nee only first extruder - if len(machine_extruders) !=0: - if self._updateSingleExtuderDefinitionFile(machine_extruders, machine_nozzle_size): + if machine_extruder_count == '1': + definition_name = parser["general"]["name"] + machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) + + # For single extruder machine we need only first extruder + if len(machine_extruders) !=0: + self._updateSingleExtruderDefinitionFile(machine_extruders, machine_nozzle_size) parser.remove_option("values", "machine_nozzle_size") # Update version numbers @@ -219,9 +224,9 @@ class VersionUpgrade30to31(VersionUpgrade): machine_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.MachineStack) - machine_instances = [] + machine_instance_id = None - #Find all machine instances + # Find machine instances for item in os.listdir(machine_instances_dir): file_path = os.path.join(machine_instances_dir, item) if not os.path.isfile(file_path): @@ -242,57 +247,51 @@ class VersionUpgrade30to31(VersionUpgrade): if not parser.has_option("general", "id"): continue - machine_instances.append(parser) - - #Find for extruders - extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) - #"machine",[extruders] - extruder_instances_per_machine = {} - - #Find all custom extruders for founded machines - for item in os.listdir(extruders_instances_dir): - file_path = os.path.join(extruders_instances_dir, item) - if not os.path.isfile(file_path): + id = parser["general"]["id"] + if id + "_settings" != definition_name: continue - - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read([file_path]) - except: - # skip, it is not a valid stack file - continue - - if not parser.has_option("metadata", "type"): - continue - if "extruder_train" != parser["metadata"]["type"]: - continue - - if not parser.has_option("metadata", "machine"): - continue - if not parser.has_option("metadata", "position"): - continue - - - for machine_instace in machine_instances: - - machine_id = machine_instace["general"]["id"] - if machine_id != parser["metadata"]["machine"]: - continue - - if machine_id + "_settings" != definition_name: - continue - - if extruder_instances_per_machine.get(machine_id) is None: - extruder_instances_per_machine.update({machine_id:[]}) - - extruder_instances_per_machine.get(machine_id).append(parser) - #the extruder can be related only to one machine + else: + machine_instance_id = id break - return extruder_instances_per_machine + if machine_instance_id is not None: - #Find extruder defition at index 0 and update its values - def _updateSingleExtuderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): + extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) + #"machine",[extruders] + extruder_instances = [] + + # Find all custom extruders for found machines + for item in os.listdir(extruders_instances_dir): + file_path = os.path.join(extruders_instances_dir, item) + if not os.path.isfile(file_path): + continue + + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "extruder_train" != parser["metadata"]["type"]: + continue + + if not parser.has_option("metadata", "machine"): + continue + if not parser.has_option("metadata", "position"): + continue + + if machine_instance_id != parser["metadata"]["machine"]: + continue + + extruder_instances.append(parser) + + return extruder_instances + + # Find extruder definition at index 0 and update its values + def _updateSingleExtruderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): defintion_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer) @@ -312,19 +311,15 @@ class VersionUpgrade30to31(VersionUpgrade): continue name = parser["general"]["name"] custom_extruder_at_0_position = None - for machine_extruders in extruder_instances_per_machine: - for extruder_instance in extruder_instances_per_machine[machine_extruders]: + for extruder_instance in extruder_instances_per_machine: - if extruder_instance["general"]["id"] + "_settings" == name: - defition_position = extruder_instance["metadata"]["position"] + definition_position = extruder_instance["metadata"]["position"] - if defition_position == "0": - custom_extruder_at_0_position = extruder_instance - break - if custom_extruder_at_0_position is not None: + if definition_position == "0": + custom_extruder_at_0_position = extruder_instance break - #If not null, then parsed file is for first extuder and then can be updated. I need to update only + # If not null, then parsed file is for first extuder and then can be updated. I need to update only # first, because this update for single extuder machine if custom_extruder_at_0_position is not None: @@ -374,4 +369,4 @@ class VersionUpgrade30to31(VersionUpgrade): quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w") as f: - f.write(extruder_quality_changes_output.getvalue()) + f.write(extruder_quality_changes_output.getvalue()) \ No newline at end of file From c5e33e45a427bb25ddb10c632c788d3d8d05d4b7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 13:24:20 +0100 Subject: [PATCH 649/764] Fix setting definition if importing profile without printer-specific profiles Fixes a crash. --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 43e2e072b0..9a19d35c60 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -305,7 +305,7 @@ class CuraContainerRegistry(ContainerRegistry): quality_type_criteria["definition"] = profile.getDefinition().getId() else: - profile.setDefinition(fdmprinter) + profile.setDefinition("fdmprinter") quality_type_criteria["definition"] = "fdmprinter" machine_definition = Application.getInstance().getGlobalContainerStack().getBottom() From 569715492c67c6659e3950b2399f84398beb5429 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 16:05:42 +0100 Subject: [PATCH 650/764] Correct ID if importing multiple legacy profiles They have to be made unique. Contributes to issue CURA-4715. --- plugins/LegacyProfileReader/LegacyProfileReader.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 32cfb5d027..a0d1442ad8 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -1,4 +1,4 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import configparser # For reading the legacy profile INI files. @@ -10,6 +10,7 @@ import os.path # For concatenating the path to the plugin and the relative path from UM.Application import Application # To get the machine manager to create the new profile in. from UM.Logger import Logger # Logging errors. from UM.PluginRegistry import PluginRegistry # For getting the path to this plugin's directory. +from UM.Settings.ContainerRegistry import ContainerRegistry #To create unique profile IDs. from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make. from cura.ProfileReader import ProfileReader # The plug-in type to implement. @@ -77,7 +78,9 @@ class LegacyProfileReader(ProfileReader): raise Exception("Unable to import legacy profile. Multi extrusion is not supported") Logger.log("i", "Importing legacy profile from file " + file_name + ".") - profile = InstanceContainer("Imported Legacy Profile") # Create an empty profile. + container_registry = ContainerRegistry.getInstance() + profile_id = container_registry.uniqueName("Imported Legacy Profile") + profile = InstanceContainer(profile_id) # Create an empty profile. parser = configparser.ConfigParser(interpolation = None) try: @@ -120,7 +123,7 @@ class LegacyProfileReader(ProfileReader): if "translation" not in dict_of_doom: Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") return None - current_printer_definition = global_container_stack.getBottom() + current_printer_definition = global_container_stack.definition profile.setDefinition(current_printer_definition.getId()) for new_setting in dict_of_doom["translation"]: # Evaluate all new settings that would get a value from the translations. old_setting_expression = dict_of_doom["translation"][new_setting] @@ -139,12 +142,12 @@ class LegacyProfileReader(ProfileReader): if len(profile.getAllKeys()) == 0: Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.") - # We need to downgrade the container to version 1 (in Cura 2.1) so the upgrade system can correctly upgrade # it to the latest version. profile.addMetaDataEntry("type", "profile") # don't know what quality_type it is based on, so use "normal" by default profile.addMetaDataEntry("quality_type", "normal") + profile.setName("Imported Legacy Profile") profile.setDirty(True) parser = configparser.ConfigParser(interpolation=None) From 039c85677a0c8eec71236eaddd52c60b7ef4c94a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 16:40:03 +0100 Subject: [PATCH 651/764] Also return a global profile Since we always have an extruder now, also for single-extrusion printers, we need to return both a global profile and an extruder profile. Contributes to issue CURA-4713. --- plugins/LegacyProfileReader/LegacyProfileReader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index a0d1442ad8..62ac12dc18 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -162,4 +162,8 @@ class LegacyProfileReader(ProfileReader): data = stream.getvalue() profile.deserialize(data) - return profile + global_container_id = container_registry.uniqueName("Global Imported Legacy Profile") + global_profile = profile.duplicate(new_id = global_container_id, new_name = "Imported Legacy Profile") #Needs to have the same name as the extruder profile. + global_profile.setDirty(True) + + return [global_profile, profile] From c6a2b1b9c9053b30f4820300ad027ec87e616300 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:08:51 +0100 Subject: [PATCH 652/764] Ignore any additional stacks in imported profile When you import a multi-extrusion file into a single-extrusion printer, don't crash but simply ignore the additional stacks. Contributes to issue CURA-4715. --- cura/Settings/CuraContainerRegistry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 9a19d35c60..f510a9fca9 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -252,6 +252,9 @@ class CuraContainerRegistry(ContainerRegistry): profile.setMetaDataEntry("extruder", extruder_id) profile_id = (extruder_id + "_" + name_seed).lower().replace(" ", "_") + else: #More extruders in the imported file than in the machine. + continue #Delete the additional profiles. + result = self._configureProfile(profile, profile_id, new_name) if result is not None: return {"status": "error", "message": catalog.i18nc( From 05e232b498514f20a11fbbfc0f8ca2fe932d44d9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:16:32 +0100 Subject: [PATCH 653/764] Move LegacyProfileReader-specific logic into the plug-in itself This had the documentation that it should edit the profiles returned by LegacyProfileReader. Instead, just return correct profiles from the reader... Contributes to issue CURA-4715. --- cura/Settings/CuraContainerRegistry.py | 19 ------------------- .../LegacyProfileReader.py | 16 ++++++++++++++-- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index f510a9fca9..26d3484a9f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -218,25 +218,6 @@ class CuraContainerRegistry(ContainerRegistry): if type(profile_or_list) is not list: profile_or_list = [profile_or_list] - if len(profile_or_list) == 1: - # If there is only 1 stack file it means we're loading a legacy (pre-3.1) .curaprofile. - # In that case we find the per-extruder settings and put those in a new quality_changes container - # so that it is compatible with the new stack setup. - profile = profile_or_list[0] - extruder_stack_quality_changes_container = ContainerManager.getInstance().duplicateContainerInstance(profile) - extruder_stack_quality_changes_container.addMetaDataEntry("extruder", "fdmextruder") - - for quality_changes_setting_key in extruder_stack_quality_changes_container.getAllKeys(): - settable_per_extruder = extruder_stack_quality_changes_container.getProperty(quality_changes_setting_key, "settable_per_extruder") - if settable_per_extruder: - profile.removeInstance(quality_changes_setting_key, postpone_emit = True) - else: - extruder_stack_quality_changes_container.removeInstance(quality_changes_setting_key, postpone_emit = True) - - # We add the new container to the profile list so things like extruder positions are taken care of - # in the next code segment. - profile_or_list.append(extruder_stack_quality_changes_container) - # Import all profiles for profile_index, profile in enumerate(profile_or_list): if profile_index == 0: diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 62ac12dc18..5f80379e49 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -13,6 +13,7 @@ from UM.PluginRegistry import PluginRegistry # For getting the path to this plu from UM.Settings.ContainerRegistry import ContainerRegistry #To create unique profile IDs. from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make. from cura.ProfileReader import ProfileReader # The plug-in type to implement. +from cura.Settings.ExtruderManager import ExtruderManager #To get the current extruder definition. ## A plugin that reads profile data from legacy Cura versions. @@ -142,14 +143,13 @@ class LegacyProfileReader(ProfileReader): if len(profile.getAllKeys()) == 0: Logger.log("i", "A legacy profile was imported but everything evaluates to the defaults, creating an empty profile.") - # We need to downgrade the container to version 1 (in Cura 2.1) so the upgrade system can correctly upgrade - # it to the latest version. profile.addMetaDataEntry("type", "profile") # don't know what quality_type it is based on, so use "normal" by default profile.addMetaDataEntry("quality_type", "normal") profile.setName("Imported Legacy Profile") profile.setDirty(True) + #Serialise and deserialise in order to perform the version upgrade. parser = configparser.ConfigParser(interpolation=None) data = profile.serialize() parser.read_string(data) @@ -162,8 +162,20 @@ class LegacyProfileReader(ProfileReader): data = stream.getvalue() profile.deserialize(data) + #We need to return one extruder stack and one global stack. global_container_id = container_registry.uniqueName("Global Imported Legacy Profile") global_profile = profile.duplicate(new_id = global_container_id, new_name = "Imported Legacy Profile") #Needs to have the same name as the extruder profile. global_profile.setDirty(True) + #Only the extruder stack has an extruder metadata entry. + profile.addMetaDataEntry("extruder", ExtruderManager.getInstance().getActiveExtruderStack().definition) + + #Split all settings into per-extruder and global settings. + for setting_key in profile.getAllKeys(): + settable_per_extruder = global_container_stack.getProperty(setting_key, "settable_per_extruder") + if settable_per_extruder: + global_profile.removeInstance(setting_key) + else: + profile.removeInstance(setting_key) + return [global_profile, profile] From fc784021460c04d51026a898a173ea7de108855b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 19 Dec 2017 17:26:30 +0100 Subject: [PATCH 654/764] CURA-4726 Using a string for the per object stack id instead of the id of the instance (that is an integer) because the new ContainerRegistry searches by string --- cura/Settings/SettingOverrideDecorator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index c70d9343cf..acd161c6a6 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -32,14 +32,14 @@ class SettingOverrideDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - self._stack = PerObjectContainerStack(stack_id = id(self)) + self._stack = PerObjectContainerStack(stack_id = "per_object_stack") self._stack.setDirty(False) # This stack does not need to be saved. self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() self._stack.propertyChanged.connect(self._onSettingChanged) - ContainerRegistry.getInstance().addContainer(self._stack) + Application.getInstance().getContainerRegistry().addContainer(self._stack) Application.getInstance().globalContainerStackChanged.connect(self._updateNextStack) self.activeExtruderChanged.connect(self._updateNextStack) From d9bc561d7398f95939208fe25d1f9d38663b7db4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:28:05 +0100 Subject: [PATCH 655/764] Set the extruder metadata to its ID Not the actual extruder! Contributes to issue CURA-4715. --- plugins/LegacyProfileReader/LegacyProfileReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 5f80379e49..84fbeccb50 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -168,7 +168,7 @@ class LegacyProfileReader(ProfileReader): global_profile.setDirty(True) #Only the extruder stack has an extruder metadata entry. - profile.addMetaDataEntry("extruder", ExtruderManager.getInstance().getActiveExtruderStack().definition) + profile.addMetaDataEntry("extruder", ExtruderManager.getInstance().getActiveExtruderStack().definition.getId()) #Split all settings into per-extruder and global settings. for setting_key in profile.getAllKeys(): From 21d46d73b5e69eb0c3b5143e7a3e57c239c567c0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:30:10 +0100 Subject: [PATCH 656/764] Add new CAD plugins --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 88c4d5b6eb..510fbfe006 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,8 @@ plugins/CuraLiveScriptingPlugin plugins/CuraPrintProfileCreator plugins/OctoPrintPlugin plugins/CuraCloudPlugin +plugins/CuraBlenderPlugin +plugins/CuraOpenSCADPlugin #Build stuff CMakeCache.txt From 85debb2577ba2493fc59324b3e22ece072a4e798 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:31:36 +0100 Subject: [PATCH 657/764] Sort list of plugins alphabetically --- .gitignore | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 510fbfe006..71e83433cf 100644 --- a/.gitignore +++ b/.gitignore @@ -33,23 +33,23 @@ cura.desktop .settings #Externally located plug-ins. -plugins/CuraSolidWorksPlugin -plugins/Doodle3D-cura-plugin -plugins/GodMode -plugins/PostProcessingPlugin -plugins/X3GWriter -plugins/FlatProfileExporter -plugins/ProfileFlattener -plugins/cura-god-mode-plugin plugins/cura-big-flame-graph +plugins/cura-god-mode-plugin plugins/cura-siemensnx-plugin -plugins/CuraVariSlicePlugin -plugins/CuraLiveScriptingPlugin -plugins/CuraPrintProfileCreator -plugins/OctoPrintPlugin -plugins/CuraCloudPlugin plugins/CuraBlenderPlugin +plugins/CuraCloudPlugin +plugins/CuraLiveScriptingPlugin plugins/CuraOpenSCADPlugin +plugins/CuraPrintProfileCreator +plugins/CuraSolidWorksPlugin +plugins/CuraVariSlicePlugin +plugins/Doodle3D-cura-plugin +plugins/FlatProfileExporter +plugins/GodMode +plugins/OctoPrintPlugin +plugins/PostProcessingPlugin +plugins/ProfileFlattener +plugins/X3GWriter #Build stuff CMakeCache.txt From 8734460aff01d2a6e7e8f24cf22b88e23442c291 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 17:36:20 +0100 Subject: [PATCH 658/764] Use unique name too if importing multiple legacy profiles Otherwise all of them get the same name and they don't match global/extruder stacks together properly any more. Contributes to issue CURA-4715. --- plugins/LegacyProfileReader/LegacyProfileReader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 84fbeccb50..07cd8b0aad 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -146,7 +146,7 @@ class LegacyProfileReader(ProfileReader): profile.addMetaDataEntry("type", "profile") # don't know what quality_type it is based on, so use "normal" by default profile.addMetaDataEntry("quality_type", "normal") - profile.setName("Imported Legacy Profile") + profile.setName(profile_id) profile.setDirty(True) #Serialise and deserialise in order to perform the version upgrade. @@ -164,7 +164,7 @@ class LegacyProfileReader(ProfileReader): #We need to return one extruder stack and one global stack. global_container_id = container_registry.uniqueName("Global Imported Legacy Profile") - global_profile = profile.duplicate(new_id = global_container_id, new_name = "Imported Legacy Profile") #Needs to have the same name as the extruder profile. + global_profile = profile.duplicate(new_id = global_container_id, new_name = profile_id) #Needs to have the same name as the extruder profile. global_profile.setDirty(True) #Only the extruder stack has an extruder metadata entry. From 8af52fb61b8a3f5efafb827553ae09d682b48485 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 19 Dec 2017 19:44:04 +0100 Subject: [PATCH 659/764] CURA-4726 Creating unique name for the per object stack. Keep the prefix so it is easy to trace when debugging instead of just a number --- cura/Settings/SettingOverrideDecorator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index acd161c6a6..df19f88a26 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -32,7 +32,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - self._stack = PerObjectContainerStack(stack_id = "per_object_stack") + self._stack = PerObjectContainerStack(stack_id = "per_object_stack_" + str(id(self))) self._stack.setDirty(False) # This stack does not need to be saved. self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() From 1a6a6f74d5e705dc92e776b9b5feaf4430a645b1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 12:19:01 +0100 Subject: [PATCH 660/764] Fix SettingOverrideDecorator for non printing meshes CURA-4705 - Do not set a "secret" property in the SceneNode to indicate whether a node is a non-printing-mesh because SceneNode will not copy that property during a deepcopy. Store it in the SettingOverrideDecorator and make it accessible through a decorator call - Try to trigger an auto-slice AFTER the non-printing-meshes flag is updated, not before. --- cura/Settings/SettingOverrideDecorator.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index df19f88a26..135b16116f 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -37,6 +37,8 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer")) self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() + self._is_non_printing_mesh = False + self._stack.propertyChanged.connect(self._onSettingChanged) Application.getInstance().getContainerRegistry().addContainer(self._stack) @@ -57,6 +59,8 @@ class SettingOverrideDecorator(SceneNodeDecorator): # Properly set the right extruder on the copy deep_copy.setActiveExtruder(self._extruder_stack) + deep_copy._is_non_printing_mesh = self._is_non_printing_mesh + return deep_copy ## Gets the currently active extruder to print this object with. @@ -80,14 +84,17 @@ class SettingOverrideDecorator(SceneNodeDecorator): container_stack = containers[0] return container_stack.getMetaDataEntry("position", default=None) + def isNonPrintingMesh(self): + return self._is_non_printing_mesh + def _onSettingChanged(self, instance, property_name): # Reminder: 'property' is a built-in function # Trigger slice/need slicing if the value has changed. if property_name == "value": + self._is_non_printing_mesh = any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_printing_mesh_settings) + Application.getInstance().getBackend().needsSlicing() Application.getInstance().getBackend().tickle() - self._node._non_printing_mesh = any(self._stack.getProperty(setting, "value") for setting in self._non_printing_mesh_settings) - ## Makes sure that the stack upon which the container stack is placed is # kept up to date. def _updateNextStack(self): From b2ac2e0fc79b609b22b6412f635673ecc53be4fc Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 12:22:39 +0100 Subject: [PATCH 661/764] Trust the stack values more than the decorator CURA-4705 A SceneNode and its decorators can be deepcopied. However, the data in some decorators will only be updated when a per-object settings stack triggers a property changed event. That event cannot copied. So, it can happen that a deepcopied SceneNode has inconsistent data in some of its decorators than what's in the per-object settings stack. --- plugins/CuraEngineBackend/StartSliceJob.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index efa0e87b9e..f12b8e656f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -19,6 +19,10 @@ from UM.Settings.SettingRelation import RelationType from cura.OneAtATimeIterator import OneAtATimeIterator from cura.Settings.ExtruderManager import ExtruderManager + +NON_PRINTING_MESH_SETTINGS = ["anti_overhang_mesh", "infill_mesh", "cutting_mesh"] + + class StartJobResult(IntEnum): Finished = 1 Error = 2 @@ -133,11 +137,13 @@ class StartSliceJob(Job): temp_list = [] has_printing_mesh = False for node in DepthFirstIterator(self._scene.getRoot()): - if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - _non_printing_mesh = getattr(node, "_non_printing_mesh", False) - if not getattr(node, "_outside_buildarea", False) or _non_printing_mesh: + if node.callDecoration("isSliceable") and type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: + per_object_stack = node.callDecoration("getStack") + is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) + + if not getattr(node, "_outside_buildarea", False) or not is_non_printing_mesh: temp_list.append(node) - if not _non_printing_mesh: + if not is_non_printing_mesh: has_printing_mesh = True Job.yieldThread() From 61dd1c98fde94a6b1feb8f001aac8c1e02ab8f7f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:16:29 +0100 Subject: [PATCH 662/764] Fix cases with no per-object settings stack CURA-4705 --- plugins/CuraEngineBackend/StartSliceJob.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index f12b8e656f..4da26aa78f 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -139,7 +139,9 @@ class StartSliceJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("isSliceable") and type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: per_object_stack = node.callDecoration("getStack") - is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) + is_non_printing_mesh = False + if per_object_stack: + is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) if not getattr(node, "_outside_buildarea", False) or not is_non_printing_mesh: temp_list.append(node) From 4f28dec8845d7666b9e920a6f0e0300dcf553f3b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:19:48 +0100 Subject: [PATCH 663/764] Fix typo --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 16fd2ee93c..26901c3abc 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -583,7 +583,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if machine_id: new_machine_id = self.getNewId(machine_id) new_id = new_machine_id + "_current_settings" - instance_container.setMetadataEntry("id", new_id) + instance_container.setMetaDataEntry("id", new_id) instance_container.setName(new_id) instance_container.setMetaDataEntry("machine", new_machine_id) containers_to_add.append(instance_container) From 196bffd3ad6fd026a5e9bc5a04ff570160aeff6e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:20:22 +0100 Subject: [PATCH 664/764] Only try to get a new unique name when it already exists CURA-4704 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 26901c3abc..a7dad68519 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -461,7 +461,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): global_stack_id_new = self.getNewId(global_stack_id_original) global_stack_need_rename = True - global_stack_name_new = self._container_registry.uniqueName(global_stack_name_original) + if self._container_registry.findContainerStacksMetadata(name = global_stack_id_original): + global_stack_name_new = self._container_registry.uniqueName(global_stack_name_original) for each_extruder_stack_file in extruder_stack_files: old_container_id = self._stripFileToId(each_extruder_stack_file) From 588335c6db112e82810bb421832374538221deef Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:42:55 +0100 Subject: [PATCH 665/764] Make sure only single-extrusion machines will be fixed CURA-4713 --- cura/Settings/CuraContainerRegistry.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 26d3484a9f..089d513071 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -406,6 +406,10 @@ class CuraContainerRegistry(ContainerRegistry): if not isinstance(container, ContainerStack) or container.getMetaDataEntry("type") != "machine": return + machine_extruder_trains = container.getMetaDataEntry("machine_extruder_trains") + if machine_extruder_trains is not None and machine_extruder_trains != {"0": "fdmextruder"}: + return + extruder_stacks = self.findContainerStacks(type = "extruder_train", machine = container.getId()) if not extruder_stacks: self.addExtruderStackForSingleExtrusionMachine(container, "fdmextruder") From 49ee2a543e9b1f790db9b7ded62a9b0c05323a04 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:57:48 +0100 Subject: [PATCH 666/764] Fix code style --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index b36fb989f0..fd1aa2c7b0 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -432,7 +432,7 @@ Cura.MachineAction property int areaHeight: parent.height - y property string settingKey: "machine_extruder_start_code" property bool isExtruderSetting: true - } + } } Column { height: parent.height @@ -714,7 +714,7 @@ Cura.MachineAction width: gcodeArea.width text: _tooltip - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting + property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip UM.SettingPropertyProvider From 6d06d184076af5174516e61c0a72080c097b28e0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 13:58:02 +0100 Subject: [PATCH 667/764] Fix Extruder tabs in MachineSettings dialog CURA-4722 The extruder field views should be bound to the actual extruder, not the active extruder. --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index fd1aa2c7b0..da3de4f4fc 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -726,7 +726,7 @@ Cura.MachineAction { if(settingsTabs.currentIndex > 0) { - return Cura.MachineManager.activeStackId; + return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; } return ""; } From ae86a838e0d228503131d191c621aed06da9dbf6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 16:23:39 +0100 Subject: [PATCH 668/764] Update extruder count model in MachineSettings dialog CURA-4722 --- .../MachineSettingsAction.qml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index da3de4f4fc..6ff70a1503 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -270,6 +270,20 @@ Cura.MachineAction } } } + + Connections + { + target: manager + onDefinedExtruderCountChanged: + { + extruderCountModel.clear(); + for(var i = 0; i < manager.definedExtruderCount; ++i) + { + extruderCountModel.append({text: String(i + 1), value: i}); + } + } + } + currentIndex: machineExtruderCountProvider.properties.value - 1 onActivated: { From 107f6aff786157016e622964abb2675b09f2c311 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 20 Dec 2017 16:48:57 +0100 Subject: [PATCH 669/764] Fix SolidView to use isNonPrintingMesh decorator call CURA-4705 --- plugins/SolidView/SolidView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index e96c7e9bda..e156e655ce 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -110,7 +110,7 @@ class SolidView(View): except ValueError: pass - if getattr(node, "_non_printing_mesh", False): + if node.callDecoration("isNonPrintingMesh"): if per_mesh_stack and (per_mesh_stack.getProperty("infill_mesh", "value") or per_mesh_stack.getProperty("cutting_mesh", "value")): renderer.queueNode(node, shader = self._non_printing_shader, uniforms = uniforms, transparent = True) else: From 419dc6f59a9aa8148b03ccec03be4adf1fe3eb79 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 21 Dec 2017 09:14:31 +0100 Subject: [PATCH 670/764] Improve issue template a bit --- .github/ISSUE_TEMPLATE.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 7bdf35455c..b78b9b91a2 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,32 +1,36 @@ -Application Version: +**Application Version** -Platform: +**Platform** -Qt: +**Qt** -PyQt: +**PyQt** -Display Driver: +**Display Driver** -Steps to Reproduce: +**Steps to Reproduce** -Actual Results: +**Actual Results** -Expected results: +**Expected results** -Additional Information: +**Additional Information** From 0a0db39f0288afe188cfc66e43a0484bb5b057f7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 21 Dec 2017 09:27:05 +0100 Subject: [PATCH 671/764] deepcopy value from the stack CURA-4705 --- cura/Settings/SettingOverrideDecorator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 135b16116f..b853c06c8e 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -59,7 +59,9 @@ class SettingOverrideDecorator(SceneNodeDecorator): # Properly set the right extruder on the copy deep_copy.setActiveExtruder(self._extruder_stack) - deep_copy._is_non_printing_mesh = self._is_non_printing_mesh + # use value from the stack because there can be a delay in signal triggering and "_is_non_printing_mesh" + # has not been updated yet. + deep_copy._is_non_printing_mesh = any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_printing_mesh_settings) return deep_copy From 312bd137c221194a7cfa97db4117495ff9d3a529 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 11:03:32 +0100 Subject: [PATCH 672/764] Fix merge error, a variable got renamed. CURA-4525 --- cura/PrintInformation.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 72613fb7ef..60d3c11a49 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -74,7 +74,6 @@ class PrintInformation(QObject): Application.getInstance().globalContainerStackChanged.connect(self._updateJobName) Application.getInstance().fileLoaded.connect(self.setBaseName) - Application.getInstance().projectFileLoaded.connect(self.setProjectName) Application.getInstance().getBuildPlateModel().activeBuildPlateChanged.connect(self._onActiveBuildPlateChanged) Application.getInstance().workspaceLoaded.connect(self.setProjectName) From a47107448ef1476f94ed9406568d4dae24473670 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 11:39:37 +0100 Subject: [PATCH 673/764] Moved objects menu to lower left and made it collapsible. CURA-4525 --- .../ProcessSlicedLayersJob.py | 2 +- resources/qml/Cura.qml | 40 ++------------ resources/qml/ObjectsList.qml | 55 +++++++++++++------ resources/themes/cura-light/theme.json | 4 +- 4 files changed, 47 insertions(+), 54 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 077e81f8dc..5f632768ec 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -69,7 +69,7 @@ class ProcessSlicedLayersJob(Job): return self._build_plate_number def run(self): - Logger.log("d", "########## Processing new layer for [%s]..." % self._build_plate_number) + Logger.log("d", "Processing new layer for build plate %s..." % self._build_plate_number) start_time = time() view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "SimulationView": diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 9f3ccb67c5..ec9773679a 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -348,7 +348,6 @@ UM.MainWindow Button { id: openFileButton; - visible: !UM.Preferences.getValue("cura/use_multi_build_plate") text: catalog.i18nc("@action:button","Open File"); iconSource: UM.Theme.getIcon("load") style: UM.Theme.styles.tool_button @@ -362,25 +361,6 @@ UM.MainWindow action: Cura.Actions.open; } - Button - { - id: objectsButton; - visible: UM.Preferences.getValue("cura/use_multi_build_plate") - - text: catalog.i18nc("@action:button","Objects list"); - iconSource: UM.Theme.getIcon("plus") - style: UM.Theme.styles.tool_button - tooltip: ''; - anchors - { - top: topbar.bottom; - //top: openFileButton.bottom; - topMargin: UM.Theme.getSize("default_margin").height; - left: parent.left; - } - action: triggerObjectsList; - } - Toolbar { id: toolbar; @@ -389,32 +369,24 @@ UM.MainWindow property int mouseY: base.mouseY anchors { - top: objectsButton.bottom; + top: openFileButton.bottom; topMargin: UM.Theme.getSize("window_margin").height; left: parent.left; } } - Action - { - id: triggerObjectsList; - text: catalog.i18nc("@action:inmenu menubar:file","&Open File(s)..."); - iconName: "document-open"; - shortcut: StandardKey.Open; - onTriggered: objectsList.visible = !objectsList.visible; - } - ObjectsList { id: objectsList; - visible: false; - //z: -10; + visible: UM.Preferences.getValue("cura/use_multi_build_plate"); anchors { - top: objectsButton.top; - left: objectsButton.right; + bottom: parent.bottom; + left: parent.left; leftMargin: UM.Theme.getSize("default_margin").width; rightMargin: UM.Theme.getSize("default_margin").width; + topMargin: UM.Theme.getSize("default_margin").height; + bottomMargin: UM.Theme.getSize("default_margin").height; } } diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index bf7d92c4d6..e0e7e08820 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -19,25 +19,43 @@ Rectangle color: UM.Theme.getColor("tool_panel_background") width: UM.Theme.getSize("objects_menu_size").width - height: UM.Theme.getSize("objects_menu_size").height + height: { + if (collapsed) { + return UM.Theme.getSize("objects_menu_size_collapsed").height; + } else { + return UM.Theme.getSize("objects_menu_size").height; + } + } + + property bool collapsed: false; SystemPalette { id: palette } - Button - { - id: openFileButton; - text: catalog.i18nc("@action:button","Open File"); - iconSource: UM.Theme.getIcon("load") - style: UM.Theme.styles.tool_button - tooltip: ''; - anchors + Button { + id: collapseButton + anchors.top: parent.top + anchors.topMargin: Math.floor(UM.Theme.getSize("default_margin").height + (UM.Theme.getSize("layerview_row").height - UM.Theme.getSize("default_margin").height) / 2) + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + + onClicked: collapsed = !collapsed + + style: ButtonStyle { - top: parent.top; - topMargin: UM.Theme.getSize("default_margin").height; - left: parent.left; - leftMargin: UM.Theme.getSize("default_margin").height; + background: UM.RecolorImage + { + width: control.width + height: control.height + sourceSize.width: width + sourceSize.height: width + color: UM.Theme.getColor("setting_control_text") + source: collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom") + } + label: Label{ } } - action: Cura.Actions.open; } Component { @@ -86,11 +104,12 @@ Rectangle { id: objectsList frameVisible: true + visible: !collapsed width: parent.width - 2 * UM.Theme.getSize("default_margin").height anchors { - top: openFileButton.bottom; + top: collapseButton.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; @@ -118,10 +137,11 @@ Rectangle CheckBox { id: filterBuildPlateCheckbox + visible: !collapsed checked: boolCheck(UM.Preferences.getValue("view/filter_current_build_plate")) onClicked: UM.Preferences.setValue("view/filter_current_build_plate", checked) - text: catalog.i18nc("@option:check","Filter active build plate"); + text: catalog.i18nc("@option:check","See only current build plate"); anchors { @@ -133,7 +153,6 @@ Rectangle } } - Component { id: buildPlateDelegate Rectangle @@ -167,7 +186,7 @@ Rectangle { id: buildPlateSelection frameVisible: true - height: 100 + height: UM.Theme.getSize("build_plate_selection_size").height width: parent.width - 2 * UM.Theme.getSize("default_margin").height anchors diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index e7e1a377f5..714e578d97 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -393,6 +393,8 @@ "jobspecs_line": [2.0, 2.0], - "objects_menu_size": [20, 40] + "objects_menu_size": [17, 40], + "objects_menu_size_collapsed": [15, 15], + "build_plate_selection_size": [15, 5] } } From 1ca6fa0daa240f9bac2cf5a431bbb82d43473af7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 11:40:59 +0100 Subject: [PATCH 674/764] Different arrow for collapsing. CURA-4525 --- resources/qml/ObjectsList.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index e0e7e08820..95979961c0 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -52,7 +52,7 @@ Rectangle sourceSize.width: width sourceSize.height: width color: UM.Theme.getColor("setting_control_text") - source: collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom") + source: collapsed ? UM.Theme.getIcon("arrow_top") : UM.Theme.getIcon("arrow_bottom") } label: Label{ } } From 4b5097f99831fb49d0c4db3201bcd211225684a2 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 12:41:06 +0100 Subject: [PATCH 675/764] Objects menu now collapses animated and it has a border. CURA-4525 --- resources/qml/ObjectsList.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 95979961c0..b67c0c0bec 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -26,6 +26,10 @@ Rectangle return UM.Theme.getSize("objects_menu_size").height; } } + Behavior on height { NumberAnimation { duration: 100 } } + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") property bool collapsed: false; From eaa27114c63101a86d0546d1ff0b1ec336db9164 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 21 Dec 2017 12:43:50 +0100 Subject: [PATCH 676/764] Fix ID changing in project loading --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index a7dad68519..40d64590f5 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -682,12 +682,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): file_name = global_stack_file) # Ensure a unique ID and name - stack._id = global_stack_id_new - - # Extruder stacks are "bound" to a machine. If we add the machine as a new one, the id of the - # bound machine also needs to change. - if stack.getMetaDataEntry("machine", None): - stack.setMetaDataEntry("machine", global_stack_id_new) + stack.setMetaDataEntry("id", global_stack_id_new) # Only machines need a new name, stacks may be non-unique stack.setName(global_stack_name_new) @@ -741,7 +736,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): stack.deserialize(extruder_file_content, file_name = extruder_stack_file) # Ensure a unique ID and name - stack._id = new_id + stack.setMetaDataEntry("id", new_id) self._container_registry.addContainer(stack) extruder_stacks_added.append(stack) From c05e6b43fff33148ce75230441edacbd8b4d5895 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 13:11:32 +0100 Subject: [PATCH 677/764] Fixed platform physics. CURA-4525 --- cura/PlatformPhysics.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 23197dac24..cc2074cc3e 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -60,7 +60,7 @@ class PlatformPhysics: random.shuffle(nodes) for node in nodes: - if node is root or type(node) is not SceneNode or node.getBoundingBox() is None: + if node is root or not issubclass(type(node), SceneNode) or node.getBoundingBox() is None: continue bbox = node.getBoundingBox() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9d7cb62a8e..473dbee31a 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -213,7 +213,7 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced) num_objects = self._numObjects() if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0: - Logger.log("d", " ## Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) + Logger.log("d", "Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced) self._invokeSlice() return From 9f8eae006c77000f3d17c9cb3b4c5873ac6cec4d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 13:15:10 +0100 Subject: [PATCH 678/764] Fix push free. CURA-4525 --- cura/PlatformPhysics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index cc2074cc3e..5a57912db6 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -80,7 +80,7 @@ class PlatformPhysics: # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): # Ignore root, ourselves and anything that is not a normal SceneNode. - if other_node is root or type(other_node) is not SceneNode or other_node is node: + if other_node is root or not issubclass(type(other_node), SceneNode) or other_node is node: continue # Ignore collisions of a group with it's own children From 08391250765dc1a01780421a1db86bf13294b85c Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 13:31:19 +0100 Subject: [PATCH 679/764] Fix platform physics not working across different build plates. CURA-4525 --- cura/PlatformPhysics.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 5a57912db6..43118c5d01 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -57,6 +57,7 @@ class PlatformPhysics: # Only check nodes inside build area. nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)] + active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate random.shuffle(nodes) for node in nodes: @@ -80,7 +81,7 @@ class PlatformPhysics: # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): # Ignore root, ourselves and anything that is not a normal SceneNode. - if other_node is root or not issubclass(type(other_node), SceneNode) or other_node is node: + if other_node is root or not issubclass(type(other_node), SceneNode) or other_node is node or other_node.callDecoration("getBuildPlateNumber") != node.callDecoration("getBuildPlateNumber"): continue # Ignore collisions of a group with it's own children From fda4badab154e4dcf74e7ec3eca26c5800f9205d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 15:08:46 +0100 Subject: [PATCH 680/764] Checked build plates in context menu now actually match the selected item's build plates; changed collapse arrow. CURA-4525 --- cura/BuildPlateModel.py | 16 ++++++++++++++++ resources/qml/Menus/ContextMenu.qml | 7 +++++-- resources/qml/ObjectsList.qml | 2 +- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index a29dd65de4..c832a7c522 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -2,6 +2,7 @@ from UM.Qt.ListModel import ListModel from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection from UM.Logger import Logger from UM.Application import Application @@ -9,13 +10,17 @@ from UM.Application import Application class BuildPlateModel(ListModel): maxBuildPlateChanged = pyqtSignal() activeBuildPlateChanged = pyqtSignal() + selectionChanged = pyqtSignal() def __init__(self): super().__init__() Application.getInstance().getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously + Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSelectedObjectBuildPlateNumbers) + Selection.selectionChanged.connect(self._updateSelectedObjectBuildPlateNumbers) self._max_build_plate = 1 # default self._active_build_plate = -1 + self._selection_build_plates = [] @pyqtSlot(int) def setActiveBuildPlate(self, nr): @@ -60,3 +65,14 @@ class BuildPlateModel(ListModel): @staticmethod def createBuildPlateModel(): return BuildPlateModel() + + def _updateSelectedObjectBuildPlateNumbers(self, *args): + result = set() + for node in Selection.getAllSelectedObjects(): + result.add(node.callDecoration("getBuildPlateNumber")) + self._selection_build_plates = list(result) + self.selectionChanged.emit() + + @pyqtProperty("QVariantList", notify = selectionChanged) + def selectionBuildPlates(self): + return self._selection_build_plates diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index a80de2d8a7..910f0a951a 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -49,7 +49,7 @@ Menu text: Cura.BuildPlateModel.getItem(index).name; onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.getItem(index).buildPlateNumber); checkable: true - checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate + checked: Cura.BuildPlateModel.selectionBuildPlates.indexOf(Cura.BuildPlateModel.getItem(index).buildPlateNumber) != -1; visible: UM.Preferences.getValue("cura/use_multi_build_plate") } onObjectAdded: base.insertItem(index, object); @@ -57,7 +57,10 @@ Menu } MenuItem { text: "New build plate"; - onTriggered: CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.maxBuildPlate + 1); + onTriggered: { + CuraActions.setBuildPlateForSelection(Cura.BuildPlateModel.maxBuildPlate + 1); + checked = false; + } checkable: true checked: false visible: UM.Preferences.getValue("cura/use_multi_build_plate") diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index b67c0c0bec..ac99d6b0ef 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -56,7 +56,7 @@ Rectangle sourceSize.width: width sourceSize.height: width color: UM.Theme.getColor("setting_control_text") - source: collapsed ? UM.Theme.getIcon("arrow_top") : UM.Theme.getIcon("arrow_bottom") + source: collapsed ? UM.Theme.getIcon("arrow_left") : UM.Theme.getIcon("arrow_bottom") } label: Label{ } } From 24ad68aeb5b1c28f47ac81dd320939a75092c291 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 15:13:12 +0100 Subject: [PATCH 681/764] Fix initial state of 'See only current build plate'. CURA-4525 --- resources/qml/ObjectsList.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index ac99d6b0ef..e688928570 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -142,7 +142,7 @@ Rectangle { id: filterBuildPlateCheckbox visible: !collapsed - checked: boolCheck(UM.Preferences.getValue("view/filter_current_build_plate")) + checked: UM.Preferences.getValue("view/filter_current_build_plate") onClicked: UM.Preferences.setValue("view/filter_current_build_plate", checked) text: catalog.i18nc("@option:check","See only current build plate"); From 9ff15bf72d49f24cd77613f5830f949aa0662e11 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 15:42:23 +0100 Subject: [PATCH 682/764] Fixed not always updating objects list when changing build plate number by adding signals. CURA-4525 --- cura/Scene/BuildPlateDecorator.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index cfbe792699..6a288b4bcd 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -14,9 +14,13 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr + if self._node is not None: + self._node.transformationChanged.emit() + #self._node.transformationChanged.emit() if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): child.callDecoration("setBuildPlateNumber", nr) + child.transformationChanged.emit() def getBuildPlateNumber(self): return self._build_plate_number From df1d3bf569102e2bd8645b83f436d35b65eb003f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 21 Dec 2017 15:42:48 +0100 Subject: [PATCH 683/764] Add fix and doc for Mac OpenGL crash CURA-4726 --- plugins/SimulationView/SimulationView.py | 20 ++++++++++++++++++++ plugins/XRayView/XRayView.py | 22 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 44f472129f..6fc362725e 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -4,6 +4,7 @@ import sys from PyQt5.QtCore import Qt +from PyQt5.QtGui import QOpenGLContext from PyQt5.QtWidgets import QApplication from UM.Application import Application @@ -13,6 +14,7 @@ from UM.Logger import Logger from UM.Math.Color import Color from UM.Mesh.MeshBuilder import MeshBuilder from UM.Message import Message +from UM.Platform import Platform from UM.PluginRegistry import PluginRegistry from UM.Preferences import Preferences from UM.Resources import Resources @@ -24,6 +26,7 @@ from UM.View.GL.OpenGLContext import OpenGLContext from UM.View.View import View from UM.i18n import i18nCatalog from cura.ConvexHullNode import ConvexHullNode +from cura.CuraApplication import CuraApplication from .NozzleNode import NozzleNode from .SimulationPass import SimulationPass @@ -414,6 +417,23 @@ class SimulationView(View): return True if event.type == Event.ViewActivateEvent: + # FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching. + # This can happen when you do the following steps: + # 1. Start Cura + # 2. Load a model + # 3. Switch to Custom mode + # 4. Select the model and click on the per-object tool icon + # 5. Switch view to Layer view or X-Ray + # 6. Cura will very likely crash + # It seems to be a timing issue that the currentContext can somehow be empty, but I have no clue why. + # This fix tries to reschedule the view changing event call on the Qt thread again if the current OpenGL + # context is None. + if Platform.isOSX(): + if QOpenGLContext.currentContext() is None: + Logger.log("d", "current context of OpenGL is empty on Mac OS X, will try to create shaders later") + CuraApplication.getInstance().callLater(lambda e=event: self.event(e)) + return + # Make sure the SimulationPass is created layer_pass = self.getSimulationPass() self.getRenderer().addRenderPass(layer_pass) diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py index 35509a9715..0c4035c62d 100644 --- a/plugins/XRayView/XRayView.py +++ b/plugins/XRayView/XRayView.py @@ -2,10 +2,13 @@ # Cura is released under the terms of the LGPLv3 or higher. import os.path +from PyQt5.QtGui import QOpenGLContext from UM.Application import Application +from UM.Logger import Logger from UM.Math.Color import Color from UM.PluginRegistry import PluginRegistry +from UM.Platform import Platform from UM.Event import Event from UM.View.View import View from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator @@ -13,6 +16,8 @@ from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.View.RenderBatch import RenderBatch from UM.View.GL.OpenGL import OpenGL +from cura.CuraApplication import CuraApplication + from . import XRayPass ## View used to display a see-through version of objects with errors highlighted. @@ -52,6 +57,23 @@ class XRayView(View): def event(self, event): if event.type == Event.ViewActivateEvent: + # FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching. + # This can happen when you do the following steps: + # 1. Start Cura + # 2. Load a model + # 3. Switch to Custom mode + # 4. Select the model and click on the per-object tool icon + # 5. Switch view to Layer view or X-Ray + # 6. Cura will very likely crash + # It seems to be a timing issue that the currentContext can somehow be empty, but I have no clue why. + # This fix tries to reschedule the view changing event call on the Qt thread again if the current OpenGL + # context is None. + if Platform.isOSX(): + if QOpenGLContext.currentContext() is None: + Logger.log("d", "current context of OpenGL is empty on Mac OS X, will try to create shaders later") + CuraApplication.getInstance().callLater(lambda e = event: self.event(e)) + return + if not self._xray_pass: # Currently the RenderPass constructor requires a size > 0 # This should be fixed in RenderPass's constructor. From 2c831ceb05fe46993ebcbd81ec28b7dc8e232faa Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 15:47:40 +0100 Subject: [PATCH 684/764] For this version, send all build plates. No print view when multiple build plates. CURA-4525 --- plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 1b029903b7..05069d1c0d 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -259,7 +259,7 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._add_build_plate_number = len(self._job_list) > 1 self.writeStarted.emit(self) # Allow postprocessing before sending data to the printer - if len(self._printers) > 1 or len(gcodes) > 1: + if len(self._printers) > 1: self.spawnPrintView() # Ask user how to print it. elif len(self._printers) == 1: # If there is only one printer, don't bother asking. From 4e902046208b2c2a31542ab8b3cce38b873f1443 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 21 Dec 2017 15:51:24 +0100 Subject: [PATCH 685/764] Only push aways other objects if they are printing meshes CURA-4705 --- cura/PlatformPhysics.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 23197dac24..471e54dba6 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -76,7 +76,8 @@ class PlatformPhysics: if not node.getDecorator(ConvexHullDecorator): node.addDecorator(ConvexHullDecorator()) - if Preferences.getInstance().getValue("physics/automatic_push_free"): + # only push away objects if this node is a printing mesh + if not node.callDecoration("isNonPrintingMesh") and Preferences.getInstance().getValue("physics/automatic_push_free"): # Check for collisions between convex hulls for other_node in BreadthFirstIterator(root): # Ignore root, ourselves and anything that is not a normal SceneNode. @@ -98,6 +99,9 @@ class PlatformPhysics: if other_node in transformed_nodes: continue # Other node is already moving, wait for next pass. + if other_node.callDecoration("isNonPrintingMesh"): + continue + overlap = (0, 0) # Start loop with no overlap current_overlap_checks = 0 # Continue to check the overlap until we no longer find one. From 447c6e7e2360d89fd00a7926ee8059d70c4b7635 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 21 Dec 2017 16:25:13 +0100 Subject: [PATCH 686/764] Added Disable link style CURA-4630 --- cura/CuraApplication.py | 8 ++++++++ plugins/SliceInfoPlugin/SliceInfo.py | 4 ++-- resources/qml/Cura.qml | 6 ++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 18d1bde57e..036369aed7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1426,3 +1426,11 @@ class CuraApplication(QtApplication): node = node.getParent() Selection.add(node) + + + triggerPreferenceWindow = pyqtSignal() + + # This event has a simple logic, display pereference window if user decided to disable "collect information" + @pyqtProperty(bool, notify = triggerPreferenceWindow) + def showMyTest(self): + return True \ No newline at end of file diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 9bd99cae2b..28bcc763c7 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -48,13 +48,13 @@ class SliceInfo(Extension): self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None, description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) self.send_slice_info_message.addAction("Disable", name = catalog.i18nc("@action:button", "Disable"), icon = None, - description = catalog.i18nc("@action:tooltip", "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences.")) + description = catalog.i18nc("@action:tooltip", "Don't allow Cura to send anonymized usage statistics. You can enable it again in the preferences."), button_style = Message.ActionButtonStyle.LINK) self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() def messageActionTriggered(self, message_id, action_id): if action_id == "Disable": - Preferences.getInstance().setValue("info/send_slice_info", False) + CuraApplication.getInstance().triggerPreferenceWindow.emit() self.send_slice_info_message.hide() Preferences.getInstance().setValue("info/asked_send_slice_info", True) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 91098bbb29..40fc88c975 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -528,6 +528,12 @@ UM.MainWindow onTriggered: preferences.visible = true } + Connections + { + target: CuraApplication + onShowMyTestChanged: preferences.visible = true + } + MessageDialog { id: newProjectDialog From 663ceab0699d1bae2aaab8895d81dbdc3cd0e813 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 21 Dec 2017 16:53:43 +0100 Subject: [PATCH 687/764] Undo emit transformationChanges (caused a crash), themed objects in objects list. CURA-4525 --- cura/ArrangeObjectsAllBuildPlatesJob.py | 2 -- cura/BuildPlateModel.py | 6 +++++- cura/Scene/BuildPlateDecorator.py | 10 +++++----- resources/qml/Actions.qml | 1 - resources/qml/ObjectsList.qml | 10 ++++++---- resources/themes/cura-light/theme.json | 5 +++-- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/cura/ArrangeObjectsAllBuildPlatesJob.py b/cura/ArrangeObjectsAllBuildPlatesJob.py index 7991ac39f0..f062c2b23b 100644 --- a/cura/ArrangeObjectsAllBuildPlatesJob.py +++ b/cura/ArrangeObjectsAllBuildPlatesJob.py @@ -34,8 +34,6 @@ class ArrangeArray: if a.isEmpty: self._first_empty = i self._has_empty = True - - Logger.log("d", "lala %s %s", self._first_empty, self._has_empty) return self._first_empty = None self._has_empty = False diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index c832a7c522..118a5ce271 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -40,7 +40,11 @@ class BuildPlateModel(ListModel): def maxBuildPlate(self): return self._max_build_plate - def updateMaxBuildPlate(self, source): + def updateMaxBuildPlate(self, *args): + if args: + source = args[0] + else: + source = None if not issubclass(type(source), SceneNode): return max_build_plate = self._calcMaxBuildPlate() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 6a288b4bcd..36b89c5e5d 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -1,6 +1,5 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator -from UM.Application import Application -from UM.Logger import Logger +from UM.Scene.SceneNode import SceneNode ## Make a SceneNode build plate aware CuraSceneNode objects all have this decorator. @@ -14,13 +13,14 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr - if self._node is not None: - self._node.transformationChanged.emit() + # if issubclass(type(self._node), SceneNode): # TODO: Crashes on ArrangeObjectsAllBuildPlatesJob + # self._node.transformationChanged.emit() #self._node.transformationChanged.emit() if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): child.callDecoration("setBuildPlateNumber", nr) - child.transformationChanged.emit() + # if issubclass(type(child), SceneNode): + # child.transformationChanged.emit() def getBuildPlateNumber(self): return self._build_plate_number diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 0727642d7e..93861c0963 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -316,7 +316,6 @@ Item { id: arrangeAllBuildPlatesAction; text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models To All Build Plates"); - //iconName: "document-open"; onTriggered: Printer.arrangeObjectsToAllBuildPlates(); } diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index e688928570..761ff6d3f5 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -146,6 +146,7 @@ Rectangle onClicked: UM.Preferences.setValue("view/filter_current_build_plate", checked) text: catalog.i18nc("@option:check","See only current build plate"); + style: UM.Theme.styles.checkbox; anchors { @@ -192,6 +193,7 @@ Rectangle frameVisible: true height: UM.Theme.getSize("build_plate_selection_size").height width: parent.width - 2 * UM.Theme.getSize("default_margin").height + style: UM.Theme.styles.scrollview anchors { @@ -222,9 +224,8 @@ Rectangle { id: arrangeAllBuildPlatesButton; text: catalog.i18nc("@action:button","Arrange to all build plates"); - //iconSource: UM.Theme.getIcon("load") - //style: UM.Theme.styles.tool_button - height: 25 + style: UM.Theme.styles.sidebar_action_button + height: UM.Theme.getSize("objects_menu_button").height; tooltip: ''; anchors { @@ -244,7 +245,8 @@ Rectangle { id: arrangeBuildPlateButton; text: catalog.i18nc("@action:button","Arrange current build plate"); - height: 25 + style: UM.Theme.styles.sidebar_action_button + height: UM.Theme.getSize("objects_menu_button").height; tooltip: ''; anchors { diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 714e578d97..18f2650e77 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -393,8 +393,9 @@ "jobspecs_line": [2.0, 2.0], - "objects_menu_size": [17, 40], + "objects_menu_size": [20, 40], "objects_menu_size_collapsed": [15, 15], - "build_plate_selection_size": [15, 5] + "build_plate_selection_size": [15, 5], + "objects_menu_button": [0.3, 2.7] } } From ed8f73765ee6aa772c1fd8382af0c414aab22d73 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Fri, 22 Dec 2017 02:11:34 +0100 Subject: [PATCH 688/764] Reduce amount of movements after print At the moment, the base plate is moved to the end stops, which moves the head to the front of the base plate (at least for stock printers, but most likely for modified ones, too), making the object inaccessible. This has been fixed by moving the base plate to the back after this step. That eliminates the need for the X/Y homing, hence it got removed from the after print code. Also, before these changes, the "steppers off" command was pretty pointless, as the final move was performed after this step. This is not necessarily a problem, but can be annoying when trying to move the base plate or extruder after the print by hand. All in all some useful changes. --- resources/definitions/tevo_tarantula.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/tevo_tarantula.def.json b/resources/definitions/tevo_tarantula.def.json index 097281aaeb..09a9a4a0f4 100644 --- a/resources/definitions/tevo_tarantula.def.json +++ b/resources/definitions/tevo_tarantula.def.json @@ -66,7 +66,7 @@ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning\nG1 Y200 F3600 ;move baseplate to front for easier access to printed object" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off" } } } From b29047abd32195666b989adc50ce49545f073a44 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 11:38:56 +0100 Subject: [PATCH 689/764] Small fixes for disable user data triggering preferences window --- cura/CuraApplication.py | 16 ++++++++-------- plugins/SliceInfoPlugin/SliceInfo.py | 8 +++++--- resources/qml/Cura.qml | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 036369aed7..e9e2282be6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -409,6 +409,14 @@ class CuraApplication(QtApplication): else: self.exit(0) + ## Signal to connect preferences action in QML + showPreferencesWindow = pyqtSignal() + + ## Show the preferences window + @pyqtSlot() + def showPreferences(self): + self.showPreferencesWindow.emit() + ## A reusable dialogbox # showMessageBox = pyqtSignal(str, str, str, str, int, int, arguments = ["title", "text", "informativeText", "detailedText", "buttons", "icon"]) @@ -1426,11 +1434,3 @@ class CuraApplication(QtApplication): node = node.getParent() Selection.add(node) - - - triggerPreferenceWindow = pyqtSignal() - - # This event has a simple logic, display pereference window if user decided to disable "collect information" - @pyqtProperty(bool, notify = triggerPreferenceWindow) - def showMyTest(self): - return True \ No newline at end of file diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 28bcc763c7..753e00091b 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -52,11 +52,13 @@ class SliceInfo(Extension): self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() + ## Perform action based on user input. + # Note that clicking "Disable" won't actually disable the data sending, but rather take the user to preferences where they can disable it. def messageActionTriggered(self, message_id, action_id): - if action_id == "Disable": - CuraApplication.getInstance().triggerPreferenceWindow.emit() - self.send_slice_info_message.hide() Preferences.getInstance().setValue("info/asked_send_slice_info", True) + if action_id == "Disable": + CuraApplication.getInstance().showPreferences() + self.send_slice_info_message.hide() def _onWriteStarted(self, output_device): try: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 40fc88c975..efe956939b 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -531,7 +531,7 @@ UM.MainWindow Connections { target: CuraApplication - onShowMyTestChanged: preferences.visible = true + onShowPreferencesWindow: preferences.visible = true } MessageDialog From f75d91071a3fd8b3262d42e809bc0c548d960207 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 22 Dec 2017 11:39:58 +0100 Subject: [PATCH 690/764] Remove invisible flag from allowed command line options to trigger non-gui mode --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e9e2282be6..e90dfd70d3 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -691,7 +691,7 @@ class CuraApplication(QtApplication): self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) - run_without_gui = self.getCommandLineOption("headless", False) or self.getCommandLineOption("invisible", False) + run_without_gui = self.getCommandLineOption("headless", False) if not run_without_gui: self.initializeEngine() controller.setActiveStage("PrepareStage") From f5918228367a2160ecda9c36296d91ef7615987f Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 22 Dec 2017 12:00:08 +0100 Subject: [PATCH 691/764] Set minimum distance between models CURA-4672 --- cura/PlatformPhysics.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 471e54dba6..543eff0d4b 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -34,6 +34,7 @@ class PlatformPhysics: self._change_timer.timeout.connect(self._onChangeTimerFinished) self._move_factor = 1.1 # By how much should we multiply overlap to calculate a new spot? self._max_overlap_checks = 10 # How many times should we try to find a new spot per tick? + self._minimum_gap = 2 # It is a minimum distance between two models, applicable for small models Preferences.getInstance().addPreference("physics/automatic_push_free", True) Preferences.getInstance().addPreference("physics/automatic_drop_down", True) @@ -128,8 +129,23 @@ class PlatformPhysics: if own_convex_hull and other_convex_hull: overlap = own_convex_hull.translate(move_vector.x, move_vector.z).intersectsPolygon(other_convex_hull) if overlap: # Moving ensured that overlap was still there. Try anew! - move_vector = move_vector.set(x=move_vector.x + overlap[0] * self._move_factor, + temp_move_vector = move_vector.set(x=move_vector.x + overlap[0] * self._move_factor, z=move_vector.z + overlap[1] * self._move_factor) + + # if the distance between two models less than 2mm then try to find a new factor + if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: + temp_scale_factor = self._move_factor + temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] # find x move_factor, like (3.4 + 2) / 3.4 = 1.58 + temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] # find y move_factor + if temp_x_factor > temp_y_factor: + temp_scale_factor = temp_x_factor + else: + temp_scale_factor = temp_y_factor + + move_vector = move_vector.set(x=move_vector.x + overlap[0] * temp_scale_factor, + z=move_vector.z + overlap[1] * temp_scale_factor) + else: + move_vector = temp_move_vector else: # This can happen in some cases if the object is not yet done with being loaded. # Simply waiting for the next tick seems to resolve this correctly. From 3f9f00673adf91bc6f6b649df37be490198dd5bb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 11:36:42 +0100 Subject: [PATCH 692/764] Fix addExtruderStackForSingleExtrusionMachine() CURA-4708 - Create definition_changes container for the newly created ExtruderStacks. - Move extruder-specific definition_changes settings from the machine's container to the extruder's container --- cura/Settings/CuraContainerRegistry.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 089d513071..4a31ed5cc4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -430,11 +430,32 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setDefinition(extruder_definition) extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) + from cura.CuraApplication import CuraApplication + + # create a new definition_changes container for the extruder stack + definition_changes_id = self.uniqueName(extruder_stack.getId() + "_settings") + definition_changes_name = definition_changes_id + definition_changes = InstanceContainer(definition_changes_id) + definition_changes.setName(definition_changes_name) + definition_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + definition_changes.addMetaDataEntry("type", "definition_changes") + definition_changes.addMetaDataEntry("definition", extruder_definition.getId()) + + # move definition_changes settings if exist + for setting_key in ("machine_nozzle_size", "material_diameter"): + setting_instance = machine.definitionChanges.getInstance(setting_key) + if setting_instance is not None: + # move it to the extruder stack's definition_changes + definition_changes.addInstance(setting_instance) + machine.definitionChanges.removeInstance(setting_key, postpone_emit = True) + + self.addContainer(definition_changes) + extruder_stack.setDefinitionChanges(definition_changes) + # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.id + "_user") + user_container = InstanceContainer(extruder_stack.getId() + "_user") user_container.addMetaDataEntry("type", "user") user_container.addMetaDataEntry("machine", extruder_stack.getId()) - from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) user_container.setDefinition(machine.definition.getId()) From 3fb3b5826fae02295cb6d36653dfcc1cf38043a0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 11:39:51 +0100 Subject: [PATCH 693/764] Make sure user containers have unique IDs CURA-4708 --- cura/Settings/CuraContainerRegistry.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 4a31ed5cc4..292e7f1f82 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -453,7 +453,10 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setDefinitionChanges(definition_changes) # create empty user changes container otherwise - user_container = InstanceContainer(extruder_stack.getId() + "_user") + user_container_id = self.uniqueName(extruder_stack.getId() + "_user") + user_container_name = user_container_id + user_container = InstanceContainer(user_container_id) + user_container.setName(user_container_name) user_container.addMetaDataEntry("type", "user") user_container.addMetaDataEntry("machine", extruder_stack.getId()) user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) From 05acb2e00fc28c92c9851eb2dbe5c9637068e19c Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 22 Dec 2017 13:04:25 +0100 Subject: [PATCH 694/764] Prvent integer infinitive value after arranging all models CURA-4672 --- cura/PlatformPhysics.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 543eff0d4b..c4254ebd3f 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -135,9 +135,9 @@ class PlatformPhysics: # if the distance between two models less than 2mm then try to find a new factor if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: temp_scale_factor = self._move_factor - temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] # find x move_factor, like (3.4 + 2) / 3.4 = 1.58 - temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] # find y move_factor - if temp_x_factor > temp_y_factor: + temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] !=0 else 0# find x move_factor, like (3.4 + 2) / 3.4 = 1.58 + temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] !=0 else 0 # find y move_factor + if abs(temp_x_factor) > abs(temp_y_factor): temp_scale_factor = temp_x_factor else: temp_scale_factor = temp_y_factor From 26a136f7c51e1cd8f4f9267c00ebeabc3561ed88 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 13:29:55 +0100 Subject: [PATCH 695/764] Revert "Simplified upgrade funtion, typos, check extruder count" This reverts commit fd6d3e76a3754dae14f83a45d20685b4ddae6062. CURA-4708 --- .../VersionUpgrade30to31.py | 123 +++++++++--------- 1 file changed, 64 insertions(+), 59 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c350dadefe..c01ff158b1 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -129,17 +129,12 @@ class VersionUpgrade30to31(VersionUpgrade): if parser.has_option("values", "machine_nozzle_size"): machine_nozzle_size = parser["values"]["machine_nozzle_size"] - machine_extruder_count = '1' # by default it is 1 and the value cannot be stored in the global stack - if parser.has_option("values", "machine_extruder_count"): - machine_extruder_count = parser["values"]["machine_extruder_count"] + definition_name = parser["general"]["name"] + machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) - if machine_extruder_count == '1': - definition_name = parser["general"]["name"] - machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) - - # For single extruder machine we need only first extruder - if len(machine_extruders) !=0: - self._updateSingleExtruderDefinitionFile(machine_extruders, machine_nozzle_size) + #For single extuder machine we nee only first extruder + if len(machine_extruders) !=0: + if self._updateSingleExtuderDefinitionFile(machine_extruders, machine_nozzle_size): parser.remove_option("values", "machine_nozzle_size") # Update version numbers @@ -224,9 +219,9 @@ class VersionUpgrade30to31(VersionUpgrade): machine_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.MachineStack) - machine_instance_id = None + machine_instances = [] - # Find machine instances + #Find all machine instances for item in os.listdir(machine_instances_dir): file_path = os.path.join(machine_instances_dir, item) if not os.path.isfile(file_path): @@ -247,51 +242,57 @@ class VersionUpgrade30to31(VersionUpgrade): if not parser.has_option("general", "id"): continue - id = parser["general"]["id"] - if id + "_settings" != definition_name: + machine_instances.append(parser) + + #Find for extruders + extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) + #"machine",[extruders] + extruder_instances_per_machine = {} + + #Find all custom extruders for founded machines + for item in os.listdir(extruders_instances_dir): + file_path = os.path.join(extruders_instances_dir, item) + if not os.path.isfile(file_path): continue - else: - machine_instance_id = id + + parser = configparser.ConfigParser(interpolation=None) + try: + parser.read([file_path]) + except: + # skip, it is not a valid stack file + continue + + if not parser.has_option("metadata", "type"): + continue + if "extruder_train" != parser["metadata"]["type"]: + continue + + if not parser.has_option("metadata", "machine"): + continue + if not parser.has_option("metadata", "position"): + continue + + + for machine_instace in machine_instances: + + machine_id = machine_instace["general"]["id"] + if machine_id != parser["metadata"]["machine"]: + continue + + if machine_id + "_settings" != definition_name: + continue + + if extruder_instances_per_machine.get(machine_id) is None: + extruder_instances_per_machine.update({machine_id:[]}) + + extruder_instances_per_machine.get(machine_id).append(parser) + #the extruder can be related only to one machine break - if machine_instance_id is not None: + return extruder_instances_per_machine - extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) - #"machine",[extruders] - extruder_instances = [] - - # Find all custom extruders for found machines - for item in os.listdir(extruders_instances_dir): - file_path = os.path.join(extruders_instances_dir, item) - if not os.path.isfile(file_path): - continue - - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read([file_path]) - except: - # skip, it is not a valid stack file - continue - - if not parser.has_option("metadata", "type"): - continue - if "extruder_train" != parser["metadata"]["type"]: - continue - - if not parser.has_option("metadata", "machine"): - continue - if not parser.has_option("metadata", "position"): - continue - - if machine_instance_id != parser["metadata"]["machine"]: - continue - - extruder_instances.append(parser) - - return extruder_instances - - # Find extruder definition at index 0 and update its values - def _updateSingleExtruderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): + #Find extruder defition at index 0 and update its values + def _updateSingleExtuderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): defintion_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer) @@ -311,15 +312,19 @@ class VersionUpgrade30to31(VersionUpgrade): continue name = parser["general"]["name"] custom_extruder_at_0_position = None - for extruder_instance in extruder_instances_per_machine: + for machine_extruders in extruder_instances_per_machine: + for extruder_instance in extruder_instances_per_machine[machine_extruders]: - definition_position = extruder_instance["metadata"]["position"] + if extruder_instance["general"]["id"] + "_settings" == name: + defition_position = extruder_instance["metadata"]["position"] - if definition_position == "0": - custom_extruder_at_0_position = extruder_instance + if defition_position == "0": + custom_extruder_at_0_position = extruder_instance + break + if custom_extruder_at_0_position is not None: break - # If not null, then parsed file is for first extuder and then can be updated. I need to update only + #If not null, then parsed file is for first extuder and then can be updated. I need to update only # first, because this update for single extuder machine if custom_extruder_at_0_position is not None: @@ -369,4 +374,4 @@ class VersionUpgrade30to31(VersionUpgrade): quality_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.QualityInstanceContainer) with open(os.path.join(quality_changes_dir, extruder_quality_changes_filename), "w") as f: - f.write(extruder_quality_changes_output.getvalue()) \ No newline at end of file + f.write(extruder_quality_changes_output.getvalue()) From 2cffb1759f68a7cd5c861e74540bb4dc3f95d1cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 13:30:06 +0100 Subject: [PATCH 696/764] Revert "Version upgrade for nozzle_size" This reverts commit 54bc7dd348d77efa7f2dc3f420200df9864b8d37. CURA-4708 --- .../VersionUpgrade30to31.py | 142 ------------------ 1 file changed, 142 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c01ff158b1..8c5a160ff4 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -122,21 +122,6 @@ class VersionUpgrade30to31(VersionUpgrade): if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) - if parser["metadata"]["type"] == "definition_changes": - if parser["general"]["definition"] == "custom": - - # We are only interested in machine_nozzle_size - if parser.has_option("values", "machine_nozzle_size"): - machine_nozzle_size = parser["values"]["machine_nozzle_size"] - - definition_name = parser["general"]["name"] - machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) - - #For single extuder machine we nee only first extruder - if len(machine_extruders) !=0: - if self._updateSingleExtuderDefinitionFile(machine_extruders, machine_nozzle_size): - parser.remove_option("values", "machine_nozzle_size") - # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" @@ -215,133 +200,6 @@ class VersionUpgrade30to31(VersionUpgrade): return quality_changes_containers - def _getSingleExtrusionMachineExtruders(self, definition_name): - - machine_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.MachineStack) - - machine_instances = [] - - #Find all machine instances - for item in os.listdir(machine_instances_dir): - file_path = os.path.join(machine_instances_dir, item) - if not os.path.isfile(file_path): - continue - - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read([file_path]) - except: - # skip, it is not a valid stack file - continue - - if not parser.has_option("metadata", "type"): - continue - if "machine" != parser["metadata"]["type"]: - continue - - if not parser.has_option("general", "id"): - continue - - machine_instances.append(parser) - - #Find for extruders - extruders_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) - #"machine",[extruders] - extruder_instances_per_machine = {} - - #Find all custom extruders for founded machines - for item in os.listdir(extruders_instances_dir): - file_path = os.path.join(extruders_instances_dir, item) - if not os.path.isfile(file_path): - continue - - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read([file_path]) - except: - # skip, it is not a valid stack file - continue - - if not parser.has_option("metadata", "type"): - continue - if "extruder_train" != parser["metadata"]["type"]: - continue - - if not parser.has_option("metadata", "machine"): - continue - if not parser.has_option("metadata", "position"): - continue - - - for machine_instace in machine_instances: - - machine_id = machine_instace["general"]["id"] - if machine_id != parser["metadata"]["machine"]: - continue - - if machine_id + "_settings" != definition_name: - continue - - if extruder_instances_per_machine.get(machine_id) is None: - extruder_instances_per_machine.update({machine_id:[]}) - - extruder_instances_per_machine.get(machine_id).append(parser) - #the extruder can be related only to one machine - break - - return extruder_instances_per_machine - - #Find extruder defition at index 0 and update its values - def _updateSingleExtuderDefinitionFile(self, extruder_instances_per_machine, machine_nozzle_size): - - defintion_instances_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer) - - for item in os.listdir(defintion_instances_dir): - file_path = os.path.join(defintion_instances_dir, item) - if not os.path.isfile(file_path): - continue - - parser = configparser.ConfigParser(interpolation=None) - try: - parser.read([file_path]) - except: - # skip, it is not a valid stack file - continue - - if not parser.has_option("general", "name"): - continue - name = parser["general"]["name"] - custom_extruder_at_0_position = None - for machine_extruders in extruder_instances_per_machine: - for extruder_instance in extruder_instances_per_machine[machine_extruders]: - - if extruder_instance["general"]["id"] + "_settings" == name: - defition_position = extruder_instance["metadata"]["position"] - - if defition_position == "0": - custom_extruder_at_0_position = extruder_instance - break - if custom_extruder_at_0_position is not None: - break - - #If not null, then parsed file is for first extuder and then can be updated. I need to update only - # first, because this update for single extuder machine - if custom_extruder_at_0_position is not None: - - #Add new value - parser["values"]["machine_nozzle_size"] = machine_nozzle_size - - definition_output = io.StringIO() - parser.write(definition_output) - - with open(file_path, "w") as f: - f.write(definition_output.getvalue()) - - return True - - return False - - def _createExtruderQualityChangesForSingleExtrusionMachine(self, filename, global_quality_changes): suffix = "_" + quote_plus(global_quality_changes["general"]["name"].lower()) machine_name = os.path.os.path.basename(filename).replace(".inst.cfg", "").replace(suffix, "") From a7d51326c0c94cdcd8b6114764a43d3f24353955 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 14:06:11 +0100 Subject: [PATCH 697/764] Move extruder-specific DC settings CURA-4708 Read code comments. --- cura/Settings/ExtruderStack.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 42a2733879..6dffeda6c2 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -8,6 +8,7 @@ from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase from UM.Settings.ContainerStack import ContainerStack from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import ContainerInterface, PropertyEvaluationContext +from UM.Settings.SettingInstance import SettingInstance from . import Exceptions from .CuraContainerStack import CuraContainerStack @@ -16,6 +17,11 @@ from .ExtruderManager import ExtruderManager if TYPE_CHECKING: from cura.Settings.GlobalStack import GlobalStack + +_EXTRUDER_SPECIFIC_DEFINITION_CHANGES_SETTINGS = ["machine_nozzle_size", + "material_diameter"] + + ## Represents an Extruder and its related containers. # # @@ -39,6 +45,29 @@ class ExtruderStack(CuraContainerStack): # For backward compatibility: Register the extruder with the Extruder Manager ExtruderManager.getInstance().registerExtruder(self, stack.id) + # Now each machine will have at least one extruder stack. If this is the first extruder, the extruder-specific + # settings such as nozzle size and material diameter should be moved from the machine's definition_changes to + # the this extruder's definition_changes. + # + # We do this here because it is tooooo expansive to do it in the version upgrade: During the version upgrade, + # when we are upgrading a definition_changes container file, there is NO guarantee that other files such as + # machine an extruder stack files are upgraded before this, so we cannot read those files assuming they are in + # the latest format. + if self.getMetaDataEntry("position") == "0": + for key in _EXTRUDER_SPECIFIC_DEFINITION_CHANGES_SETTINGS: + setting_value = stack.definitionChanges.getProperty(key, "value") + if setting_value is None: + continue + + setting_definition = stack.getSettingDefinition(key) + new_instance = SettingInstance(setting_definition, self.definitionChanges) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + self.definitionChanges.addInstance(new_instance) + self.definitionChanges.setDirty(True) + + stack.definitionChanges.removeInstance(key, postpone_emit = True) + @override(ContainerStack) def getNextStack(self) -> Optional["GlobalStack"]: return super().getNextStack() From 0cd392fbd233c1f4ed21afa44dab1d3219db36e7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 14:08:22 +0100 Subject: [PATCH 698/764] Create new SettingInstance when moving extruder DC settings CURA-4708 --- cura/Settings/CuraContainerRegistry.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 292e7f1f82..533908a614 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -14,6 +14,7 @@ from UM.Decorators import override from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.SettingInstance import SettingInstance from UM.Application import Application from UM.Logger import Logger from UM.Message import Message @@ -443,10 +444,16 @@ class CuraContainerRegistry(ContainerRegistry): # move definition_changes settings if exist for setting_key in ("machine_nozzle_size", "material_diameter"): - setting_instance = machine.definitionChanges.getInstance(setting_key) - if setting_instance is not None: + setting_value = machine.definitionChanges.getProperty(setting_key, "value") + if setting_value is not None: # move it to the extruder stack's definition_changes - definition_changes.addInstance(setting_instance) + setting_definition = machine.getSettingDefinition(setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + definition_changes.addInstance(new_instance) + definition_changes.setDirty(True) + machine.definitionChanges.removeInstance(setting_key, postpone_emit = True) self.addContainer(definition_changes) From 0c28c61e0536ce3f73bf0415ee4e001e5fb92e82 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 22 Dec 2017 14:09:13 +0100 Subject: [PATCH 699/764] Create new SettingInstances when moving user changes settings CURA-4708 --- cura/Settings/CuraContainerRegistry.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 533908a614..7b21332ee4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -475,7 +475,15 @@ class CuraContainerRegistry(ContainerRegistry): for user_setting_key in machine.userChanges.getAllKeys(): settable_per_extruder = machine.getProperty(user_setting_key, "settable_per_extruder") if settable_per_extruder: - user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) + setting_value = machine.getProperty(user_setting_key, "value") + + setting_definition = machine.getSettingDefinition(user_setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + user_container.addInstance(new_instance) + user_container.setDirty(True) + machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) self.addContainer(user_container) From d0a3575c0c0b7065f7f6583bc4e04901dac6a725 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 22 Dec 2017 14:48:45 +0100 Subject: [PATCH 700/764] Don't print the model if it is outside of the buildplate CURA-4734 --- plugins/CuraEngineBackend/StartSliceJob.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 4da26aa78f..b22e116f95 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -143,10 +143,11 @@ class StartSliceJob(Job): if per_object_stack: is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) - if not getattr(node, "_outside_buildarea", False) or not is_non_printing_mesh: + if not getattr(node, "_outside_buildarea", False): temp_list.append(node) if not is_non_printing_mesh: has_printing_mesh = True + Job.yieldThread() #If the list doesn't have any model with suitable settings then clean the list From a63ad41676bfafd30c227b91cdb344e667efe0e5 Mon Sep 17 00:00:00 2001 From: TheAssassin Date: Sun, 24 Dec 2017 22:14:45 +0100 Subject: [PATCH 701/764] Move extruder to X0 --- resources/definitions/tevo_tarantula.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/tevo_tarantula.def.json b/resources/definitions/tevo_tarantula.def.json index 09a9a4a0f4..a9f9cefff2 100644 --- a/resources/definitions/tevo_tarantula.def.json +++ b/resources/definitions/tevo_tarantula.def.json @@ -66,7 +66,7 @@ "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG1 X0 Y200 F3600 ;move extruder out of the way by moving the baseplate to the front for easier access to printed object\nM84 ;steppers off" } } } From 4b9ddc186a8ba870ea3cfb761c2d257ec3f9616d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 14:28:12 +0100 Subject: [PATCH 702/764] Code style: Space after binary operator Contributes to issue CURA-4672. --- cura/PlatformPhysics.py | 4 ++-- .../VersionUpgrade30to31/VersionUpgrade30to31.py | 2 +- plugins/X3DReader/X3DReader.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index c4254ebd3f..d1871466d5 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -135,8 +135,8 @@ class PlatformPhysics: # if the distance between two models less than 2mm then try to find a new factor if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: temp_scale_factor = self._move_factor - temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] !=0 else 0# find x move_factor, like (3.4 + 2) / 3.4 = 1.58 - temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] !=0 else 0 # find y move_factor + temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0# find x move_factor, like (3.4 + 2) / 3.4 = 1.58 + temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] != 0 else 0 # find y move_factor if abs(temp_x_factor) > abs(temp_y_factor): temp_scale_factor = temp_x_factor else: diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c350dadefe..35c889c6bd 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -138,7 +138,7 @@ class VersionUpgrade30to31(VersionUpgrade): machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) # For single extruder machine we need only first extruder - if len(machine_extruders) !=0: + if len(machine_extruders) != 0: self._updateSingleExtruderDefinitionFile(machine_extruders, machine_nozzle_size) parser.remove_option("values", "machine_nozzle_size") diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py index e4a59dcdaa..8280af936d 100644 --- a/plugins/X3DReader/X3DReader.py +++ b/plugins/X3DReader/X3DReader.py @@ -184,7 +184,7 @@ class X3DReader(MeshReader): got_center = (center.x != 0 or center.y != 0 or center.z != 0) T = self.transform - if trans.x != 0 or trans.y != 0 or trans.z !=0: + if trans.x != 0 or trans.y != 0 or trans.z != 0: T.translate(trans) if got_center: T.translate(center) From a4d83331adb72eafc0c145a97a5797e0c8be39c5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 14:30:47 +0100 Subject: [PATCH 703/764] Code style: Space around binary operator Contributes to issue CURA-4672. --- cura/PlatformPhysics.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index d1871466d5..62338ce91f 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -117,33 +117,33 @@ class PlatformPhysics: overlap = node.callDecoration("getConvexHull").translate(move_vector.x, move_vector.z).intersectsPolygon(other_head_hull) if overlap: # Moving ensured that overlap was still there. Try anew! - move_vector = move_vector.set(x=move_vector.x + overlap[0] * self._move_factor, - z=move_vector.z + overlap[1] * self._move_factor) + move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor, + z = move_vector.z + overlap[1] * self._move_factor) else: # Moving ensured that overlap was still there. Try anew! - move_vector = move_vector.set(x=move_vector.x + overlap[0] * self._move_factor, - z=move_vector.z + overlap[1] * self._move_factor) + move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor, + z = move_vector.z + overlap[1] * self._move_factor) else: own_convex_hull = node.callDecoration("getConvexHull") other_convex_hull = other_node.callDecoration("getConvexHull") if own_convex_hull and other_convex_hull: overlap = own_convex_hull.translate(move_vector.x, move_vector.z).intersectsPolygon(other_convex_hull) if overlap: # Moving ensured that overlap was still there. Try anew! - temp_move_vector = move_vector.set(x=move_vector.x + overlap[0] * self._move_factor, - z=move_vector.z + overlap[1] * self._move_factor) + temp_move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor, + z = move_vector.z + overlap[1] * self._move_factor) # if the distance between two models less than 2mm then try to find a new factor if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap: temp_scale_factor = self._move_factor - temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0# find x move_factor, like (3.4 + 2) / 3.4 = 1.58 + temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0 # find x move_factor, like (3.4 + 2) / 3.4 = 1.58 temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] != 0 else 0 # find y move_factor if abs(temp_x_factor) > abs(temp_y_factor): temp_scale_factor = temp_x_factor else: temp_scale_factor = temp_y_factor - move_vector = move_vector.set(x=move_vector.x + overlap[0] * temp_scale_factor, - z=move_vector.z + overlap[1] * temp_scale_factor) + move_vector = move_vector.set(x = move_vector.x + overlap[0] * temp_scale_factor, + z = move_vector.z + overlap[1] * temp_scale_factor) else: move_vector = temp_move_vector else: @@ -151,7 +151,7 @@ class PlatformPhysics: # Simply waiting for the next tick seems to resolve this correctly. overlap = None - if not Vector.Null.equals(move_vector, epsilon=1e-5): + if not Vector.Null.equals(move_vector, epsilon = 1e-5): transformed_nodes.append(node) op = PlatformPhysicsOperation.PlatformPhysicsOperation(node, move_vector) op.push() From 5f240229f9290b27fa1759ce40c1020ebe18826b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 15:40:37 +0100 Subject: [PATCH 704/764] Fix reference to addAdditionalComponents and updateAdditionalComponents Nobody ever tested this, I think... Contributes to issue CURA-4741. --- resources/qml/MonitorButton.qml | 4 ++-- resources/qml/SaveButton.qml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 9305e2261a..21bc360fe2 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -199,12 +199,12 @@ Item } Component.onCompleted: { - updateAdditionalComponents("monitorButtons") + buttonsRow.updateAdditionalComponents("monitorButtons") } Connections { target: CuraApplication - onAdditionalComponentsChanged: updateAdditionalComponents + onAdditionalComponentsChanged: buttonsRow.updateAdditionalComponents } function updateAdditionalComponents (areaId) { diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index c5025dea78..dc24cc4700 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -138,12 +138,12 @@ Item { } Component.onCompleted: { - addAdditionalComponents("saveButton") + saveRow.addAdditionalComponents("saveButton") } Connections { target: CuraApplication - onAdditionalComponentsChanged: addAdditionalComponents + onAdditionalComponentsChanged: saveRow.addAdditionalComponents("saveButton") } function addAdditionalComponents (areaId) { From 9b41cc05af39f260a5f98a5079119be29d368161 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 15:46:06 +0100 Subject: [PATCH 705/764] Further fix for MonitorButton Forgot this one here. Contributes to issue CURA-4741. --- resources/qml/MonitorButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 21bc360fe2..b23ba4c95a 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -204,7 +204,7 @@ Item Connections { target: CuraApplication - onAdditionalComponentsChanged: buttonsRow.updateAdditionalComponents + onAdditionalComponentsChanged: buttonsRow.updateAdditionalComponents("monitorButtons") } function updateAdditionalComponents (areaId) { From 10f9ae4082d81acc26923ff29635472bcc11c55a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 16:21:29 +0100 Subject: [PATCH 706/764] Resolve binding loop Let's align the icons to the text instead of the text to the icons. This makes it all align from left to right and allows the button to take the width of the childrenRect properly. --- resources/themes/cura-light/styles.qml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 0de761b7d9..7532f0dfaf 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -202,9 +202,8 @@ QtObject { height: Theme.getSize("topbar_button_icon").height Label { + id: button_label text: control.text; - anchors.right: (icon.visible || overlayIcon.visible) ? icon.left : parent.right - anchors.rightMargin: (icon.visible || overlayIcon.visible) ? Theme.getSize("default_margin").width : 0 anchors.verticalCenter: parent.verticalCenter; font: control.checked ? UM.Theme.getFont("large") : UM.Theme.getFont("large_nonbold") color: @@ -227,6 +226,8 @@ QtObject { { visible: control.iconSource != "" id: icon + anchors.left: button_label.right + anchors.leftMargin: (icon.visible || overlayIcon.visible) ? Theme.getSize("default_margin").width : 0 color: UM.Theme.getColor("text_emphasis") opacity: !control.enabled ? 0.2 : 1.0 source: control.iconSource @@ -238,6 +239,8 @@ QtObject { UM.RecolorImage { id: overlayIcon + anchors.left: button_label.right + anchors.leftMargin: (icon.visible || overlayIcon.visible) ? Theme.getSize("default_margin").width : 0 visible: control.overlayIconSource != "" && control.iconSource != "" color: control.overlayColor opacity: !control.enabled ? 0.2 : 1.0 From bf2972200d023ef30d5925080083a0708d48667f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 28 Dec 2017 18:09:44 +0100 Subject: [PATCH 707/764] Clarify infill/skin overlap setting descriptions a bit Discovered during work on CURA-4732. --- resources/definitions/fdmprinter.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 24f7efe373..17f8b6826f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1614,7 +1614,7 @@ "infill_overlap": { "label": "Infill Overlap Percentage", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "description": "The amount of overlap between the infill and the walls as a percentage of the infill line width. A slight overlap allows the walls to connect firmly to the infill.", "unit": "%", "type": "float", "default_value": 10, @@ -1635,7 +1635,7 @@ "default_value": 0.04, "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", - "value": "0.5 * ( infill_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0) ) * infill_overlap / 100 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", + "value": "0.5 * (infill_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0)) * infill_overlap / 100 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", "enabled": "infill_sparse_density > 0 and infill_pattern != 'concentric'", "settable_per_mesh": true } @@ -1644,7 +1644,7 @@ "skin_overlap": { "label": "Skin Overlap Percentage", - "description": "The amount of overlap between the skin and the walls as a percentage of the line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall.", + "description": "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall.", "unit": "%", "type": "float", "default_value": 5, @@ -1665,7 +1665,7 @@ "default_value": 0.02, "minimum_value_warning": "-0.5 * machine_nozzle_size", "maximum_value_warning": "machine_nozzle_size", - "value": "0.5 * ( skin_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0) ) * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", + "value": "0.5 * (skin_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0)) * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", "enabled": "top_bottom_pattern != 'concentric'", "settable_per_mesh": true } From b733c587f433b4305d8b1bef80b5d0a785d48e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Fri, 29 Dec 2017 01:33:12 +0100 Subject: [PATCH 708/764] Adding support Anycubic i3 Mega Definition for _Anycubic i3 Mega_ from the user manual. --- .../definitions/anycubic_i3_mega.def.json | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 resources/definitions/anycubic_i3_mega.def.json diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json new file mode 100644 index 0000000000..2ae21b6d80 --- /dev/null +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -0,0 +1,57 @@ +{ + "version":2, + "name":"Anycubic i3 Mega", + "inherits":"fdmprinter", + "metadata":{ + "visible":true, + "author":"TheTobby", + "manufacturer":"Anycubic", + "file_formats":"text/x-gcode", + "icon":"icon_ultimaker2", + "platform":"prusai3_platform.stl" + }, + "overrides":{ + "machine_name":{ + "default_value":"Anycubic i3 Mega" + }, + "machine_heated_bed":{ + "default_value":true + }, + "machine_width":{ + "default_value":210 + }, + "machine_height":{ + "default_value":205 + }, + "machine_depth":{ + "default_value":210 + }, + "machine_center_is_zero":{ + "default_value":false + }, + "machine_nozzle_size":{ + "default_value":0.4 + }, + "material_diameter":{ + "default_value":1.75 + }, + "speed_travel":{ + "default_value":60 + }, + "speed_print":{ + "default_value":50 + }, + "gantry_height":{ + "default_value":0 + }, + "machine_gcode_flavor":{ + "default_value":"RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode":{ + "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" + }, + "machine_end_gcode":{ + "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + } + } +} \ No newline at end of file From c1dea6e9d43e60d0b4a52ef9929da581e6bfdf60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Fri, 29 Dec 2017 01:56:46 +0100 Subject: [PATCH 709/764] Adding support Tevo Black Widow Definition for _Tevo Black Widow_ from the user manual. --- .../definitions/tevo_blackwidow.def.json | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 resources/definitions/tevo_blackwidow.def.json diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json new file mode 100644 index 0000000000..f31bbcff23 --- /dev/null +++ b/resources/definitions/tevo_blackwidow.def.json @@ -0,0 +1,57 @@ +{ + "version": 2, + "name": "Tevo Black Widow", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "TheTobby", + "manufacturer": "Tevo", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "prusai3_platform.stl" + }, + "overrides": { + "machine_name": { + "default_value": "Tevo Black Widow" + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 350 + }, + "machine_height": { + "default_value": 250 + }, + "machine_depth": { + "default_value": 250 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "gantry_height": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "speed_travel": { + "default_value": 70 + }, + "speed_print": { + "default_value": 60 + }, + "machine_start_gcode": { + "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\M420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\G28 ; home all\G29 ; probe bed\G92 E0 ;zero the extruded length\G1 X0.0 Y50.0 Z10.0 F3600\; perform wipe and prime\G1 Z0.0 F1000\G1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\G1 Y100.0 E12.5 F1000.0 ; prime\G92 E0 ; zero extruder again\M117 Printing..." + }, + "machine_end_gcode": { + "default_value": "G92 E0 ; zero the extruded length again\G1 E-1.5 F500 ; retract the filament to release some of the pressure\M104 S0 ; turn off extruder\M140 S0 ; turn off bed\G28 X0 ; home X axis\G1 Y245 ; move Y axis to end position\M84 ; disable motors\M107 ; turn off fan" + } + } +} From 5b47c58e80a89522ac7529e7a5c556f7bd1d4a77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 11:22:55 +0100 Subject: [PATCH 710/764] Add European Portuguese translation This is a new translation from Bothof. Contributes to issue CURA-4692. --- resources/i18n/pt_PT/cura.po | 4595 ++++++++++++++ resources/i18n/pt_PT/fdmextruder.def.json.po | 210 + resources/i18n/pt_PT/fdmprinter.def.json.po | 5814 ++++++++++++++++++ 3 files changed, 10619 insertions(+) create mode 100644 resources/i18n/pt_PT/cura.po create mode 100644 resources/i18n/pt_PT/fdmextruder.def.json.po create mode 100644 resources/i18n/pt_PT/fdmprinter.def.json.po diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po new file mode 100644 index 0000000000..5cabe1b536 --- /dev/null +++ b/resources/i18n/pt_PT/cura.po @@ -0,0 +1,4595 @@ +# Cura +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.1\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-12-07 13:41+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Bothof\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:29 +msgctxt "@action" +msgid "Machine Settings" +msgstr "Definições da máquina" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@item:inlistbox" +msgid "X-Ray view" +msgstr "Visualização de raio X" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:13 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "Ficheiro X3D" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:16 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "Ficheiro GCode" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:65 +msgctxt "@action:button" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Imprimir com Wi-Fi box Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:66 +msgctxt "@properties:tooltip" +msgid "Print with Doodle3D WiFi-Box" +msgstr "Imprimir com Wi-Fi box Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:86 +msgctxt "@info:status" +msgid "Connecting to Doodle3D Connect" +msgstr "A ligar ao Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:87 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:155 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:874 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:646 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:370 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:78 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:104 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:99 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:376 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:139 +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:253 +msgctxt "@action:button" +msgid "Cancel" +msgstr "Cancelar" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:154 +msgctxt "@info:status" +msgid "Sending data to Doodle3D Connect" +msgstr "A enviar dados para o Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:161 +msgctxt "@info:status" +msgid "Unable to send data to Doodle3D Connect. Is another job still active?" +msgstr "Não é possível enviar dados para o Doodle3D Connect. Existe outra tarefa ativa?" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:175 +msgctxt "@info:status" +msgid "Storing data on Doodle3D Connect" +msgstr "A armazenar dados no Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:213 +msgctxt "@info:status" +msgid "File sent to Doodle3D Connect" +msgstr "Ficheiro enviado para o Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@action:button" +msgid "Open Connect..." +msgstr "Abrir Connect..." + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D/D3DCloudPrintOutputDevicePlugin.py:214 +msgctxt "@info:tooltip" +msgid "Open the Doodle3D Connect web interface" +msgstr "Abrir a interface Web do Doodle3D Connect" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:34 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "Mostrar registo de alterações" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:20 +msgctxt "@item:inmenu" +msgid "Flatten active settings" +msgstr "Definições ativas de aplanamento" + +#: /home/ruben/Projects/Cura/plugins/ProfileFlattener/ProfileFlattener.py:32 +msgctxt "@info:status" +msgid "Profile has been flattened & activated." +msgstr "O perfil foi aplanado e ativado." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "Impressão através de USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "Imprimir através de USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "Imprimir através de USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "Ligado através de USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "Não é possível iniciar uma nova tarefa porque a impressora está ocupada ou não está ligada." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:154 +msgctxt "@info:title" +msgid "Printer Unavailable" +msgstr "Impressora indisponível" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +msgctxt "@info:status" +msgid "" +"This printer does not support USB printing because it uses UltiGCode flavor." +msgstr "Esta impressora não suporta impressão através de USB porque utiliza o padrão UltiGCode." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:457 +msgctxt "@info:title" +msgid "USB Printing" +msgstr "Impressão através de USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +msgctxt "@info:status" +msgid "" +"Unable to start a new job because the printer does not support usb printing." +msgstr "Não é possível iniciar uma nova tarefa porque a impressora não suporta impressão através de USB." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:461 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:945 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1349 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1417 +msgctxt "@info:title" +msgid "Warning" +msgstr "Aviso" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:108 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "Não é possível atualizar o firmware porque não existem impressoras ligadas." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "Não foi possível encontrar o firmware necessário para a impressora em %s." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:122 +msgctxt "@info:title" +msgid "Printer Firmware" +msgstr "Firmware da impressora" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "Guardar em unidade amovível" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "Guardar em unidade amovível {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +#, python-brace-format +msgctxt "@info:progress Don't translate the XML tags !" +msgid "Saving to Removable Drive {0}" +msgstr "A guardar em unidade amovível {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:89 +msgctxt "@info:title" +msgid "Saving" +msgstr "A guardar" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:99 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:102 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "Could not save to {0}: {1}" +msgstr "Não foi possível guardar em {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:118 +#, python-brace-format +msgctxt "@info:status Don't translate the tag {device}!" +msgid "Could not find a file name when trying to write to {device}." +msgstr "Não foi possível encontrar um nome de ficheiro ao tentar gravar em {device}." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:131 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:146 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "Não foi possível guardar na unidade amovível {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:132 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:692 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:700 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:146 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:153 +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1358 +msgctxt "@info:title" +msgid "Error" +msgstr "Erro" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "Guardado na unidade amovível {0} como {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:140 +msgctxt "@info:title" +msgid "File Saved" +msgstr "Ficheiro guardado" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +msgctxt "@action:button" +msgid "Eject" +msgstr "Ejetar" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:141 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "Ejetar dispositivo amovível {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "{0} ejetado. Pode agora remover a unidade com segurança." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:156 +msgctxt "@info:title" +msgid "Safely Remove Hardware" +msgstr "Remover hardware com segurança" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:158 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "Falha ao ejetar {0}. Outro programa pode estar a utilizar a unidade." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:68 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "Unidade amovível" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:109 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:53 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "Imprimir através da rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:110 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "Imprimir através da rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:status" +msgid "" +"Access to the printer requested. Please approve the request on the printer" +msgstr "Acesso à impressora solicitado. Aprove a solicitação na impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +msgctxt "@info:title" +msgid "Connection status" +msgstr "Estado da ligação" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:160 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:479 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:502 +msgctxt "@info:title" +msgid "Connection Status" +msgstr "Estado da ligação" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +msgctxt "@action:button" +msgid "Retry" +msgstr "Repetir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:161 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "Reenviar a solicitação de acesso" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:163 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "Acesso à impressora aceite" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:164 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "Sem acesso à impressão com esta impressora. Não é possível enviar a tarefa de impressão." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "Solicitar acesso" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:165 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "Enviar solicitação de acesso para a impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:385 +msgctxt "@info:status" +msgid "" +"Connected over the network. Please approve the access request on the printer." +msgstr "Ligado através da rede. Aprove a solicitação de acesso na impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:392 +msgctxt "@info:status" +msgid "Connected over the network." +msgstr "Ligado através da rede." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:405 +msgctxt "@info:status" +msgid "Connected over the network. No access to control the printer." +msgstr "Ligado através da rede. Sem acesso para controlar a impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:410 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "A solicitação de acesso foi negada na impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:413 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "A solicitação de acesso falhou devido a tempo excedido." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:478 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "A ligação à rede foi perdida." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:501 +msgctxt "@info:status" +msgid "" +"The connection with the printer was lost. Check your printer to see if it is " +"connected." +msgstr "A ligação à impressora foi perdida. Verifique se a impressora está ligada." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:666 +#, python-format +msgctxt "@info:status" +msgid "" +"Unable to start a new print job, printer is busy. Current printer status is " +"%s." +msgstr "Não é possível iniciar uma nova tarefa de impressão; a impressora está ocupada. O estado atual da impressora é %s." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:667 +msgctxt "@info:title" +msgid "Printer Status" +msgstr "Estado da impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:691 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No Printcore loaded in slot {0}" +msgstr "Não é possível iniciar uma nova tarefa de impressão. Nenhum núcleo de impressão carregado na ranhura {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:699 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "Não é possível iniciar uma nova tarefa de impressão. Nenhum material carregado na ranhura {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:709 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "Material insuficiente para a bobina {0}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:719 +#, python-brace-format +msgctxt "@label" +msgid "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "Núcleo de impressão diferente (Cura: {0}, Impressora: {1}) selecionado para a extrusora {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:733 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "Material diferente (Cura: {0}, Impressora: {1}) selecionado para a extrusora {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:741 +#, python-brace-format +msgctxt "@label" +msgid "" +"PrintCore {0} is not properly calibrated. XY calibration needs to be " +"performed on the printer." +msgstr "O núcleo de impressão {0} não foi devidamente calibrado. É necessário realizar a calibração XY na impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:746 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "Tem a certeza de que deseja imprimir com a configuração selecionada?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:747 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer " +"and Cura. For the best result, always slice for the PrintCores and materials " +"that are inserted in your printer." +msgstr "Foi detetada uma incompatibilidade entre a configuração ou calibração da impressora e o Cura. Para obter melhores resultados, segmente sempre para os núcleos de impressão e para os materiais que estão introduzidos na impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:753 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "Configuração incompatível" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:864 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:262 +msgctxt "@info:status" +msgid "" +"Sending new jobs (temporarily) blocked, still sending the previous print job." +msgstr "A enviar novas tarefas bloqueadas (temporariamente); ainda a enviar a tarefa de impressão anterior." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "A enviar dados para a impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +msgctxt "@info:title" +msgid "Sending Data" +msgstr "A enviar dados" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:944 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "Não é possível enviar dados para a impressora. Existe outra tarefa ativa?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1085 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:196 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "A cancelar impressão..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1091 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "Impressão cancelada. Verifique a impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1097 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "A colocar a impressão em pausa..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1099 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "A retomar a impressão..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1289 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "Sincronizar com a impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1291 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "Gostaria de utilizar a configuração de impressora atual no Cura?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1293 +msgctxt "@label" +msgid "" +"The PrintCores and/or materials on your printer differ from those within " +"your current project. For the best result, always slice for the PrintCores " +"and materials that are inserted in your printer." +msgstr "Os núcleos de impressão e/ou materiais na sua impressora são diferentes dos incluídos no seu projeto atual. Para obter melhores resultados, segmente sempre para os núcleos de impressão e para os materiais que estão introduzidos na impressora." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:112 +msgid "" +"This printer is not set up to host a group of connected Ultimaker 3 printers." +msgstr "Esta impressora não está configurada para alojar um grupo de impressoras Ultimaker 3 ligadas em rede." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:113 +#, python-brace-format +msgctxt "Count is number of printers." +msgid "" +"This printer is the host for a group of {count} connected Ultimaker 3 " +"printers." +msgstr "Esta impressora aloja um grupo de {count} impressoras Ultimaker 3 ligadas em rede." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:114 +#, python-brace-format +msgid "" +"{printer_name} has finished printing '{job_name}'. Please collect the print " +"and confirm clearing the build plate." +msgstr "{printer_name} terminou a impressão de \"{job_name}\". Recolha a impressão e confirme a limpeza da placa de construção." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:115 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:520 +#, python-brace-format +msgid "" +"{printer_name} is reserved to print '{job_name}'. Please change the " +"printer's configuration to match the job, for it to start printing." +msgstr "{printer_name} está reservada para imprimir \"{job_name}\". Altere a configuração da impressora de forma a corresponder à tarefa para dar início à impressão." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:278 +msgctxt "@info:status" +msgid "" +"Unable to send new print job: this 3D printer is not (yet) set up to host a " +"group of connected Ultimaker 3 printers." +msgstr "Não é possível enviar nova tarefa de impressão: esta impressora 3D não está (ainda) configurada para alojar um grupo de impressoras Ultimaker 3 ligadas em rede." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:410 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to send print job to group {cluster_name}." +msgstr "Não é possível enviar tarefa de impressão para o grupo {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:418 +#, python-brace-format +msgctxt "@info:status" +msgid "Sent {file_name} to group {cluster_name}." +msgstr "{File_name} enviado para o grupo {cluster_name}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 +msgctxt "@action:button" +msgid "Show print jobs" +msgstr "Mostrar tarefas de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:424 +msgctxt "@info:tooltip" +msgid "Opens the print jobs interface in your browser." +msgstr "Abre a interface de tarefas de impressão no seu browser." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:489 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:239 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:47 +msgctxt "@label" +msgid "Unknown" +msgstr "Desconhecido" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:492 +#, python-brace-format +msgctxt "@info:status" +msgid "Printer '{printer_name}' has finished printing '{job_name}'." +msgstr "A impressora {printer_name} terminou a impressão de \"{job_name}\"." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:494 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:497 +msgctxt "@info:status" +msgid "Print finished" +msgstr "Impressão terminada" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:522 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:525 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:282 +msgctxt "@label:status" +msgid "Action required" +msgstr "Ação necessária" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:643 +#, python-brace-format +msgctxt "@info:progress" +msgid "Sending {file_name} to group {cluster_name}" +msgstr "A enviar {file_name} para o grupo {cluster_name}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Ligar através de rede" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:64 +#, python-brace-format +msgctxt "" +"@info Don't translate {machine_name}, since it gets replaced by a printer " +"name!" +msgid "" +"New features are available for your {machine_name}! It is recommended to " +"update the firmware on your printer." +msgstr "Estão disponíveis novas funcionalidades para a sua {machine_name}! É recomendado atualizar o firmware na sua impressora." + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:65 +#, python-format +msgctxt "@info:title The %s gets replaced with the printer name." +msgid "New %s firmware available" +msgstr "Novo firmware %s disponível" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:66 +msgctxt "@action:button" +msgid "How to update" +msgstr "Como atualizar" + +#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:77 +msgctxt "@info" +msgid "Could not access update information." +msgstr "Não foi possível aceder às informações de atualização." + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/SolidWorksReader.py:199 +msgctxt "@info:status" +msgid "" +"Errors appeared while opening your SolidWorks file! Please " +"check, whether it is possible to open your file in SolidWorks itself without " +"any problems as well!" +msgstr "Foram apresentados erros ao abrir o seu ficheiro SolidWorks! Verifique se é possível abrir o ficheiro no SolidWorks sem quaisquer problemas!" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:31 +msgctxt "@item:inlistbox" +msgid "SolidWorks part file" +msgstr "Ficheiro de peça SolidWorks" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "SolidWorks assembly file" +msgstr "Ficheiro de montagem SolidWorks" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.py:21 +msgid "Configure" +msgstr "Configurar" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/CommonComReader.py:135 +#, python-format +msgctxt "@info:status" +msgid "Error while starting %s!" +msgstr "Erro ao iniciar %s!" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Simulation view" +msgstr "Visualização de simulação" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:100 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "O Cura não apresenta as camadas de forma precisa quando a Impressão de fios está ativada" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.py:101 +msgctxt "@info:title" +msgid "Simulation View" +msgstr "Visualização de simulação" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:26 +msgid "Modify G-Code" +msgstr "Modificar G-Code" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:43 +msgctxt "@info" +msgid "" +"Cura collects anonymised slicing statistics. You can disable this in the " +"preferences." +msgstr "O Cura recolhe estatísticas de segmentação anónimas. É possível desativar esta opção nas preferências." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:46 +msgctxt "@info:title" +msgid "Collecting Data" +msgstr "A recolher dados" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:48 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "Dispensar" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Perfis Cura 15.04" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "Ficheiro G-code" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "Imagem JPG" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "Imagem JPEG" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "Imagem PNG" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:26 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "Imagem BMP" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "Imagem GIF" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +msgctxt "@info:status" +msgid "" +"Unable to slice with the current material as it is incompatible with the " +"selected machine or configuration." +msgstr "Não é possível segmentar com o material atual, uma vez que é incompatível com a máquina ou configuração selecionada." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:269 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:297 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:319 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:327 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:336 +msgctxt "@info:title" +msgid "Unable to slice" +msgstr "Não é possível segmentar" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:296 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice with the current settings. The following settings have " +"errors: {0}" +msgstr "Não é possível segmentar com as definições atuais. As seguintes definições apresentam erros: {0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:318 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice due to some per-model settings. The following settings have " +"errors on one or more models: {error_labels}" +msgstr "Não é possível segmentar devido a algumas definições por modelo. As seguintes definições apresentam erros num ou mais modelos: {error_labels}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:326 +msgctxt "@info:status" +msgid "" +"Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "Não é possível segmentar porque a torre ou a(s) posição(ões) de preparação é(são) inválidas." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:335 +msgctxt "@info:status" +msgid "" +"Nothing to slice because none of the models fit the build volume. Please " +"scale or rotate models to fit." +msgstr "Sem conteúdo para segmentar porque nenhum dos modelos se adapta ao volume de construção. Dimensione ou rode os modelos para os adaptar." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "A processar camadas" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:239 +msgctxt "@info:title" +msgid "Information" +msgstr "Informações" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "Definições por modelo" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:15 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "Configurar definições por modelo" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:23 +msgid "Install" +msgstr "Instalar" + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:43 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR. It " +"is not set to a directory." +msgstr "Falha ao copiar os ficheiros de plug-in Siemens NX. Verifique o seu UGII_USER_DIR. Não está atribuído a um diretório." + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:50 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:59 +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:81 +msgid "Successfully installed Siemens NX Cura plugin." +msgstr "Plug-in Siemens NX Cura instalado com sucesso." + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:65 +msgid "" +"Failed to copy Siemens NX plugins files. Please check your UGII_USER_DIR." +msgstr "Falha ao copiar os ficheiros de plug-in Siemens NX. Verifique o seu UGII_USER_DIR." + +#: /home/ruben/Projects/Cura/plugins/cura-siemensnx-plugin/Installer.py:85 +msgid "" +"Failed to install Siemens NX plugin. Could not set environment variable " +"UGII_USER_DIR for Siemens NX." +msgstr "Falha ao instalar o plug-in Siemens NX. Não foi possível definir a variável do ambiente UGII_USER_DIR para o Siemens NX." + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:167 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:585 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "Recomendado" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:169 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:590 +msgctxt "@title:tab" +msgid "Custom" +msgstr "Personalizado" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:30 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:36 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "Ficheiro 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:126 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1142 +msgctxt "@label" +msgid "Nozzle" +msgstr "Bocal" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:164 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to get plugin ID from {0}" +msgstr "Falha ao obter ID de plug-in de {0}" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:165 +msgctxt "@info:tile" +msgid "Warning" +msgstr "Aviso" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.py:203 +msgctxt "@window:title" +msgid "Plugin browser" +msgstr "Browser de plug-ins" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@item:inmenu" +msgid "Solid view" +msgstr "Visualização sólida" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/__init__.py:18 +msgctxt "@item:inlistbox" +msgid "G File" +msgstr "Ficheiro G" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:314 +msgctxt "@info:status" +msgid "Parsing G-code" +msgstr "A analisar G-Code" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:316 +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:426 +msgctxt "@info:title" +msgid "G-code Details" +msgstr "Detalhes do G-code" + +#: /home/ruben/Projects/Cura/plugins/GCodeReader/GCodeReader.py:424 +msgctxt "@info:generic" +msgid "" +"Make sure the g-code is suitable for your printer and printer configuration " +"before sending the file to it. The g-code representation may not be accurate." +msgstr "Certifique-se de que o g-code é apropriado para a sua impressora e respetiva configuração antes de enviar o ficheiro. A representação do g-code poderá ser imprecisa." + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:14 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:14 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Perfil Cura" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "Ficheiro 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:38 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "Ficheiro 3MF de projeto Cura" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:20 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18 +msgctxt "@action" +msgid "Select upgrades" +msgstr "Selecionar atualizações" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:12 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "Atualizar firmware" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "Exame" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "Nivelar placa de construção" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89 +msgctxt "@tooltip" +msgid "Outer Wall" +msgstr "Parede externa" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90 +msgctxt "@tooltip" +msgid "Inner Walls" +msgstr "Paredes internas" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91 +msgctxt "@tooltip" +msgid "Skin" +msgstr "Revestimento" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:92 +msgctxt "@tooltip" +msgid "Infill" +msgstr "Preenchimento" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:93 +msgctxt "@tooltip" +msgid "Support Infill" +msgstr "Preenchimento de suporte" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:94 +msgctxt "@tooltip" +msgid "Support Interface" +msgstr "Interface de suporte" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:95 +msgctxt "@tooltip" +msgid "Support" +msgstr "Suporte" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:96 +msgctxt "@tooltip" +msgid "Skirt" +msgstr "Contorno" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:97 +msgctxt "@tooltip" +msgid "Travel" +msgstr "Deslocação" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:98 +msgctxt "@tooltip" +msgid "Retractions" +msgstr "Retrações" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:99 +msgctxt "@tooltip" +msgid "Other" +msgstr "Outro" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:199 +msgctxt "@label unknown material" +msgid "Unknown" +msgstr "Desconhecido" + +#: /home/ruben/Projects/Cura/cura/PrintInformation.py:284 +#, python-brace-format +msgctxt "@label" +msgid "Pre-sliced file {0}" +msgstr "Ficheiro pré-segmentado {0}" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:469 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "Nenhum material carregado" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:476 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "Material desconhecido" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:30 +msgctxt "@info:status" +msgid "Finding new location for objects" +msgstr "A procurar nova localização para objetos" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:34 +msgctxt "@info:title" +msgid "Finding Location" +msgstr "A procurar localização" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:89 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:status" +msgid "Unable to find a location within the build volume for all objects" +msgstr "Não é possível encontrar uma localização no volume de construção para todos os objetos" + +#: /home/ruben/Projects/Cura/cura/ArrangeObjectsJob.py:90 +msgctxt "@info:title" +msgid "Can't Find Location" +msgstr "Não é possível encontrar localização" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:431 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "O ficheiro já existe" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:432 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:114 +#, python-brace-format +msgctxt "@label Don't translate the XML tag !" +msgid "" +"The file {0} already exists. Are you sure you want to " +"overwrite it?" +msgstr "O ficheiro {0} já existe. Tem a certeza de que deseja substituí-lo?" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:815 +msgctxt "@label" +msgid "Custom" +msgstr "Personalizado" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:819 +msgctxt "@label" +msgid "Custom Material" +msgstr "Material personalizado" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:182 +msgctxt "@menuitem" +msgid "Global" +msgstr "Global" + +#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:229 +msgctxt "@menuitem" +msgid "Not overridden" +msgstr "Não substituído" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:117 +msgctxt "@info:status" +msgid "" +"The selected material is incompatible with the selected machine or " +"configuration." +msgstr "O material selecionado é incompatível com a máquina ou configuração selecionada." + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:118 +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:title" +msgid "Incompatible Material" +msgstr "Material incompatível" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:24 +msgctxt "@info:status Has a cancel button next to it." +msgid "" +"The selected material diameter causes the material to become incompatible " +"with the current printer." +msgstr "O diâmetro do material selecionado faz com que o material se torne incompatível com a impressora atual." + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action:button" +msgid "Undo" +msgstr "Anular" + +#: /home/ruben/Projects/Cura/cura/Settings/MaterialManager.py:25 +msgctxt "@action" +msgid "Undo changing the material diameter." +msgstr "Anular alteração do diâmetro do material." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to export profile to {0}: {1}" +msgstr "Falha ao exportar perfil para {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:151 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "" +"Failed to export profile to {0}: Writer plugin reported " +"failure." +msgstr "Falha ao exportar perfil para {0}: O plug-in de gravador comunicou uma falha." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:156 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tag !" +msgid "Exported profile to {0}" +msgstr "Perfil exportado para {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:157 +msgctxt "@info:title" +msgid "Export succeeded" +msgstr "Exportação bem-sucedida" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:183 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:205 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:214 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:248 +#, python-brace-format +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Failed to import profile from {0}: {1}" +msgstr "Falha ao importar perfil de {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:216 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:252 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "Perfil {0} importado com êxito" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:255 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "O perfil {0} tem um tipo de ficheiro desconhecido ou está corrompido." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:274 +msgctxt "@label" +msgid "Custom profile" +msgstr "Perfil personalizado" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:285 +msgctxt "@info:status" +msgid "Profile is missing a quality type." +msgstr "O perfil tem um tipo de qualidade em falta." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not find a quality type {0} for the current configuration." +msgstr "Não foi possível encontrar um tipo de qualidade {0} para a configuração atual." + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:100 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print " +"Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "A altura do volume de construção foi reduzida devido ao valor da definição \"Sequência de impressão\" para impedir que o pórtico colida com os modelos impressos." + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:102 +msgctxt "@info:title" +msgid "Build Volume" +msgstr "Volume de construção" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:34 +msgctxt "@info:status" +msgid "Multiplying and placing objects" +msgstr "Multiplicar e dispor objetos" + +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:35 +#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:83 +msgctxt "@info:title" +msgid "Placing Object" +msgstr "A dispor objeto" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:80 +msgctxt "@title:window" +msgid "Crash Report" +msgstr "Relatório de falhas" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:93 +msgctxt "@label crash message" +msgid "" +"

    A fatal exception has occurred. Please send us this Crash Report to " +"fix the problem

    \n" +"

    Please use the \"Send report\" button to post a bug report " +"automatically to our servers

    \n" +" " +msgstr "

    Ocorreu uma exceção fatal. Envie-nos este relatório de falhas para resolver o problema

    \n

    Utilize o botão \"Enviar relatório\" para publicar um relatório de erros automaticamente nos nossos servidores

    \n " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:101 +msgctxt "@title:groupbox" +msgid "System information" +msgstr "Informações do sistema" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:109 +msgctxt "@label unknown version of Cura" +msgid "Unknown" +msgstr "Desconhecido" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:111 +#, python-brace-format +msgctxt "@label Cura version" +msgid "Cura version: {version}
    " +msgstr "Versão do Cura: {version}
    " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:112 +#, python-brace-format +msgctxt "@label Platform" +msgid "Platform: {platform}
    " +msgstr "Plataforma: {platform}
    " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:113 +#, python-brace-format +msgctxt "@label Qt version" +msgid "Qt version: {qt}
    " +msgstr "Versão Qt: {qt}
    " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:114 +#, python-brace-format +msgctxt "@label PyQt version" +msgid "PyQt version: {pyqt}
    " +msgstr "Versão PyQt: {pyqt}
    " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:115 +#, python-brace-format +msgctxt "@label OpenGL" +msgid "OpenGL: {opengl}
    " +msgstr "OpenGL: {opengl}
    " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:130 +#, python-brace-format +msgctxt "@label OpenGL version" +msgid "
  • OpenGL Version: {version}
  • " +msgstr "
  • Versão do OpenGL: {version}
  • " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:131 +#, python-brace-format +msgctxt "@label OpenGL vendor" +msgid "
  • OpenGL Vendor: {vendor}
  • " +msgstr "
  • Vendedor do OpenGL: {vendor}
  • " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:132 +#, python-brace-format +msgctxt "@label OpenGL renderer" +msgid "
  • OpenGL Renderer: {renderer}
  • " +msgstr "
  • Processador do OpenGL: {renderer}
  • " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:141 +msgctxt "@title:groupbox" +msgid "Exception traceback" +msgstr "Determinação da origem da exceção" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:208 +msgctxt "@title:groupbox" +msgid "Logs" +msgstr "Registos" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:231 +msgctxt "@title:groupbox" +msgid "User description" +msgstr "Descrição do utilizador" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:246 +msgctxt "@action:button" +msgid "Send report" +msgstr "Enviar relatório" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:256 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "A carregar máquinas..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:661 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "A configurar cenário..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:703 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "A carregar interface..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:874 +#, python-format +msgctxt "" +"@info 'width', 'depth' and 'height' are variable names that must NOT be " +"translated; just translate the format of ##x##x## mm." +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(largura).1f x %(profundidade).1f x %(altura).1f mm" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 +#, python-brace-format +msgctxt "@info:status" +msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" +msgstr "Apenas pode ser carregado um ficheiro G-code de cada vez. Importação {0} ignorada" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1357 +#, python-brace-format +msgctxt "@info:status" +msgid "Can't open any other file if G-code is loading. Skipped importing {0}" +msgstr "Não é possível abrir outro ficheiro enquanto o G-code estiver a carregar. Importação {0} ignorada" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1416 +msgctxt "@info:status" +msgid "The selected model was too small to load." +msgstr "O modelo selecionado era demasiado pequeno para carregar." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:59 +msgctxt "@title" +msgid "Machine Settings" +msgstr "Definições da máquina" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:78 +msgctxt "@title:tab" +msgid "Printer" +msgstr "Impressora" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:97 +msgctxt "@label" +msgid "Printer Settings" +msgstr "Definições da impressora" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:108 +msgctxt "@label" +msgid "X (Width)" +msgstr "X (largura)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:119 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:235 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:288 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:300 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:391 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:401 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:413 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:840 +msgctxt "@label" +msgid "mm" +msgstr "mm" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:118 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (profundidade)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:128 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (altura)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:140 +msgctxt "@label" +msgid "Build plate shape" +msgstr "Forma da placa de construção" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:149 +msgctxt "@option:check" +msgid "Origin at center" +msgstr "Origem no centro" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:157 +msgctxt "@option:check" +msgid "Heated bed" +msgstr "Base aquecida" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:168 +msgctxt "@label" +msgid "Gcode flavor" +msgstr "Padrão Gcode" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:181 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "Definições da cabeça de impressão" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:191 +msgctxt "@label" +msgid "X min" +msgstr "X mín." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:192 +msgctxt "@tooltip" +msgid "" +"Distance from the left of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "Distância desde a parte esquerda da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:201 +msgctxt "@label" +msgid "Y min" +msgstr "Y mín." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:202 +msgctxt "@tooltip" +msgid "" +"Distance from the front of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "Distância desde a parte frontal da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:211 +msgctxt "@label" +msgid "X max" +msgstr "X máx." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:212 +msgctxt "@tooltip" +msgid "" +"Distance from the right of the printhead to the center of the nozzle. Used " +"to prevent colissions between previous prints and the printhead when " +"printing \"One at a Time\"." +msgstr "Distância desde a parte direita da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:221 +msgctxt "@label" +msgid "Y max" +msgstr "Y máx." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:222 +msgctxt "@tooltip" +msgid "" +"Distance from the rear of the printhead to the center of the nozzle. Used to " +"prevent colissions between previous prints and the printhead when printing " +"\"One at a Time\"." +msgstr "Distância desde a parte posterior da cabeça de impressão até ao centro do bocal. Utilizado para impedir colisões entre as impressões anteriores e a cabeça de impressão ao imprimir \"Individualmente\"." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:234 +msgctxt "@label" +msgid "Gantry height" +msgstr "Altura do pórtico" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:236 +msgctxt "@tooltip" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes). Used to prevent collisions between previous prints and the " +"gantry when printing \"One at a Time\"." +msgstr "A diferença de altura entre a ponta do bocal e o sistema de pórtico (eixos X e Y). Utilizado para impedir colisões entre as impressões anteriores e o pórtico ao imprimir \"Individualmente\"." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:255 +msgctxt "@label" +msgid "Number of Extruders" +msgstr "Número de extrusoras" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 +msgctxt "@tooltip" +msgid "" +"The nominal diameter of filament supported by the printer. The exact " +"diameter will be overridden by the material and/or the profile." +msgstr "O diâmetro nominal do filamento suportado pela impressora. O diâmetro exato será substituído pelo material e/ou perfil." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:291 +msgctxt "@label" +msgid "Material diameter" +msgstr "Diâmetro do material" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:299 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:390 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Tamanho do bocal" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:317 +msgctxt "@label" +msgid "Start Gcode" +msgstr "Gcode inicial" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:327 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very start." +msgstr "Comandos Gcode a serem executados no início." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:336 +msgctxt "@label" +msgid "End Gcode" +msgstr "Gcode final" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:346 +msgctxt "@tooltip" +msgid "Gcode commands to be executed at the very end." +msgstr "Comandos Gcode a serem executados no fim." + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:378 +msgctxt "@label" +msgid "Nozzle Settings" +msgstr "Definições do bocal" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:400 +msgctxt "@label" +msgid "Nozzle offset X" +msgstr "Desvio X do bocal" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:412 +msgctxt "@label" +msgid "Nozzle offset Y" +msgstr "Desvio Y do bocal" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:433 +msgctxt "@label" +msgid "Extruder Start Gcode" +msgstr "Gcode inicial da extrusora" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:451 +msgctxt "@label" +msgid "Extruder End Gcode" +msgstr "Gcode final da extrusora" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "Registo de alterações" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:107 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:445 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:357 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:80 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:147 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "Fechar" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:22 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "Atualização de firmware" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:42 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "Atualização de firmware concluída." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:47 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "A iniciar atualização de firmware; isto poderá demorar algum tempo." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:52 +msgctxt "@label" +msgid "Updating firmware." +msgstr "A atualizar firmware." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:61 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "A atualização de firmware falhou devido a um erro desconhecido." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:64 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "A atualização de firmware falhou devido a um erro de comunicação." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:67 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "A atualização de firmware falhou devido a um erro de entrada/saída." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:70 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "A atualização de firmware falhou devido à ausência de firmware." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:73 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "Código de erro desconhecido: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:55 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "Ligar à impressora em rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:65 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your " +"printer is connected to the network using a network cable or by connecting " +"your printer to your WIFI network. If you don't connect Cura with your " +"printer, you can still use a USB drive to transfer g-code files to your " +"printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "Para imprimir diretamente para a sua impressora através da rede, certifique-se de que a sua impressora está ligada à rede por meio de um cabo de rede ou através de ligação à rede Wi-Fi. Se não ligar o Cura à impressora, poderá ainda assim utilizar uma unidade USB para transferir ficheiros g-code para a impressora.\n\nSelecione a sua impressora na lista a seguir:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:75 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "Adicionar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:85 +msgctxt "@action:button" +msgid "Edit" +msgstr "Editar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:190 +msgctxt "@action:button" +msgid "Remove" +msgstr "Remover" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:104 +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:35 +msgctxt "@action:button" +msgid "Refresh" +msgstr "Atualizar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:194 +msgctxt "@label" +msgid "" +"If your printer is not listed, read the network printing " +"troubleshooting guide" +msgstr "Se a sua impressora não estiver indicada, leia o guia de resolução de problemas de impressão em rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:221 +msgctxt "@label" +msgid "Type" +msgstr "Tipo" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:233 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:236 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Extended" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:252 +msgctxt "@label" +msgid "Firmware version" +msgstr "Versão de firmware" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:264 +msgctxt "@label" +msgid "Address" +msgstr "Endereço" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:286 +msgctxt "@label" +msgid "This printer is not set up to host a group of Ultimaker 3 printers." +msgstr "Esta impressora não está configurada para alojar um grupo de impressoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:290 +msgctxt "@label" +msgid "This printer is the host for a group of %1 Ultimaker 3 printers." +msgstr "Esta impressora aloja um grupo de %1 impressoras Ultimaker 3." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:300 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "A impressora neste endereço ainda não respondeu." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:305 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "Ligar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:319 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "Endereço da impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:349 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "Introduza o endereço IP ou o nome de anfitrião da sua impressora na rede." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:379 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:92 +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:88 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181 +msgctxt "@action:button" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:24 +msgctxt "@title:window" +msgid "Print over network" +msgstr "Imprimir através da rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrintWindow.qml:92 +msgctxt "@action:button" +msgid "Print" +msgstr "Imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml:36 +msgctxt "@label: arg 1 is group name" +msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" +msgstr "%1 não está configurado para alojar um grupo de impressoras Ultimaker 3 ligadas em rede" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:14 +msgctxt "@info:tooltip" +msgid "Opens the print jobs page with your default web browser." +msgstr "Abre a página de tarefas de impressão com o seu browser predefinido." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/OpenPanelButton.qml:15 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:131 +msgctxt "@action:button" +msgid "View print jobs" +msgstr "Visualizar tarefas de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:37 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:278 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:408 +msgctxt "@label" +msgid "Preparing to print" +msgstr "A preparar para imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:39 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:271 +msgctxt "@label:status" +msgid "Printing" +msgstr "A imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:41 +msgctxt "@label:status" +msgid "Available" +msgstr "Disponível" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:43 +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:101 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Ligação com a impressora perdida" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:257 +msgctxt "@label:status" +msgid "Disabled" +msgstr "Desativado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:273 +msgctxt "@label:status" +msgid "Reserved" +msgstr "Reservado" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:275 +msgctxt "@label:status" +msgid "Finished" +msgstr "Concluído" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:290 +msgctxt "@label:status" +msgid "Paused" +msgstr "Em pausa" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:292 +msgctxt "@label:status" +msgid "Resuming" +msgstr "A retomar" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:294 +msgctxt "@label:status" +msgid "Print aborted" +msgstr "Impressão cancelada" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:389 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:410 +msgctxt "@label" +msgid "Not accepting print jobs" +msgstr "Não são aceites tarefas de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:403 +msgctxt "@label" +msgid "Finishes at: " +msgstr "Termina a: " + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:405 +msgctxt "@label" +msgid "Clear build plate" +msgstr "Limpar placa de construção" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml:414 +msgctxt "@label" +msgid "Waiting for configuration change" +msgstr "A aguardar pela alteração de configuração" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:64 +msgctxt "@title" +msgid "Print jobs" +msgstr "Tarefas de impressão" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:94 +msgctxt "@label" +msgid "Printing" +msgstr "A imprimir" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:112 +msgctxt "@label" +msgid "Queued" +msgstr "Em fila" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:171 +msgctxt "@label:title" +msgid "Printers" +msgstr "Impressoras" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/ClusterControlItem.qml:225 +msgctxt "@action:button" +msgid "View printers" +msgstr "Visualizar impressoras" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "Ligar a uma impressora" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "Carregar a configuração da impressora para o Cura" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "Ativar configuração" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:20 +msgctxt "@title:window" +msgid "Cura SolidWorks Plugin Configuration" +msgstr "Configuração do plug-in SolidWorks do Cura" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:44 +msgctxt "@action:label" +msgid "Default quality of the exported STL:" +msgstr "Qualidade predefinida do STL exportado:" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:79 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always ask" +msgstr "Perguntar sempre" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:80 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Fine quality" +msgstr "Utilizar sempre qualidade de alta resolução" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ConfigDialog.qml:81 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Always use Coarse quality" +msgstr "Utilizar sempre a qualidade de baixa resolução" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:20 +msgctxt "@title:window" +msgid "Import SolidWorks File as STL..." +msgstr "Importar ficheiro SolidWorks como STL..." + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:43 +msgctxt "@info:tooltip" +msgid "Quality of the Exported STL" +msgstr "Qualidade do STL exportado" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:48 +msgctxt "@action:label" +msgid "Quality" +msgstr "Qualidade" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:62 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Coarse" +msgstr "Baixa resolução" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:63 +msgctxt "@option:curaSolidworksStlQuality" +msgid "Fine" +msgstr "Alta resolução" + +#: /home/ruben/Projects/Cura/plugins/CuraSolidWorksPlugin/ExportSTLUI.qml:78 +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:82 +msgctxt "@text:window" +msgid "Remember my choice" +msgstr "Memorizar a minha escolha" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:81 +msgctxt "@label" +msgid "Color scheme" +msgstr "Esquema de cores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:96 +msgctxt "@label:listbox" +msgid "Material Color" +msgstr "Cor do material" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:100 +msgctxt "@label:listbox" +msgid "Line Type" +msgstr "Tipo de linha" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:104 +msgctxt "@label:listbox" +msgid "Feedrate" +msgstr "Velocidade de alimentação" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:108 +msgctxt "@label:listbox" +msgid "Layer thickness" +msgstr "Espessura da camada" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:148 +msgctxt "@label" +msgid "Compatibility Mode" +msgstr "Modo de compatibilidade" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:230 +msgctxt "@label" +msgid "Show Travels" +msgstr "Mostrar deslocações" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:236 +msgctxt "@label" +msgid "Show Helpers" +msgstr "Mostrar auxiliares" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:242 +msgctxt "@label" +msgid "Show Shell" +msgstr "Mostrar cobertura" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:248 +msgctxt "@label" +msgid "Show Infill" +msgstr "Mostrar preenchimento" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:297 +msgctxt "@label" +msgid "Only Show Top Layers" +msgstr "Mostrar apenas camadas superiores" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:306 +msgctxt "@label" +msgid "Show 5 Detailed Layers On Top" +msgstr "Mostrar cinco camadas detalhadas no topo" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:317 +msgctxt "@label" +msgid "Top / Bottom" +msgstr "Superior/Inferior" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:321 +msgctxt "@label" +msgid "Inner Wall" +msgstr "Parede interna" + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:378 +msgctxt "@label" +msgid "min" +msgstr "mín." + +#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationView.qml:420 +msgctxt "@label" +msgid "max" +msgstr "máx." + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "Plug-in de pós-processamento" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "Scripts de pós-processamento" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:217 +msgctxt "@action" +msgid "Add a script" +msgstr "Adicionar um script" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:263 +msgctxt "@label" +msgid "Settings" +msgstr "Definições" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:455 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "Alterar scripts de pós-processamento ativos" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "Converter imagem..." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:33 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "A distância máxima de cada pixel desde a \"Base\"." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:38 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "Altura (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:56 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "A altura da base desde a placa de construção em milímetros." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:61 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "Base (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:79 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "A largura em milímetros na placa de construção." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:84 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "Largura (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "A profundidade em milímetros na placa de construção." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "Profundidade (mm)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels " +"represent low points on the mesh. Change this option to reverse the behavior " +"such that black pixels represent high points on the mesh and white pixels " +"represent low points on the mesh." +msgstr "Por predefinição, os pixels brancos representam os pontos altos na malha e os pixels pretos representam os pontos baixos na malha. Altere esta opção para inverter o comportamento de forma que os pixels pretos representem os pontos altos na malha e os pixels brancos representem os pontos baixos na malha." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "Mais claro é mais alto" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "Mais escuro é mais alto" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "A quantidade de suavização a aplicar à imagem." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:154 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "Suavização" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:208 +msgctxt "@action:button" +msgid "Select settings" +msgstr "Selecionar definições" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:248 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "Selecionar definições a personalizar para este modelo" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:272 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "Filtrar..." + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:296 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "Mostrar tudo" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:14 +msgctxt "@title:window" +msgid "Open Project" +msgstr "Abrir projeto" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:58 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "Atualizar existente" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:59 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "Criar novo" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:70 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:72 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "Resumo – Projeto Cura" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:92 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:90 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "Definições da impressora" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:108 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "Como deve ser resolvido o conflito na máquina?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:128 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:99 +msgctxt "@action:label" +msgid "Type" +msgstr "Tipo" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:144 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:201 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:293 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:114 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:190 +msgctxt "@action:label" +msgid "Name" +msgstr "Nome" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:165 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:166 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "Definições do perfil" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:181 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "Como deve ser resolvido o conflito no perfil?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:174 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "Inexistente no perfil" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:221 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:179 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "%1 substituição" +msgstr[1] "%1 substituições" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:232 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "Derivado de" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:237 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "%1, %2 substituição" +msgstr[1] "%1, %2 substituições" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:253 +msgctxt "@action:label" +msgid "Material settings" +msgstr "Definições de material" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:269 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "Como deve ser resolvido o conflito no material?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:312 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:209 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "Visibilidade das definições" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:321 +msgctxt "@action:label" +msgid "Mode" +msgstr "Modo" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:337 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:218 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "Definições visíveis:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:342 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:223 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%1 de %2" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:368 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the build plate." +msgstr "O carregamento de um projeto irá limpar todos os modelos na placa de construção." + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:386 +msgctxt "@action:button" +msgid "Open" +msgstr "Abrir" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:11 +msgctxt "@title:window" +msgid "Find & Update plugins" +msgstr "Procurar e atualizar plug-ins" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:27 +msgctxt "@label" +msgid "Here you can find a list of Third Party plugins." +msgstr "Aqui pode encontrar uma lista de plug-ins de terceiros." + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:145 +msgctxt "@action:button" +msgid "Upgrade" +msgstr "Atualizar" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:147 +msgctxt "@action:button" +msgid "Installed" +msgstr "Instalado" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:149 +msgctxt "@action:button" +msgid "Download" +msgstr "Transferir" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:199 +msgctxt "@title:window" +msgid "Plugin License Agreement" +msgstr "Contrato de licença do plug-in" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:220 +msgctxt "@label" +msgid "" +"This plugin contains a license.\n" +"You need to accept this license to install this plugin.\n" +"Do you agree with the terms below?" +msgstr "Este plug-in contém uma licença.\nÉ necessário aceitar esta licença para instalar o plug-in.\nConcorda com os termos abaixo?" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:242 +msgctxt "@action:button" +msgid "Accept" +msgstr "Aceitar" + +#: /home/ruben/Projects/Cura/plugins/PluginBrowser/PluginBrowser.qml:253 +msgctxt "@action:button" +msgid "Decline" +msgstr "Rejeitar" + +#: /home/ruben/Projects/Cura/plugins/UserAgreementPlugin/UserAgreement.qml:16 +msgctxt "@title:window" +msgid "User Agreement" +msgstr "Contrato de utilizador" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:25 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "Selecionar atualizações da impressora" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker 2." +msgstr "Selecione quaisquer atualizações realizadas a esta Ultimaker 2." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Olsson Block" +msgstr "Bloco Olsson" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "Nivelamento da placa de construção" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your " +"buildplate. When you click 'Move to Next Position' the nozzle will move to " +"the different positions that can be adjusted." +msgstr "Para assegurar uma boa qualidade das suas impressões, é agora possível ajustar a placa de construção. Quando clica em \"Avançar para a posição seguinte\", o bocal irá deslocar-se para as diferentes posições que podem ser ajustadas." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the " +"print build plate height. The print build plate height is right when the " +"paper is slightly gripped by the tip of the nozzle." +msgstr "Para cada posição, introduza um pedaço de papel debaixo do bocal e ajuste a altura da placa de construção da impressão. A altura da placa de construção da impressão está correta quando o papel ficar ligeiramente preso na ponta do bocal." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "Iniciar nivelamento da placa de construção" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "Avançar para posição seguinte" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "Atualizar firmware" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This " +"firmware controls the step motors, regulates the temperature and ultimately " +"makes your printer work." +msgstr "O firmware é a parte do software que é executada diretamente na sua impressora 3D. Este firmware controla os motores de passo, regula a temperatura e assegura o funcionamento da sua impressora." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "" +"The firmware shipping with new printers works, but new versions tend to have " +"more features and improvements." +msgstr "O firmware que é expedido com as novas impressoras funciona corretamente, mas as novas versões costumam ter mais funcionalidades e melhorias." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "Atualizar firmware automaticamente" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "Carregar firmware personalizado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "Selecionar firmware personalizado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "Selecione quaisquer atualizações realizadas a esta Ultimaker Original" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "Placa de construção aquecida (kit oficial ou de construção própria)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "Verificar impressora" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip " +"this step if you know your machine is functional" +msgstr "É recomendado efetuar algumas verificações de conformidade à sua Ultimaker. Pode ignorar este passo se souber que a sua máquina está funcional" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "Iniciar verificação da impressora" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "Ligação: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "Ligado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "Não ligado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "X mín. de posição final: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "Trabalhos" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "Não verificado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "Y mín. de posição final: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "Z mín. de posição final: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "Verificação da temperatura do bocal: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "Parar aquecimento" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "Iniciar aquecimento" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "Verificação da temperatura da placa de construção:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "Verificado" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "Está tudo em ordem! O seu exame está concluído." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:88 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "Não ligado a uma impressora" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "A impressora não aceita comandos" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:96 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "Em manutenção. Verifique a impressora" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:184 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "A imprimir..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:106 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:186 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "Em pausa" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:109 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:188 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "A preparar..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "Remova a impressão" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:237 +msgctxt "@label:" +msgid "Resume" +msgstr "Retomar" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:241 +msgctxt "@label:" +msgid "Pause" +msgstr "Colocar em pausa" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:270 +msgctxt "@label:" +msgid "Abort Print" +msgstr "Cancelar impressão" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:280 +msgctxt "@window:title" +msgid "Abort print" +msgstr "Cancelar impressão" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "Tem a certeza de que deseja cancelar a impressão?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:15 +msgctxt "@title:window" +msgid "Discard or Keep changes" +msgstr "Eliminar ou manter as alterações" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:57 +msgctxt "@text:window" +msgid "" +"You have customized some profile settings.\n" +"Would you like to keep or discard those settings?" +msgstr "Personalizou algumas definições do perfil.\nGostaria de manter ou eliminar essas definições?" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:110 +msgctxt "@title:column" +msgid "Profile settings" +msgstr "Definições do perfil" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:117 +msgctxt "@title:column" +msgid "Default" +msgstr "Predefinição" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:124 +msgctxt "@title:column" +msgid "Customized" +msgstr "Personalizado" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:157 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:593 +msgctxt "@option:discardOrKeep" +msgid "Always ask me this" +msgstr "Perguntar sempre isto" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:158 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:594 +msgctxt "@option:discardOrKeep" +msgid "Discard and never ask again" +msgstr "Eliminar e não perguntar novamente" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:595 +msgctxt "@option:discardOrKeep" +msgid "Keep and never ask again" +msgstr "Manter e não perguntar novamente" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:196 +msgctxt "@action:button" +msgid "Discard" +msgstr "Eliminar" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:209 +msgctxt "@action:button" +msgid "Keep" +msgstr "Manter" + +#: /home/ruben/Projects/Cura/resources/qml/DiscardOrKeepProfileChangesDialog.qml:222 +msgctxt "@action:button" +msgid "Create New Profile" +msgstr "Criar novo perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:44 +msgctxt "@title" +msgid "Information" +msgstr "Informações" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:68 +msgctxt "@label" +msgid "Display Name" +msgstr "Apresentar nome" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:78 +msgctxt "@label" +msgid "Brand" +msgstr "Marca" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:92 +msgctxt "@label" +msgid "Material Type" +msgstr "Tipo de material" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:105 +msgctxt "@label" +msgid "Color" +msgstr "Cor" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:139 +msgctxt "@label" +msgid "Properties" +msgstr "Propriedades" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:141 +msgctxt "@label" +msgid "Density" +msgstr "Densidade" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:156 +msgctxt "@label" +msgid "Diameter" +msgstr "Diâmetro" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:185 +msgctxt "@label" +msgid "Filament Cost" +msgstr "Custo do filamento" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:201 +msgctxt "@label" +msgid "Filament weight" +msgstr "Peso do filamento" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:218 +msgctxt "@label" +msgid "Filament length" +msgstr "Comprimento do filamento" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:227 +msgctxt "@label" +msgid "Cost per Meter" +msgstr "Custo por metro" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:241 +msgctxt "@label" +msgid "This material is linked to %1 and shares some of its properties." +msgstr "Este material está associado a %1 e partilha algumas das suas propriedades." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:248 +msgctxt "@label" +msgid "Unlink Material" +msgstr "Desassociar material" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:259 +msgctxt "@label" +msgid "Description" +msgstr "Descrição" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:272 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "Informações de aderência" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:298 +msgctxt "@label" +msgid "Print settings" +msgstr "Definições de impressão" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "Visibilidade das definições" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "Verificar tudo" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:40 +msgctxt "@info:status" +msgid "Calculated" +msgstr "Calculado" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "Definição" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "Perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "Atual" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "Unidade" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:439 +msgctxt "@title:tab" +msgid "General" +msgstr "Geral" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:128 +msgctxt "@label" +msgid "Interface" +msgstr "Interface" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:139 +msgctxt "@label" +msgid "Language:" +msgstr "Idioma:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:205 +msgctxt "@label" +msgid "Currency:" +msgstr "Moeda:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:219 +msgctxt "@label" +msgid "Theme:" +msgstr "Tema:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:279 +msgctxt "@label" +msgid "" +"You will need to restart the application for these changes to have effect." +msgstr "É necessário reiniciar a aplicação para que estas alterações sejam aplicadas." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "Slice automatically when changing settings." +msgstr "Segmentar automaticamente ao alterar as definições." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:304 +msgctxt "@option:check" +msgid "Slice automatically" +msgstr "Segmentar automaticamente" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:318 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "Comportamento da janela" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:326 +msgctxt "@info:tooltip" +msgid "" +"Highlight unsupported areas of the model in red. Without support these areas " +"will not print properly." +msgstr "Realce a vermelho as áreas não suportadas do modelo. Sem suporte, estas áreas não serão impressas adequadamente." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:335 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "Apresentar saliência" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:342 +msgctxt "@info:tooltip" +msgid "" +"Moves the camera so the model is in the center of the view when a model is " +"selected" +msgstr "Move a câmara de forma que o modelo fique no centro da visualização quando é selecionado um modelo" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:347 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "Centrar câmara ao selecionar item" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356 +msgctxt "@info:tooltip" +msgid "Should the default zoom behavior of cura be inverted?" +msgstr "O comportamento de zoom predefinido do Cura deve ser invertido?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361 +msgctxt "@action:button" +msgid "Invert the direction of camera zoom." +msgstr "Inverta a direção do zoom da câmara." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370 +msgctxt "@info:tooltip" +msgid "Should zooming move in the direction of the mouse?" +msgstr "O zoom deve deslocar-se na direção do rato?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:375 +msgctxt "@action:button" +msgid "Zoom toward mouse direction" +msgstr "Aplicar zoom na direção do rato" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:384 +msgctxt "@info:tooltip" +msgid "" +"Should models on the platform be moved so that they no longer intersect?" +msgstr "Os modelos na plataforma devem ser movidos para que deixem de se cruzar?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:389 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "Garantir que os modelos são mantidos afastados" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:397 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "Os modelos na plataforma devem ser movidos para baixo de forma a tocar na placa de construção?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "Baixar modelos automaticamente para a placa de construção" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:414 +msgctxt "@info:tooltip" +msgid "Show caution message in gcode reader." +msgstr "Mostrar mensagem de atenção no leitor de gcode." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:423 +msgctxt "@option:check" +msgid "Caution message in gcode reader" +msgstr "Mensagem de atenção no leitor de gcode" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:430 +msgctxt "@info:tooltip" +msgid "Should layer be forced into compatibility mode?" +msgstr "A camada deve ser forçada a entrar no modo de compatibilidade?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:435 +msgctxt "@option:check" +msgid "Force layer view compatibility mode (restart required)" +msgstr "Forçar modo de compatibilidade da visualização da camada (é necessário reiniciar)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:451 +msgctxt "@label" +msgid "Opening and saving files" +msgstr "Abrir e guardar ficheiros" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:457 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "Os modelos devem ser dimensionados até ao volume de construção se forem demasiado grandes?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:462 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "Dimensionar modelos grandes" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters " +"rather than millimeters. Should these models be scaled up?" +msgstr "Um modelo pode parecer extremamente pequeno se, por exemplo, a sua unidade estiver em metros e não em milímetros. Estes modelos devem ser aumentados verticalmente?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "Dimensionar modelos extremamente pequenos" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:485 +msgctxt "@info:tooltip" +msgid "" +"Should a prefix based on the printer name be added to the print job name " +"automatically?" +msgstr "Deve um prefixo com base no nome da impressora ser adicionado ao nome da tarefa de impressão automaticamente?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:490 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "Adicionar prefixo da máquina ao nome da tarefa" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:499 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "Deve ser apresentado um resumo ao guardar um ficheiro de projeto?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:503 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "Mostrar caixa de diálogo de resumo ao guardar projeto" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:512 +msgctxt "@info:tooltip" +msgid "Default behavior when opening a project file" +msgstr "Comportamento predefinido ao abrir um ficheiro de projeto" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520 +msgctxt "@window:text" +msgid "Default behavior when opening a project file: " +msgstr "Comportamento predefinido ao abrir um ficheiro de projeto: " + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:533 +msgctxt "@option:openProject" +msgid "Always ask" +msgstr "Perguntar sempre" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:534 +msgctxt "@option:openProject" +msgid "Always open as a project" +msgstr "Abrir sempre como projeto" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:535 +msgctxt "@option:openProject" +msgid "Always import models" +msgstr "Importar sempre modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:571 +msgctxt "@info:tooltip" +msgid "" +"When you have made changes to a profile and switched to a different one, a " +"dialog will be shown asking whether you want to keep your modifications or " +"not, or you can choose a default behaviour and never show that dialog again." +msgstr "Quando tiver realizado alterações a um perfil e mudado para outro, será apresentada uma caixa de diálogo a perguntar se pretende manter as alterações. Caso contrário, pode escolher um comportamento predefinido, sendo que a caixa de diálogo nunca mais é apresentada." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:580 +msgctxt "@label" +msgid "Override Profile" +msgstr "Substituir perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:629 +msgctxt "@label" +msgid "Privacy" +msgstr "Privacidade" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:636 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "O Cura deve procurar atualizações quando o programa é iniciado?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:641 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "Procurar atualizações ao iniciar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:651 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no " +"models, IP addresses or other personally identifiable information is sent or " +"stored." +msgstr "Devem os dados anónimos sobre a sua impressão ser enviados para a Ultimaker? Observe que não são enviados nem armazenados modelos, endereços IP ou outras informações que forneçam a identificação pessoal." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "Enviar informações de impressão (anónimas)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:444 +msgctxt "@title:tab" +msgid "Printers" +msgstr "Impressoras" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:137 +msgctxt "@action:button" +msgid "Activate" +msgstr "Ativar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "Renomear" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:149 +msgctxt "@label" +msgid "Printer type:" +msgstr "Tipo de impressora:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:158 +msgctxt "@label" +msgid "Connection:" +msgstr "Ligação:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:164 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:52 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "A impressora não está ligada." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:170 +msgctxt "@label" +msgid "State:" +msgstr "Estado:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:190 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "A aguardar que alguém limpe a placa de construção" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:199 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "A aguardar por uma tarefa de impressão" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:448 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "Perfis" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "Perfis protegidos" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "Perfis personalizados" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "Criar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "Duplicar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:201 +msgctxt "@action:button" +msgid "Import" +msgstr "Importar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:212 +msgctxt "@action:button" +msgid "Export" +msgstr "Exportar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "Impressora: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "Atualizar perfil com as definições/substituições atuais" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "Eliminar alterações atuais" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "" +"This profile uses the defaults specified by the printer, so it has no " +"settings/overrides in the list below." +msgstr "Este perfil utiliza as predefinições especificadas pela impressora, pelo que não tem quaisquer definições/substituições na lista a seguir." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "As suas definições atuais correspondem ao perfil selecionado." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "Definições globais" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "Renomear perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "Criar perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "Duplicar perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "Importar perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "Importar perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "Exportar perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:446 +msgctxt "@title:tab" +msgid "Materials" +msgstr "Materiais" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:116 +msgctxt "" +"@action:label %1 is printer name, %2 is how this printer names variants, %3 " +"is variant name" +msgid "Printer: %1, %2: %3" +msgstr "Impressora: %1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:120 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "Impressora: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:149 +msgctxt "@action:button" +msgid "Create" +msgstr "Criar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:168 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "Duplicar" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:311 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:319 +msgctxt "@title:window" +msgid "Import Material" +msgstr "Importar material" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:320 +msgctxt "@info:status Don't translate the XML tags or !" +msgid "" +"Could not import material %1: %2" +msgstr "Não foi possível importar o material %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully imported material %1" +msgstr "Material %1 importado com êxito" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:358 +msgctxt "@title:window" +msgid "Export Material" +msgstr "Exportar material" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:362 +msgctxt "@info:status Don't translate the XML tags and !" +msgid "" +"Failed to export material to %1: %2" +msgstr "Falha ao exportar material para %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:368 +msgctxt "@info:status Don't translate the XML tag !" +msgid "Successfully exported material to %1" +msgstr "Material exportado com êxito para %1" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:793 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "Adicionar impressora" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:185 +msgctxt "@label" +msgid "Printer Name:" +msgstr "Nome da impressora:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:208 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "Adicionar impressora" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "Sobre o Cura" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:43 +msgctxt "@label" +msgid "version: %1" +msgstr "versão: %1" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "Solução completa para impressão 3D por filamento fundido." + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "O Cura foi desenvolvido pela Ultimaker B.V. em colaboração com a comunidade.\nO Cura tem o prazer de utilizar os seguintes projetos open source:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:118 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "Interface gráfica do utilizador" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Application framework" +msgstr "Estrutura de aplicações" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GCode generator" +msgstr "Gerador de GCode" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "Biblioteca de comunicação interprocessual" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Programming language" +msgstr "Linguagem de programação" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "GUI framework" +msgstr "Estrutura da GUI" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "Ligações de estrutura da GUI" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "Biblioteca de ligações C/C++" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Data interchange format" +msgstr "Formato de intercâmbio de dados" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "Support library for scientific computing" +msgstr "Biblioteca de apoio para computação científica" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "Biblioteca de apoio para cálculos mais rápidos" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "Biblioteca de apoio para processamento de ficheiros STL" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "Support library for handling 3MF files" +msgstr "Biblioteca de apoio para processamento de ficheiros 3MF" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:132 +msgctxt "@label" +msgid "Serial communication library" +msgstr "Biblioteca de comunicação em série" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:133 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "Biblioteca de deteção ZeroConf" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:134 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "Biblioteca de recortes de polígonos" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:135 +msgctxt "@Label" +msgid "Python HTTP library" +msgstr "Biblioteca de HTTP Python" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:137 +msgctxt "@label" +msgid "Font" +msgstr "Tipo de letra" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 +msgctxt "@label" +msgid "SVG icons" +msgstr "Ícones SVG" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:41 +msgctxt "@label" +msgid "Profile:" +msgstr "Perfil:" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:66 +msgctxt "@" +msgid "No Profile Available" +msgstr "Nenhum perfil disponível" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:104 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the " +"profile.\n" +"\n" +"Click to open the profile manager." +msgstr "Alguns valores de definição/substituição são diferentes dos valores armazenados no perfil.\n\nClique para abrir o gestor de perfis." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:152 +msgctxt "@label:textbox" +msgid "Search..." +msgstr "Procurar..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:483 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "Copiar valor para todas as extrusoras" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:498 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "Ocultar esta definição" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:508 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "Não mostrar esta definição" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "Manter esta definição visível" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:531 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "Configurar visibilidade da definição..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:123 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated " +"value.\n" +"\n" +"Click to make these settings visible." +msgstr "Algumas definições ocultas utilizam valores diferentes do respetivo valor normal calculado.\n\nClique para tornar estas definições visíveis." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:62 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "Afeta" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:67 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "Afetado por" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "" +"This setting is always shared between all extruders. Changing it here will " +"change the value for all extruders" +msgstr "Esta definição é sempre partilhada entre todas as extrusoras. Ao alterá-la aqui, o valor será alterado para todas as extrusoras." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "O valor é resolvido a partir de valores por extrusora " + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "Esta definição tem um valor que é diferente do perfil.\n\nClique para restaurar o valor do perfil." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:284 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value " +"set.\n" +"\n" +"Click to restore the calculated value." +msgstr "Geralmente, esta definição é calculada, mas atualmente tem um valor absoluto definido.\n\nClique para restaurar o valor calculado." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "Configuração de impressão" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:120 +msgctxt "@label:listbox" +msgid "" +"Print Setup disabled\n" +"G-code files cannot be modified" +msgstr "Configuração de impressão desativada\nOs ficheiros G-code não podem ser modificados" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:336 +msgctxt "@label Hours and minutes" +msgid "00h 00min" +msgstr "00h00min" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:354 +msgctxt "@tooltip" +msgid "Time specification
    " +msgstr "Especificação de tempo
    " + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:429 +msgctxt "@label" +msgid "Cost specification" +msgstr "Especificação de custos" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:434 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:445 +msgctxt "@label m for meter" +msgid "%1m" +msgstr "%1 m" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:435 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:446 +msgctxt "@label g for grams" +msgid "%1g" +msgstr "%1 g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:444 +msgctxt "@label" +msgid "Total:" +msgstr "Total:" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:498 +msgctxt "" +"@label Print estimates: m for meters, g for grams, %4 is currency and %3 is " +"print cost" +msgid "%1m / ~ %2g / ~ %4 %3" +msgstr "%1 m/~ %2 g/~ %4 %3" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:503 +msgctxt "@label Print estimates: m for meters, g for grams" +msgid "%1m / ~ %2g" +msgstr "%1 m/~ %2 g" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:586 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

    Print with the recommended settings " +"for the selected printer, material and quality." +msgstr "Configuração de impressão recomendada

    Imprima com as definições recomendadas para a impressora, o material e a qualidade selecionados." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:591 +msgctxt "@tooltip" +msgid "" +"Custom Print Setup

    Print with finegrained control over every " +"last bit of the slicing process." +msgstr "Configuração de impressão personalizada

    Imprima com controlo detalhado de cada etapa do processo de segmentação." + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:49 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "Automático: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "&Visualizar" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:40 +msgctxt "@title:menuitem %1 is the nozzle currently loaded in the printer" +msgid "Automatic: %1" +msgstr "Automático: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:25 +msgctxt "@label" +msgid "Print Selected Model With:" +msgid_plural "Print Selected Models With:" +msgstr[0] "Imprimir modelo selecionado com:" +msgstr[1] "Imprimir modelos selecionados com:" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:83 +msgctxt "@title:window" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "Multiplicar modelo selecionado" +msgstr[1] "Multiplicar modelos selecionados" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ContextMenu.qml:108 +msgctxt "@label" +msgid "Number of Copies" +msgstr "Número de cópias" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "Abrir &recente" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:38 +msgctxt "@info:status" +msgid "No printer connected" +msgstr "Nenhuma impressora ligada" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:90 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:138 +msgctxt "@label" +msgid "Extruder" +msgstr "Extrusora" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:120 +msgctxt "@tooltip" +msgid "" +"The target temperature of the hotend. The hotend will heat up or cool down " +"towards this temperature. If this is 0, the hotend heating is turned off." +msgstr "A temperatura-alvo da extremidade quente. A extremidade quente irá aquecer ou arrefecer até esta temperatura. Se esta opção for definida como 0, o aquecimento da extremidade quente será desligado." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:152 +msgctxt "@tooltip" +msgid "The current temperature of this extruder." +msgstr "A temperatura atual desta extrusora." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:188 +msgctxt "@tooltip" +msgid "The colour of the material in this extruder." +msgstr "A cor do material nesta extrusora." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:220 +msgctxt "@tooltip" +msgid "The material in this extruder." +msgstr "O material nesta extrusora." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:252 +msgctxt "@tooltip" +msgid "The nozzle inserted in this extruder." +msgstr "O bocal inserido nesta extrusora." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:283 +msgctxt "@label" +msgid "Build plate" +msgstr "Placa de construção" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:312 +msgctxt "@tooltip" +msgid "" +"The target temperature of the heated bed. The bed will heat up or cool down " +"towards this temperature. If this is 0, the bed heating is turned off." +msgstr "A temperatura desejada da base aquecida. A base irá aquecer ou arrefecer até esta temperatura. Se esta opção for definida como 0, o aquecimento da base será desligado." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:344 +msgctxt "@tooltip" +msgid "The current temperature of the heated bed." +msgstr "A temperatura atual da base aquecida." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:423 +msgctxt "@tooltip of temperature input" +msgid "The temperature to pre-heat the bed to." +msgstr "A temperatura de pré-aquecimento da base." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +msgctxt "@button Cancel pre-heating" +msgid "Cancel" +msgstr "Cancelar" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:623 +msgctxt "@button" +msgid "Pre-heat" +msgstr "Pré-aquecer" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:650 +msgctxt "@tooltip of pre-heat" +msgid "" +"Heat the bed in advance before printing. You can continue adjusting your " +"print while it is heating, and you won't have to wait for the bed to heat up " +"when you're ready to print." +msgstr "Aqueça a base com antecedência antes da impressão. Pode continuar a ajustar a impressora durante o aquecimento e não precisará de esperar que a base aqueça quando estiver pronto para imprimir." + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:703 +msgctxt "@label" +msgid "Printer control" +msgstr "Controlo da impressora" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:717 +msgctxt "@label" +msgid "Jog Position" +msgstr "Posição de deslocação" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:735 +msgctxt "@label" +msgid "X/Y" +msgstr "X/Y" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:842 +msgctxt "@label" +msgid "Z" +msgstr "Z" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:907 +msgctxt "@label" +msgid "Jog Distance" +msgstr "Distância de deslocação" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1018 +msgctxt "@label" +msgid "Active print" +msgstr "Impressão ativa" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1023 +msgctxt "@label" +msgid "Job Name" +msgstr "Nome da tarefa" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1029 +msgctxt "@label" +msgid "Printing Time" +msgstr "Tempo de impressão" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:1035 +msgctxt "@label" +msgid "Estimated time left" +msgstr "Tempo restante estimado" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:72 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "Alternar para e&crã inteiro" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:79 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "&Anular" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:89 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "&Refazer" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:99 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "&Sair" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:107 +msgctxt "@action:inmenu menubar:view" +msgid "&Reset camera position" +msgstr "&Repor posição da câmara" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:114 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "Configurar Cura..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:121 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "&Adicionar impressora..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "Gerir im&pressoras..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "Gerir materiais..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:142 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "&Atualizar perfil com as definições/substituições atuais" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:150 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "&Eliminar alterações atuais" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "&Criar perfil a partir das definições/substituições atuais..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "Gerir perfis..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "Mostrar &documentação online" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:183 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "Reportar um &erro" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:191 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "&Sobre..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:198 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selected Model" +msgid_plural "Delete &Selected Models" +msgstr[0] "Eliminar modelo &selecionado" +msgstr[1] "Eliminar modelos &selecionados" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:208 +msgctxt "@action:inmenu menubar:edit" +msgid "Center Selected Model" +msgid_plural "Center Selected Models" +msgstr[0] "Centrar modelo selecionado" +msgstr[1] "Centrar modelos selecionados" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:217 +msgctxt "@action:inmenu menubar:edit" +msgid "Multiply Selected Model" +msgid_plural "Multiply Selected Models" +msgstr[0] "Multiplicar modelo selecionado" +msgstr[1] "Multiplicar modelos selecionados" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "Eliminar modelo" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "Ce&ntrar modelo na plataforma" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:240 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "&Agrupar modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:250 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "Desagrupar modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "&Unir modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:270 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "&Multiplicar modelo..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "&Selecionar todos os modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:287 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "&Limpar placa de construção" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:297 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "Re&carregar todos os modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:306 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models" +msgstr "Dispor todos os modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection" +msgstr "Dispor seleção" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:321 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "Repor todas as posições de modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:328 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "Repor todas as &transformações de modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:335 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File(s)..." +msgstr "&Abrir ficheiro(s)..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:343 +msgctxt "@action:inmenu menubar:file" +msgid "&New Project..." +msgstr "&Novo projeto..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "Mostrar ®isto de motor..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:358 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "Mostrar pasta de configuração" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:365 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "Configurar visibilidade das definições..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:372 +msgctxt "@action:menu" +msgid "Browse plugins..." +msgstr "Procurar plug-ins..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:379 +msgctxt "@action:menu" +msgid "Installed plugins..." +msgstr "Plug-ins instalados..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:28 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3D model" +msgstr "Carregue um modelo 3D" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus" +msgid "Ready to slice" +msgstr "Pronto para segmentar" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "A segmentar..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:38 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "Pronto para %1" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:40 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "Não é possível segmentar" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:42 +msgctxt "@label:PrintjobStatus" +msgid "Slicing unavailable" +msgstr "Segmentação indisponível" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +msgctxt "@label:Printjob" +msgid "Prepare" +msgstr "Preparar" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:162 +msgctxt "@label:Printjob" +msgid "Cancel" +msgstr "Cancelar" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:302 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "Selecione o dispositivo de saída ativo" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:19 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:620 +msgctxt "@title:window" +msgid "Open file(s)" +msgstr "Abrir ficheiro(s)" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:64 +msgctxt "@text:window" +msgid "" +"We have found one or more project file(s) within the files you have " +"selected. You can open only one project file at a time. We suggest to only " +"import models from those files. Would you like to proceed?" +msgstr "Encontrámos um ou mais ficheiros de projeto nos ficheiros selecionados. Só é possível abrir um ficheiro de projeto de cada vez. Sugerimos que importe apenas modelos desses ficheiros. Deseja continuar?" + +#: /home/ruben/Projects/Cura/resources/qml/OpenFilesIncludingProjectsDialog.qml:99 +msgctxt "@action:button" +msgid "Import all as models" +msgstr "Importar tudo como modelos" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Ultimaker Cura" +msgstr "Ultimaker Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:81 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "&Ficheiro" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:98 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "&Guardar seleção para ficheiro" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:107 +msgctxt "@title:menu menubar:file" +msgid "Save &As..." +msgstr "Guardar &como..." + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:118 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "Guardar projeto" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:141 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "&Editar" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +msgctxt "@title:menu" +msgid "&View" +msgstr "&Visualizar" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:163 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "&Definições" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:165 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "&Impressora" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:187 +msgctxt "@title:menu" +msgid "&Material" +msgstr "&Material" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:176 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:188 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "&Perfil" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:180 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "Definir como extrusora ativa" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:198 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "E&xtensões" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232 +msgctxt "@title:menu menubar:toplevel" +msgid "P&lugins" +msgstr "P&lug-ins" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:240 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "P&referências" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:248 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "&Ajuda" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:330 +msgctxt "@action:button" +msgid "Open File" +msgstr "Abrir ficheiro" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:442 +msgctxt "@title:tab" +msgid "Settings" +msgstr "Definições" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:478 +msgctxt "@title:window" +msgid "New project" +msgstr "Novo projeto" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:479 +msgctxt "@info:question" +msgid "" +"Are you sure you want to start a new project? This will clear the build " +"plate and any unsaved settings." +msgstr "Tem a certeza de que deseja iniciar um novo projeto? Isto irá limpar a placa de construção e quaisquer definições não guardadas." + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:721 +msgctxt "@window:title" +msgid "Install Plugin" +msgstr "Instalar plug-in" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:728 +msgctxt "@title:window" +msgid "Open File(s)" +msgstr "Abrir ficheiro(s)" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:731 +msgctxt "@text:window" +msgid "" +"We have found one or more G-Code files within the files you have selected. " +"You can only open one G-Code file at a time. If you want to open a G-Code " +"file, please just select only one." +msgstr "Encontrámos um ou mais ficheiros G-Code nos ficheiros selecionados. Só é possível abrir um ficheiro G-Code de cada vez. Se pretender abrir um ficheiro G-code, selecione apenas um." + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "Guardar projeto" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:136 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "Extrusora %1" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:146 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "%1 & material" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:242 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "Não mostrar resumo de projeto ao guardar novamente" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:264 +msgctxt "@action:button" +msgid "Save" +msgstr "Guardar" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:74 +msgctxt "@title:tab" +msgid "Prepare" +msgstr "Preparar" + +#: /home/ruben/Projects/Cura/resources/qml/Topbar.qml:100 +msgctxt "@title:tab" +msgid "Monitor" +msgstr "Monitorizar" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:163 +msgctxt "@label" +msgid "Layer Height" +msgstr "Altura da camada" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:323 +msgctxt "@tooltip" +msgid "" +"A custom profile is currently active. To enable the quality slider, choose a " +"default quality profile in Custom tab" +msgstr "Está atualmente ativo um perfil personalizado. Para ativar o controlo de deslize de qualidade, escolha um perfil de qualidade predefinido no separador Personalizado" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:340 +msgctxt "@label" +msgid "Print Speed" +msgstr "Velocidade de impressão" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:350 +msgctxt "@label" +msgid "Slower" +msgstr "Mais lenta" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:361 +msgctxt "@label" +msgid "Faster" +msgstr "Mais rápida" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:388 +msgctxt "@tooltip" +msgid "" +"You have modified some profile settings. If you want to change these go to " +"custom mode." +msgstr "Algumas definições de perfil foram modificadas. Se pretender alterá-las, aceda ao modo personalizado." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:413 +msgctxt "@label" +msgid "Infill" +msgstr "Preenchimento" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:633 +msgctxt "@label" +msgid "" +"Gradual infill will gradually increase the amount of infill towards the top." +msgstr "O preenchimento gradual irá aumentar progressivamente a quantidade de preenchimento em direção ao topo." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:645 +msgctxt "@label" +msgid "Enable gradual" +msgstr "Ativar gradação" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:712 +msgctxt "@label" +msgid "Generate Support" +msgstr "Gerar suporte" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:746 +msgctxt "@label" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "Gera estruturas para suportar peças do modelo com saliências. Sem estas estruturas, essas peças desintegrar-se-iam durante a impressão." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:764 +msgctxt "@label" +msgid "Support Extruder" +msgstr "Extrusora de suporte" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:816 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting " +"structures below the model to prevent the model from sagging or printing in " +"mid air." +msgstr "Selecione a extrusora a ser utilizada para suporte. Isto irá construir estruturas de suporte debaixo do modelo para impedir a flacidez do modelo ou a impressão em suspenso." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:839 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "Aderência à placa de construção" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:894 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under " +"your object which is easy to cut off afterwards." +msgstr "Ativa a impressão de uma borda ou base reticular. Isto irá adicionar uma área plana em torno ou debaixo do seu objeto, o que facilitará o respetivo corte posteriormente." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:934 +msgctxt "@label" +msgid "" +"Need help improving your prints?
    Read the Ultimaker " +"Troubleshooting Guides" +msgstr "Precisa de ajuda para melhorar as suas impressões?
    Leia os Guias de resolução de problemas da Ultimaker" + +#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16 +msgctxt "@label %1 is filled in with the name of an extruder" +msgid "Print Selected Model with %1" +msgid_plural "Print Selected Models with %1" +msgstr[0] "Imprimir modelo selecionado com %1" +msgstr[1] "Imprimir modelos selecionados com %1" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:20 +msgctxt "@title:window" +msgid "Open project file" +msgstr "Abrir ficheiro de projeto" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:72 +msgctxt "@text:window" +msgid "" +"This is a Cura project file. Would you like to open it as a project or " +"import the models from it?" +msgstr "Este é um ficheiro de projeto Cura. Gostaria de o abrir como um projeto ou importar os modelos a partir dele?" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:103 +msgctxt "@action:button" +msgid "Open as project" +msgstr "Abrir como projeto" + +#: /home/ruben/Projects/Cura/resources/qml/AskOpenAsProjectOrModelsDialog.qml:122 +msgctxt "@action:button" +msgid "Import models" +msgstr "Importar modelos" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "Registo de motor" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:242 +msgctxt "@label" +msgid "Material" +msgstr "Material" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:349 +msgctxt "@label" +msgid "Check compatibility" +msgstr "Verificar compatibilidade" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:369 +msgctxt "@tooltip" +msgid "Click to check the material compatibility on Ultimaker.com." +msgstr "Clique para verificar a compatibilidade do material em Ultimaker.com." + +#: MachineSettingsAction/plugin.json +msgctxt "description" +msgid "" +"Provides a way to change machine settings (such as build volume, nozzle " +"size, etc)" +msgstr "Proporciona uma forma de alterar as definições da máquina (como o volume de construção, o tamanho do bocal etc.)" + +#: MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings action" +msgstr "Ação de definições da máquina" + +#: XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "Fornece a visualização de raio X." + +#: XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "Visualização de raio X" + +#: X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "Fornece suporte para ler ficheiros X3D." + +#: X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "Leitor de X3D" + +#: GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes GCode to a file." +msgstr "Grava o GCode num ficheiro." + +#: GCodeWriter/plugin.json +msgctxt "name" +msgid "GCode Writer" +msgstr "Gravador de GCode" + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "description" +msgid "Dump the contents of all settings to a HTML file." +msgstr "Descarregar o conteúdo de todas as definições num ficheiro HTML." + +#: cura-god-mode-plugin/src/GodMode/plugin.json +msgctxt "name" +msgid "God Mode" +msgstr "Modo God" + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "description" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "Aceita G-Codes e envia-os por Wi-Fi para uma Wi-Fi box Doodle3D." + +#: Doodle3D-cura-plugin/Doodle3D/plugin.json +msgctxt "name" +msgid "Doodle3D WiFi-Box" +msgstr "Wi-Fi box Doodle3D" + +#: ChangeLogPlugin/plugin.json +msgctxt "description" +msgid "Shows changes since latest checked version." +msgstr "Mostra as alterações efetuadas desde a última versão verificada." + +#: ChangeLogPlugin/plugin.json +msgctxt "name" +msgid "Changelog" +msgstr "Registo de alterações" + +#: ProfileFlattener/plugin.json +msgctxt "description" +msgid "Create a flattend quality changes profile." +msgstr "Cria um perfil de alterações de qualidade aplanado." + +#: ProfileFlattener/plugin.json +msgctxt "name" +msgid "Profile flatener" +msgstr "Aplanador de perfis" + +#: USBPrinting/plugin.json +msgctxt "description" +msgid "" +"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "Aceita G-Codes e envia-os para uma impressora. O plug-in também pode atualizar firmware." + +#: USBPrinting/plugin.json +msgctxt "name" +msgid "USB printing" +msgstr "Impressão através de USB" + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "Fornece suporte de ligação da unidade amovível e suporte de gravação." + +#: RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "Plug-in de dispositivo de saída da unidade amovível" + +#: UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "Gere as ligações de rede com as impressoras Ultimaker 3" + +#: UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UM3 Network Connection" +msgstr "Ligação de rede UM3" + +#: FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "Procura atualizações de firmware." + +#: FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "Verificador de atualizações de firmware" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "description" +msgid "" +"Gives you the possibility to open certain files via SolidWorks itself. These " +"are then converted and loaded into Cura" +msgstr "Oferece a possibilidade de abrir determinados ficheiros através do SolidWorks. Estes são posteriormente convertidos e carregados para o Cura" + +#: CuraSolidWorksPlugin/plugin.json +msgctxt "name" +msgid "SolidWorks Integration" +msgstr "SolidWorks Integration" + +#: SimulationView/plugin.json +msgctxt "description" +msgid "Provides the Simulation view." +msgstr "Fornece a visualização de simulação." + +#: SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "Visualização de simulação" + +#: PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "Extensão que permite a utilização de scripts criados pelo utilizador para efeitos de pós-processamento" + +#: PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "Pós-processamento" + +#: AutoSave/plugin.json +msgctxt "description" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "Guarda automaticamente preferências, máquinas e perfis após as alterações." + +#: AutoSave/plugin.json +msgctxt "name" +msgid "Auto Save" +msgstr "Guardar automaticamente" + +#: SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "Envia informações de segmentação anónimas. Pode ser desativado nas preferências." + +#: SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "Informações de segmentação" + +#: XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "Fornece capacidades para ler e gravar perfis de material com base em XML." + +#: XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "Perfis de material" + +#: LegacyProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "Fornece suporte para importar perfis de versões legadas do Cura." + +#: LegacyProfileReader/plugin.json +msgctxt "name" +msgid "Legacy Cura Profile Reader" +msgstr "Leitor de perfis legados do Cura" + +#: GCodeProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing profiles from g-code files." +msgstr "Fornece suporte para importar perfis de ficheiros g-code." + +#: GCodeProfileReader/plugin.json +msgctxt "name" +msgid "GCode Profile Reader" +msgstr "Leitor de perfis GCode" + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "Atualiza as configurações do Cura 2.5 para o Cura 2.6." + +#: VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "Atualização da versão 2.5 para 2.6" + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.7 to Cura 3.0." +msgstr "Atualiza as configurações do Cura 2.7 para o Cura 3.0." + +#: VersionUpgrade/VersionUpgrade27to30/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.7 to 3.0" +msgstr "Atualização da versão 2.7 para 3.0" + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." +msgstr "Atualiza as configurações do Cura 3.0 para o Cura 3.1." + +#: VersionUpgrade/VersionUpgrade30to31/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.0 to 3.1" +msgstr "Atualização da versão 3.0 para 3.1" + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "Atualiza as configurações do Cura 2.6 para o Cura 2.7." + +#: VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" +msgstr "Atualização da versão 2.6 para 2.7" + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "Atualiza as configurações do Cura 2.1 para o Cura 2.2." + +#: VersionUpgrade/VersionUpgrade21to22/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "Atualização da versão 2.1 para 2.2" + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "Atualiza as configurações do Cura 2.2 para o Cura 2.4." + +#: VersionUpgrade/VersionUpgrade22to24/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "Atualização da versão 2.2 para 2.4" + +#: ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "Permite gerar geometria imprimível a partir de ficheiros de imagem 2D." + +#: ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "Leitor de imagens" + +#: CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "Fornece a hiperligação para o back-end de segmentação do CuraEngine." + +#: CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "Back-end do CuraEngine" + +#: PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "Fornece as definições por modelo." + +#: PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "Ferramenta de definições por modelo" + +#: cura-siemensnx-plugin/plugin.json +msgctxt "description" +msgid "Helps you to install an 'export to Cura' button in Siemens NX." +msgstr "Ajuda a instalar um botão \"Exportar para o Cura\" no Siemens NX." + +#: cura-siemensnx-plugin/plugin.json +msgctxt "name" +msgid "Siemens NX Integration" +msgstr "Siemens NX Integration" + +#: 3MFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading 3MF files." +msgstr "Fornece suporte para ler ficheiros 3MF." + +#: 3MFReader/plugin.json +msgctxt "name" +msgid "3MF Reader" +msgstr "Leitor de 3MF" + +#: PluginBrowser/plugin.json +msgctxt "description" +msgid "Find, manage and install new plugins." +msgstr "Procura, gere e instala novos plug-ins." + +#: PluginBrowser/plugin.json +msgctxt "name" +msgid "Plugin Browser" +msgstr "Browser de plug-ins" + +#: SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "Fornece uma visualização de malha sólida normal." + +#: SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "Visualização sólida" + +#: GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "Permite carregar e apresentar ficheiros G-code." + +#: GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "Leitor de G-code" + +#: CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "Fornece suporte para exportar perfis Cura." + +#: CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "Gravador de perfis Cura" + +#: 3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "Fornece suporte para gravar ficheiros 3MF." + +#: 3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "Gravador 3MF" + +#: UserAgreementPlugin/plugin.json +msgctxt "description" +msgid "Ask the user once if he/she agrees with our license" +msgstr "Pergunta uma vez ao utilizador se concorda com a nossa licença" + +#: UserAgreementPlugin/plugin.json +msgctxt "name" +msgid "UserAgreement" +msgstr "Contrato do utilizador" + +#: UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "" +"Provides machine actions for Ultimaker machines (such as bed leveling " +"wizard, selecting upgrades, etc)" +msgstr "Fornece ações automáticas para as máquinas Ultimaker (como assistentes de nivelamento da base, seleção de atualizações etc.)" + +#: UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "Ultimaker machine actions" +msgstr "Ações automáticas da Ultimaker" + +#: CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "Fornece suporte para importar perfis Cura." + +#: CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "Leitor de perfis Cura" diff --git a/resources/i18n/pt_PT/fdmextruder.def.json.po b/resources/i18n/pt_PT/fdmextruder.def.json.po new file mode 100644 index 0000000000..852fe4d562 --- /dev/null +++ b/resources/i18n/pt_PT/fdmextruder.def.json.po @@ -0,0 +1,210 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.1\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-12-07 13:41+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Bothof\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: fdmextruder.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "Máquina" + +#: fdmextruder.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Definições específicas da máquina" + +#: fdmextruder.def.json +msgctxt "extruder_nr label" +msgid "Extruder" +msgstr "Extrusora" + +#: fdmextruder.def.json +msgctxt "extruder_nr description" +msgid "The extruder train used for printing. This is used in multi-extrusion." +msgstr "A máquina extrusora utilizada para imprimir. Esta é utilizada em extrusões múltiplas." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "ID do bocal" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "A ID do bocal para uma máquina de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "Diâmetro do bocal" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "O diâmetro interno do bocal. Altere esta definição ao utilizar um tamanho de bocal não convencional." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x label" +msgid "Nozzle X Offset" +msgstr "Desvio X do bocal" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x description" +msgid "The x-coordinate of the offset of the nozzle." +msgstr "A coordenada X do desvio do bocal." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y label" +msgid "Nozzle Y Offset" +msgstr "Desvio Y do bocal" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y description" +msgid "The y-coordinate of the offset of the nozzle." +msgstr "A coordenada Y do desvio do bocal." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code label" +msgid "Extruder Start G-Code" +msgstr "G-Code inicial da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code description" +msgid "Start g-code to execute whenever turning the extruder on." +msgstr "G-Code inicial a ser executado sempre que a extrusora for ligada." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs label" +msgid "Extruder Start Position Absolute" +msgstr "Posição inicial absoluta da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs description" +msgid "" +"Make the extruder starting position absolute rather than relative to the " +"last-known location of the head." +msgstr "Torne a posição inicial da extrusora absoluta em vez de relativa à última posição conhecida da cabeça." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x label" +msgid "Extruder Start Position X" +msgstr "X da posição inicial da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x description" +msgid "The x-coordinate of the starting position when turning the extruder on." +msgstr "A coordenada X da posição inicial ao ligar a extrusora." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y label" +msgid "Extruder Start Position Y" +msgstr "Y da posição inicial da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y description" +msgid "The y-coordinate of the starting position when turning the extruder on." +msgstr "A coordenada Y da posição inicial ao ligar a extrusora." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code label" +msgid "Extruder End G-Code" +msgstr "G-Code final da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code description" +msgid "End g-code to execute whenever turning the extruder off." +msgstr "G-Code final a ser executado sempre que a extrusora for desligada." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs label" +msgid "Extruder End Position Absolute" +msgstr "Posição final absoluta da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs description" +msgid "" +"Make the extruder ending position absolute rather than relative to the last-" +"known location of the head." +msgstr "Torne a posição final da extrusora absoluta em vez de relativa à última localização conhecida da cabeça." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x label" +msgid "Extruder End Position X" +msgstr "X da posição final da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x description" +msgid "The x-coordinate of the ending position when turning the extruder off." +msgstr "A coordenada X da posição final ao desligar a extrusora." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y label" +msgid "Extruder End Position Y" +msgstr "Y da posição final da extrusora" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y description" +msgid "The y-coordinate of the ending position when turning the extruder off." +msgstr "A coordenada Y da posição final ao desligar a extrusora." + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Posição Z de preparação da extrusora" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada Z da posição de preparação do bocal ao iniciar a impressão." + +#: fdmextruder.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Aderência à placa de construção" + +#: fdmextruder.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "Aderência" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "Posição X de preparação da extrusora" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada X da posição de preparação do bocal ao iniciar a impressão." + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Posição Y de preparação da extrusora" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada Y da posição de preparação do bocal ao iniciar a impressão." diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po new file mode 100644 index 0000000000..d7385d9584 --- /dev/null +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -0,0 +1,5814 @@ +# Cura JSON setting files +# Copyright (C) 2017 Ultimaker +# This file is distributed under the same license as the Cura package. +# Ruben Dulek , 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: Cura 3.1\n" +"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" +"POT-Creation-Date: 2017-08-02 16:53+0000\n" +"PO-Revision-Date: 2017-12-07 13:41+0100\n" +"Last-Translator: Bothof \n" +"Language-Team: Bothof\n" +"Language: pt_PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: fdmprinter.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "Máquina" + +#: fdmprinter.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Definições específicas da máquina" + +#: fdmprinter.def.json +msgctxt "machine_name label" +msgid "Machine Type" +msgstr "Tipo de máquina" + +#: fdmprinter.def.json +msgctxt "machine_name description" +msgid "The name of your 3D printer model." +msgstr "O nome do seu modelo de impressora 3D." + +#: fdmprinter.def.json +msgctxt "machine_show_variants label" +msgid "Show Machine Variants" +msgstr "Mostrar variantes da máquina" + +#: fdmprinter.def.json +msgctxt "machine_show_variants description" +msgid "" +"Whether to show the different variants of this machine, which are described " +"in separate json files." +msgstr "Mostrar ou não as diferentes variantes desta máquina, as quais são descritas em ficheiros json separados." + +#: fdmprinter.def.json +msgctxt "machine_start_gcode label" +msgid "Start GCode" +msgstr "GCode inicial" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode description" +msgid "" +"Gcode commands to be executed at the very start - separated by \n" +"." +msgstr "Comandos Gcode a serem executados no início – separados por \n." + +#: fdmprinter.def.json +msgctxt "machine_end_gcode label" +msgid "End GCode" +msgstr "GCode final" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode description" +msgid "" +"Gcode commands to be executed at the very end - separated by \n" +"." +msgstr "Comandos Gcode a serem executados no fim – separados por \n." + +#: fdmprinter.def.json +msgctxt "material_guid label" +msgid "Material GUID" +msgstr "GUID de material" + +#: fdmprinter.def.json +msgctxt "material_guid description" +msgid "GUID of the material. This is set automatically. " +msgstr "GUID do material. Isto é definido automaticamente. " + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait label" +msgid "Wait for Build Plate Heatup" +msgstr "Aguardar pelo aquecimento da placa de construção" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait description" +msgid "" +"Whether to insert a command to wait until the build plate temperature is " +"reached at the start." +msgstr "Introduzir ou não um comando para aguardar até que a temperatura da placa de construção seja atingida durante o arranque." + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait label" +msgid "Wait for Nozzle Heatup" +msgstr "Aguardar pelo aquecimento do bocal" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait description" +msgid "Whether to wait until the nozzle temperature is reached at the start." +msgstr "Aguardar ou não até que a temperatura do bocal seja atingida durante o arranque." + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend label" +msgid "Include Material Temperatures" +msgstr "Incluir temperaturas do material" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend description" +msgid "" +"Whether to include nozzle temperature commands at the start of the gcode. " +"When the start_gcode already contains nozzle temperature commands Cura " +"frontend will automatically disable this setting." +msgstr "Incluir ou não os comandos de temperatura do bocal no início do gcode. Se o gcode_inicial já contiver os comandos de temperatura do bocal, o front-end do Cura desativará automaticamente esta definição." + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend label" +msgid "Include Build Plate Temperature" +msgstr "Incluir temperatura da placa de construção" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend description" +msgid "" +"Whether to include build plate temperature commands at the start of the " +"gcode. When the start_gcode already contains build plate temperature " +"commands Cura frontend will automatically disable this setting." +msgstr "Incluir ou não os comandos de temperatura da placa de construção no início do gcode. Se o gcode_inicial já contiver os comandos de temperatura da placa de construção, o front-end do Cura desativará automaticamente esta definição." + +#: fdmprinter.def.json +msgctxt "machine_width label" +msgid "Machine Width" +msgstr "Largura da máquina" + +#: fdmprinter.def.json +msgctxt "machine_width description" +msgid "The width (X-direction) of the printable area." +msgstr "A largura (direção X) da área de impressão." + +#: fdmprinter.def.json +msgctxt "machine_depth label" +msgid "Machine Depth" +msgstr "Profundidade da máquina" + +#: fdmprinter.def.json +msgctxt "machine_depth description" +msgid "The depth (Y-direction) of the printable area." +msgstr "A profundidade (direção Y) da área de impressão." + +#: fdmprinter.def.json +msgctxt "machine_shape label" +msgid "Build Plate Shape" +msgstr "Forma da placa de construção" + +#: fdmprinter.def.json +msgctxt "machine_shape description" +msgid "" +"The shape of the build plate without taking unprintable areas into account." +msgstr "A forma da placa de construção sem ter em consideração as áreas não imprimíveis." + +#: fdmprinter.def.json +msgctxt "machine_shape option rectangular" +msgid "Rectangular" +msgstr "Retangular" + +#: fdmprinter.def.json +msgctxt "machine_shape option elliptic" +msgid "Elliptic" +msgstr "Elíptica" + +#: fdmprinter.def.json +msgctxt "machine_height label" +msgid "Machine Height" +msgstr "Altura da máquina" + +#: fdmprinter.def.json +msgctxt "machine_height description" +msgid "The height (Z-direction) of the printable area." +msgstr "A altura (direção Z) da área de impressão." + +#: fdmprinter.def.json +msgctxt "machine_heated_bed label" +msgid "Has Heated Build Plate" +msgstr "Contém placa de construção aquecida" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed description" +msgid "Whether the machine has a heated build plate present." +msgstr "Se a máquina contém ou não uma placa de construção aquecida." + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero label" +msgid "Is Center Origin" +msgstr "O centro é a origem" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero description" +msgid "" +"Whether the X/Y coordinates of the zero position of the printer is at the " +"center of the printable area." +msgstr "Se as coordenadas X/Y da posição zero da impressora se encontram no centro da área de impressão." + +#: fdmprinter.def.json +msgctxt "machine_extruder_count label" +msgid "Number of Extruders" +msgstr "Número de extrusoras" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count description" +msgid "" +"Number of extruder trains. An extruder train is the combination of a feeder, " +"bowden tube, and nozzle." +msgstr "Número de máquinas de extrusão. Uma máquina de extrusão é a combinação de um alimentador, de um tubo Bowden e de um bocal." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter label" +msgid "Outer nozzle diameter" +msgstr "Diâmetro externo do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter description" +msgid "The outer diameter of the tip of the nozzle." +msgstr "O diâmetro externo da ponta do bocal." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance label" +msgid "Nozzle length" +msgstr "Comprimento do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance description" +msgid "" +"The height difference between the tip of the nozzle and the lowest part of " +"the print head." +msgstr "A diferença de altura entre a ponta do bocal e o extremo inferior da cabeça de impressão." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle label" +msgid "Nozzle angle" +msgstr "Ângulo do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle description" +msgid "" +"The angle between the horizontal plane and the conical part right above the " +"tip of the nozzle." +msgstr "O ângulo entre o plano horizontal e a peça cónica imediatamente acima da ponta do bocal." + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length label" +msgid "Heat zone length" +msgstr "Comprimento da zona de aquecimento" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length description" +msgid "" +"The distance from the tip of the nozzle in which heat from the nozzle is " +"transferred to the filament." +msgstr "A distância a partir da ponta do bocal à qual o calor do bocal é transferido para o filamento." + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance label" +msgid "Filament Park Distance" +msgstr "Distância de estacionamento do filamento" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance description" +msgid "" +"The distance from the tip of the nozzle where to park the filament when an " +"extruder is no longer used." +msgstr "A distância a partir da ponta do bocal à qual o filamento deve ser estacionado quando já não existe uma extrusora em utilização." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled label" +msgid "Enable Nozzle Temperature Control" +msgstr "Ativar controlo de temperatura do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_temp_enabled description" +msgid "" +"Whether to control temperature from Cura. Turn this off to control nozzle " +"temperature from outside of Cura." +msgstr "Controlar ou não a temperatura a partir do Cura. Desative esta opção para controlar a temperatura do bocal a partir de fora do Cura." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed label" +msgid "Heat up speed" +msgstr "Velocidade de aquecimento" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed description" +msgid "" +"The speed (°C/s) by which the nozzle heats up averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "A velocidade média (°C/s) a que o bocal é aquecido calculada no intervalo entre as temperaturas normais de impressão e a temperatura de espera." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed label" +msgid "Cool down speed" +msgstr "Velocidade de arrefecimento" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed description" +msgid "" +"The speed (°C/s) by which the nozzle cools down averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "A velocidade média (°C/s) a que o bocal arrefece calculada no intervalo entre as temperaturas normais de impressão e a temperatura de espera." + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window label" +msgid "Minimal Time Standby Temperature" +msgstr "Tempo mínimo para temperatura de espera" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window description" +msgid "" +"The minimal time an extruder has to be inactive before the nozzle is cooled. " +"Only when an extruder is not used for longer than this time will it be " +"allowed to cool down to the standby temperature." +msgstr "O tempo mínimo durante o qual uma extrusora tem de estar inativa antes de o bocal arrefecer. Apenas é permitido arrefecer até à temperatura de espera quando uma extrusora não for utilizada durante um período de tempo superior a este." + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor label" +msgid "Gcode flavour" +msgstr "Padrão de Gcode" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor description" +msgid "The type of gcode to be generated." +msgstr "O tipo de gcode a ser gerado." + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" +msgid "Marlin" +msgstr "Marlin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Volumetric)" +msgid "Marlin (Volumetric)" +msgstr "Marlin (volumétrico)" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (RepRap)" +msgid "RepRap" +msgstr "RepRap" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option UltiGCode" +msgid "Ultimaker 2" +msgstr "Ultimaker 2" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Griffin" +msgid "Griffin" +msgstr "Griffin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Makerbot" +msgid "Makerbot" +msgstr "Makerbot" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option BFB" +msgid "Bits from Bytes" +msgstr "Bits from Bytes" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option MACH3" +msgid "Mach3" +msgstr "Mach3" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Repetier" +msgid "Repetier" +msgstr "Repetier" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas label" +msgid "Disallowed areas" +msgstr "Áreas não permitidas" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas description" +msgid "A list of polygons with areas the print head is not allowed to enter." +msgstr "Uma lista de polígonos com áreas onde a cabeça de impressão não pode entrar." + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas label" +msgid "Nozzle Disallowed Areas" +msgstr "Áreas não permitidas do bocal" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas description" +msgid "A list of polygons with areas the nozzle is not allowed to enter." +msgstr "Uma lista de polígonos com áreas onde o bocal não pode entrar." + +#: fdmprinter.def.json +msgctxt "machine_head_polygon label" +msgid "Machine head polygon" +msgstr "Polígono da cabeça da máquina" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon description" +msgid "A 2D silhouette of the print head (fan caps excluded)." +msgstr "Uma silhueta 2D da cabeça de impressão (excluindo as tampas da ventoinha)." + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon label" +msgid "Machine head & Fan polygon" +msgstr "Polígono da cabeça e da ventoinha da máquina" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon description" +msgid "A 2D silhouette of the print head (fan caps included)." +msgstr "Uma silhueta 2D da cabeça de impressão (incluindo as tampas da ventoinha)." + +#: fdmprinter.def.json +msgctxt "gantry_height label" +msgid "Gantry height" +msgstr "Altura do pórtico" + +#: fdmprinter.def.json +msgctxt "gantry_height description" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes)." +msgstr "A diferença de altura entre a ponta do bocal e o sistema de pórtico (eixos X e Y)." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id label" +msgid "Nozzle ID" +msgstr "ID do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_id description" +msgid "The nozzle ID for an extruder train, such as \"AA 0.4\" and \"BB 0.8\"." +msgstr "A ID do bocal para uma máquina de extrusão, tal como \"AA 0.4\" e \"BB 0.8\"." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "Diâmetro do bocal" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "O diâmetro interno do bocal. Altere esta definição ao utilizar um tamanho de bocal não convencional." + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords label" +msgid "Offset With Extruder" +msgstr "Desvio da extrusora" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords description" +msgid "Apply the extruder offset to the coordinate system." +msgstr "Aplique o desvio da extrusora ao sistema de coordenadas." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Posição Z de preparação da extrusora" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada Z da posição de preparação do bocal ao iniciar a impressão." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs label" +msgid "Absolute Extruder Prime Position" +msgstr "Posição absoluta de preparação da extrusora" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs description" +msgid "" +"Make the extruder prime position absolute rather than relative to the last-" +"known location of the head." +msgstr "Torne a posição de preparação da extrusora absoluta em vez de relativa à última posição conhecida da cabeça." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x label" +msgid "Maximum Speed X" +msgstr "Velocidade X máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x description" +msgid "The maximum speed for the motor of the X-direction." +msgstr "A velocidade máxima do motor na direção X." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y label" +msgid "Maximum Speed Y" +msgstr "Velocidade Y máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y description" +msgid "The maximum speed for the motor of the Y-direction." +msgstr "A velocidade máxima do motor na direção Y." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z label" +msgid "Maximum Speed Z" +msgstr "Velocidade Z máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z description" +msgid "The maximum speed for the motor of the Z-direction." +msgstr "A velocidade máxima do motor na direção Z." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e label" +msgid "Maximum Feedrate" +msgstr "Velocidade máxima de alimentação" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e description" +msgid "The maximum speed of the filament." +msgstr "A velocidade máxima do filamento." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x label" +msgid "Maximum Acceleration X" +msgstr "Aceleração X máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x description" +msgid "Maximum acceleration for the motor of the X-direction" +msgstr "A aceleração máxima do motor na direção X" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y label" +msgid "Maximum Acceleration Y" +msgstr "Aceleração Y máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y description" +msgid "Maximum acceleration for the motor of the Y-direction." +msgstr "A aceleração máxima do motor na direção Y." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z label" +msgid "Maximum Acceleration Z" +msgstr "Aceleração Z máxima" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z description" +msgid "Maximum acceleration for the motor of the Z-direction." +msgstr "A aceleração máxima do motor na direção Z." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e label" +msgid "Maximum Filament Acceleration" +msgstr "Aceleração máxima do filamento" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e description" +msgid "Maximum acceleration for the motor of the filament." +msgstr "A aceleração máxima do motor do filamento." + +#: fdmprinter.def.json +msgctxt "machine_acceleration label" +msgid "Default Acceleration" +msgstr "Aceleração predefinida" + +#: fdmprinter.def.json +msgctxt "machine_acceleration description" +msgid "The default acceleration of print head movement." +msgstr "A aceleração predefinida do movimento da cabeça de impressão." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy label" +msgid "Default X-Y Jerk" +msgstr "Solavanco X-Y predefinido" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy description" +msgid "Default jerk for movement in the horizontal plane." +msgstr "O solavanco predefinido do movimento no plano horizontal." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z label" +msgid "Default Z Jerk" +msgstr "Solavanco Z predefinido" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z description" +msgid "Default jerk for the motor of the Z-direction." +msgstr "O solavanco predefinido do motor na direção Z." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e label" +msgid "Default Filament Jerk" +msgstr "Solavanco predefinido do filamento" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e description" +msgid "Default jerk for the motor of the filament." +msgstr "O solavanco predefinido do motor do filamento." + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate label" +msgid "Minimum Feedrate" +msgstr "Velocidade mínima de alimentação" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate description" +msgid "The minimal movement speed of the print head." +msgstr "A velocidade mínima de movimento da cabeça de impressão." + +#: fdmprinter.def.json +msgctxt "resolution label" +msgid "Quality" +msgstr "Qualidade" + +#: fdmprinter.def.json +msgctxt "resolution description" +msgid "" +"All settings that influence the resolution of the print. These settings have " +"a large impact on the quality (and print time)" +msgstr "Todas as definições que influenciam a resolução da impressão. Estas definições têm um grande impacto na qualidade (e no tempo de impressão)." + +#: fdmprinter.def.json +msgctxt "layer_height label" +msgid "Layer Height" +msgstr "Altura da camada" + +#: fdmprinter.def.json +msgctxt "layer_height description" +msgid "" +"The height of each layer in mm. Higher values produce faster prints in lower " +"resolution, lower values produce slower prints in higher resolution." +msgstr "A altura de cada camada em mm. Valores mais elevados produzem impressões mais rápidas com menor resolução e valores mais baixos produzem impressões mais lentas com maior resolução." + +#: fdmprinter.def.json +msgctxt "layer_height_0 label" +msgid "Initial Layer Height" +msgstr "Altura da camada inicial" + +#: fdmprinter.def.json +msgctxt "layer_height_0 description" +msgid "" +"The height of the initial layer in mm. A thicker initial layer makes " +"adhesion to the build plate easier." +msgstr "A altura da camada inicial em mm. Uma camada inicial mais espessa facilita a aderência à placa de construção." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance label" +msgid "Slicing Tolerance" +msgstr "Tolerância da segmentação" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance description" +msgid "" +"How to slice layers with diagonal surfaces. The areas of a layer can be " +"generated based on where the middle of the layer intersects the surface " +"(Middle). Alternatively each layer can have the areas which fall inside of " +"the volume throughout the height of the layer (Exclusive) or a layer has the " +"areas which fall inside anywhere within the layer (Inclusive). Exclusive " +"retains the most details, Inclusive makes for the best fit and Middle takes " +"the least time to process." +msgstr "Como segmentar camadas com superfícies diagonais. As áreas de uma camada podem ser geradas com base no local onde o centro da camada se cruza com a superfície (Centro). Como alternativa, cada camada pode conter as áreas que se encontram no interior do volume da altura da camada (Exclusivo) ou as áreas que se encontram no interior de qualquer parte da camada (Inclusivo). A opção Exclusivo retém o maior número de detalhes, a opção Inclusivo garante o melhor ajuste e a opção Centro tem o menor tempo de processamento." + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option middle" +msgid "Middle" +msgstr "Centro" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option exclusive" +msgid "Exclusive" +msgstr "Exclusivo" + +#: fdmprinter.def.json +msgctxt "slicing_tolerance option inclusive" +msgid "Inclusive" +msgstr "Inclusivo" + +#: fdmprinter.def.json +msgctxt "line_width label" +msgid "Line Width" +msgstr "Largura da linha" + +#: fdmprinter.def.json +msgctxt "line_width description" +msgid "" +"Width of a single line. Generally, the width of each line should correspond " +"to the width of the nozzle. However, slightly reducing this value could " +"produce better prints." +msgstr "A largura de uma única linha. Normalmente, a largura de cada linha deve corresponder à largura do bocal. No entanto, reduzir ligeiramente este valor pode produzir melhores impressões." + +#: fdmprinter.def.json +msgctxt "wall_line_width label" +msgid "Wall Line Width" +msgstr "Largura da linha de parede" + +#: fdmprinter.def.json +msgctxt "wall_line_width description" +msgid "Width of a single wall line." +msgstr "A largura de uma única linha de parede." + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 label" +msgid "Outer Wall Line Width" +msgstr "Largura da linha de parede externa" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 description" +msgid "" +"Width of the outermost wall line. By lowering this value, higher levels of " +"detail can be printed." +msgstr "A largura da linha de parede mais externa. Ao reduzir este valor, é possível imprimir com maior nível de detalhe." + +#: fdmprinter.def.json +msgctxt "wall_line_width_x label" +msgid "Inner Wall(s) Line Width" +msgstr "Largura da linha de parede(s) interna" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x description" +msgid "" +"Width of a single wall line for all wall lines except the outermost one." +msgstr "A largura de uma única linha de parede para todas as linhas de parede exceto a mais externa." + +#: fdmprinter.def.json +msgctxt "roofing_line_width label" +msgid "Top Surface Skin Line Width" +msgstr "Largura da linha de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "roofing_line_width description" +msgid "Width of a single line of the areas at the top of the print." +msgstr "A largura de uma única linha das áreas na parte superior da impressão." + +#: fdmprinter.def.json +msgctxt "skin_line_width label" +msgid "Top/Bottom Line Width" +msgstr "Largura da linha superior/inferior" + +#: fdmprinter.def.json +msgctxt "skin_line_width description" +msgid "Width of a single top/bottom line." +msgstr "A largura de uma única linha superior/inferior." + +#: fdmprinter.def.json +msgctxt "infill_line_width label" +msgid "Infill Line Width" +msgstr "Largura da linha de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_line_width description" +msgid "Width of a single infill line." +msgstr "A largura de uma única linha de preenchimento." + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width label" +msgid "Skirt/Brim Line Width" +msgstr "Largura da linha de contorno/borda" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width description" +msgid "Width of a single skirt or brim line." +msgstr "A largura de uma única linha de contorno ou borda." + +#: fdmprinter.def.json +msgctxt "support_line_width label" +msgid "Support Line Width" +msgstr "Largura da linha de suporte" + +#: fdmprinter.def.json +msgctxt "support_line_width description" +msgid "Width of a single support structure line." +msgstr "A largura de uma única linha de estrutura de suporte." + +#: fdmprinter.def.json +msgctxt "support_interface_line_width label" +msgid "Support Interface Line Width" +msgstr "Largura da linha da interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width description" +msgid "Width of a single line of support roof or floor." +msgstr "A largura de uma única linha de piso ou teto de suporte." + +#: fdmprinter.def.json +msgctxt "support_roof_line_width label" +msgid "Support Roof Line Width" +msgstr "Largura da linha do teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_line_width description" +msgid "Width of a single support roof line." +msgstr "A largura de uma única linha de teto de suporte." + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width label" +msgid "Support Floor Line Width" +msgstr "Largura da linha do piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_width description" +msgid "Width of a single support floor line." +msgstr "A largura de uma única linha de piso de suporte." + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width label" +msgid "Prime Tower Line Width" +msgstr "Largura da linha da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width description" +msgid "Width of a single prime tower line." +msgstr "A largura de uma única linha da torre de preparação." + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor label" +msgid "Initial Layer Line Width" +msgstr "Largura da linha da camada inicial" + +#: fdmprinter.def.json +msgctxt "initial_layer_line_width_factor description" +msgid "" +"Multiplier of the line width on the first layer. Increasing this could " +"improve bed adhesion." +msgstr "Multiplicador da largura da linha na primeira camada. Aumentar a largura poderá melhorar a aderência à base." + +#: fdmprinter.def.json +msgctxt "shell label" +msgid "Shell" +msgstr "Cobertura" + +#: fdmprinter.def.json +msgctxt "shell description" +msgid "Shell" +msgstr "Cobertura" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr label" +msgid "Wall Extruder" +msgstr "Extrusora de parede" + +#: fdmprinter.def.json +msgctxt "wall_extruder_nr description" +msgid "" +"The extruder train used for printing the walls. This is used in multi-" +"extrusion." +msgstr "A máquina de extrusão utilizada para imprimir as paredes. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr label" +msgid "Outer Wall Extruder" +msgstr "Extrusora de parede externa" + +#: fdmprinter.def.json +msgctxt "wall_0_extruder_nr description" +msgid "" +"The extruder train used for printing the outer wall. This is used in multi-" +"extrusion." +msgstr "A máquina de extrusão utilizada para imprimir a parede externa. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr label" +msgid "Inner Wall Extruder" +msgstr "Extrusora de parede interna" + +#: fdmprinter.def.json +msgctxt "wall_x_extruder_nr description" +msgid "" +"The extruder train used for printing the inner walls. This is used in multi-" +"extrusion." +msgstr "A máquina de extrusão utilizada para imprimir as paredes internas. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "wall_thickness label" +msgid "Wall Thickness" +msgstr "Espessura das paredes" + +#: fdmprinter.def.json +msgctxt "wall_thickness description" +msgid "" +"The thickness of the walls in the horizontal direction. This value divided " +"by the wall line width defines the number of walls." +msgstr "A espessura das paredes na direção horizontal. Este valor, dividido pela largura da linha de parede, define o número de paredes." + +#: fdmprinter.def.json +msgctxt "wall_line_count label" +msgid "Wall Line Count" +msgstr "Contagem de linhas de parede" + +#: fdmprinter.def.json +msgctxt "wall_line_count description" +msgid "" +"The number of walls. When calculated by the wall thickness, this value is " +"rounded to a whole number." +msgstr "O número de paredes. Quando calculado através da espessura da parede, este valor é arredondado para um número inteiro." + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist label" +msgid "Outer Wall Wipe Distance" +msgstr "Distância de limpeza da parede externa" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist description" +msgid "" +"Distance of a travel move inserted after the outer wall, to hide the Z seam " +"better." +msgstr "A distância de um movimento de deslocação inserido depois da parede externa para ocultar melhor a costura Z." + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr label" +msgid "Top Surface Skin Extruder" +msgstr "Extrusora de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "roofing_extruder_nr description" +msgid "" +"The extruder train used for printing the top most skin. This is used in " +"multi-extrusion." +msgstr "A máquina de extrusão utilizada para imprimir o revestimento superior. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "roofing_layer_count label" +msgid "Top Surface Skin Layers" +msgstr "Camadas de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "roofing_layer_count description" +msgid "" +"The number of top most skin layers. Usually only one top most layer is " +"sufficient to generate higher quality top surfaces." +msgstr "O número de camadas de revestimento superiores. Por norma, uma só camada superior é suficiente para gerar superfícies superiores de maior qualidade." + +#: fdmprinter.def.json +msgctxt "roofing_pattern label" +msgid "Top Surface Skin Pattern" +msgstr "Padrão do revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "roofing_pattern description" +msgid "The pattern of the top most layers." +msgstr "O padrão das camadas superiores." + +#: fdmprinter.def.json +msgctxt "roofing_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "roofing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "roofing_angles label" +msgid "Top Surface Skin Line Directions" +msgstr "Direções da linha de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "roofing_angles description" +msgid "" +"A list of integer line directions to use when the top surface skin layers " +"use the lines or zig zag pattern. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees)." +msgstr "Uma lista de valores inteiros relativos às direções de linha a utilizar quando as camadas de revestimento da superfície superior utilizarem o padrão de linhas ou ziguezague. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus)." + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr label" +msgid "Top/Bottom Extruder" +msgstr "Extrusora superior/inferior" + +#: fdmprinter.def.json +msgctxt "top_bottom_extruder_nr description" +msgid "" +"The extruder train used for printing the top and bottom skin. This is used " +"in multi-extrusion." +msgstr "A máquina de extrusão utilizada para imprimir o revestimento superior e inferior. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness label" +msgid "Top/Bottom Thickness" +msgstr "Espessura superior/inferior" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness description" +msgid "" +"The thickness of the top/bottom layers in the print. This value divided by " +"the layer height defines the number of top/bottom layers." +msgstr "A espessura das camadas superiores/inferiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas superiores/inferiores." + +#: fdmprinter.def.json +msgctxt "top_thickness label" +msgid "Top Thickness" +msgstr "Espessura superior" + +#: fdmprinter.def.json +msgctxt "top_thickness description" +msgid "" +"The thickness of the top layers in the print. This value divided by the " +"layer height defines the number of top layers." +msgstr "A espessura das camadas superiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas superiores." + +#: fdmprinter.def.json +msgctxt "top_layers label" +msgid "Top Layers" +msgstr "Camadas superiores" + +#: fdmprinter.def.json +msgctxt "top_layers description" +msgid "" +"The number of top layers. When calculated by the top thickness, this value " +"is rounded to a whole number." +msgstr "O número de camadas superiores. Quando calculado através da espessura superior, este valor é arredondado para um número inteiro." + +#: fdmprinter.def.json +msgctxt "bottom_thickness label" +msgid "Bottom Thickness" +msgstr "Espessura inferior" + +#: fdmprinter.def.json +msgctxt "bottom_thickness description" +msgid "" +"The thickness of the bottom layers in the print. This value divided by the " +"layer height defines the number of bottom layers." +msgstr "A espessura das camadas inferiores na impressão. Este valor, dividido pela altura da camada, define o número de camadas inferiores." + +#: fdmprinter.def.json +msgctxt "bottom_layers label" +msgid "Bottom Layers" +msgstr "Camadas inferiores" + +#: fdmprinter.def.json +msgctxt "bottom_layers description" +msgid "" +"The number of bottom layers. When calculated by the bottom thickness, this " +"value is rounded to a whole number." +msgstr "O número de camadas inferiores. Quando calculado pela espessura inferior, este valor é arredondado para um número inteiro." + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern label" +msgid "Top/Bottom Pattern" +msgstr "Padrão superior/inferior" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern description" +msgid "The pattern of the top/bottom layers." +msgstr "O padrão das camadas superiores/inferiores." + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 label" +msgid "Bottom Pattern Initial Layer" +msgstr "Camada inicial de padrão inferior" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 description" +msgid "The pattern on the bottom of the print on the first layer." +msgstr "O padrão na parte inferior da primeira camada." + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern_0 option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "skin_angles label" +msgid "Top/Bottom Line Directions" +msgstr "Direções de linha superior/inferior" + +#: fdmprinter.def.json +msgctxt "skin_angles description" +msgid "" +"A list of integer line directions to use when the top/bottom layers use the " +"lines or zig zag pattern. Elements from the list are used sequentially as " +"the layers progress and when the end of the list is reached, it starts at " +"the beginning again. The list items are separated by commas and the whole " +"list is contained in square brackets. Default is an empty list which means " +"use the traditional default angles (45 and 135 degrees)." +msgstr "Uma lista de valores inteiros relativos às direções de linha a utilizar quando as camadas superiores/inferiores utilizarem o padrão de linhas ou ziguezague. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus)." + +#: fdmprinter.def.json +msgctxt "wall_0_inset label" +msgid "Outer Wall Inset" +msgstr "Inserção de parede externa" + +#: fdmprinter.def.json +msgctxt "wall_0_inset description" +msgid "" +"Inset applied to the path of the outer wall. If the outer wall is smaller " +"than the nozzle, and printed after the inner walls, use this offset to get " +"the hole in the nozzle to overlap with the inner walls instead of the " +"outside of the model." +msgstr "Inserção aplicada à trajetória da parede externa. Se a parede externa for menor que o bocal e impressa depois das paredes internas, utilize este desvio para que o orifício do bocal se sobreponha às paredes internas e não ao exterior do modelo." + +#: fdmprinter.def.json +msgctxt "outer_inset_first label" +msgid "Outer Before Inner Walls" +msgstr "Paredes externas antes das internas" + +#: fdmprinter.def.json +msgctxt "outer_inset_first description" +msgid "" +"Prints walls in order of outside to inside when enabled. This can help " +"improve dimensional accuracy in X and Y when using a high viscosity plastic " +"like ABS; however it can decrease outer surface print quality, especially on " +"overhangs." +msgstr "Quando ativado, imprime paredes do exterior para o interior. Isto pode ajudar a melhorar a precisão dimensional em X e Y ao utilizar um plástico de alta viscosidade, como o ABS; no entanto, pode diminuir a qualidade de impressão da superfície externa, especialmente em saliências." + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter label" +msgid "Alternate Extra Wall" +msgstr "Alternar parede adicional" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter description" +msgid "" +"Prints an extra wall at every other layer. This way infill gets caught " +"between these extra walls, resulting in stronger prints." +msgstr "Imprime uma parede adicional em camadas alternadas. Deste modo, o preenchimento é capturado entre estas paredes adicionais, resultando em impressões mais robustas." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled label" +msgid "Compensate Wall Overlaps" +msgstr "Compensar sobreposição de paredes" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled description" +msgid "" +"Compensate the flow for parts of a wall being printed where there is already " +"a wall in place." +msgstr "Compensa o fluxo de peças de uma parede a ser impressa onde já existe uma parede." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled label" +msgid "Compensate Outer Wall Overlaps" +msgstr "Compensar sobreposição de paredes externas" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled description" +msgid "" +"Compensate the flow for parts of an outer wall being printed where there is " +"already a wall in place." +msgstr "Compensa o fluxo de peças de uma parede externa a ser impressa onde já existe uma parede." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled label" +msgid "Compensate Inner Wall Overlaps" +msgstr "Compensar sobreposição de paredes internas" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled description" +msgid "" +"Compensate the flow for parts of an inner wall being printed where there is " +"already a wall in place." +msgstr "Compensa o fluxo de peças de uma parede interna a ser impressa onde já existe uma parede." + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps label" +msgid "Fill Gaps Between Walls" +msgstr "Preencher folgas entre paredes" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps description" +msgid "Fills the gaps between walls where no walls fit." +msgstr "Preenche as folgas entre paredes onde não é possível instalar paredes." + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option nowhere" +msgid "Nowhere" +msgstr "Em lado nenhum" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option everywhere" +msgid "Everywhere" +msgstr "Em todo o lado" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps label" +msgid "Print Thin Walls" +msgstr "Imprimir paredes finas" + +#: fdmprinter.def.json +msgctxt "fill_outline_gaps description" +msgid "" +"Print pieces of the model which are horizontally thinner than the nozzle " +"size." +msgstr "Imprime peças do modelo que são horizontalmente mais finas do que o tamanho do bocal." + +#: fdmprinter.def.json +msgctxt "xy_offset label" +msgid "Horizontal Expansion" +msgstr "Expansão horizontal" + +#: fdmprinter.def.json +msgctxt "xy_offset description" +msgid "" +"Amount of offset applied to all polygons in each layer. Positive values can " +"compensate for too big holes; negative values can compensate for too small " +"holes." +msgstr "Quantidade de desvio aplicado a todos os polígonos em cada camada. Os valores positivos podem compensar orifícios demasiado grandes; os valores negativos podem compensar orifícios demasiado pequenos." + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 label" +msgid "Initial Layer Horizontal Expansion" +msgstr "Expansão horizontal da camada inicial" + +#: fdmprinter.def.json +msgctxt "xy_offset_layer_0 description" +msgid "" +"Amount of offset applied to all polygons in the first layer. A negative " +"value can compensate for squishing of the first layer known as \"elephant's " +"foot\"." +msgstr "Quantidade de desvio aplicado a todos os polígonos na primeira camada. Um valor negativo pode compensar o esmagamento da primeira camada, conhecido como o \"pé de elefante\"." + +#: fdmprinter.def.json +msgctxt "z_seam_type label" +msgid "Z Seam Alignment" +msgstr "Alinhamento da costura Z" + +#: fdmprinter.def.json +msgctxt "z_seam_type description" +msgid "" +"Starting point of each path in a layer. When paths in consecutive layers " +"start at the same point a vertical seam may show on the print. When aligning " +"these near a user specified location, the seam is easiest to remove. When " +"placed randomly the inaccuracies at the paths' start will be less " +"noticeable. When taking the shortest path the print will be quicker." +msgstr "Ponto inicial de cada trajetória numa camada. Quando as trajetórias das camadas consecutivas começam no mesmo ponto, pode ser apresentada uma costura vertical na impressão. Ao alinhá-las próximo a uma posição especificada pelo utilizador, é mais fácil remover a costura. Quando dispostas aleatoriamente, as imprecisões no início das trajetórias serão menos percetíveis. Ao adotar a trajetória mais curta, a impressão será mais rápida." + +#: fdmprinter.def.json +msgctxt "z_seam_type option back" +msgid "User Specified" +msgstr "Especificado pelo utilizador" + +#: fdmprinter.def.json +msgctxt "z_seam_type option shortest" +msgid "Shortest" +msgstr "Mais curto" + +#: fdmprinter.def.json +msgctxt "z_seam_type option random" +msgid "Random" +msgstr "Aleatório" + +#: fdmprinter.def.json +msgctxt "z_seam_type option sharpest_corner" +msgid "Sharpest Corner" +msgstr "Canto mais acentuado" + +#: fdmprinter.def.json +msgctxt "z_seam_x label" +msgid "Z Seam X" +msgstr "X da costura Z" + +#: fdmprinter.def.json +msgctxt "z_seam_x description" +msgid "" +"The X coordinate of the position near where to start printing each part in a " +"layer." +msgstr "A coordenada X da posição próxima do local onde a impressão de cada parte de uma camada será iniciada." + +#: fdmprinter.def.json +msgctxt "z_seam_y label" +msgid "Z Seam Y" +msgstr "Y da costura Z" + +#: fdmprinter.def.json +msgctxt "z_seam_y description" +msgid "" +"The Y coordinate of the position near where to start printing each part in a " +"layer." +msgstr "A coordenada Y da posição próxima do local onde a impressão de cada parte de uma camada será iniciada." + +#: fdmprinter.def.json +msgctxt "z_seam_corner label" +msgid "Seam Corner Preference" +msgstr "Preferência de canto da costura" + +#: fdmprinter.def.json +msgctxt "z_seam_corner description" +msgid "" +"Control whether corners on the model outline influence the position of the " +"seam. None means that corners have no influence on the seam position. Hide " +"Seam makes the seam more likely to occur on an inside corner. Expose Seam " +"makes the seam more likely to occur on an outside corner. Hide or Expose " +"Seam makes the seam more likely to occur at an inside or outside corner." +msgstr "Controla se os cantos do contorno do modelo influenciam a posição da costura. Nenhum significa que os cantos não influenciam a posição da costura. Ocultar costura torna mais provável que esta surja num canto interno. Expor costura torna mais provável que esta surja num canto externo. Ocultar ou expor costura torna mais provável que esta surja num canto interno ou externo." + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_none" +msgid "None" +msgstr "Nenhum" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_inner" +msgid "Hide Seam" +msgstr "Ocultar costura" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_outer" +msgid "Expose Seam" +msgstr "Expor costura" + +#: fdmprinter.def.json +msgctxt "z_seam_corner option z_seam_corner_any" +msgid "Hide or Expose Seam" +msgstr "Ocultar ou expor costura" + +#: fdmprinter.def.json +msgctxt "z_seam_relative label" +msgid "Z Seam Relative" +msgstr "Relativo à costura Z" + +#: fdmprinter.def.json +msgctxt "z_seam_relative description" +msgid "" +"When enabled, the z seam coordinates are relative to each part's centre. " +"When disabled, the coordinates define an absolute position on the build " +"plate." +msgstr "Quando ativado, as coordenadas da costura Z são relativas ao centro de cada peça. Quando desativado, as coordenadas definem uma posição absoluta na placa de construção." + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic label" +msgid "Ignore Small Z Gaps" +msgstr "Ignorar pequenas folgas Z" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic description" +msgid "" +"When the model has small vertical gaps, about 5% extra computation time can " +"be spent on generating top and bottom skin in these narrow spaces. In such " +"case, disable the setting." +msgstr "Quando o modelo tem pequenas folgas verticais, pode ser gasto cerca de 5% de tempo de cálculo adicional na criação de um revestimento superior e inferior nessas folgas reduzidas. Nesse caso, desative esta definição." + +#: fdmprinter.def.json +msgctxt "skin_outline_count label" +msgid "Extra Skin Wall Count" +msgstr "Contagem de paredes de revestimento adicional" + +#: fdmprinter.def.json +msgctxt "skin_outline_count description" +msgid "" +"Replaces the outermost part of the top/bottom pattern with a number of " +"concentric lines. Using one or two lines improves roofs that start on infill " +"material." +msgstr "Substitui a parte mais externa do padrão superior/inferior por várias linhas concêntricas. Utilizar uma ou duas linhas melhora os tetos iniciados com material de preenchimento." + +#: fdmprinter.def.json +msgctxt "ironing_enabled label" +msgid "Enable Ironing" +msgstr "Ativar engomagem" + +#: fdmprinter.def.json +msgctxt "ironing_enabled description" +msgid "" +"Go over the top surface one additional time, but without extruding material. " +"This is meant to melt the plastic on top further, creating a smoother " +"surface." +msgstr "Passa novamente sobre a superfície superior, mas sem extrudir material. O objetivo é derreter mais o plástico na parte superior, criando uma superfície mais uniforme." + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer label" +msgid "Iron Only Highest Layer" +msgstr "Engomar apenas camada superior" + +#: fdmprinter.def.json +msgctxt "ironing_only_highest_layer description" +msgid "" +"Only perform ironing on the very last layer of the mesh. This saves time if " +"the lower layers don't need a smooth surface finish." +msgstr "Engoma apenas a última camada de malha. Isto permite poupar tempo se as camadas inferiores não precisarem de um acabamento de superfície uniforme." + +#: fdmprinter.def.json +msgctxt "ironing_pattern label" +msgid "Ironing Pattern" +msgstr "Padrão de engomagem" + +#: fdmprinter.def.json +msgctxt "ironing_pattern description" +msgid "The pattern to use for ironing top surfaces." +msgstr "O padrão a utilizar para engomar as superfícies superiores." + +#: fdmprinter.def.json +msgctxt "ironing_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "ironing_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing label" +msgid "Ironing Line Spacing" +msgstr "Espaçamento da linha de engomagem" + +#: fdmprinter.def.json +msgctxt "ironing_line_spacing description" +msgid "The distance between the lines of ironing." +msgstr "A distância entre as linhas de engomagem." + +#: fdmprinter.def.json +msgctxt "ironing_flow label" +msgid "Ironing Flow" +msgstr "Fluxo de engomagem" + +#: fdmprinter.def.json +msgctxt "ironing_flow description" +msgid "" +"The amount of material, relative to a normal skin line, to extrude during " +"ironing. Keeping the nozzle filled helps filling some of the crevices of the " +"top surface, but too much results in overextrusion and blips on the side of " +"the surface." +msgstr "A quantidade de material, em relação a uma linha de revestimento normal, a ser extrudido durante a engomagem. Manter o bocal abastecido ajuda a preencher algumas das fendas da superfície superior, mas o excesso de abastecimento resulta em sobre-extrusão e bolhas na parte lateral da superfície." + +#: fdmprinter.def.json +msgctxt "ironing_inset label" +msgid "Ironing Inset" +msgstr "Inserção de engomagem" + +#: fdmprinter.def.json +msgctxt "ironing_inset description" +msgid "" +"A distance to keep from the edges of the model. Ironing all the way to the " +"edge of the mesh may result in a jagged edge on your print." +msgstr "A distância a manter em relação às extremidades do modelo. Engomar até à extremidade da malha pode resultar numa extremidade irregular na sua impressão." + +#: fdmprinter.def.json +msgctxt "speed_ironing label" +msgid "Ironing Speed" +msgstr "Velocidade de engomagem" + +#: fdmprinter.def.json +msgctxt "speed_ironing description" +msgid "The speed at which to pass over the top surface." +msgstr "A velocidade de passagem sobre a superfície superior." + +#: fdmprinter.def.json +msgctxt "acceleration_ironing label" +msgid "Ironing Acceleration" +msgstr "Aceleração de engomagem" + +#: fdmprinter.def.json +msgctxt "acceleration_ironing description" +msgid "The acceleration with which ironing is performed." +msgstr "A aceleração com a qual a engomagem é efetuada." + +#: fdmprinter.def.json +msgctxt "jerk_ironing label" +msgid "Ironing Jerk" +msgstr "Solavanco de engomagem" + +#: fdmprinter.def.json +msgctxt "jerk_ironing description" +msgid "The maximum instantaneous velocity change while performing ironing." +msgstr "A mudança de velocidade instantânea máxima ao engomar." + +#: fdmprinter.def.json +msgctxt "infill label" +msgid "Infill" +msgstr "Preenchimento" + +#: fdmprinter.def.json +msgctxt "infill description" +msgid "Infill" +msgstr "Preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr label" +msgid "Infill Extruder" +msgstr "Extrusora de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_extruder_nr description" +msgid "" +"The extruder train used for printing infill. This is used in multi-extrusion." +msgstr "A máquina de extrusão utilizada para imprimir o preenchimento. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "infill_sparse_density label" +msgid "Infill Density" +msgstr "Densidade de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density description" +msgid "Adjusts the density of infill of the print." +msgstr "Ajusta a densidade do preenchimento da impressão." + +#: fdmprinter.def.json +msgctxt "infill_line_distance label" +msgid "Infill Line Distance" +msgstr "Distância da linha de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_line_distance description" +msgid "" +"Distance between the printed infill lines. This setting is calculated by the " +"infill density and the infill line width." +msgstr "A distância entre as linhas de preenchimento impressas. Esta definição é calculada através da densidade de preenchimento e da largura da linha de preenchimento." + +#: fdmprinter.def.json +msgctxt "infill_pattern label" +msgid "Infill Pattern" +msgstr "Padrão de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_pattern description" +msgid "" +"The pattern of the infill material of the print. The line and zig zag infill " +"swap direction on alternate layers, reducing material cost. The grid, " +"triangle, tri-hexagon, cubic, octet, quarter cubic, cross and concentric " +"patterns are fully printed every layer. Cubic, quarter cubic and octet " +"infill change with every layer to provide a more equal distribution of " +"strength over each direction." +msgstr "O padrão do material de preenchimento da impressão. A direção de troca de preenchimento de linha e ziguezague em camadas alternadas, reduzindo os custos de material. Os padrões de grelha, triângulo, tri-hexágono, cubo, octeto, quarto cúbico, cruz e concêntrico são totalmente impressos em cada camada. Os preenchimentos cúbico, quarto cúbico e octeto são alterados a cada camada para fornecer uma distribuição mais uniforme da resistência em cada direção." + +#: fdmprinter.def.json +msgctxt "infill_pattern option grid" +msgid "Grid" +msgstr "Grelha" + +#: fdmprinter.def.json +msgctxt "infill_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "infill_pattern option triangles" +msgid "Triangles" +msgstr "Triângulos" + +#: fdmprinter.def.json +msgctxt "infill_pattern option trihexagon" +msgid "Tri-Hexagon" +msgstr "Tri-hexágono" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubic" +msgid "Cubic" +msgstr "Cúbico" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubicsubdiv" +msgid "Cubic Subdivision" +msgstr "Subdivisão cúbica" + +#: fdmprinter.def.json +msgctxt "infill_pattern option tetrahedral" +msgid "Octet" +msgstr "Octeto" + +#: fdmprinter.def.json +msgctxt "infill_pattern option quarter_cubic" +msgid "Quarter Cubic" +msgstr "Quarto cúbico" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Concêntrico 3D" + +#: fdmprinter.def.json +msgctxt "infill_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross" +msgid "Cross" +msgstr "Cruz" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cross_3d" +msgid "Cross 3D" +msgstr "Cruz 3D" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill label" +msgid "Connect Infill Lines" +msgstr "Ligar linhas de preenchimento" + +#: fdmprinter.def.json +msgctxt "zig_zaggify_infill description" +msgid "" +"Connect the ends where the infill pattern meets the inner wall using a line " +"which follows the shape of the inner wall. Enabling this setting can make " +"the infill adhere to the walls better and reduce the effects of infill on " +"the quality of vertical surfaces. Disabling this setting reduces the amount " +"of material used." +msgstr "Liga as extremidades onde o padrão de preenchimento entra em contacto com a parede interna utilizando uma linha que acompanha a forma da parede interna. Ativar esta definição pode melhorar a aderência do preenchimento às paredes e reduzir os efeitos do preenchimento na qualidade das superfícies verticais. Desativar esta definição reduz a quantidade de material utilizado." + +#: fdmprinter.def.json +msgctxt "infill_angles label" +msgid "Infill Line Directions" +msgstr "Direções da linha de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_angles description" +msgid "" +"A list of integer line directions to use. Elements from the list are used " +"sequentially as the layers progress and when the end of the list is reached, " +"it starts at the beginning again. The list items are separated by commas and " +"the whole list is contained in square brackets. Default is an empty list " +"which means use the traditional default angles (45 and 135 degrees for the " +"lines and zig zag patterns and 45 degrees for all other patterns)." +msgstr "Uma lista de valores inteiros relativos às direções de linha a utilizar. Os elementos da lista são utilizados em sequência, à medida que as camadas progridem, voltando ao início assim que a lista chega ao fim. Os itens da lista são separados por vírgulas e a lista completa é disposta entre parênteses retos. A predefinição é uma lista vazia, cujas médias utilizam os ângulos predefinidos tradicionais (45 e 135 graus para os padrões de linha e ziguezague e 45 graus para todos os restantes padrões)." + +#: fdmprinter.def.json +msgctxt "infill_offset_x label" +msgid "Infill X Offset" +msgstr "Desvio X do preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_offset_x description" +msgid "The infill pattern is offset this distance along the X axis." +msgstr "O padrão de preenchimento apresenta um desvio a esta distância ao longo do eixo X." + +#: fdmprinter.def.json +msgctxt "infill_offset_y label" +msgid "Infill Y Offset" +msgstr "Desvio Y do preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_offset_y description" +msgid "The infill pattern is offset this distance along the Y axis." +msgstr "O padrão de preenchimento apresenta um desvio a esta distância ao longo do eixo Y." + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add label" +msgid "Cubic Subdivision Shell" +msgstr "Cobertura de subdivisão cúbica" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add description" +msgid "" +"An addition to the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to a thicker shell of small cubes near the boundary of " +"the model." +msgstr "Um acréscimo ao raio do centro de cada cubo para verificar os limites do modelo, de forma a decidir se este cubo deve ser subdividido. Valores mais elevados resultam numa cobertura mais espessa dos cubos pequenos próximos aos limites do modelo." + +#: fdmprinter.def.json +msgctxt "infill_overlap label" +msgid "Infill Overlap Percentage" +msgstr "Percentagem de sobreposição do preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_overlap description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "A quantidade de sobreposição entre o preenchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao preenchimento." + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm label" +msgid "Infill Overlap" +msgstr "Sobreposição do preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "A quantidade de sobreposição entre o preenchimento e as paredes. Uma ligeira sobreposição permite que as paredes sejam ligadas firmemente ao preenchimento." + +#: fdmprinter.def.json +msgctxt "skin_overlap label" +msgid "Skin Overlap Percentage" +msgstr "Percentagem de sobreposição do revestimento" + +#: fdmprinter.def.json +msgctxt "skin_overlap description" +msgid "" +"The amount of overlap between the skin and the walls as a percentage of the " +"line width. A slight overlap allows the walls to connect firmly to the skin. " +"This is a percentage of the average line widths of the skin lines and the " +"innermost wall." +msgstr "A quantidade de sobreposição entre o revestimento e as paredes, como percentagem de largura da linha. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento. Esta é uma percentagem das larguras médias de linha das linhas de revestimento e da parede mais interna." + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm label" +msgid "Skin Overlap" +msgstr "Sobreposição de revestimento" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "A quantidade de sobreposição entre o revestimento e as paredes. Uma ligeira sobreposição permite que as paredes se liguem firmemente ao revestimento." + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist label" +msgid "Infill Wipe Distance" +msgstr "Distância de limpeza do preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist description" +msgid "" +"Distance of a travel move inserted after every infill line, to make the " +"infill stick to the walls better. This option is similar to infill overlap, " +"but without extrusion and only on one end of the infill line." +msgstr "A distância de um movimento de deslocação inserido depois de cada linha de preenchimento, para melhorar a aderência do preenchimento às paredes. Esta opção é semelhante à sobreposição de preenchimento, mas sem extrusão e apenas numa das extremidades da linha de preenchimento." + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness label" +msgid "Infill Layer Thickness" +msgstr "Espessura da camada de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness description" +msgid "" +"The thickness per layer of infill material. This value should always be a " +"multiple of the layer height and is otherwise rounded." +msgstr "A espessura por camada de material de preenchimento. Este valor deve sempre ser um múltiplo da altura da camada. Caso contrário, será arredondado." + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps label" +msgid "Gradual Infill Steps" +msgstr "Passos de preenchimento gradual" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps description" +msgid "" +"Number of times to reduce the infill density by half when getting further " +"below top surfaces. Areas which are closer to top surfaces get a higher " +"density, up to the Infill Density." +msgstr "O número de vezes que a densidade de preenchimento deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores obtêm uma maior densidade, até ao limite da Densidade de preenchimento." + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height label" +msgid "Gradual Infill Step Height" +msgstr "Altura do passo de preenchimento gradual" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height description" +msgid "" +"The height of infill of a given density before switching to half the density." +msgstr "A altura de preenchimento de uma determinada densidade antes de mudar para metade da densidade." + +#: fdmprinter.def.json +msgctxt "infill_before_walls label" +msgid "Infill Before Walls" +msgstr "Preenchimento antes das paredes" + +#: fdmprinter.def.json +msgctxt "infill_before_walls description" +msgid "" +"Print the infill before printing the walls. Printing the walls first may " +"lead to more accurate walls, but overhangs print worse. Printing the infill " +"first leads to sturdier walls, but the infill pattern might sometimes show " +"through the surface." +msgstr "Imprime o preenchimento antes de imprimir as paredes. Imprimir as paredes em primeiro lugar pode resultar em paredes mais precisas, embora as saliências sejam impressas com menor qualidade. Imprimir o preenchimento em primeiro lugar resulta em paredes mais robustas, embora, por vezes, o padrão de preenchimento possa ser visto através da superfície." + +#: fdmprinter.def.json +msgctxt "min_infill_area label" +msgid "Minimum Infill Area" +msgstr "Área de preenchimento mínimo" + +#: fdmprinter.def.json +msgctxt "min_infill_area description" +msgid "Don't generate areas of infill smaller than this (use skin instead)." +msgstr "Não cria áreas de preenchimento mais reduzidas do que esta (em vez disso, utiliza o revestimento)." + +#: fdmprinter.def.json +msgctxt "skin_preshrink label" +msgid "Skin Removal Width" +msgstr "Largura de remoção do revestimento" + +#: fdmprinter.def.json +msgctxt "skin_preshrink description" +msgid "" +"The largest width of skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top/bottom skin at slanted surfaces " +"in the model." +msgstr "A maior largura das áreas de revestimento a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento superior/inferior nas superfícies inclinadas do modelo." + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink label" +msgid "Top Skin Removal Width" +msgstr "Largura de remoção do revestimento superior" + +#: fdmprinter.def.json +msgctxt "top_skin_preshrink description" +msgid "" +"The largest width of top skin areas which are to be removed. Every skin area " +"smaller than this value will disappear. This can help in limiting the amount " +"of time and material spent on printing top skin at slanted surfaces in the " +"model." +msgstr "A maior largura das áreas de revestimento superiores a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento superior nas superfícies inclinadas do modelo." + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink label" +msgid "Bottom Skin Removal Width" +msgstr "Largura de remoção do revestimento inferior" + +#: fdmprinter.def.json +msgctxt "bottom_skin_preshrink description" +msgid "" +"The largest width of bottom skin areas which are to be removed. Every skin " +"area smaller than this value will disappear. This can help in limiting the " +"amount of time and material spent on printing bottom skin at slanted " +"surfaces in the model." +msgstr "A maior largura das áreas de revestimento inferiores a serem removidas. Todas as áreas de revestimento inferiores a este valor irão desaparecer. Isto pode ajudar a limitar a quantidade de tempo e material gastos na impressão do revestimento inferior nas superfícies inclinadas do modelo." + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance label" +msgid "Skin Expand Distance" +msgstr "Distância de expansão do revestimento" + +#: fdmprinter.def.json +msgctxt "expand_skins_expand_distance description" +msgid "" +"The distance the skins are expanded into the infill. Higher values makes the " +"skin attach better to the infill pattern and makes the walls on neighboring " +"layers adhere better to the skin. Lower values save amount of material used." +msgstr "A distância a que os revestimentos são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência das paredes das camadas adjacentes ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance label" +msgid "Top Skin Expand Distance" +msgstr "Distância de expansão do revestimento superior" + +#: fdmprinter.def.json +msgctxt "top_skin_expand_distance description" +msgid "" +"The distance the top skins are expanded into the infill. Higher values makes " +"the skin attach better to the infill pattern and makes the walls on the " +"layer above adhere better to the skin. Lower values save amount of material " +"used." +msgstr "A distância à qual os revestimentos superiores são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência das paredes da camada superior ao revestimento. Os valores mais baixos reduzem a quantidade de material utilizado." + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance label" +msgid "Bottom Skin Expand Distance" +msgstr "Distância de expansão do revestimento inferior" + +#: fdmprinter.def.json +msgctxt "bottom_skin_expand_distance description" +msgid "" +"The distance the bottom skins are expanded into the infill. Higher values " +"makes the skin attach better to the infill pattern and makes the skin adhere " +"better to the walls on the layer below. Lower values save amount of material " +"used." +msgstr "A distância à qual os revestimentos inferiores são expandidos para o preenchimento. Os valores mais elevados melhoram a fixação do revestimento no padrão de preenchimento, bem como a aderência do revestimento às paredes da camada inferior. Os valores mais baixos reduzem a quantidade de material utilizado." + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion label" +msgid "Maximum Skin Angle for Expansion" +msgstr "Ângulo máximo do revestimento para expansão" + +#: fdmprinter.def.json +msgctxt "max_skin_angle_for_expansion description" +msgid "" +"Top and/or bottom surfaces of your object with an angle larger than this " +"setting, won't have their top/bottom skin expanded. This avoids expanding " +"the narrow skin areas that are created when the model surface has a near " +"vertical slope. An angle of 0° is horizontal, while an angle of 90° is " +"vertical." +msgstr "As superfícies superiores/inferiores do objeto com um ângulo superior a esta definição não conseguirão expandir o revestimento superior/inferior. Isto evita a expansão das áreas de revestimento reduzidas que são criadas quando a superfície do modelo apresenta uma inclinação quase vertical. Um ângulo de 0° é horizontal e um ângulo de 90° é vertical." + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion label" +msgid "Minimum Skin Width for Expansion" +msgstr "Largura mínima do revestimento para expansão" + +#: fdmprinter.def.json +msgctxt "min_skin_width_for_expansion description" +msgid "" +"Skin areas narrower than this are not expanded. This avoids expanding the " +"narrow skin areas that are created when the model surface has a slope close " +"to the vertical." +msgstr "As áreas de revestimento mais reduzidas do que este valor não são expandidas. Isto evita a expansão das áreas de revestimento reduzidas que são criadas quando a superfície do modelo apresenta uma inclinação quase vertical." + +#: fdmprinter.def.json +msgctxt "material label" +msgid "Material" +msgstr "Material" + +#: fdmprinter.def.json +msgctxt "material description" +msgid "Material" +msgstr "Material" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Temperatura automática" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature description" +msgid "" +"Change the temperature for each layer automatically with the average flow " +"speed of that layer." +msgstr "Muda automaticamente a temperatura de cada camada com a velocidade média de fluxo dessa camada." + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature label" +msgid "Default Printing Temperature" +msgstr "Temperatura de impressão predefinida" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature description" +msgid "" +"The default temperature used for printing. This should be the \"base\" " +"temperature of a material. All other print temperatures should use offsets " +"based on this value" +msgstr "A temperatura predefinida utilizada para a impressão. Esta deve ser a temperatura \"base\" de um material. Todas as outras temperaturas de impressão devem utilizar desvios com base neste valor." + +#: fdmprinter.def.json +msgctxt "material_print_temperature label" +msgid "Printing Temperature" +msgstr "Temperatura de impressão" + +#: fdmprinter.def.json +msgctxt "material_print_temperature description" +msgid "The temperature used for printing." +msgstr "A temperatura utilizada para a impressão." + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 label" +msgid "Printing Temperature Initial Layer" +msgstr "Temperatura de impressão da camada inicial" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 description" +msgid "" +"The temperature used for printing the first layer. Set at 0 to disable " +"special handling of the initial layer." +msgstr "A temperatura utilizada para imprimir a primeira camada. Esta é definida como 0 para desativar o manuseamento especial da camada inicial." + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature label" +msgid "Initial Printing Temperature" +msgstr "Temperatura de impressão inicial" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature description" +msgid "" +"The minimal temperature while heating up to the Printing Temperature at " +"which printing can already start." +msgstr "A temperatura mínima ao aquecer até à Temperatura de impressão à qual a impressão já pode começar." + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature label" +msgid "Final Printing Temperature" +msgstr "Temperatura de impressão final" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature description" +msgid "" +"The temperature to which to already start cooling down just before the end " +"of printing." +msgstr "A temperatura à qual o arrefecimento é iniciado imediatamente antes do final da impressão." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "Gráfico de temperatura de fluxo" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "Os dados que ligam o fluxo de material (em mm3 por segundo) à temperatura (graus Celsius)." + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed label" +msgid "Extrusion Cool Down Speed Modifier" +msgstr "Modificador da velocidade de arrefecimento da extrusão" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed description" +msgid "" +"The extra speed by which the nozzle cools while extruding. The same value is " +"used to signify the heat up speed lost when heating up while extruding." +msgstr "A velocidade adicional a que o bocal arrefece durante a extrusão. É utilizado o mesmo valor para indicar a velocidade de aquecimento perdida ao aquecer durante a extrusão." + +#: fdmprinter.def.json +msgctxt "material_bed_temperature label" +msgid "Build Plate Temperature" +msgstr "Temperatura da placa de construção" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature description" +msgid "" +"The temperature used for the heated build plate. If this is 0, the bed will " +"not heat up for this print." +msgstr "A temperatura utilizada para a placa de construção aquecida. Se for 0, a base não será aquecida para esta impressão." + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 label" +msgid "Build Plate Temperature Initial Layer" +msgstr "Temperatura da placa de construção da camada inicial" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 description" +msgid "The temperature used for the heated build plate at the first layer." +msgstr "A temperatura utilizada para a placa de construção aquecida na primeira camada." + +#: fdmprinter.def.json +msgctxt "material_diameter label" +msgid "Diameter" +msgstr "Diâmetro" + +#: fdmprinter.def.json +msgctxt "material_diameter description" +msgid "" +"Adjusts the diameter of the filament used. Match this value with the " +"diameter of the used filament." +msgstr "Ajusta o diâmetro do filamento utilizado. Faça corresponder este valor com o diâmetro do filamento utilizado." + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency label" +msgid "Adhesion Tendency" +msgstr "Tendência de aderência" + +#: fdmprinter.def.json +msgctxt "material_adhesion_tendency description" +msgid "Surface adhesion tendency." +msgstr "A tendência de aderência à superfície." + +#: fdmprinter.def.json +msgctxt "material_surface_energy label" +msgid "Surface Energy" +msgstr "Energia da superfície" + +#: fdmprinter.def.json +msgctxt "material_surface_energy description" +msgid "Surface energy." +msgstr "Energia da superfície." + +#: fdmprinter.def.json +msgctxt "material_flow label" +msgid "Flow" +msgstr "Fluxo" + +#: fdmprinter.def.json +msgctxt "material_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor." + +#: fdmprinter.def.json +msgctxt "retraction_enable label" +msgid "Enable Retraction" +msgstr "Ativar retração" + +#: fdmprinter.def.json +msgctxt "retraction_enable description" +msgid "" +"Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "Retrai o filamento quando o bocal está em movimento numa área sem impressão. " + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change label" +msgid "Retract at Layer Change" +msgstr "Retrair na mudança de camada" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change description" +msgid "Retract the filament when the nozzle is moving to the next layer." +msgstr "Retrai o filamento quando o bocal se está a deslocar para a camada seguinte." + +#: fdmprinter.def.json +msgctxt "retraction_amount label" +msgid "Retraction Distance" +msgstr "Distância de retração" + +#: fdmprinter.def.json +msgctxt "retraction_amount description" +msgid "The length of material retracted during a retraction move." +msgstr "O comprimento do material retraído durante um movimento de retração." + +#: fdmprinter.def.json +msgctxt "retraction_speed label" +msgid "Retraction Speed" +msgstr "Velocidade de retração" + +#: fdmprinter.def.json +msgctxt "retraction_speed description" +msgid "" +"The speed at which the filament is retracted and primed during a retraction " +"move." +msgstr "A velocidade a que o filamento é retraído e preparado durante um movimento de retração." + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed label" +msgid "Retraction Retract Speed" +msgstr "Velocidade de recolha de retração" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed description" +msgid "The speed at which the filament is retracted during a retraction move." +msgstr "A velocidade a que o filamento é recolhido durante um movimento de retração." + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed label" +msgid "Retraction Prime Speed" +msgstr "Velocidade de preparação de retração" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed description" +msgid "The speed at which the filament is primed during a retraction move." +msgstr "A velocidade a que o filamento é preparado durante um movimento de retração." + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount label" +msgid "Retraction Extra Prime Amount" +msgstr "Quantidade de preparação adicional de retração" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount description" +msgid "" +"Some material can ooze away during a travel move, which can be compensated " +"for here." +msgstr "Pode ocorrer vazamento de material durante um movimento de deslocação, o qual pode ser compensado aqui." + +#: fdmprinter.def.json +msgctxt "retraction_min_travel label" +msgid "Retraction Minimum Travel" +msgstr "Deslocação mínima de retração" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel description" +msgid "" +"The minimum distance of travel needed for a retraction to happen at all. " +"This helps to get fewer retractions in a small area." +msgstr "A distância mínima de deslocação necessária para que ocorra uma retração. Isto ajuda a obter menos retrações numa área reduzida." + +#: fdmprinter.def.json +msgctxt "retraction_count_max label" +msgid "Maximum Retraction Count" +msgstr "Contagem máxima de retração" + +#: fdmprinter.def.json +msgctxt "retraction_count_max description" +msgid "" +"This setting limits the number of retractions occurring within the minimum " +"extrusion distance window. Further retractions within this window will be " +"ignored. This avoids retracting repeatedly on the same piece of filament, as " +"that can flatten the filament and cause grinding issues." +msgstr "Esta definição limita o número de retrações que ocorrem no intervalo mínimo de distância de extrusão. As retrações adicionais dentro deste intervalo serão ignoradas. Isto evita a retração repetida no mesmo filamento, uma vez que tal pode achatar o filamento e causar problemas de trituração." + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window label" +msgid "Minimum Extrusion Distance Window" +msgstr "Intervalo mínimo de distância de extrusão" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window description" +msgid "" +"The window in which the maximum retraction count is enforced. This value " +"should be approximately the same as the retraction distance, so that " +"effectively the number of times a retraction passes the same patch of " +"material is limited." +msgstr "O intervalo no qual a contagem máxima de retração é aplicada. Este valor deve ser aproximadamente o mesmo que a distância de retração, de forma que o número de vezes que uma retração passa no mesmo retalho de material seja efetivamente limitado." + +#: fdmprinter.def.json +msgctxt "material_standby_temperature label" +msgid "Standby Temperature" +msgstr "Temperatura de espera" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature description" +msgid "" +"The temperature of the nozzle when another nozzle is currently used for " +"printing." +msgstr "A temperatura do bocal quando outro bocal está a ser utilizado para a impressão." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount label" +msgid "Nozzle Switch Retraction Distance" +msgstr "Distância de retração de substituição do bocal" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount description" +msgid "" +"The amount of retraction: Set at 0 for no retraction at all. This should " +"generally be the same as the length of the heat zone." +msgstr "A quantidade de retração: defina como 0 para não obter qualquer retração. Normalmente, esta deve ser a mesma que o comprimento da zona de aquecimento." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds label" +msgid "Nozzle Switch Retraction Speed" +msgstr "Velocidade de retração de substituição do bocal" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds description" +msgid "" +"The speed at which the filament is retracted. A higher retraction speed " +"works better, but a very high retraction speed can lead to filament grinding." +msgstr "A velocidade a que o filamento é retraído. Uma maior velocidade de retração funciona melhor, mas uma velocidade de retração muito elevada pode resultar na trituração do filamento." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed label" +msgid "Nozzle Switch Retract Speed" +msgstr "Velocidade de recolha de substituição do bocal" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed description" +msgid "" +"The speed at which the filament is retracted during a nozzle switch retract." +msgstr "A velocidade a que o filamento é retraído durante uma recolha de substituição do bocal." + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed label" +msgid "Nozzle Switch Prime Speed" +msgstr "Velocidade de preparação de substituição do bocal" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed description" +msgid "" +"The speed at which the filament is pushed back after a nozzle switch " +"retraction." +msgstr "A velocidade a que o filamento é empurrado após uma retração de substituição do bocal." + +#: fdmprinter.def.json +msgctxt "speed label" +msgid "Speed" +msgstr "Velocidade" + +#: fdmprinter.def.json +msgctxt "speed description" +msgid "Speed" +msgstr "Velocidade" + +#: fdmprinter.def.json +msgctxt "speed_print label" +msgid "Print Speed" +msgstr "Velocidade de impressão" + +#: fdmprinter.def.json +msgctxt "speed_print description" +msgid "The speed at which printing happens." +msgstr "A velocidade a que é efetuada a impressão." + +#: fdmprinter.def.json +msgctxt "speed_infill label" +msgid "Infill Speed" +msgstr "Velocidade de preenchimento" + +#: fdmprinter.def.json +msgctxt "speed_infill description" +msgid "The speed at which infill is printed." +msgstr "A velocidade a que o preenchimento é impresso." + +#: fdmprinter.def.json +msgctxt "speed_wall label" +msgid "Wall Speed" +msgstr "Velocidade de parede" + +#: fdmprinter.def.json +msgctxt "speed_wall description" +msgid "The speed at which the walls are printed." +msgstr "A velocidade a que as paredes são impressas." + +#: fdmprinter.def.json +msgctxt "speed_wall_0 label" +msgid "Outer Wall Speed" +msgstr "Velocidade de parede externa" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 description" +msgid "" +"The speed at which the outermost walls are printed. Printing the outer wall " +"at a lower speed improves the final skin quality. However, having a large " +"difference between the inner wall speed and the outer wall speed will affect " +"quality in a negative way." +msgstr "A velocidade a que as paredes externas são impressas. Imprimir a parede externa a uma velocidade mais reduzida melhora a qualidade final do revestimento. No entanto, a existência de uma grande diferença entre a velocidade da parede interna e a velocidade de parede externa afetará a qualidade de forma negativa." + +#: fdmprinter.def.json +msgctxt "speed_wall_x label" +msgid "Inner Wall Speed" +msgstr "Velocidade de parede interna" + +#: fdmprinter.def.json +msgctxt "speed_wall_x description" +msgid "" +"The speed at which all inner walls are printed. Printing the inner wall " +"faster than the outer wall will reduce printing time. It works well to set " +"this in between the outer wall speed and the infill speed." +msgstr "A velocidade a que todas as paredes internas são impressas. Imprimir a parede interna mais rapidamente do que a parede externa irá reduzir o tempo de impressão. É conveniente introduzir esta definição entre a velocidade de parede externa e a velocidade de preenchimento." + +#: fdmprinter.def.json +msgctxt "speed_roofing label" +msgid "Top Surface Skin Speed" +msgstr "Velocidade de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "speed_roofing description" +msgid "The speed at which top surface skin layers are printed." +msgstr "A velocidade a que as camadas de revestimento da superfície superior são impressas." + +#: fdmprinter.def.json +msgctxt "speed_topbottom label" +msgid "Top/Bottom Speed" +msgstr "Velocidade superior/inferior" + +#: fdmprinter.def.json +msgctxt "speed_topbottom description" +msgid "The speed at which top/bottom layers are printed." +msgstr "A velocidade a que as camadas superiores/inferiores são impressas." + +#: fdmprinter.def.json +msgctxt "speed_support label" +msgid "Support Speed" +msgstr "Velocidade de suporte" + +#: fdmprinter.def.json +msgctxt "speed_support description" +msgid "" +"The speed at which the support structure is printed. Printing support at " +"higher speeds can greatly reduce printing time. The surface quality of the " +"support structure is not important since it is removed after printing." +msgstr "A velocidade a que a estrutura de suporte é impressa. Imprimir o suporte a velocidades elevadas pode reduzir consideravelmente o tempo de impressão. A qualidade da superfície da estrutura de suporte não é importante, uma vez que esta é removida após a impressão." + +#: fdmprinter.def.json +msgctxt "speed_support_infill label" +msgid "Support Infill Speed" +msgstr "Velocidade de preenchimento do suporte" + +#: fdmprinter.def.json +msgctxt "speed_support_infill description" +msgid "" +"The speed at which the infill of support is printed. Printing the infill at " +"lower speeds improves stability." +msgstr "A velocidade a que o preenchimento do suporte é impresso. Imprimir o preenchimento a velocidades baixas melhora a estabilidade." + +#: fdmprinter.def.json +msgctxt "speed_support_interface label" +msgid "Support Interface Speed" +msgstr "Velocidade da interface de suporte" + +#: fdmprinter.def.json +msgctxt "speed_support_interface description" +msgid "" +"The speed at which the roofs and floors of support are printed. Printing " +"them at lower speeds can improve overhang quality." +msgstr "A velocidade a que os tetos e os pisos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." + +#: fdmprinter.def.json +msgctxt "speed_support_roof label" +msgid "Support Roof Speed" +msgstr "Velocidade do teto de suporte" + +#: fdmprinter.def.json +msgctxt "speed_support_roof description" +msgid "" +"The speed at which the roofs of support are printed. Printing them at lower " +"speeds can improve overhang quality." +msgstr "A velocidade a que os tetos de suporte são impressos. Imprimi-los a velocidades baixas pode melhorar a qualidade das saliências." + +#: fdmprinter.def.json +msgctxt "speed_support_bottom label" +msgid "Support Floor Speed" +msgstr "Velocidade do piso de suporte" + +#: fdmprinter.def.json +msgctxt "speed_support_bottom description" +msgid "" +"The speed at which the floor of support is printed. Printing it at lower " +"speed can improve adhesion of support on top of your model." +msgstr "A velocidade a que o piso de suporte é impresso. Imprimi-lo a uma velocidade baixa pode melhorar a aderência do suporte na parte superior do modelo." + +#: fdmprinter.def.json +msgctxt "speed_prime_tower label" +msgid "Prime Tower Speed" +msgstr "Velocidade da torre de preparação" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower description" +msgid "" +"The speed at which the prime tower is printed. Printing the prime tower " +"slower can make it more stable when the adhesion between the different " +"filaments is suboptimal." +msgstr "A velocidade à qual a torre de preparação é impressa. Imprimir a torre de preparação mais lentamente pode torná-la mais estável quando a aderência entre os diferentes filamentos é insuficiente." + +#: fdmprinter.def.json +msgctxt "speed_travel label" +msgid "Travel Speed" +msgstr "Velocidade de deslocação" + +#: fdmprinter.def.json +msgctxt "speed_travel description" +msgid "The speed at which travel moves are made." +msgstr "A velocidade a que os movimentos de deslocação são efetuados." + +#: fdmprinter.def.json +msgctxt "speed_layer_0 label" +msgid "Initial Layer Speed" +msgstr "Velocidade da camada inicial" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 description" +msgid "" +"The speed for the initial layer. A lower value is advised to improve " +"adhesion to the build plate." +msgstr "A velocidade da camada inicial. É recomendado um valor inferior para melhorar a aderência à placa de construção." + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 label" +msgid "Initial Layer Print Speed" +msgstr "Velocidade de impressão da camada inicial" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 description" +msgid "" +"The speed of printing for the initial layer. A lower value is advised to " +"improve adhesion to the build plate." +msgstr "A velocidade de impressão da camada inicial. É recomendado um valor inferior para melhorar a aderência à placa de construção." + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 label" +msgid "Initial Layer Travel Speed" +msgstr "Velocidade de deslocação da camada inicial" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 description" +msgid "" +"The speed of travel moves in the initial layer. A lower value is advised to " +"prevent pulling previously printed parts away from the build plate. The " +"value of this setting can automatically be calculated from the ratio between " +"the Travel Speed and the Print Speed." +msgstr "A velocidade dos movimentos de deslocação na camada inicial. É recomendado um valor inferior para evitar que as peças anteriormente impressas sejam separadas da placa de construção. O valor desta definição pode ser automaticamente calculado a partir da proporção entre a Velocidade de deslocação e a Velocidade de impressão." + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed label" +msgid "Skirt/Brim Speed" +msgstr "Velocidade de contorno/borda" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed description" +msgid "" +"The speed at which the skirt and brim are printed. Normally this is done at " +"the initial layer speed, but sometimes you might want to print the skirt or " +"brim at a different speed." +msgstr "A velocidade a que o contorno e a borda são impressos. Geralmente, isto é efetuado à velocidade de camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a borda a uma velocidade diferente." + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override label" +msgid "Maximum Z Speed" +msgstr "Velocidade Z máxima" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override description" +msgid "" +"The maximum speed with which the build plate is moved. Setting this to zero " +"causes the print to use the firmware defaults for the maximum z speed." +msgstr "A velocidade máxima a que a placa de construção é movida. Defini-la como zero faz com que a impressão utilize as predefinições de firmware para a velocidade Z máxima." + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers label" +msgid "Number of Slower Layers" +msgstr "Número de camadas mais lentas" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers description" +msgid "" +"The first few layers are printed slower than the rest of the model, to get " +"better adhesion to the build plate and improve the overall success rate of " +"prints. The speed is gradually increased over these layers." +msgstr "As primeiras camadas são impressas mais lentamente do que o resto do modelo para obter uma melhor aderência à placa de construção e melhorar a taxa de sucesso geral das impressões. A velocidade é aumentada gradualmente nessas camadas." + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled label" +msgid "Equalize Filament Flow" +msgstr "Equilibrar fluxo de filamento" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled description" +msgid "" +"Print thinner than normal lines faster so that the amount of material " +"extruded per second remains the same. Thin pieces in your model might " +"require lines printed with smaller line width than provided in the settings. " +"This setting controls the speed changes for such lines." +msgstr "Imprime linhas mais finas do que o normal de forma mais rápida, para que a quantidade de material extrudido por segundo permaneça o mesmo. As peças finas do modelo podem requerer linhas impressas com uma menor largura de linha do que a fornecida nas definições. Esta definição controla as mudanças de velocidade dessas linhas." + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max label" +msgid "Maximum Speed for Flow Equalization" +msgstr "Velocidade máxima para equilíbrio de fluxo" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max description" +msgid "" +"Maximum print speed when adjusting the print speed in order to equalize flow." +msgstr "A velocidade máxima de impressão ao ajustar a velocidade de impressão para equilibrar o fluxo." + +#: fdmprinter.def.json +msgctxt "acceleration_enabled label" +msgid "Enable Acceleration Control" +msgstr "Ativar controlo da aceleração" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled description" +msgid "" +"Enables adjusting the print head acceleration. Increasing the accelerations " +"can reduce printing time at the cost of print quality." +msgstr "Permite o ajuste da aceleração da cabeça de impressão. Aumentar as acelerações pode reduzir o tempo de impressão em detrimento da qualidade de impressão." + +#: fdmprinter.def.json +msgctxt "acceleration_print label" +msgid "Print Acceleration" +msgstr "Aceleração de impressão" + +#: fdmprinter.def.json +msgctxt "acceleration_print description" +msgid "The acceleration with which printing happens." +msgstr "A aceleração com que é efetuada a impressão." + +#: fdmprinter.def.json +msgctxt "acceleration_infill label" +msgid "Infill Acceleration" +msgstr "Aceleração de preenchimento" + +#: fdmprinter.def.json +msgctxt "acceleration_infill description" +msgid "The acceleration with which infill is printed." +msgstr "A aceleração com que o preenchimento é impresso." + +#: fdmprinter.def.json +msgctxt "acceleration_wall label" +msgid "Wall Acceleration" +msgstr "Aceleração de parede" + +#: fdmprinter.def.json +msgctxt "acceleration_wall description" +msgid "The acceleration with which the walls are printed." +msgstr "A aceleração com que as paredes são impressas." + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 label" +msgid "Outer Wall Acceleration" +msgstr "Aceleração da parede externa" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 description" +msgid "The acceleration with which the outermost walls are printed." +msgstr "A aceleração com que as paredes mais externas são impressas." + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x label" +msgid "Inner Wall Acceleration" +msgstr "Aceleração da parede interna" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x description" +msgid "The acceleration with which all inner walls are printed." +msgstr "A aceleração com que todas as paredes internas são impressas." + +#: fdmprinter.def.json +msgctxt "acceleration_roofing label" +msgid "Top Surface Skin Acceleration" +msgstr "Aceleração do revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "acceleration_roofing description" +msgid "The acceleration with which top surface skin layers are printed." +msgstr "A aceleração com que as camadas de revestimento da superfície superior são impressas." + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom label" +msgid "Top/Bottom Acceleration" +msgstr "Aceleração superior/inferior" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom description" +msgid "The acceleration with which top/bottom layers are printed." +msgstr "A aceleração com que as camadas superiores/inferiores são impressas." + +#: fdmprinter.def.json +msgctxt "acceleration_support label" +msgid "Support Acceleration" +msgstr "Aceleração de suporte" + +#: fdmprinter.def.json +msgctxt "acceleration_support description" +msgid "The acceleration with which the support structure is printed." +msgstr "A aceleração com que a estrutura de suporte é impressa." + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill label" +msgid "Support Infill Acceleration" +msgstr "Aceleração de preenchimento do suporte" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill description" +msgid "The acceleration with which the infill of support is printed." +msgstr "A aceleração com que o preenchimento do suporte é impresso." + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface label" +msgid "Support Interface Acceleration" +msgstr "Aceleração da interface de suporte" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface description" +msgid "" +"The acceleration with which the roofs and floors of support are printed. " +"Printing them at lower acceleration can improve overhang quality." +msgstr "A aceleração com que os tetos e pisos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof label" +msgid "Support Roof Acceleration" +msgstr "Aceleração do teto de suporte" + +#: fdmprinter.def.json +msgctxt "acceleration_support_roof description" +msgid "" +"The acceleration with which the roofs of support are printed. Printing them " +"at lower acceleration can improve overhang quality." +msgstr "A aceleração com que os tetos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a qualidade das saliências." + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom label" +msgid "Support Floor Acceleration" +msgstr "Aceleração do piso de suporte" + +#: fdmprinter.def.json +msgctxt "acceleration_support_bottom description" +msgid "" +"The acceleration with which the floors of support are printed. Printing them " +"at lower acceleration can improve adhesion of support on top of your model." +msgstr "A aceleração com que os pisos de suporte são impressos. Imprimi-los com uma aceleração inferior pode melhorar a aderência do suporte na parte superior do modelo." + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower label" +msgid "Prime Tower Acceleration" +msgstr "Aceleração da torre de preparação" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower description" +msgid "The acceleration with which the prime tower is printed." +msgstr "A aceleração com que a torre de preparação é impressa." + +#: fdmprinter.def.json +msgctxt "acceleration_travel label" +msgid "Travel Acceleration" +msgstr "Aceleração de deslocação" + +#: fdmprinter.def.json +msgctxt "acceleration_travel description" +msgid "The acceleration with which travel moves are made." +msgstr "A aceleração com que os movimentos de deslocação são efetuados." + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 label" +msgid "Initial Layer Acceleration" +msgstr "Aceleração da camada inicial" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 description" +msgid "The acceleration for the initial layer." +msgstr "A aceleração da camada inicial." + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 label" +msgid "Initial Layer Print Acceleration" +msgstr "Aceleração de impressão da camada inicial" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 description" +msgid "The acceleration during the printing of the initial layer." +msgstr "A aceleração durante a impressão da camada inicial." + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 label" +msgid "Initial Layer Travel Acceleration" +msgstr "Aceleração de deslocação da camada inicial" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "A aceleração dos movimentos de deslocação na camada inicial." + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim label" +msgid "Skirt/Brim Acceleration" +msgstr "Aceleração de contorno/borda" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim description" +msgid "" +"The acceleration with which the skirt and brim are printed. Normally this is " +"done with the initial layer acceleration, but sometimes you might want to " +"print the skirt or brim at a different acceleration." +msgstr "A aceleração com que o contorno e a borda são impressos. Geralmente, isto é efetuado com a aceleração da camada inicial, mas, por vezes, pode preferir imprimir o contorno ou a borda com uma aceleração diferente." + +#: fdmprinter.def.json +msgctxt "jerk_enabled label" +msgid "Enable Jerk Control" +msgstr "Ativar controlo de solavanco" + +#: fdmprinter.def.json +msgctxt "jerk_enabled description" +msgid "" +"Enables adjusting the jerk of print head when the velocity in the X or Y " +"axis changes. Increasing the jerk can reduce printing time at the cost of " +"print quality." +msgstr "Permite o ajuste do solavanco da cabeça de impressão quando a velocidade nos eixos X ou Y muda. Aumentar o solavanco pode reduzir o tempo de impressão em detrimento da qualidade de impressão." + +#: fdmprinter.def.json +msgctxt "jerk_print label" +msgid "Print Jerk" +msgstr "Solavanco de impressão" + +#: fdmprinter.def.json +msgctxt "jerk_print description" +msgid "The maximum instantaneous velocity change of the print head." +msgstr "A mudança de velocidade instantânea máxima da cabeça de impressão." + +#: fdmprinter.def.json +msgctxt "jerk_infill label" +msgid "Infill Jerk" +msgstr "Solavanco de preenchimento" + +#: fdmprinter.def.json +msgctxt "jerk_infill description" +msgid "The maximum instantaneous velocity change with which infill is printed." +msgstr "A mudança de velocidade instantânea máxima com a qual o preenchimento é impresso." + +#: fdmprinter.def.json +msgctxt "jerk_wall label" +msgid "Wall Jerk" +msgstr "Solavanco de parede" + +#: fdmprinter.def.json +msgctxt "jerk_wall description" +msgid "" +"The maximum instantaneous velocity change with which the walls are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual as paredes são impressas." + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 label" +msgid "Outer Wall Jerk" +msgstr "Solavanco de parede externa" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 description" +msgid "" +"The maximum instantaneous velocity change with which the outermost walls are " +"printed." +msgstr "A mudança de velocidade instantânea máxima com a qual as paredes externas são impressas." + +#: fdmprinter.def.json +msgctxt "jerk_wall_x label" +msgid "Inner Wall Jerk" +msgstr "Solavanco de parede interna" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x description" +msgid "" +"The maximum instantaneous velocity change with which all inner walls are " +"printed." +msgstr "A mudança de velocidade instantânea máxima com a qual todas as paredes internas são impressas." + +#: fdmprinter.def.json +msgctxt "jerk_roofing label" +msgid "Top Surface Skin Jerk" +msgstr "Solavanco de revestimento da superfície superior" + +#: fdmprinter.def.json +msgctxt "jerk_roofing description" +msgid "" +"The maximum instantaneous velocity change with which top surface skin layers " +"are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual as camadas de revestimento da superfície superior são impressas." + +#: fdmprinter.def.json +msgctxt "jerk_topbottom label" +msgid "Top/Bottom Jerk" +msgstr "Solavanco superior/inferior" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom description" +msgid "" +"The maximum instantaneous velocity change with which top/bottom layers are " +"printed." +msgstr "A mudança de velocidade instantânea máxima com a qual as camadas superiores/inferiores são impressas." + +#: fdmprinter.def.json +msgctxt "jerk_support label" +msgid "Support Jerk" +msgstr "Solavanco de suporte" + +#: fdmprinter.def.json +msgctxt "jerk_support description" +msgid "" +"The maximum instantaneous velocity change with which the support structure " +"is printed." +msgstr "A mudança de velocidade instantânea máxima com a qual a estrutura de suporte é impressa." + +#: fdmprinter.def.json +msgctxt "jerk_support_infill label" +msgid "Support Infill Jerk" +msgstr "Solavanco de preenchimento do suporte" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill description" +msgid "" +"The maximum instantaneous velocity change with which the infill of support " +"is printed." +msgstr "A mudança de velocidade instantânea máxima com a qual o preenchimento do suporte é impresso." + +#: fdmprinter.def.json +msgctxt "jerk_support_interface label" +msgid "Support Interface Jerk" +msgstr "Solavanco de interface de suporte" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface description" +msgid "" +"The maximum instantaneous velocity change with which the roofs and floors of " +"support are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual os tetos e pisos de suporte são impressos." + +#: fdmprinter.def.json +msgctxt "jerk_support_roof label" +msgid "Support Roof Jerk" +msgstr "Solavanco de teto de suporte" + +#: fdmprinter.def.json +msgctxt "jerk_support_roof description" +msgid "" +"The maximum instantaneous velocity change with which the roofs of support " +"are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual os tetos de suporte são impressos." + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom label" +msgid "Support Floor Jerk" +msgstr "Solavanco de piso de suporte" + +#: fdmprinter.def.json +msgctxt "jerk_support_bottom description" +msgid "" +"The maximum instantaneous velocity change with which the floors of support " +"are printed." +msgstr "A mudança de velocidade instantânea máxima com a qual os pisos de suporte são impressos." + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower label" +msgid "Prime Tower Jerk" +msgstr "Solavanco da torre de preparação" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower description" +msgid "" +"The maximum instantaneous velocity change with which the prime tower is " +"printed." +msgstr "A mudança de velocidade instantânea máxima com a qual a torre de preparação é impressa." + +#: fdmprinter.def.json +msgctxt "jerk_travel label" +msgid "Travel Jerk" +msgstr "Solavanco de deslocação" + +#: fdmprinter.def.json +msgctxt "jerk_travel description" +msgid "" +"The maximum instantaneous velocity change with which travel moves are made." +msgstr "A mudança de velocidade instantânea máxima com a qual os movimentos de deslocação são impressos." + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 label" +msgid "Initial Layer Jerk" +msgstr "Solavanco de camada inicial" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 description" +msgid "The print maximum instantaneous velocity change for the initial layer." +msgstr "A mudança de velocidade instantânea máxima de impressão para a camada inicial." + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 label" +msgid "Initial Layer Print Jerk" +msgstr "Solavanco de impressão da camada inicial" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 description" +msgid "" +"The maximum instantaneous velocity change during the printing of the initial " +"layer." +msgstr "A mudança de velocidade instantânea máxima durante a impressão da camada inicial." + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 label" +msgid "Initial Layer Travel Jerk" +msgstr "Solavanco de deslocação da camada inicial" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "A aceleração dos movimentos de deslocação na camada inicial." + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim label" +msgid "Skirt/Brim Jerk" +msgstr "Solavanco de contorno/borda" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim description" +msgid "" +"The maximum instantaneous velocity change with which the skirt and brim are " +"printed." +msgstr "A mudança de velocidade instantânea máxima com a qual o contorno e a borda são impressos." + +#: fdmprinter.def.json +msgctxt "travel label" +msgid "Travel" +msgstr "Deslocação" + +#: fdmprinter.def.json +msgctxt "travel description" +msgid "travel" +msgstr "deslocação" + +#: fdmprinter.def.json +msgctxt "retraction_combing label" +msgid "Combing Mode" +msgstr "Modo de combing" + +#: fdmprinter.def.json +msgctxt "retraction_combing description" +msgid "" +"Combing keeps the nozzle within already printed areas when traveling. This " +"results in slightly longer travel moves but reduces the need for " +"retractions. If combing is off, the material will retract and the nozzle " +"moves in a straight line to the next point. It is also possible to avoid " +"combing over top/bottom skin areas by combing within the infill only." +msgstr "O combing mantém o bocal nas áreas já impressas durante a deslocação. Isto resulta em movimentos de deslocação ligeiramente mais longos, mas reduz a necessidade de retrações. Se o combing estiver desativado, o material será retraído e o bocal irá deslocar-se em linha reta para o próximo ponto. Também é possível evitar o combing em áreas de revestimento superiores/inferiores efetuando o combing apenas no preenchimento." + +#: fdmprinter.def.json +msgctxt "retraction_combing option off" +msgid "Off" +msgstr "Desligado" + +#: fdmprinter.def.json +msgctxt "retraction_combing option all" +msgid "All" +msgstr "Tudo" + +#: fdmprinter.def.json +msgctxt "retraction_combing option noskin" +msgid "No Skin" +msgstr "Sem revestimento" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall label" +msgid "Retract Before Outer Wall" +msgstr "Retrair antes da parede externa" + +#: fdmprinter.def.json +msgctxt "travel_retract_before_outer_wall description" +msgid "Always retract when moving to start an outer wall." +msgstr "Retrair sempre durante o movimento de início de uma parede externa." + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts label" +msgid "Avoid Printed Parts When Traveling" +msgstr "Evitar peças impressas durante a deslocação" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts description" +msgid "" +"The nozzle avoids already printed parts when traveling. This option is only " +"available when combing is enabled." +msgstr "O bocal evita as peças já impressas durante a deslocação. Esta opção só está disponível quando o combing está ativado." + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance label" +msgid "Travel Avoid Distance" +msgstr "Distância para evitar peças durante a deslocação" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance description" +msgid "" +"The distance between the nozzle and already printed parts when avoiding " +"during travel moves." +msgstr "A distância entre o bocal e as peças já impressas ao evitá-las durante os movimentos de deslocação." + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position label" +msgid "Start Layers with the Same Part" +msgstr "Iniciar camadas com a mesma peça" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position description" +msgid "" +"In each layer start with printing the object near the same point, so that we " +"don't start a new layer with printing the piece which the previous layer " +"ended with. This makes for better overhangs and small parts, but increases " +"printing time." +msgstr "Em cada camada, comece por imprimir o objeto junto ao mesmo ponto para não iniciar uma nova camada imprimindo a peça com a qual terminou a camada anterior. Isto produz melhores saliências e pequenas peças, mas aumenta o tempo de impressão." + +#: fdmprinter.def.json +msgctxt "layer_start_x label" +msgid "Layer Start X" +msgstr "X de início da camada" + +#: fdmprinter.def.json +msgctxt "layer_start_x description" +msgid "" +"The X coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "A coordenada X da posição próxima do local onde se situa a peça pela qual iniciar a impressão de cada camada." + +#: fdmprinter.def.json +msgctxt "layer_start_y label" +msgid "Layer Start Y" +msgstr "Y de início da camada" + +#: fdmprinter.def.json +msgctxt "layer_start_y description" +msgid "" +"The Y coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "A coordenada Y da posição do local onde se situa a peça pela qual iniciar a impressão de cada camada." + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled label" +msgid "Z Hop When Retracted" +msgstr "Salto Z ao retrair" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled description" +msgid "" +"Whenever a retraction is done, the build plate is lowered to create " +"clearance between the nozzle and the print. It prevents the nozzle from " +"hitting the print during travel moves, reducing the chance to knock the " +"print from the build plate." +msgstr "Sempre que for efetuada uma retração, a placa de construção é baixada para criar uma folga entre o bocal e a impressão. Desta forma, evita-se que o bocal atinja a impressão durante os movimentos de deslocação, reduzindo a probabilidade de derrubar a impressão da placa de construção." + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides label" +msgid "Z Hop Only Over Printed Parts" +msgstr "Salto Z apenas sobre as peças impressas" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides description" +msgid "" +"Only perform a Z Hop when moving over printed parts which cannot be avoided " +"by horizontal motion by Avoid Printed Parts when Traveling." +msgstr "Efetua um salto Z apenas ao deslocar-se sobre as peças impressas que não podem ser evitadas pelo movimento horizontal através da opção Evitar peças impressas durante a deslocação." + +#: fdmprinter.def.json +msgctxt "retraction_hop label" +msgid "Z Hop Height" +msgstr "Altura do salto Z" + +#: fdmprinter.def.json +msgctxt "retraction_hop description" +msgid "The height difference when performing a Z Hop." +msgstr "A diferença de altura ao efetuar um salto Z." + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch label" +msgid "Z Hop After Extruder Switch" +msgstr "Salto Z após substituição da extrusora" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch description" +msgid "" +"After the machine switched from one extruder to the other, the build plate " +"is lowered to create clearance between the nozzle and the print. This " +"prevents the nozzle from leaving oozed material on the outside of a print." +msgstr "Após a máquina mudar de uma extrusora para outra, a placa de construção é baixada para criar uma folga entre o bocal e a impressão. Desta forma, evita-se que o bocal liberte material vazado para a parte exterior de uma impressão." + +#: fdmprinter.def.json +msgctxt "cooling label" +msgid "Cooling" +msgstr "Arrefecimento" + +#: fdmprinter.def.json +msgctxt "cooling description" +msgid "Cooling" +msgstr "Arrefecimento" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled label" +msgid "Enable Print Cooling" +msgstr "Ativar arrefecimento de impressão" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled description" +msgid "" +"Enables the print cooling fans while printing. The fans improve print " +"quality on layers with short layer times and bridging / overhangs." +msgstr "Ativa as ventoinhas de arrefecimento de impressão ao imprimir. As ventoinhas melhoram a qualidade de impressão com menores tempos de camada e pontes/saliências." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed label" +msgid "Fan Speed" +msgstr "Velocidade da ventoinha" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed description" +msgid "The speed at which the print cooling fans spin." +msgstr "A velocidade a que as ventoinhas de arrefecimento da impressão giram." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min label" +msgid "Regular Fan Speed" +msgstr "Velocidade normal da ventoinha" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min description" +msgid "" +"The speed at which the fans spin before hitting the threshold. When a layer " +"prints faster than the threshold, the fan speed gradually inclines towards " +"the maximum fan speed." +msgstr "A velocidade a que as ventoinhas giram antes de atingir o limiar. Quando uma camada é impressa mais rapidamente do que o limiar, a velocidade da ventoinha tende gradualmente a aproximar-se da velocidade máxima." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max label" +msgid "Maximum Fan Speed" +msgstr "Velocidade máxima da ventoinha" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max description" +msgid "" +"The speed at which the fans spin on the minimum layer time. The fan speed " +"gradually increases between the regular fan speed and maximum fan speed when " +"the threshold is hit." +msgstr "A velocidade a que as ventoinhas giram no tempo mínimo de camada. A velocidade da ventoinha aumenta gradualmente entre a velocidade normal da ventoinha e a velocidade máxima da ventoinha quando o limiar é alcançado." + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max label" +msgid "Regular/Maximum Fan Speed Threshold" +msgstr "Limiar de velocidade normal/máxima da ventoinha" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max description" +msgid "" +"The layer time which sets the threshold between regular fan speed and " +"maximum fan speed. Layers that print slower than this time use regular fan " +"speed. For faster layers the fan speed gradually increases towards the " +"maximum fan speed." +msgstr "O tempo de camada que define o limiar entre a velocidade normal da ventoinha e a velocidade máxima da ventoinha. As camadas que são impressas mais lentamente utilizam a velocidade normal da ventoinha. Para camadas mais rápidas, a velocidade da ventoinha aumenta gradualmente até à velocidade máxima." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 label" +msgid "Initial Fan Speed" +msgstr "Velocidade inicial da ventoinha" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 description" +msgid "" +"The speed at which the fans spin at the start of the print. In subsequent " +"layers the fan speed is gradually increased up to the layer corresponding to " +"Regular Fan Speed at Height." +msgstr "A velocidade a que as ventoinhas giram ao iniciar a impressão. Nas camadas subsequentes, a velocidade da ventoinha aumenta gradualmente até à camada correspondente à Velocidade normal da ventoinha em altura." + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height label" +msgid "Regular Fan Speed at Height" +msgstr "Velocidade normal da ventoinha em altura" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height description" +msgid "" +"The height at which the fans spin on regular fan speed. At the layers below " +"the fan speed gradually increases from Initial Fan Speed to Regular Fan " +"Speed." +msgstr "A altura a que as ventoinhas giram à velocidade normal da ventoinha. Nas camadas inferiores, a velocidade da ventoinha aumenta gradualmente da Velocidade inicial da ventoinha para a Velocidade normal da ventoinha." + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer label" +msgid "Regular Fan Speed at Layer" +msgstr "Velocidade normal da ventoinha na camada" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer description" +msgid "" +"The layer at which the fans spin on regular fan speed. If regular fan speed " +"at height is set, this value is calculated and rounded to a whole number." +msgstr "A camada na qual as ventoinhas giram à velocidade normal da ventoinha. Se for definida a velocidade normal da ventoinha em altura, este valor é calculado e arredondado para um número inteiro." + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time label" +msgid "Minimum Layer Time" +msgstr "Tempo mínimo por camada" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time description" +msgid "" +"The minimum time spent in a layer. This forces the printer to slow down, to " +"at least spend the time set here in one layer. This allows the printed " +"material to cool down properly before printing the next layer. Layers may " +"still take shorter than the minimal layer time if Lift Head is disabled and " +"if the Minimum Speed would otherwise be violated." +msgstr "O tempo mínimo gasto numa camada. Isto força a impressora a abrandar para que, no mínimo, o tempo aqui definido seja gasto numa camada. Isto permite que o material impresso arrefeça devidamente antes de imprimir a camada seguinte. Ainda assim, as camadas podem demorar menos do que o tempo mínimo por camada se a opção Elevar cabeça estiver desativada e se a Velocidade mínima for desrespeitada." + +#: fdmprinter.def.json +msgctxt "cool_min_speed label" +msgid "Minimum Speed" +msgstr "Velocidade mínima" + +#: fdmprinter.def.json +msgctxt "cool_min_speed description" +msgid "" +"The minimum print speed, despite slowing down due to the minimum layer time. " +"When the printer would slow down too much, the pressure in the nozzle would " +"be too low and result in bad print quality." +msgstr "A velocidade mínima de impressão, apesar do abrandamento devido ao tempo mínimo por camada. Se a impressora abrandar demasiado, a pressão do bocal será demasiado baixa, o que resultará numa má qualidade de impressão." + +#: fdmprinter.def.json +msgctxt "cool_lift_head label" +msgid "Lift Head" +msgstr "Elevar cabeça" + +#: fdmprinter.def.json +msgctxt "cool_lift_head description" +msgid "" +"When the minimum speed is hit because of minimum layer time, lift the head " +"away from the print and wait the extra time until the minimum layer time is " +"reached." +msgstr "Quando a velocidade mínima for alcançada devido ao tempo mínimo por camada, eleve e afaste a cabeça da impressão e aguarde o tempo adicional até atingir o tempo mínimo por camada." + +#: fdmprinter.def.json +msgctxt "support label" +msgid "Support" +msgstr "Suporte" + +#: fdmprinter.def.json +msgctxt "support description" +msgid "Support" +msgstr "Suporte" + +#: fdmprinter.def.json +msgctxt "support_enable label" +msgid "Generate Support" +msgstr "Gerar suporte" + +#: fdmprinter.def.json +msgctxt "support_enable description" +msgid "" +"Generate structures to support parts of the model which have overhangs. " +"Without these structures, such parts would collapse during printing." +msgstr "Gera estruturas para suportar peças do modelo com saliências. Sem estas estruturas, essas peças desintegrar-se-iam durante a impressão." + +#: fdmprinter.def.json +msgctxt "support_extruder_nr label" +msgid "Support Extruder" +msgstr "Extrusora de suporte" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr description" +msgid "" +"The extruder train to use for printing the support. This is used in multi-" +"extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir o suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr label" +msgid "Support Infill Extruder" +msgstr "Extrusora de preenchimento do suporte" + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr description" +msgid "" +"The extruder train to use for printing the infill of the support. This is " +"used in multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir o preenchimento do suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 label" +msgid "First Layer Support Extruder" +msgstr "Extrusora de suporte da primeira camada" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 description" +msgid "" +"The extruder train to use for printing the first layer of support infill. " +"This is used in multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir a primeira camada de preenchimento do suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr label" +msgid "Support Interface Extruder" +msgstr "Extrusora de interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs and floors of the support. " +"This is used in multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir os tetos e pisos do suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr label" +msgid "Support Roof Extruder" +msgstr "Extrusora de teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs of the support. This is " +"used in multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir os tetos de suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr label" +msgid "Support Floor Extruder" +msgstr "Extrusora de piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_extruder_nr description" +msgid "" +"The extruder train to use for printing the floors of the support. This is " +"used in multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir os pisos de suporte. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "support_type label" +msgid "Support Placement" +msgstr "Colocação do suporte" + +#: fdmprinter.def.json +msgctxt "support_type description" +msgid "" +"Adjusts the placement of the support structures. The placement can be set to " +"touching build plate or everywhere. When set to everywhere the support " +"structures will also be printed on the model." +msgstr "Ajusta a colocação das estruturas de suporte. A colocação pode ser definida para tocar na placa de construção ou em todo o lado. Quando definida para tocar em todo o lado, as estruturas de suporte também serão impressas no modelo." + +#: fdmprinter.def.json +msgctxt "support_type option buildplate" +msgid "Touching Buildplate" +msgstr "Tocar na placa de construção" + +#: fdmprinter.def.json +msgctxt "support_type option everywhere" +msgid "Everywhere" +msgstr "Em todo o lado" + +#: fdmprinter.def.json +msgctxt "support_angle label" +msgid "Support Overhang Angle" +msgstr "Ângulo de saliência de suporte" + +#: fdmprinter.def.json +msgctxt "support_angle description" +msgid "" +"The minimum angle of overhangs for which support is added. At a value of 0° " +"all overhangs are supported, 90° will not provide any support." +msgstr "O ângulo mínimo de saliências ao qual é adicionado suporte. Com um valor de 0°, todas as saliências são suportadas e com um valor de 90° não será fornecido qualquer suporte." + +#: fdmprinter.def.json +msgctxt "support_pattern label" +msgid "Support Pattern" +msgstr "Padrão de suporte" + +#: fdmprinter.def.json +msgctxt "support_pattern description" +msgid "" +"The pattern of the support structures of the print. The different options " +"available result in sturdy or easy to remove support." +msgstr "O padrão das estruturas de suporte da impressão. As diferentes opções disponíveis resultam num suporte robusto ou de fácil remoção." + +#: fdmprinter.def.json +msgctxt "support_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "support_pattern option grid" +msgid "Grid" +msgstr "Grelha" + +#: fdmprinter.def.json +msgctxt "support_pattern option triangles" +msgid "Triangles" +msgstr "Triângulos" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Concêntrico 3D" + +#: fdmprinter.def.json +msgctxt "support_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "support_pattern option cross" +msgid "Cross" +msgstr "Cruz" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags label" +msgid "Connect Support ZigZags" +msgstr "Ligar ziguezagues de suporte" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags description" +msgid "" +"Connect the ZigZags. This will increase the strength of the zig zag support " +"structure." +msgstr "Liga os ziguezagues. Isto irá aumentar a resistência da estrutura de suporte em ziguezague." + +#: fdmprinter.def.json +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "Densidade do suporte" + +#: fdmprinter.def.json +msgctxt "support_infill_rate description" +msgid "" +"Adjusts the density of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "Ajusta a densidade da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." + +#: fdmprinter.def.json +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "Distância da linha de suporte" + +#: fdmprinter.def.json +msgctxt "support_line_distance description" +msgid "" +"Distance between the printed support structure lines. This setting is " +"calculated by the support density." +msgstr "A distância entre as linhas da estrutura de suporte impressas. Esta definição é calculada através da densidade do suporte." + +#: fdmprinter.def.json +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "Distância Z de suporte" + +#: fdmprinter.def.json +msgctxt "support_z_distance description" +msgid "" +"Distance from the top/bottom of the support structure to the print. This gap " +"provides clearance to remove the supports after the model is printed. This " +"value is rounded up to a multiple of the layer height." +msgstr "A distância entre a parte superior/inferior da estrutura de suporte e a impressão. Esta folga permite retirar os suportes depois de o modelo ser impresso. Este valor é arredondado para um múltiplo da altura da camada." + +#: fdmprinter.def.json +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "Distância superior do suporte" + +#: fdmprinter.def.json +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "A distância entre a parte superior do suporte e a impressão." + +#: fdmprinter.def.json +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "Distância inferior do suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "A distância entre a impressão e a parte inferior do suporte." + +#: fdmprinter.def.json +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "Distância X/Y do suporte" + +#: fdmprinter.def.json +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "A distância entre a estrutura de suporte e a impressão nas direções X/Y." + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "Prioridade da distância de suporte" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z description" +msgid "" +"Whether the Support X/Y Distance overrides the Support Z Distance or vice " +"versa. When X/Y overrides Z the X/Y distance can push away the support from " +"the model, influencing the actual Z distance to the overhang. We can disable " +"this by not applying the X/Y distance around overhangs." +msgstr "Se a Distância X/Y de suporte substitui a Distância Z de suporte ou vice-versa. Quando X/Y substitui Z, a distância X/Y pode afastar o suporte do modelo, influenciando a distância Z real relativamente às saliências. É possível desativar esta opção não aplicando a distância X/Y em torno das saliências." + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X/Y substitui Z" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z substitui X/Y" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "Distância X/Y mínima de suporte" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang description" +msgid "" +"Distance of the support structure from the overhang in the X/Y directions. " +msgstr "A distância da estrutura de suporte relativamente às saliências nas direções X/Y. " + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "Altura dos degraus de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height description" +msgid "" +"The height of the steps of the stair-like bottom of support resting on the " +"model. A low value makes the support harder to remove, but too high values " +"can lead to unstable support structures. Set to zero to turn off the stair-" +"like behaviour." +msgstr "A altura dos degraus da parte inferior semelhante a uma escada do suporte apoiado sobre o modelo. Um valor inferior dificulta a remoção do suporte, mas valores demasiado elevados podem resultar em estruturas de suporte instáveis. É definido como zero para desativar o comportamento semelhante a uma escada." + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width label" +msgid "Support Stair Step Maximum Width" +msgstr "Largura máxima dos degraus de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_width description" +msgid "" +"The maximum width of the steps of the stair-like bottom of support resting " +"on the model. A low value makes the support harder to remove, but too high " +"values can lead to unstable support structures." +msgstr "A largura máxima dos degraus da parte inferior semelhante a uma escada do suporte apoiado sobre o modelo. Um valor inferior dificulta a remoção do suporte, mas valores demasiado elevados podem resultar em estruturas de suporte instáveis." + +#: fdmprinter.def.json +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "Distância da junção do suporte" + +#: fdmprinter.def.json +msgctxt "support_join_distance description" +msgid "" +"The maximum distance between support structures in the X/Y directions. When " +"seperate structures are closer together than this value, the structures " +"merge into one." +msgstr "A distância máxima entre as estruturas de suporte nas direções X/Y. Quando as estruturas separadas estão mais próximas do que este valor, as estruturas fundem-se numa só." + +#: fdmprinter.def.json +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "Expansão horizontal de suporte" + +#: fdmprinter.def.json +msgctxt "support_offset description" +msgid "" +"Amount of offset applied to all support polygons in each layer. Positive " +"values can smooth out the support areas and result in more sturdy support." +msgstr "Quantidade de desvio aplicado a todos os polígonos de suporte em cada camada. Os valores positivos podem uniformizar as áreas de suporte e produzir suportes mais robustos." + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness label" +msgid "Support Infill Layer Thickness" +msgstr "Espessura da camada de preenchimento de suporte" + +#: fdmprinter.def.json +msgctxt "support_infill_sparse_thickness description" +msgid "" +"The thickness per layer of support infill material. This value should always " +"be a multiple of the layer height and is otherwise rounded." +msgstr "A espessura por camada de material de preenchimento de suporte. Este valor deve sempre ser um múltiplo da altura da camada. Caso contrário, será arredondado." + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps label" +msgid "Gradual Support Infill Steps" +msgstr "Passos de preenchimento gradual de suporte" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_steps description" +msgid "" +"Number of times to reduce the support infill density by half when getting " +"further below top surfaces. Areas which are closer to top surfaces get a " +"higher density, up to the Support Infill Density." +msgstr "O número de vezes que a densidade de preenchimento do suporte deve ser reduzida para metade ao alcançar superfícies superiores mais abaixo. As áreas que se encontram mais próximas das superfícies superiores obtêm uma maior densidade, até ao limite da Densidade de preenchimento do suporte." + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height label" +msgid "Gradual Support Infill Step Height" +msgstr "Altura do passo de preenchimento gradual de suporte" + +#: fdmprinter.def.json +msgctxt "gradual_support_infill_step_height description" +msgid "" +"The height of support infill of a given density before switching to half the " +"density." +msgstr "A altura do preenchimento de suporte de uma determinada densidade antes de mudar para metade da densidade." + +#: fdmprinter.def.json +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "Ativar interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_enable description" +msgid "" +"Generate a dense interface between the model and the support. This will " +"create a skin at the top of the support on which the model is printed and at " +"the bottom of the support, where it rests on the model." +msgstr "Gera uma interface densa entre o modelo e o suporte. Isto irá criar um revestimento na parte superior do suporte, onde o modelo é impresso, e na parte inferior do suporte, onde este é apoiado sobre o modelo." + +#: fdmprinter.def.json +msgctxt "support_roof_enable label" +msgid "Enable Support Roof" +msgstr "Ativar teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_enable description" +msgid "" +"Generate a dense slab of material between the top of support and the model. " +"This will create a skin between the model and support." +msgstr "Gera uma placa densa de material entre a parte superior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." + +#: fdmprinter.def.json +msgctxt "support_bottom_enable label" +msgid "Enable Support Floor" +msgstr "Ativar piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_enable description" +msgid "" +"Generate a dense slab of material between the bottom of the support and the " +"model. This will create a skin between the model and support." +msgstr "Gera uma placa densa de material entre a parte inferior do suporte e o modelo. Isto irá criar um revestimento entre o modelo e o suporte." + +#: fdmprinter.def.json +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "Espessura da interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_height description" +msgid "" +"The thickness of the interface of the support where it touches with the " +"model on the bottom or the top." +msgstr "A espessura da interface de suporte onde esta entra em contacto com o modelo na parte inferior ou superior." + +#: fdmprinter.def.json +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "Espessura do teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_height description" +msgid "" +"The thickness of the support roofs. This controls the amount of dense layers " +"at the top of the support on which the model rests." +msgstr "A espessura dos tetos de suporte. Isto controla a quantidade de camadas densas na parte superior do suporte na qual o modelo é apoiado." + +#: fdmprinter.def.json +msgctxt "support_bottom_height label" +msgid "Support Floor Thickness" +msgstr "Espessura do piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_height description" +msgid "" +"The thickness of the support floors. This controls the number of dense " +"layers that are printed on top of places of a model on which support rests." +msgstr "A espessura dos pisos de suporte. Isto controla o número de camadas densas que são impressas por cima de locais de um modelo no qual o suporte é apoiado." + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "Resolução da interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height description" +msgid "" +"When checking where there's model above and below the support, take steps of " +"the given height. Lower values will slice slower, while higher values may " +"cause normal support to be printed in some places where there should have " +"been support interface." +msgstr "Ao verificar os locais onde existe modelo por cima e por baixo do suporte, tome as medidas necessárias de acordo com a altura determinada. Os valores mais reduzidos irão segmentar mais lentamente, enquanto os valores mais elevados podem fazer com que o suporte normal seja impresso em alguns locais onde deveria existir uma interface de suporte." + +#: fdmprinter.def.json +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "Densidade da interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_density description" +msgid "" +"Adjusts the density of the roofs and floors of the support structure. A " +"higher value results in better overhangs, but the supports are harder to " +"remove." +msgstr "Ajusta a densidade dos tetos e pisos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." + +#: fdmprinter.def.json +msgctxt "support_roof_density label" +msgid "Support Roof Density" +msgstr "Densidade do teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_density description" +msgid "" +"The density of the roofs of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "A densidade dos tetos da estrutura de suporte. Um valor mais elevado resulta em melhores saliências, embora os suportes sejam mais difíceis de remover." + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance label" +msgid "Support Roof Line Distance" +msgstr "Distância da linha do teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_line_distance description" +msgid "" +"Distance between the printed support roof lines. This setting is calculated " +"by the Support Roof Density, but can be adjusted separately." +msgstr "A distância entre as linhas do teto de suporte impressas. Esta definição é calculada através da Densidade do teto de suporte, mas pode ser ajustada em separado." + +#: fdmprinter.def.json +msgctxt "support_bottom_density label" +msgid "Support Floor Density" +msgstr "Densidade do piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_density description" +msgid "" +"The density of the floors of the support structure. A higher value results " +"in better adhesion of the support on top of the model." +msgstr "A densidade dos pisos da estrutura de suporte. Um valor mais elevado resulta numa melhor aderência do suporte na parte superior do modelo." + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance label" +msgid "Support Floor Line Distance" +msgstr "Distância da linha do piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_line_distance description" +msgid "" +"Distance between the printed support floor lines. This setting is calculated " +"by the Support Floor Density, but can be adjusted separately." +msgstr "A distância entre as linhas do piso de suporte impressas. Esta definição é calculada através da Densidade do piso de suporte, mas pode ser ajustada em separado." + +#: fdmprinter.def.json +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "Padrão da interface de suporte" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern description" +msgid "" +"The pattern with which the interface of the support with the model is " +"printed." +msgstr "O padrão com o qual a interface de suporte do modelo é impressa." + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "Grelha" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "Triângulos" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Concêntrico 3D" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern label" +msgid "Support Roof Pattern" +msgstr "Padrão do teto de suporte" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern description" +msgid "The pattern with which the roofs of the support are printed." +msgstr "O padrão com que os tetos do suporte são impressos." + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option grid" +msgid "Grid" +msgstr "Grelha" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option triangles" +msgid "Triangles" +msgstr "Triângulos" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Concêntrico 3D" + +#: fdmprinter.def.json +msgctxt "support_roof_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern label" +msgid "Support Floor Pattern" +msgstr "Padrão do piso de suporte" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern description" +msgid "The pattern with which the floors of the support are printed." +msgstr "O padrão com que os pisos do suporte são impressos." + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option lines" +msgid "Lines" +msgstr "Linhas" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option grid" +msgid "Grid" +msgstr "Grelha" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option triangles" +msgid "Triangles" +msgstr "Triângulos" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric" +msgid "Concentric" +msgstr "Concêntrico" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Concêntrico 3D" + +#: fdmprinter.def.json +msgctxt "support_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "Ziguezague" + +#: fdmprinter.def.json +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "Utilizar torres" + +#: fdmprinter.def.json +msgctxt "support_use_towers description" +msgid "" +"Use specialized towers to support tiny overhang areas. These towers have a " +"larger diameter than the region they support. Near the overhang the towers' " +"diameter decreases, forming a roof." +msgstr "Utiliza torres especializadas para suportar pequenas áreas de saliências. Estas torres têm um diâmetro maior do que a região que suportam. Junto às saliências, o diâmetro das torres diminui, formando um teto." + +#: fdmprinter.def.json +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "Diâmetro da torre" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "O diâmetro de uma torre especial." + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "Diâmetro mínimo" + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter description" +msgid "" +"Minimum diameter in the X/Y directions of a small area which is to be " +"supported by a specialized support tower." +msgstr "O diâmetro mínimo nas direções X/Y de uma pequena área que deverá ser suportada por uma torre de suporte especializada." + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "Ângulo do teto da torre" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle description" +msgid "" +"The angle of a rooftop of a tower. A higher value results in pointed tower " +"roofs, a lower value results in flattened tower roofs." +msgstr "O ângulo do topo de uma torre. Um valor mais elevado resulta em tetos de torre pontiagudos, enquanto um valor mais reduzido resulta em tetos de torre achatados." + +#: fdmprinter.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Aderência à placa de construção" + +#: fdmprinter.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "Aderência" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable label" +msgid "Enable Prime Blob" +msgstr "Ativar blob de preparação" + +#: fdmprinter.def.json +msgctxt "prime_blob_enable description" +msgid "" +"Whether to prime the filament with a blob before printing. Turning this " +"setting on will ensure that the extruder will have material ready at the " +"nozzle before printing. Printing Brim or Skirt can act like priming too, in " +"which case turning this setting off saves some time." +msgstr "Preparar ou não o filamento com um blob antes da impressão. Ativar esta definição irá assegurar que a extrusora terá material pronto no bocal antes da impressão. A opção Imprimir borda ou contorno também pode atuar como purga, caso esse em que desativar esta definição permite ganhar algum tempo." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "Posição X de preparação da extrusora" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada X da posição de preparação do bocal ao iniciar a impressão." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Posição Y de preparação da extrusora" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "A coordenada Y da posição de preparação do bocal ao iniciar a impressão." + +#: fdmprinter.def.json +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "Tipo de aderência à placa de construção" + +#: fdmprinter.def.json +msgctxt "adhesion_type description" +msgid "" +"Different options that help to improve both priming your extrusion and " +"adhesion to the build plate. Brim adds a single layer flat area around the " +"base of your model to prevent warping. Raft adds a thick grid with a roof " +"below the model. Skirt is a line printed around the model, but not connected " +"to the model." +msgstr "Diferentes opções que ajudam a melhorar a purga da extrusão e a aderência à placa de construção. A borda acrescenta uma área plana de camada única em torno da base do modelo para evitar a deformação. A base reticular acrescenta uma grelha espessa com um teto por baixo do modelo. O contorno é uma linha impressa à volta do modelo, mas que não está ligada ao modelo." + +#: fdmprinter.def.json +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr "Contorno" + +#: fdmprinter.def.json +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "Borda" + +#: fdmprinter.def.json +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "Base reticular" + +#: fdmprinter.def.json +msgctxt "adhesion_type option none" +msgid "None" +msgstr "Nenhum" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "Extrusora de aderência à placa de construção" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr description" +msgid "" +"The extruder train to use for printing the skirt/brim/raft. This is used in " +"multi-extrusion." +msgstr "A máquina de extrusão a ser utilizada para imprimir o contorno/a borda/a base reticular. Esta é utilizada em extrusões múltiplas." + +#: fdmprinter.def.json +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "Contagem de linhas de contorno" + +#: fdmprinter.def.json +msgctxt "skirt_line_count description" +msgid "" +"Multiple skirt lines help to prime your extrusion better for small models. " +"Setting this to 0 will disable the skirt." +msgstr "Linhas de contorno múltiplas ajudam a preparar melhor a extrusão para modelos pequenos. Definir a contagem como 0 irá desativar o contorno." + +#: fdmprinter.def.json +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "Distância do contorno" + +#: fdmprinter.def.json +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance. Multiple skirt lines will extend outwards from " +"this distance." +msgstr "A distância horizontal entre o contorno e a primeira camada da impressão.\nEsta é a distância mínima. Linhas de contorno múltiplas irão estender-se para fora desta distância." + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "Comprimento mínimo do contorno/da borda" + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length description" +msgid "" +"The minimum length of the skirt or brim. If this length is not reached by " +"all skirt or brim lines together, more skirt or brim lines will be added " +"until the minimum length is reached. Note: If the line count is set to 0 " +"this is ignored." +msgstr "O comprimento mínimo do contorno ou da borda. Se este comprimento não for alcançado em conjunto por todas as linhas de contorno ou borda, serão acrescentadas mais linhas de contorno ou borda até o comprimento mínimo ser alcançado. Nota: Se a contagem de linhas for definida como 0, isto é ignorado." + +#: fdmprinter.def.json +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "Largura da borda" + +#: fdmprinter.def.json +msgctxt "brim_width description" +msgid "" +"The distance from the model to the outermost brim line. A larger brim " +"enhances adhesion to the build plate, but also reduces the effective print " +"area." +msgstr "A distância do modelo à linha de borda mais exterior. Uma borda mais larga melhora a aderência à placa de construção, mas também reduz a área de impressão efetiva." + +#: fdmprinter.def.json +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "Contagem de linhas de borda" + +#: fdmprinter.def.json +msgctxt "brim_line_count description" +msgid "" +"The number of lines used for a brim. More brim lines enhance adhesion to the " +"build plate, but also reduces the effective print area." +msgstr "O número de linhas utilizado para uma borda. Uma maior quantidade de linhas de borda melhora a aderência à placa de construção, mas também reduz a área de impressão efetiva." + +#: fdmprinter.def.json +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "Borda apenas no exterior" + +#: fdmprinter.def.json +msgctxt "brim_outside_only description" +msgid "" +"Only print the brim on the outside of the model. This reduces the amount of " +"brim you need to remove afterwards, while it doesn't reduce the bed adhesion " +"that much." +msgstr "Imprime apenas a borda no exterior do modelo. Isto reduz a quantidade de bordas a remover posteriormente, mas não reduz tanto a aderência à base." + +#: fdmprinter.def.json +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "Margem adicional da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_margin description" +msgid "" +"If the raft is enabled, this is the extra raft area around the model which " +"is also given a raft. Increasing this margin will create a stronger raft " +"while using more material and leaving less area for your print." +msgstr "Se a base reticular for ativada, esta será a área de base reticular adicional em torno do modelo, a qual também receberá uma base reticular. Aumentar esta margem irá criar uma base reticular mais sólida, ao mesmo tempo que irá utilizar mais material e deixar menos área para a impressão." + +#: fdmprinter.def.json +msgctxt "raft_smoothing label" +msgid "Raft Smoothing" +msgstr "Suavização da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_smoothing description" +msgid "" +"This setting controls how much inner corners in the raft outline are " +"rounded. Inward corners are rounded to a semi circle with a radius equal to " +"the value given here. This setting also removes holes in the raft outline " +"which are smaller than such a circle." +msgstr "Esta definição controla o nível de arredondamento dos cantos internos no contorno da base reticular. Os cantos internos são arredondados para um semicírculo com um raio igual ao valor aqui fornecido. Esta definição também remove os orifícios no contorno da base reticular que sejam inferiores a esse semicírculo." + +#: fdmprinter.def.json +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "Folga de ar da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_airgap description" +msgid "" +"The gap between the final raft layer and the first layer of the model. Only " +"the first layer is raised by this amount to lower the bonding between the " +"raft layer and the model. Makes it easier to peel off the raft." +msgstr "A folga entre a camada da base reticular final e a primeira camada do modelo. Apenas a primeira camada é elevada de acordo com este valor para diminuir a ligação entre a camada da base reticular e o modelo. Isto facilita a remoção da base reticular." + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Sobreposição Z da camada inicial" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the model overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "Sobrepõe a primeira e a segunda camadas do modelo na direção Z para compensar o filamento perdido na folga de ar. Todos os modelos acima da primeira camada do modelo serão deslocados para baixo neste valor." + +#: fdmprinter.def.json +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "Camadas superiores da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers description" +msgid "" +"The number of top layers on top of the 2nd raft layer. These are fully " +"filled layers that the model sits on. 2 layers result in a smoother top " +"surface than 1." +msgstr "O número de camadas superiores na parte superior da 2.ª camada da base reticular. Estas são camadas totalmente preenchidas onde o modelo é apoiado. Duas camadas resultam numa superfície superior mais uniforme do que uma." + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "Espessura das camada superiores da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "A espessura das camadas superiores da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "Largura das linhas superiores da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width description" +msgid "" +"Width of the lines in the top surface of the raft. These can be thin lines " +"so that the top of the raft becomes smooth." +msgstr "A largura das linhas na superfície superior da base reticular. Estas podem ser linhas finas para que a parte superior da base reticular fique uniforme." + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "Espaçamento superior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing description" +msgid "" +"The distance between the raft lines for the top raft layers. The spacing " +"should be equal to the line width, so that the surface is solid." +msgstr "A distância entre as linhas da base reticular para as camadas superiores da base reticular. O espaçamento deve ser igual à largura da linha, para que a superfície seja sólida." + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "Espessura média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "A espessura da camada média da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "Largura da linha média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width description" +msgid "" +"Width of the lines in the middle raft layer. Making the second layer extrude " +"more causes the lines to stick to the build plate." +msgstr "A largura das linhas na camada média da base reticular. Extrudir mais a segunda camada provoca a aderência das linhas à placa de construção." + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "Espaçamento médio da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing description" +msgid "" +"The distance between the raft lines for the middle raft layer. The spacing " +"of the middle should be quite wide, while being dense enough to support the " +"top raft layers." +msgstr "A distância entre as linhas da base reticular para a camada média da base reticular. O espaçamento médio deve ser bastante amplo, mas suficientemente denso para suportar as camadas superiores da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "Espessura inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness description" +msgid "" +"Layer thickness of the base raft layer. This should be a thick layer which " +"sticks firmly to the printer build plate." +msgstr "A espessura da camada inferior da base reticular. Esta deve ser uma camada espessa que adira firmemente à placa de construção da impressora." + +#: fdmprinter.def.json +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "Largura da linha inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width description" +msgid "" +"Width of the lines in the base raft layer. These should be thick lines to " +"assist in build plate adhesion." +msgstr "A largura das linhas na camada inferior da base reticular. Estas devem ser linhas espessas para auxiliar na aderência à placa de construção." + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "Espaçamento da linha da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing description" +msgid "" +"The distance between the raft lines for the base raft layer. Wide spacing " +"makes for easy removal of the raft from the build plate." +msgstr "A distância entre as linhas da base reticular para a camada inferior da base reticular. Um espaçamento amplo facilita a remoção da base reticular da placa de construção." + +#: fdmprinter.def.json +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "Velocidade de impressão da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "A velocidade a que a base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "Velocidade de impressão superior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed description" +msgid "" +"The speed at which the top raft layers are printed. These should be printed " +"a bit slower, so that the nozzle can slowly smooth out adjacent surface " +"lines." +msgstr "A velocidade a que as camadas superiores da base reticular são impressas. Estas devem ser impressas um pouco mais devagar, para que o bocal possa uniformizar lentamente as linhas das superfícies adjacentes." + +#: fdmprinter.def.json +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "Velocidade de impressão média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed description" +msgid "" +"The speed at which the middle raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "A velocidade a que a camada média da base reticular é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que advém do bocal é bastante elevado." + +#: fdmprinter.def.json +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "Velocidade de impressão inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_speed description" +msgid "" +"The speed at which the base raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "A velocidade a que a camada inferior da base reticular é impressa. Esta deve ser impressa bastante devagar, uma vez que o volume de material que advém do bocal é bastante elevado." + +#: fdmprinter.def.json +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "Aceleração de impressão da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "A aceleração com que a base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "Aceleração de impressão superior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "A aceleração com que as camadas superiores da base reticular são impressas." + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "Aceleração de impressão média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "A aceleração com que a camada média da base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "Aceleração de impressão inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "A aceleração com que a camada inferior da base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "Solavanco de impressão da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "O solavanco com que a base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "Solavanco de impressão superior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "O solavanco com que as camadas superiores da base reticular são impressas." + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "Solavanco de impressão média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "O solavanco com que a camada média da base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "Solavanco de impressão inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "O solavanco com que a camada inferior da base reticular é impressa." + +#: fdmprinter.def.json +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "Velocidade da ventoinha da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "A velocidade da ventoinha da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "Velocidade da ventoinha superior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "A velocidade da ventoinha das camadas superiores da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "Velocidade da ventoinha média da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "A velocidade da ventoinha da camada média da base reticular." + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "Velocidade da ventoinha inferior da base reticular" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "A velocidade da ventoinha da camada inferior da base reticular." + +#: fdmprinter.def.json +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "Extrusão dupla" + +#: fdmprinter.def.json +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "Definições utilizadas para imprimir com várias extrusoras." + +#: fdmprinter.def.json +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "Ativar torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable description" +msgid "" +"Print a tower next to the print which serves to prime the material after " +"each nozzle switch." +msgstr "Imprime uma torre próxima da impressão que prepara o material depois de cada substituição do bocal." + +#: fdmprinter.def.json +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "Tamanho da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "A largura da torre de preparação." + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "Volume mínimo da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume description" +msgid "" +"The minimum volume for each layer of the prime tower in order to purge " +"enough material." +msgstr "O volume mínimo para cada camada da torre de preparação para preparar material suficiente." + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "Espessura da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness description" +msgid "" +"The thickness of the hollow prime tower. A thickness larger than half the " +"Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "A espessura da torre de preparação oca. Uma espessura superior a metade do Volume mínimo da torre de preparação irá resultar numa torre de preparação densa." + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "Posição X da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "A coordenada X da posição da torre de preparação." + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "Posição Y da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "A coordenada Y da posição da torre de preparação." + +#: fdmprinter.def.json +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "Fluxo da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor." + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "Limpar bocal inativo na torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled description" +msgid "" +"After printing the prime tower with one nozzle, wipe the oozed material from " +"the other nozzle off on the prime tower." +msgstr "Após a impressão da torre de preparação com um bocal, limpe o material que vazou do bocal para a torre de preparação." + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "Limpar bocal após substituição" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe description" +msgid "" +"After switching extruder, wipe the oozed material off of the nozzle on the " +"first thing printed. This performs a safe slow wipe move at a place where " +"the oozed material causes least harm to the surface quality of your print." +msgstr "Após a substituição da extrusora, limpe o material que vazou do bocal para a primeira peça impressa. Isto executa um movimento lento de limpeza segura num local onde o material vazado seja menos prejudicial para a qualidade da superfície da sua impressão." + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume label" +msgid "Prime Tower Purge Volume" +msgstr "Volume de purga da torre de preparação" + +#: fdmprinter.def.json +msgctxt "prime_tower_purge_volume description" +msgid "" +"Amount of filament to be purged when wiping on the prime tower. Purging is " +"useful for compensating the filament lost by oozing during inactivity of the " +"nozzle." +msgstr "Quantidade de filamento a ser purgado ao limpar a torre de preparação. A purga é útil para compensar o filamento perdido por vazamento durante a inatividade do bocal." + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "Ativar proteção contra vazamentos" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled description" +msgid "" +"Enable exterior ooze shield. This will create a shell around the model which " +"is likely to wipe a second nozzle if it's at the same height as the first " +"nozzle." +msgstr "Ativa a proteção exterior contra vazamentos. Isto irá criar uma cobertura em torno do modelo que deverá limpar um segundo bocal, caso este se encontre à mesma altura que o primeiro bocal." + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "Ângulo da proteção contra vazamentos" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle description" +msgid "" +"The maximum angle a part in the ooze shield will have. With 0 degrees being " +"vertical, and 90 degrees being horizontal. A smaller angle leads to less " +"failed ooze shields, but more material." +msgstr "O ângulo máximo que uma peça da proteção contra vazamentos poderá ter. 0 graus é vertical e 90 graus é horizontal. Um ângulo menor resulta em menos falhas na proteção contra vazamentos, mas mais material." + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr "Distância da proteção contra vazamentos" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "A distância da proteção contra vazamentos relativamente à impressão nas direções X/Y." + +#: fdmprinter.def.json +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "Correção de malhas" + +#: fdmprinter.def.json +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "correção_categorias" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "União de volumes sobrepostos" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all description" +msgid "" +"Ignore the internal geometry arising from overlapping volumes within a mesh " +"and print the volumes as one. This may cause unintended internal cavities to " +"disappear." +msgstr "Ignora a geometria interna provocada pela sobreposição de volumes numa malha e imprime os volumes como um só. Pode provocar o desaparecimento de cavidades internas indesejadas." + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "Remover todos os orifícios" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes description" +msgid "" +"Remove the holes in each layer and keep only the outside shape. This will " +"ignore any invisible internal geometry. However, it also ignores layer holes " +"which can be viewed from above or below." +msgstr "Remove os orifícios em cada camada e mantém apenas a forma exterior. Isto irá ignorar qualquer geometria interna invisível. No entanto, também ignora orifícios de camadas que podem ser vistos por cima ou por baixo." + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "Costura extensiva" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching description" +msgid "" +"Extensive stitching tries to stitch up open holes in the mesh by closing the " +"hole with touching polygons. This option can introduce a lot of processing " +"time." +msgstr "A costura extensiva tenta coser orifícios abertos na malha, ao fechá-los com os polígonos em contacto. Esta opção pode acrescentar bastante tempo de processamento." + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "Manter faces desconectadas" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons description" +msgid "" +"Normally Cura tries to stitch up small holes in the mesh and remove parts of " +"a layer with big holes. Enabling this option keeps those parts which cannot " +"be stitched. This option should be used as a last resort option when " +"everything else fails to produce proper GCode." +msgstr "Geralmente, o Cura tenta coser orifícios pequenos na malha e remover as peças de uma camada com orifícios grandes. Ativar esta opção conserva as peças que não podem ser cosidas. Esta opção deve ser utilizada como último recurso quando tudo o resto não produz um GCode adequado." + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution label" +msgid "Maximum Resolution" +msgstr "Resolução máxima" + +#: fdmprinter.def.json +msgctxt "meshfix_maximum_resolution description" +msgid "" +"The minimum size of a line segment after slicing. If you increase this, the " +"mesh will have a lower resolution. This may allow the printer to keep up " +"with the speed it has to process g-code and will increase slice speed by " +"removing details of the mesh that it can't process anyway." +msgstr "O tamanho mínimo de um segmento de linha após a segmentação. Se aumentar este tamanho, a malha terá uma resolução inferior. Isto poderá permitir que a impressora mantenha a velocidade existente para processar o g-code e irá aumentar a velocidade de segmentação ao remover os detalhes da malha que não podem ser processados." + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "Sobreposição de malhas fundidas" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap description" +msgid "" +"Make meshes which are touching each other overlap a bit. This makes them " +"bond together better." +msgstr "Faz com que as malhas em contacto se sobreponham ligeiramente. Isto melhora a sua ligação." + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "Remover interceção de malhas" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes description" +msgid "" +"Remove areas where multiple meshes are overlapping with each other. This may " +"be used if merged dual material objects overlap with each other." +msgstr "Remove as áreas onde várias malhas se sobrepõem entre si. Isto pode ser utilizado se houver sobreposição de objetos de material duplo fundido." + +#: fdmprinter.def.json +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "Alternar remoção de malha" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order description" +msgid "" +"Switch to which mesh intersecting volumes will belong with every layer, so " +"that the overlapping meshes become interwoven. Turning this setting off will " +"cause one of the meshes to obtain all of the volume in the overlap, while it " +"is removed from the other meshes." +msgstr "Altera para os volumes de interceção de malha que pertencerão a cada camada, para que as malhas sobrepostas fiquem entrelaçadas. Desativar esta definição poderá fazer com que uma das malhas obtenha todo o volume na sobreposição, sendo removido das outras malhas." + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers label" +msgid "Remove Empty First Layers" +msgstr "Remover primeiras camadas vazias" + +#: fdmprinter.def.json +msgctxt "remove_empty_first_layers description" +msgid "" +"Remove empty layers beneath the first printed layer if they are present. " +"Disabling this setting can cause empty first layers if the Slicing Tolerance " +"setting is set to Exclusive or Middle." +msgstr "Remove as camadas vazias por baixo da primeira camada impressa, se existirem. Desativar esta definição pode causar primeiras camadas vazias, se a definição Tolerância de segmentação estiver definida como Exclusivo ou Centro." + +#: fdmprinter.def.json +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "Modos especiais" + +#: fdmprinter.def.json +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "categoria_blackmagic" + +#: fdmprinter.def.json +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "Sequência de impressão" + +#: fdmprinter.def.json +msgctxt "print_sequence description" +msgid "" +"Whether to print all models one layer at a time or to wait for one model to " +"finish, before moving on to the next. One at a time mode is only possible if " +"all models are separated in such a way that the whole print head can move in " +"between and all models are lower than the distance between the nozzle and " +"the X/Y axes." +msgstr "Imprime todos os modelos uma camada de cada vez ou aguarda pela conclusão de um modelo antes de avançar para o seguinte. O modo Individualmente apenas é possível se todos os modelos estiverem separados de tal forma que toda a cabeça de impressão possa mover-se entre eles e todos os modelos estejam abaixo da distância entre o bocal e os eixos X/Y." + +#: fdmprinter.def.json +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "Simultaneamente" + +#: fdmprinter.def.json +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "Individualmente" + +#: fdmprinter.def.json +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "Malha de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_mesh description" +msgid "" +"Use this mesh to modify the infill of other meshes with which it overlaps. " +"Replaces infill regions of other meshes with regions for this mesh. It's " +"suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "Utilize esta malha para modificar o preenchimento de outras malhas com as quais se sobrepõe. Substitui as regiões de preenchimento de outras malhas por regiões para esta malha. É recomendável imprimir apenas uma parede sem revestimento superior/inferior para esta malha." + +#: fdmprinter.def.json +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "Ordem de malhas de preenchimento" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order description" +msgid "" +"Determines which infill mesh is inside the infill of another infill mesh. An " +"infill mesh with a higher order will modify the infill of infill meshes with " +"lower order and normal meshes." +msgstr "Determina qual a malha de preenchimento que se encontra no interior do preenchimento de outra malha de preenchimento. Uma malha de preenchimento de ordem superior irá modificar o preenchimento das malhas de preenchimento de ordem inferior e das malhas normais." + +#: fdmprinter.def.json +msgctxt "cutting_mesh label" +msgid "Cutting Mesh" +msgstr "Malha de corte" + +#: fdmprinter.def.json +msgctxt "cutting_mesh description" +msgid "" +"Limit the volume of this mesh to within other meshes. You can use this to " +"make certain areas of one mesh print with different settings and with a " +"whole different extruder." +msgstr "Limita o volume desta malha para o interior de outras malhas. Pode utilizar esta opção para fazer com que determinadas áreas de uma malha sejam impressas com diferentes definições e com uma extrusora distinta." + +#: fdmprinter.def.json +msgctxt "mold_enabled label" +msgid "Mold" +msgstr "Molde" + +#: fdmprinter.def.json +msgctxt "mold_enabled description" +msgid "" +"Print models as a mold, which can be cast in order to get a model which " +"resembles the models on the build plate." +msgstr "Imprime modelos como moldes, os quais podem ser fundidos de forma a obter um modelo que se assemelhe aos modelos da placa de construção." + +#: fdmprinter.def.json +msgctxt "mold_width label" +msgid "Minimal Mold Width" +msgstr "Largura mínima do molde" + +#: fdmprinter.def.json +msgctxt "mold_width description" +msgid "" +"The minimal distance between the ouside of the mold and the outside of the " +"model." +msgstr "A distância mínima entre o exterior do molde e o exterior do modelo." + +#: fdmprinter.def.json +msgctxt "mold_roof_height label" +msgid "Mold Roof Height" +msgstr "Altura do teto do molde" + +#: fdmprinter.def.json +msgctxt "mold_roof_height description" +msgid "The height above horizontal parts in your model which to print mold." +msgstr "A altura acima das partes horizontais do modelo em que deve imprimir o molde." + +#: fdmprinter.def.json +msgctxt "mold_angle label" +msgid "Mold Angle" +msgstr "Ângulo do molde" + +#: fdmprinter.def.json +msgctxt "mold_angle description" +msgid "" +"The angle of overhang of the outer walls created for the mold. 0° will make " +"the outer shell of the mold vertical, while 90° will make the outside of the " +"model follow the contour of the model." +msgstr "O ângulo da saliência das paredes exteriores criadas para o molde. 0° irá tornar a cobertura exterior do molde vertical, enquanto 90° fará com que o exterior do modelo siga o contorno do mesmo." + +#: fdmprinter.def.json +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "Malha de suporte" + +#: fdmprinter.def.json +msgctxt "support_mesh description" +msgid "" +"Use this mesh to specify support areas. This can be used to generate support " +"structure." +msgstr "Utilize esta malha para especificar áreas de suporte. Esta opção pode ser utilizada para gerar estruturas de suporte." + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down label" +msgid "Drop Down Support Mesh" +msgstr "Malha de suporte pendente" + +#: fdmprinter.def.json +msgctxt "support_mesh_drop_down description" +msgid "" +"Make support everywhere below the support mesh, so that there's no overhang " +"in the support mesh." +msgstr "Cria suporte em qualquer local abaixo da malha de suporte, para que não existam saliências na malha de suporte." + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "Malha antissaliências" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh description" +msgid "" +"Use this mesh to specify where no part of the model should be detected as " +"overhang. This can be used to remove unwanted support structure." +msgstr "Utilize esta malha para especificar a parte do modelo que não deve ser detetada como saliência. Esta opção pode ser utilizada para remover estruturas de suporte indesejadas." + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "Modo de superfície" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode description" +msgid "" +"Treat the model as a surface only, a volume, or volumes with loose surfaces. " +"The normal print mode only prints enclosed volumes. \"Surface\" prints a " +"single wall tracing the mesh surface with no infill and no top/bottom skin. " +"\"Both\" prints enclosed volumes like normal and any remaining polygons as " +"surfaces." +msgstr "Trata o modelo apenas como superfície, volume ou volumes com superfícies soltas. O modo de impressão normal imprime apenas volumes delimitados. O modo \"Superfície\" imprime uma única parede que acompanha a superfície da malha sem preenchimento ou revestimento superior/inferior. O modo \"Ambos\" imprime volumes delimitados normalmente e quaisquer polígonos restantes como superfícies." + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "Normal" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "Superfície" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "Ambos" + +#: fdmprinter.def.json +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "Contorno externo em espiral" + +#: fdmprinter.def.json +msgctxt "magic_spiralize description" +msgid "" +"Spiralize smooths out the Z move of the outer edge. This will create a " +"steady Z increase over the whole print. This feature turns a solid model " +"into a single walled print with a solid bottom. This feature should only be " +"enabled when each layer only contains a single part." +msgstr "Esta opção uniformiza o movimento Z da extremidade exterior. Isto irá criar um aumento Z constante em toda a impressão. Esta funcionalidade torna um modelo sólido numa única impressão de parede com um fundo sólido. Esta funcionalidade só deve ser ativada quando cada camada contiver apenas uma única peça." + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours label" +msgid "Smooth Spiralized Contours" +msgstr "Suavizar contornos em espiral" + +#: fdmprinter.def.json +msgctxt "smooth_spiralized_contours description" +msgid "" +"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-" +"seam should be barely visible on the print but will still be visible in the " +"layer view). Note that smoothing will tend to blur fine surface details." +msgstr "Suaviza os contornos em espiral para reduzir a visibilidade da costura Z (a costura Z deve ser praticamente impercetível na impressão, mas continuará a ser visível na visualização da camada). Observe que a suavização tenderá a desfocar pequenos detalhes na superfície." + +#: fdmprinter.def.json +msgctxt "relative_extrusion label" +msgid "Relative Extrusion" +msgstr "Extrusão relativa" + +#: fdmprinter.def.json +msgctxt "relative_extrusion description" +msgid "" +"Use relative extrusion rather than absolute extrusion. Using relative E-" +"steps makes for easier post-processing of the Gcode. However, it's not " +"supported by all printers and it may produce very slight deviations in the " +"amount of deposited material compared to absolute E-steps. Irrespective of " +"this setting, the extrusion mode will always be set to absolute before any " +"Gcode script is output." +msgstr "Utilize a extrusão relativa em vez da extrusão absoluta. A utilização de passos E relativos facilita o pós-processamento do Gcode. Contudo, isto não é compatível com todas as impressoras e poderá produzir ligeiros desvios na quantidade de material depositado em comparação com os passos E absolutos. Independentemente desta definição, o modo de extrusão será sempre definido como absoluto antes da saída de qualquer script Gcode." + +#: fdmprinter.def.json +msgctxt "experimental label" +msgid "Experimental" +msgstr "Experimental" + +#: fdmprinter.def.json +msgctxt "experimental description" +msgid "experimental!" +msgstr "experimental!" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order label" +msgid "Optimize Wall Printing Order" +msgstr "Otimizar ordem de impressão de paredes" + +#: fdmprinter.def.json +msgctxt "optimize_wall_printing_order description" +msgid "" +"Optimize the order in which walls are printed so as to reduce the number of " +"retractions and the distance travelled. Most parts will benefit from this " +"being enabled but some may actually take longer so please compare the print " +"time estimates with and without optimization." +msgstr "Otimiza a ordem na qual as paredes são impressas de forma a reduzir o número de retrações e a distância percorrida. A maioria das peças irá beneficiar da ativação desta opção, embora algumas possam demorar mais tempo, portanto compare as estimativas de tempo de impressão com e sem otimização." + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags label" +msgid "Break Up Support In Chunks" +msgstr "Separar suporte em blocos" + +#: fdmprinter.def.json +msgctxt "support_skip_some_zags description" +msgid "" +"Skip some support line connections to make the support structure easier to " +"break away. This setting is applicable to the Zig Zag support infill pattern." +msgstr "Ignora algumas ligações de linha de suporte para facilitar a separação da estrutura de suporte. Esta definição é aplicável ao padrão de preenchimento de suporte em ziguezague." + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm label" +msgid "Support Chunk Size" +msgstr "Tamanho do bloco de suporte" + +#: fdmprinter.def.json +msgctxt "support_skip_zag_per_mm description" +msgid "" +"Leave out a connection between support lines once every N millimeter to make " +"the support structure easier to break away." +msgstr "Deixa uma ligação entre as linhas de suporte a cada X milímetros para facilitar a separação da estrutura de suporte." + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count label" +msgid "Support Chunk Line Count" +msgstr "Contagem de linhas do bloco de suporte" + +#: fdmprinter.def.json +msgctxt "support_zag_skip_count description" +msgid "" +"Skip one in every N connection lines to make the support structure easier to " +"break away." +msgstr "Ignora uma em cada X linhas de ligação para facilitar a separação da estrutura de suporte." + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled label" +msgid "Enable Draft Shield" +msgstr "Ativar proteção contra correntes de ar" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled description" +msgid "" +"This will create a wall around the model, which traps (hot) air and shields " +"against exterior airflow. Especially useful for materials which warp easily." +msgstr "Isto irá criar uma parede em torno do modelo que retém ar (quente) e o protege contra fluxos de ar exterior. Esta opção é especialmente útil para materiais que se deformam com facilidade." + +#: fdmprinter.def.json +msgctxt "draft_shield_dist label" +msgid "Draft Shield X/Y Distance" +msgstr "Distância X/Y da proteção contra correntes de ar" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist description" +msgid "Distance of the draft shield from the print, in the X/Y directions." +msgstr "A distância da proteção contra correntes de ar relativamente à impressora nas direções X/Y." + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation label" +msgid "Draft Shield Limitation" +msgstr "Limite de proteção contra correntes de ar" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation description" +msgid "" +"Set the height of the draft shield. Choose to print the draft shield at the " +"full height of the model or at a limited height." +msgstr "Define a altura da proteção contra correntes de ar. Opte por imprimir a proteção contra correntes de ar com a altura máxima do modelo ou com uma altura limitada." + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option full" +msgid "Full" +msgstr "Máximo" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option limited" +msgid "Limited" +msgstr "Limitado" + +#: fdmprinter.def.json +msgctxt "draft_shield_height label" +msgid "Draft Shield Height" +msgstr "Altura da proteção contra correntes de ar" + +#: fdmprinter.def.json +msgctxt "draft_shield_height description" +msgid "" +"Height limitation of the draft shield. Above this height no draft shield " +"will be printed." +msgstr "Limite de altura da proteção contra correntes de ar. Não será impressa qualquer proteção contra correntes de ar acima desta altura." + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled label" +msgid "Make Overhang Printable" +msgstr "Tornar saliência imprimível" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled description" +msgid "" +"Change the geometry of the printed model such that minimal support is " +"required. Steep overhangs will become shallow overhangs. Overhanging areas " +"will drop down to become more vertical." +msgstr "Altera a geometria do modelo impresso de forma que seja necessário suporte mínimo. Saliências acentuadas tornar-se-ão saliências rasas. As áreas de saliências irão baixar para se tornarem mais verticais." + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle label" +msgid "Maximum Model Angle" +msgstr "Ângulo máximo do modelo" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle description" +msgid "" +"The maximum angle of overhangs after the they have been made printable. At a " +"value of 0° all overhangs are replaced by a piece of model connected to the " +"build plate, 90° will not change the model in any way." +msgstr "O ângulo máximo das saliências após se terem tornado imprimíveis. Com um valor de 0°, todas as saliências são substituídas por um modelo ligado à placa de construção e, com um valor de 90°, o modelo não será alterado de forma alguma." + +#: fdmprinter.def.json +msgctxt "coasting_enable label" +msgid "Enable Coasting" +msgstr "Ativar desaceleração" + +#: fdmprinter.def.json +msgctxt "coasting_enable description" +msgid "" +"Coasting replaces the last part of an extrusion path with a travel path. The " +"oozed material is used to print the last piece of the extrusion path in " +"order to reduce stringing." +msgstr "A desaceleração substitui a última parte de um caminho de extrusão por um caminho de deslocamento. O material vazado é utilizado para imprimir a última parte do caminho de extrusão de forma a reduzir os fios soltos." + +#: fdmprinter.def.json +msgctxt "coasting_volume label" +msgid "Coasting Volume" +msgstr "Volume de desaceleração" + +#: fdmprinter.def.json +msgctxt "coasting_volume description" +msgid "" +"The volume otherwise oozed. This value should generally be close to the " +"nozzle diameter cubed." +msgstr "O volume que, caso contrário, vazaria. Geralmente, este valor deve ser próximo ao diâmetro cúbico do bocal." + +#: fdmprinter.def.json +msgctxt "coasting_min_volume label" +msgid "Minimum Volume Before Coasting" +msgstr "Volume mínimo antes da desaceleração" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume description" +msgid "" +"The smallest volume an extrusion path should have before allowing coasting. " +"For smaller extrusion paths, less pressure has been built up in the bowden " +"tube and so the coasted volume is scaled linearly. This value should always " +"be larger than the Coasting Volume." +msgstr "O menor volume que um caminho de extrusão deve ter antes de permitir a desaceleração. Para caminhos de extrusão mais curtos, é acumulada menos pressão no tubo Bowden e, como tal, o volume de desaceleração adota uma escala linear. Este valor deve sempre ser superior ao Volume de desaceleração." + +#: fdmprinter.def.json +msgctxt "coasting_speed label" +msgid "Coasting Speed" +msgstr "Velocidade de desaceleração" + +#: fdmprinter.def.json +msgctxt "coasting_speed description" +msgid "" +"The speed by which to move during coasting, relative to the speed of the " +"extrusion path. A value slightly under 100% is advised, since during the " +"coasting move the pressure in the bowden tube drops." +msgstr "A velocidade de movimento durante a desaceleração, relativa à velocidade do caminho de extrusão. É recomendado um valor ligeiramente abaixo de 100%, uma vez que durante o movimento de desaceleração, a pressão no tubo Bowden diminui." + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation label" +msgid "Alternate Skin Rotation" +msgstr "Alternar rotação do revestimento" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation description" +msgid "" +"Alternate the direction in which the top/bottom layers are printed. Normally " +"they are printed diagonally only. This setting adds the X-only and Y-only " +"directions." +msgstr "Alterna a direção na qual as camadas superiores/inferiores são impressas. Geralmente, estas são impressas apenas na diagonal. Esta definição adiciona as direções apenas X e apenas Y." + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size label" +msgid "Cross 3D Pocket Size" +msgstr "Tamanho da bolsa de cruz 3D" + +#: fdmprinter.def.json +msgctxt "cross_infill_pocket_size description" +msgid "" +"The size of pockets at four-way crossings in the cross 3D pattern at heights " +"where the pattern is touching itself." +msgstr "O tamanho das bolsas em cruzamentos de quatro vias no padrão de cruz 3D em alturas onde o padrão está em contacto consigo próprio." + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly label" +msgid "Alternate Cross 3D Pockets" +msgstr "Alternar bolsas de cruz 3D" + +#: fdmprinter.def.json +msgctxt "cross_infill_apply_pockets_alternatingly description" +msgid "" +"Only apply pockets at half of the four-way crossings in the cross 3D pattern " +"and alternate the location of the pockets between heights where the pattern " +"is touching itself." +msgstr "Aplica bolsas em apenas metade dos cruzamentos de quatro vias no padrão de cruz 3D e alterna a localização das bolsas entre alturas onde o padrão está em contacto consigo próprio." + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled label" +msgid "Spaghetti Infill" +msgstr "Preenchimento em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_enabled description" +msgid "" +"Print the infill every so often, so that the filament will curl up " +"chaotically inside the object. This reduces print time, but the behaviour is " +"rather unpredictable." +msgstr "Imprime o preenchimento de tempos a tempos, para que o filamento encaracole desordenadamente dentro do objeto. Isto reduz o tempo de impressão, mas o comportamento é um pouco imprevisível." + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped label" +msgid "Spaghetti Infill Stepping" +msgstr "Passos de preenchimento em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_stepped description" +msgid "" +"Whether to print spaghetti infill in steps or extrude all the infill " +"filament at the end of the print." +msgstr "Imprime o preenchimento em esparguete de forma faseada ou extrude todos os filamentos de preenchimento no final da impressão." + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle label" +msgid "Spaghetti Maximum Infill Angle" +msgstr "Ângulo de preenchimento máximo em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_infill_angle description" +msgid "" +"The maximum angle w.r.t. the Z axis of the inside of the print for areas " +"which are to be filled with spaghetti infill afterwards. Lowering this value " +"causes more angled parts in your model to be filled on each layer." +msgstr "O ângulo máximo em relação ao eixo Z do interior da impressão para áreas que devem ser preenchidas posteriormente com o preenchimento em esparguete. A redução deste valor produz mais partes angulares no modelo que deverão ser preenchidas em cada camada." + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height label" +msgid "Spaghetti Infill Maximum Height" +msgstr "Altura máxima de preenchimento em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_max_height description" +msgid "" +"The maximum height of inside space which can be combined and filled from the " +"top." +msgstr "A altura máxima do espaço interior que pode ser combinado e preenchido a partir da parte superior." + +#: fdmprinter.def.json +msgctxt "spaghetti_inset label" +msgid "Spaghetti Inset" +msgstr "Inserção em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_inset description" +msgid "" +"The offset from the walls from where the spaghetti infill will be printed." +msgstr "O desvio das paredes a partir do qual o preenchimento em esparguete será impresso." + +#: fdmprinter.def.json +msgctxt "spaghetti_flow label" +msgid "Spaghetti Flow" +msgstr "Fluxo em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_flow description" +msgid "" +"Adjusts the density of the spaghetti infill. Note that the Infill Density " +"only controls the line spacing of the filling pattern, not the amount of " +"extrusion for spaghetti infill." +msgstr "Ajusta a densidade do preenchimento em esparguete. Observe que a Densidade de preenchimento controla apenas o espaçamento entre linhas do padrão de preenchimento e não a quantidade de extrusão para o preenchimento em esparguete." + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume label" +msgid "Spaghetti Infill Extra Volume" +msgstr "Volume adicional de preenchimento em esparguete" + +#: fdmprinter.def.json +msgctxt "spaghetti_infill_extra_volume description" +msgid "" +"A correction term to adjust the total volume being extruded each time when " +"filling spaghetti." +msgstr "Um termo de correção para ajustar o volume total a ser extrudido sempre que for realizado o preenchimento em esparguete." + +#: fdmprinter.def.json +msgctxt "support_conical_enabled label" +msgid "Enable Conical Support" +msgstr "Ativar suporte cónico" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled description" +msgid "" +"Experimental feature: Make support areas smaller at the bottom than at the " +"overhang." +msgstr "Funcionalidade experimental: torna as áreas de suporte mais reduzidas na parte inferior do que na saliência." + +#: fdmprinter.def.json +msgctxt "support_conical_angle label" +msgid "Conical Support Angle" +msgstr "Ângulo do suporte cónico" + +#: fdmprinter.def.json +msgctxt "support_conical_angle description" +msgid "" +"The angle of the tilt of conical support. With 0 degrees being vertical, and " +"90 degrees being horizontal. Smaller angles cause the support to be more " +"sturdy, but consist of more material. Negative angles cause the base of the " +"support to be wider than the top." +msgstr "O ângulo da inclinação do suporte cónico. 0 graus é vertical e 90 graus é horizontal. Ângulos mais reduzidos tornam o suporte mais robusto, mas consomem mais material. Ângulos negativos tornam a base do suporte mais larga do que a parte superior." + +#: fdmprinter.def.json +msgctxt "support_conical_min_width label" +msgid "Conical Support Minimum Width" +msgstr "Largura mínima do suporte cónico" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width description" +msgid "" +"Minimum width to which the base of the conical support area is reduced. " +"Small widths can lead to unstable support structures." +msgstr "A largura mínima para a qual a base da área do suporte cónico é reduzida. Larguras reduzidas podem originar estruturas de suporte instáveis." + +#: fdmprinter.def.json +msgctxt "infill_hollow label" +msgid "Hollow Out Objects" +msgstr "Esvaziar objetos" + +#: fdmprinter.def.json +msgctxt "infill_hollow description" +msgid "" +"Remove all infill and make the inside of the object eligible for support." +msgstr "Remove todo o preenchimento e torna o interior do objeto elegível para suporte." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled label" +msgid "Fuzzy Skin" +msgstr "Revestimento difuso" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled description" +msgid "" +"Randomly jitter while printing the outer wall, so that the surface has a " +"rough and fuzzy look." +msgstr "Vibra aleatoriamente enquanto imprime a parede externa, para que a superfície apresente um aspeto rugoso e difuso." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness label" +msgid "Fuzzy Skin Thickness" +msgstr "Espessura do revestimento difuso" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness description" +msgid "" +"The width within which to jitter. It's advised to keep this below the outer " +"wall width, since the inner walls are unaltered." +msgstr "A largura dentro da qual deve ser produzida vibração. É recomendado mantê-la abaixo da largura da parede externa, uma vez que as paredes internas não são alteradas." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density label" +msgid "Fuzzy Skin Density" +msgstr "Densidade do revestimento difuso" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density description" +msgid "" +"The average density of points introduced on each polygon in a layer. Note " +"that the original points of the polygon are discarded, so a low density " +"results in a reduction of the resolution." +msgstr "A densidade média dos pontos introduzidos em cada polígono numa camada. Observe que os pontos originais do polígono são eliminados, pelo que uma densidade baixa resulta numa redução da resolução." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist label" +msgid "Fuzzy Skin Point Distance" +msgstr "Distância do ponto de revestimento difuso" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist description" +msgid "" +"The average distance between the random points introduced on each line " +"segment. Note that the original points of the polygon are discarded, so a " +"high smoothness results in a reduction of the resolution. This value must be " +"higher than half the Fuzzy Skin Thickness." +msgstr "A distância média entre os pontos aleatórios introduzidos em cada segmento de linha. Observe que os pontos originais do polígono são eliminados, pelo que uma suavidade elevada resulta numa redução da resolução. Este valor deve ser superior a metade da Espessura do revestimento difuso." + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset label" +msgid "Flow rate compensation max extrusion offset" +msgstr "Desvio de extrusão máximo de compensação da taxa de fluxo" + +#: fdmprinter.def.json +msgctxt "flow_rate_max_extrusion_offset description" +msgid "The maximum distance in mm to compensate." +msgstr "A distância máxima em mm a ser compensada." + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor label" +msgid "Flow rate compensation factor" +msgstr "Fator de compensação da taxa de fluxo" + +#: fdmprinter.def.json +msgctxt "flow_rate_extrusion_offset_factor description" +msgid "The multiplication factor for the flow rate -> distance translation." +msgstr "O fator de multiplicação da taxa de fluxo -> translação de distância." + +#: fdmprinter.def.json +msgctxt "wireframe_enabled label" +msgid "Wire Printing" +msgstr "Impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled description" +msgid "" +"Print only the outside surface with a sparse webbed structure, printing 'in " +"thin air'. This is realized by horizontally printing the contours of the " +"model at given Z intervals which are connected via upward and diagonally " +"downward lines." +msgstr "Imprime apenas a superfície externa com uma estrutura entrelaçada dispersa a partir \"do ar\". Isto é realizado ao imprimir horizontalmente os contornos do modelo em determinados intervalos Z que são ligados através de linhas ascendentes e diagonais descendentes." + +#: fdmprinter.def.json +msgctxt "wireframe_height label" +msgid "WP Connection Height" +msgstr "Altura de ligação da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_height description" +msgid "" +"The height of the upward and diagonally downward lines between two " +"horizontal parts. This determines the overall density of the net structure. " +"Only applies to Wire Printing." +msgstr "A altura das linhas ascendentes e diagonais descendentes entre duas partes horizontais. Isto determina a densidade geral da estrutura de rede. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset label" +msgid "WP Roof Inset Distance" +msgstr "Distância de inserção do teto da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset description" +msgid "" +"The distance covered when making a connection from a roof outline inward. " +"Only applies to Wire Printing." +msgstr "A distância percorrida ao efetuar uma ligação a partir de um contorno de telhado interno. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed label" +msgid "WP Speed" +msgstr "Velocidade da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed description" +msgid "" +"Speed at which the nozzle moves when extruding material. Only applies to " +"Wire Printing." +msgstr "Velocidade à qual o bocal se movimenta ao extrudir material. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom label" +msgid "WP Bottom Printing Speed" +msgstr "Velocidade de impressão da parte inferior da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom description" +msgid "" +"Speed of printing the first layer, which is the only layer touching the " +"build platform. Only applies to Wire Printing." +msgstr "Velocidade de impressão da primeira camada, que é a única camada que entra em contacto com a plataforma de construção. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up label" +msgid "WP Upward Printing Speed" +msgstr "Velocidade de impressão ascendente da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up description" +msgid "" +"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgstr "A velocidade de impressão de uma linha ascendente \"no ar\". Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down label" +msgid "WP Downward Printing Speed" +msgstr "Velocidade de impressão descendente da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down description" +msgid "" +"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgstr "Velocidade de impressão de uma linha diagonal descendente. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat label" +msgid "WP Horizontal Printing Speed" +msgstr "Velocidade de impressão horizontal da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat description" +msgid "" +"Speed of printing the horizontal contours of the model. Only applies to Wire " +"Printing." +msgstr "Velocidade de impressão de contornos horizontais do modelo. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_flow label" +msgid "WP Flow" +msgstr "Fluxo de impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value. Only applies to Wire Printing." +msgstr "Compensação de fluxo: a quantidade de material extrudido é multiplicada por este valor. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection label" +msgid "WP Connection Flow" +msgstr "Fluxo de ligação da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection description" +msgid "Flow compensation when going up or down. Only applies to Wire Printing." +msgstr "A compensação de fluxo ao deslocar-se para cima ou para baixo. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat label" +msgid "WP Flat Flow" +msgstr "Fluxo plano da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat description" +msgid "" +"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgstr "Compensação de fluxo ao imprimir linhas planas. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay label" +msgid "WP Top Delay" +msgstr "Atraso superior da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay description" +msgid "" +"Delay time after an upward move, so that the upward line can harden. Only " +"applies to Wire Printing." +msgstr "O tempo de atraso após um movimento ascendente, para que a linha ascendente possa endurecer. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay label" +msgid "WP Bottom Delay" +msgstr "Atraso da parte inferior da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay description" +msgid "Delay time after a downward move. Only applies to Wire Printing." +msgstr "O tempo de atraso após um movimento descendente. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay label" +msgid "WP Flat Delay" +msgstr "Atraso plano da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay description" +msgid "" +"Delay time between two horizontal segments. Introducing such a delay can " +"cause better adhesion to previous layers at the connection points, while too " +"long delays cause sagging. Only applies to Wire Printing." +msgstr "Tempo de atraso entre dois segmentos horizontais. A introdução desse atraso pode causar melhor aderência às camadas anteriores nos pontos de ligação. No entanto, os atrasos demasiado longos podem causar flacidez. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed label" +msgid "WP Ease Upward" +msgstr "Facilidade de movimento ascendente da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed description" +msgid "" +"Distance of an upward move which is extruded with half speed.\n" +"This can cause better adhesion to previous layers, while not heating the " +"material in those layers too much. Only applies to Wire Printing." +msgstr "A distância de um movimento ascendente que é extrudido a metade da velocidade.\nIsto pode causar melhor aderência às camadas anteriores, sendo que o material nessas camadas não é demasiado aquecido. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump label" +msgid "WP Knot Size" +msgstr "Tamanho do nó da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump description" +msgid "" +"Creates a small knot at the top of an upward line, so that the consecutive " +"horizontal layer has a better chance to connect to it. Only applies to Wire " +"Printing." +msgstr "Cria um pequeno nó no topo de uma linha ascendente, para que a camada horizontal subsequente possa ligar-se com maior facilidade. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down label" +msgid "WP Fall Down" +msgstr "Queda da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down description" +msgid "" +"Distance with which the material falls down after an upward extrusion. This " +"distance is compensated for. Only applies to Wire Printing." +msgstr "Distância à qual o material cai após uma extrusão ascendente. Esta distância é compensada. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along label" +msgid "WP Drag Along" +msgstr "Arrastamento da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along description" +msgid "" +"Distance with which the material of an upward extrusion is dragged along " +"with the diagonally downward extrusion. This distance is compensated for. " +"Only applies to Wire Printing." +msgstr "Distância à qual o material de uma extrusão ascendente é arrastado juntamente com a extrusão diagonal descendente. Esta distância é compensada. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_strategy label" +msgid "WP Strategy" +msgstr "Estratégia de impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy description" +msgid "" +"Strategy for making sure two consecutive layers connect at each connection " +"point. Retraction lets the upward lines harden in the right position, but " +"may cause filament grinding. A knot can be made at the end of an upward line " +"to heighten the chance of connecting to it and to let the line cool; " +"however, it may require slow printing speeds. Another strategy is to " +"compensate for the sagging of the top of an upward line; however, the lines " +"won't always fall down as predicted." +msgstr "Estratégia para assegurar que duas camadas consecutivas se ligam a cada ponto de ligação. A retração permite que as linhas ascendentes endureçam na posição correta, mas pode causar a trituração do filamento. É possível fazer um nó no final de uma linha ascendente para aumentar a probabilidade de ligação e para permitir o arrefecimento da linha. No entanto, podem ser necessárias velocidades de impressão reduzidas. Outra estratégia é compensar a flacidez do topo de uma linha ascendente. Porém, as linhas nem sempre cairão conforme previsto." + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option compensate" +msgid "Compensate" +msgstr "Compensar" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option knot" +msgid "Knot" +msgstr "Nó" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option retract" +msgid "Retract" +msgstr "Retrair" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down label" +msgid "WP Straighten Downward Lines" +msgstr "Linhas retas descendentes da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down description" +msgid "" +"Percentage of a diagonally downward line which is covered by a horizontal " +"line piece. This can prevent sagging of the top most point of upward lines. " +"Only applies to Wire Printing." +msgstr "A percentagem de uma linha diagonal descendente que é abrangida por uma peça da linha horizontal. Isto pode impedir a flacidez do ponto mais elevado das linhas ascendentes. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down label" +msgid "WP Roof Fall Down" +msgstr "Queda do teto da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down description" +msgid "" +"The distance which horizontal roof lines printed 'in thin air' fall down " +"when being printed. This distance is compensated for. Only applies to Wire " +"Printing." +msgstr "A distância à qual as linhas horizontais do teto que são impressas \"no ar\" caem ao ser impressas. Esta distância é compensada. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along label" +msgid "WP Roof Drag Along" +msgstr "Arrastamento do teto da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along description" +msgid "" +"The distance of the end piece of an inward line which gets dragged along " +"when going back to the outer outline of the roof. This distance is " +"compensated for. Only applies to Wire Printing." +msgstr "A distância da parte final de uma linha interna que é arrastada ao regressar ao contorno externo do teto. Esta distância é compensada. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay label" +msgid "WP Roof Outer Delay" +msgstr "Atraso externo do teto da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay description" +msgid "" +"Time spent at the outer perimeters of hole which is to become a roof. Longer " +"times can ensure a better connection. Only applies to Wire Printing." +msgstr "Tempo gasto nos perímetros externos do orifício que se irá transformar em teto. Períodos de tempo mais longos permitem garantir uma melhor ligação. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance label" +msgid "WP Nozzle Clearance" +msgstr "Espaço do bocal da impressão de fios" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance description" +msgid "" +"Distance between the nozzle and horizontally downward lines. Larger " +"clearance results in diagonally downward lines with a less steep angle, " +"which in turn results in less upward connections with the next layer. Only " +"applies to Wire Printing." +msgstr "Distância entre o bocal e as linhas horizontais descendentes. Uma maior folga resulta em linhas horizontais descendentes com um ângulo menos acentuado, o que, por sua vez, resulta em menos ligações ascendentes com a camada seguinte. Aplica-se apenas à impressão de fios." + +#: fdmprinter.def.json +msgctxt "command_line_settings label" +msgid "Command Line Settings" +msgstr "Definições de linha de comando" + +#: fdmprinter.def.json +msgctxt "command_line_settings description" +msgid "" +"Settings which are only used if CuraEngine isn't called from the Cura " +"frontend." +msgstr "Definições que só são utilizadas se o CuraEngine não for ativado a partir do front-end do Cura." + +#: fdmprinter.def.json +msgctxt "center_object label" +msgid "Center object" +msgstr "Centrar objeto" + +#: fdmprinter.def.json +msgctxt "center_object description" +msgid "" +"Whether to center the object on the middle of the build platform (0,0), " +"instead of using the coordinate system in which the object was saved." +msgstr "Permite centrar o objeto no centro da plataforma de construção (0,0), em vez de utilizar o sistema de coordenadas no qual o objeto foi guardado." + +#: fdmprinter.def.json +msgctxt "mesh_position_x label" +msgid "Mesh position x" +msgstr "Posição X da malha" + +#: fdmprinter.def.json +msgctxt "mesh_position_x description" +msgid "Offset applied to the object in the x direction." +msgstr "Desvio aplicado ao objeto na direção X." + +#: fdmprinter.def.json +msgctxt "mesh_position_y label" +msgid "Mesh position y" +msgstr "Posição Y da malha" + +#: fdmprinter.def.json +msgctxt "mesh_position_y description" +msgid "Offset applied to the object in the y direction." +msgstr "Desvio aplicado ao objeto na direção Y." + +#: fdmprinter.def.json +msgctxt "mesh_position_z label" +msgid "Mesh position z" +msgstr "Posição Z da malha" + +#: fdmprinter.def.json +msgctxt "mesh_position_z description" +msgid "" +"Offset applied to the object in the z direction. With this you can perform " +"what was used to be called 'Object Sink'." +msgstr "Desvio aplicado ao objeto na direção Z. Com esta opção, é possível realizar o que se costumava designar \"Afundamento de objetos\"." + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix label" +msgid "Mesh Rotation Matrix" +msgstr "Matriz de rotação da malha" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix description" +msgid "" +"Transformation matrix to be applied to the model when loading it from file." +msgstr "Matriz de transformação a ser aplicada ao modelo ao carregá-lo a partir do ficheiro." From da4372beef71eeb68ea69146d916406848d904d5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 11:49:04 +0100 Subject: [PATCH 711/764] Corrections for Portuguese translation Without really knowing the language, I was able to make these corrections. Contributes to issue CURA-4692. --- resources/i18n/pt_PT/cura.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 5cabe1b536..6fbc8664a9 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -568,7 +568,7 @@ msgstr "Não é possível enviar tarefa de impressão para o grupo {cluster_name #, python-brace-format msgctxt "@info:status" msgid "Sent {file_name} to group {cluster_name}." -msgstr "{File_name} enviado para o grupo {cluster_name}." +msgstr "{file_name} enviado para o grupo {cluster_name}." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py:423 msgctxt "@action:button" @@ -1306,7 +1306,7 @@ msgctxt "" "@info 'width', 'depth' and 'height' are variable names that must NOT be " "translated; just translate the format of ##x##x## mm." msgid "%(width).1f x %(depth).1f x %(height).1f mm" -msgstr "%(largura).1f x %(profundidade).1f x %(altura).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f mm" #: /home/ruben/Projects/Cura/cura/CuraApplication.py:1348 #, python-brace-format @@ -2043,7 +2043,7 @@ msgstr "Largura (mm)" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:103 msgctxt "@info:tooltip" msgid "The depth in millimeters on the build plate" -msgstr "A profundidade em milímetros na placa de construção." +msgstr "A profundidade em milímetros na placa de construção" #: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:108 msgctxt "@action:label" @@ -3376,7 +3376,7 @@ msgctxt "@label" msgid "" "This setting is always shared between all extruders. Changing it here will " "change the value for all extruders" -msgstr "Esta definição é sempre partilhada entre todas as extrusoras. Ao alterá-la aqui, o valor será alterado para todas as extrusoras." +msgstr "Esta definição é sempre partilhada entre todas as extrusoras. Ao alterá-la aqui, o valor será alterado para todas as extrusoras" #: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 msgctxt "@label" From ac8f3a31bed6503d64b860fb238ed21e694c1692 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 11:51:28 +0100 Subject: [PATCH 712/764] Include period in translation source text I suspect that this was originally done this way to prevent breaking a string freeze. I'm now correcting it so that languages that don't use this period will also be able to properly end their sentence (such as Japanese or Chinese). Contributes to issue CURA-4692. --- resources/qml/Settings/SettingItem.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 1fa83cb6d4..4a89090984 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -1,5 +1,5 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Uranium is released under the terms of the LGPLv3 or higher. +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.1 import QtQuick.Layouts 1.1 @@ -154,7 +154,7 @@ Item { onEntered: { hoverTimer.stop(); - var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; + var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders."); if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + Cura.ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; From c786f7a69b46c950712cf32b8d3f341b8c9e7289 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 11:53:58 +0100 Subject: [PATCH 713/764] Add Portuguese to language drop-down So that we can select it. Contributes to issue CURA-4692. --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index e9dae6eb11..722ba31c48 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -159,6 +159,7 @@ UM.PreferencesPage append({ text: "Nederlands", code: "nl_NL" }) append({ text: "Polski", code: "pl_PL" }) append({ text: "Português do Brasil", code: "pt_BR" }) + append({ text: "Português", code: "pt_PT" }) append({ text: "Русский", code: "ru_RU" }) append({ text: "Türkçe", code: "tr_TR" }) append({ text: "简体中文", code: "zh_CN" }) From cda600f12d0e03dffdbdbf77a72ba27a85336db2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 13:16:52 +0100 Subject: [PATCH 714/764] Don't halt build when encountering duplicate tests I had duplicate tests because multiple plug-ins were interfering with each other. We shouldn't crash on that. Contributes to issue CURA-4692. --- cmake/CuraTests.cmake | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/cmake/CuraTests.cmake b/cmake/CuraTests.cmake index a8af16c28c..3cb5a705b3 100644 --- a/cmake/CuraTests.cmake +++ b/cmake/CuraTests.cmake @@ -28,12 +28,17 @@ function(cura_add_test) string(REPLACE "|" ":" _PYTHONPATH ${_PYTHONPATH}) endif() - add_test( - NAME ${_NAME} - COMMAND ${PYTHON_EXECUTABLE} -m pytest --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY} - ) - set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT LANG=C) - set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${_PYTHONPATH}") + get_test_property(${_NAME} ENVIRONMENT test_exists) #Find out if the test exists by getting a property from it that always exists (such as ENVIRONMENT because we set that ourselves). + if (${test_exists} EQUAL "NOTFOUND") + add_test( + NAME ${_NAME} + COMMAND ${PYTHON_EXECUTABLE} -m pytest --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY} + ) + set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT LANG=C) + set_tests_properties(${_NAME} PROPERTIES ENVIRONMENT "PYTHONPATH=${_PYTHONPATH}") + else() + message(WARNING "Duplicate test ${_NAME}!") + endif() endfunction() cura_add_test(NAME pytest-main DIRECTORY ${CMAKE_SOURCE_DIR}/tests PYTHONPATH "${CMAKE_SOURCE_DIR}|${URANIUM_DIR}") From 8b504c8acc56f7db4e5465c32130e451c24c81a0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 14:07:34 +0100 Subject: [PATCH 715/764] Fix scroll position after collapsing category not in focus When collapsing a category, the height of the category is briefly set to 0 and then animated there properly. If the setting list becomes so small then that the scroll bar disappears, the view should automatically get scrolled up. But because the focus changed at the same time it would move the scrollbar such that the category header was in view. This clashed, causing the scroll position to end up not completely at the top even though the scroll bar did disappear. Setting the focus after collapsing the scroll bar prevents this. Contributes to issue CURA-4732 and fixes #2935. --- resources/qml/Settings/SettingCategory.qml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml index 53f8f89e15..3ccf668699 100644 --- a/resources/qml/Settings/SettingCategory.qml +++ b/resources/qml/Settings/SettingCategory.qml @@ -1,5 +1,5 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Uranium is released under the terms of the LGPLv3 or higher. +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 1.1 @@ -31,13 +31,17 @@ Button { onClicked: { - forceActiveFocus(); if(definition.expanded) { settingDefinitionsModel.collapse(definition.key); - } else { + } + else + { settingDefinitionsModel.expandAll(definition.key); } + //Set focus so that tab navigation continues from this point on. + //NB: This must be set AFTER collapsing/expanding the category so that the scroll position is correct. + forceActiveFocus(); } onActiveFocusChanged: { From 1bcdc0357e4d1ad0e1e4d05c39fa56d825c39b5c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 14:32:43 +0100 Subject: [PATCH 716/764] If there is no added printer, disallow closing the window The state of having no printer added is very weird to the user. Let's prevent that from happening by accident. Contributes to issue CURA-4736. --- resources/qml/AddMachineDialog.qml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index 109ea07695..a635f1f8d1 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2016 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -25,6 +25,15 @@ UM.Dialog width: minimumWidth height: minimumHeight + flags: { + var window_flags = Qt.Dialog | Qt.CustomizeWindowHint | Qt.WindowTitleHint; + if (Cura.MachineManager.activeDefinitionId !== "") //Disallow closing the window if we have no active printer yet. You MUST add a printer. + { + window_flags |= Qt.WindowCloseButtonHint; + } + return window_flags; + } + onVisibilityChanged: { // Reset selection and machine name From 4a3109c8852e229a6d3002db0ec0a43388bf41a0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 14:47:55 +0100 Subject: [PATCH 717/764] Don't crash when loading model before a printer is loaded The model won't load successfully and you get a message that it failed to load, but Cura won't crash at least. Contributes to issue CURA-4736. --- cura/CuraApplication.py | 2 +- cura/ShapeArray.py | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e90dfd70d3..1dce1039db 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1387,7 +1387,7 @@ class CuraApplication(QtApplication): if node.callDecoration("isSliceable"): # Only check position if it's not already blatantly obvious that it won't fit. - if node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: + if node.getBoundingBox() is None or self._volume.getBoundingBox() is None or node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: # Find node location offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = min_offset) diff --git a/cura/ShapeArray.py b/cura/ShapeArray.py index 73fc2023e3..9232c9f22f 100755 --- a/cura/ShapeArray.py +++ b/cura/ShapeArray.py @@ -43,13 +43,12 @@ class ShapeArray: transform_x = transform._data[0][3] transform_y = transform._data[2][3] hull_verts = node.callDecoration("getConvexHull") + # If a model is too small then it will not contain any points + if hull_verts is None or not hull_verts.getPoints().any(): + return None, None # For one_at_a_time printing you need the convex hull head. hull_head_verts = node.callDecoration("getConvexHullHead") or hull_verts - # If a model is to small then it will not contain any points - if not hull_verts.getPoints().any(): - return None, None - offset_verts = hull_head_verts.getMinkowskiHull(Polygon.approximatedCircle(min_offset)) offset_points = copy.deepcopy(offset_verts._points) # x, y offset_points[:, 0] = numpy.add(offset_points[:, 0], -transform_x) From 719bd5a707cb5e5f944f81d59f0dedc56722816d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 29 Dec 2017 18:08:58 +0100 Subject: [PATCH 718/764] Fix slicing non-printable meshes that fall outside of build volume Non-printable meshes don't care whether they are in the build volume or not. Contributes to issue CURA-4734. --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index b22e116f95..21b3973bc6 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -143,7 +143,7 @@ class StartSliceJob(Job): if per_object_stack: is_non_printing_mesh = any(per_object_stack.getProperty(key, "value") for key in NON_PRINTING_MESH_SETTINGS) - if not getattr(node, "_outside_buildarea", False): + if not getattr(node, "_outside_buildarea", False) or is_non_printing_mesh: temp_list.append(node) if not is_non_printing_mesh: has_printing_mesh = True From 8a308ef0dbd4b2d787ba862efd7647e4c1d3089a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Fri, 29 Dec 2017 19:59:04 +0100 Subject: [PATCH 719/764] Added Quality profiles for Anycubic i3 Mega --- .../definitions/anycubic_i3_mega.def.json | 12 ++-- ...bic_i3_mega_global_Coarse_Quality.inst.cfg | 43 ++++++++++++++ ...cubic_i3_mega_global_High_Quality.inst.cfg | 43 ++++++++++++++ ...bic_i3_mega_global_Normal_Quality.inst.cfg | 43 ++++++++++++++ .../anycubic_i3_mega_petg_coarse.inst.cfg | 59 +++++++++++++++++++ .../petg/anycubic_i3_mega_petg_high.inst.cfg | 59 +++++++++++++++++++ .../anycubic_i3_mega_petg_normal.inst.cfg | 59 +++++++++++++++++++ .../pla/anycubic_i3_mega_pla_coarse.inst.cfg | 59 +++++++++++++++++++ .../pla/anycubic_i3_mega_pla_high.inst.cfg | 59 +++++++++++++++++++ .../pla/anycubic_i3_mega_pla_normal.inst.cfg | 59 +++++++++++++++++++ 10 files changed, 488 insertions(+), 7 deletions(-) create mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg create mode 100644 resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index 2ae21b6d80..5e35ab1fdd 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -8,8 +8,12 @@ "manufacturer":"Anycubic", "file_formats":"text/x-gcode", "icon":"icon_ultimaker2", - "platform":"prusai3_platform.stl" + "platform":"prusai3_platform.stl", + "has_materials": true, + "has_machine_quality": true, + "preferred_quality": "*normal*" }, + "overrides":{ "machine_name":{ "default_value":"Anycubic i3 Mega" @@ -34,12 +38,6 @@ }, "material_diameter":{ "default_value":1.75 - }, - "speed_travel":{ - "default_value":60 - }, - "speed_print":{ - "default_value":50 }, "gantry_height":{ "default_value":0 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg new file mode 100644 index 0000000000..721aa4f25b --- /dev/null +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 2 +name = Coarse +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = coarse +global_quality = True +weight = -3 +setting_version = 4 + +[values] +layer_height = 0.4 +layer_height_0 = =layer_height + +skin_angles = [0,90] + +infill_before_walls = False +infill_angles = [0,90] + +speed_slowdown_layers = 1 +acceleration_print = 2000 +acceleration_travel = 3000 +jerk_print = 13 +jerk_travel = 13 + +retraction_combing = off + +support_z_distance = 0 +support_xy_distance = 0.7 +support_join_distance = 10 +support_interface_enable = True +support_interface_pattern = triangles + +adhesion_type = skirt +skirt_gap = 1 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 100 +speed_wall = 50 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..e69d70828d --- /dev/null +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 2 +name = High +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = high +global_quality = True +weight = 1 +setting_version = 4 + +[values] +layer_height = 0.1 +layer_height_0 = =0.2 if min(extruderValues('machine_nozzle_size')) < 0.3 else 0.3 + +skin_angles = [0,90] + +infill_before_walls = False +infill_angles = [0,90] + +speed_slowdown_layers = 1 +acceleration_print = 2000 +acceleration_travel = 3000 +jerk_print = 13 +jerk_travel = 13 + +retraction_combing = off + +support_z_distance = 0 +support_xy_distance = 0.7 +support_join_distance = 10 +support_interface_enable = True +support_interface_pattern = triangles + +adhesion_type = skirt +skirt_gap = 1 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 50 +speed_wall = 50 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..bab515eae4 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 2 +name = Normal +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = normal +global_quality = True +weight = 0 +setting_version = 4 + +[values] +layer_height = 0.2 +layer_height_0 = =0.2 if min(extruderValues('machine_nozzle_size')) < 0.3 else 0.3 + +skin_angles = [0,90] + +infill_before_walls = False +infill_angles = [0,90] + +speed_slowdown_layers = 1 +acceleration_print = 2000 +acceleration_travel = 3000 +jerk_print = 13 +jerk_travel = 13 + +retraction_combing = off + +support_z_distance = 0 +support_xy_distance = 0.7 +support_join_distance = 10 +support_interface_enable = True +support_interface_pattern = triangles + +adhesion_type = skirt +skirt_gap = 1 +speed_infill = 60 +speed_print = 60 +speed_support = 60 +speed_topbottom = 30 +speed_travel = 60 +speed_wall = 60 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg new file mode 100644 index 0000000000..682e198f78 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = Coarse +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = coarse +material = generic_petg_175 +weight = 1 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 50 +cool_fan_speed_0 = 50 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.2 +material_bed_temperature = 80 +material_diameter = 1.7 +material_print_temperature = 230 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 4.5 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 60 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 60 +speed_print = 60 +speed_support = 30 +speed_topbottom = 30 +speed_travel = 100 +speed_wall = 60 +speed_wall_x = 60 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg new file mode 100644 index 0000000000..5a22a4c0b2 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = High +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +weight = 3 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 50 +cool_fan_speed_0 = 50 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.2 +material_bed_temperature = 80 +material_diameter = 1.7 +material_print_temperature = 230 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 4.5 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 60 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 50 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg new file mode 100644 index 0000000000..dfe39f87f2 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = Normal +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +weight = 2 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 50 +cool_fan_speed_0 = 50 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.2 +material_bed_temperature = 80 +material_diameter = 1.7 +material_print_temperature = 230 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 4.5 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 60 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 60 +speed_print = 60 +speed_support = 30 +speed_topbottom = 30 +speed_travel = 100 +speed_wall = 60 +speed_wall_x = 60 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg new file mode 100644 index 0000000000..c4f6f5ecae --- /dev/null +++ b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = Coarse +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = coarse +material = generic_pla_175 +weight = 0 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.3 +material_bed_temperature = 60 +material_diameter = 1.7 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 7 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 60 +speed_print = 60 +speed_support = 60 +speed_topbottom = 30 +speed_travel = 100 +speed_wall = 60 +speed_wall_x = 60 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg new file mode 100644 index 0000000000..009bd89c16 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = High +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = high +material = generic_pla_175 +weight = 2 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.3 +material_bed_temperature = 60 +material_diameter = 1.7 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 7 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 50 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg new file mode 100644 index 0000000000..907b95fb71 --- /dev/null +++ b/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 2 +name = Normal +definition = anycubic_i3_mega + +[metadata] +type = quality +quality_type = normal +material = generic_pla_175 +weight = 1 +setting_version = 4 + +[values] +acceleration_enabled = True +acceleration_print = 2000 +acceleration_travel = 3500 +adhesion_type = skirt +cool_fan_full_at_height = 0.5 +cool_fan_speed = 100 +cool_fan_speed_0 = 100 +infill_overlap = 15 +infill_sparse_density = 25 +initial_layer_line_width_factor = 140 +jerk_enabled = True +jerk_print = 13 +jerk_travel = 13 +layer_height_0 = 0.3 +material_bed_temperature = 60 +material_diameter = 1.7 +material_print_temperature = 200 +material_print_temperature_layer_0 = 0 +retract_at_layer_change = False +retraction_amount = 7 +retraction_hop = 0.075 +retraction_hop_enabled = True +retraction_hop_only_when_collides = True +retraction_min_travel = 1.5 +retraction_speed = 40 +skirt_brim_speed = 40 +skirt_gap = 5 +skirt_line_count = 3 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 100 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = False +support_interface_enable = False +support_pattern = triangles +support_roof_enable = False +support_type = everywhere +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 +infill_pattern = zigzag +support_use_towers = False \ No newline at end of file From b782b532fcbc1ee07781a7c50d236b16759bb3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Fri, 29 Dec 2017 23:27:39 +0100 Subject: [PATCH 720/764] Update to new machine_gcode_flavor definition --- resources/definitions/anycubic_i3_mega.def.json | 2 +- resources/definitions/tevo_blackwidow.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index 5e35ab1fdd..3c0925a2d5 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -43,7 +43,7 @@ "default_value":0 }, "machine_gcode_flavor":{ - "default_value":"RepRap (Marlin/Sprinter)" + "default_value":"Marlin" }, "machine_start_gcode":{ "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index f31bbcff23..f37ed9f24e 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -39,7 +39,7 @@ "default_value": 0 }, "machine_gcode_flavor": { - "default_value": "RepRap (Marlin/Sprinter)" + "default_value": "Marlin" }, "speed_travel": { "default_value": 70 From 7aaedff8afe7c99713cf0b7764f6378c3dfaa8b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sat, 30 Dec 2017 00:17:36 +0100 Subject: [PATCH 721/764] Reverted back to use of RepRap (Marlin/Sprinter) --- resources/definitions/anycubic_i3_mega.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index 3c0925a2d5..01abeb2079 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -43,7 +43,7 @@ "default_value":0 }, "machine_gcode_flavor":{ - "default_value":"Marlin" + "default_value":"RepRap (Marlin/Sprinter)" }, "machine_start_gcode":{ "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" @@ -52,4 +52,4 @@ "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } -} \ No newline at end of file +} From 04589596f04f2b6c094674dd7ccfe8f8260111fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sat, 30 Dec 2017 00:18:15 +0100 Subject: [PATCH 722/764] Reverted back to use of RepRap (Marlin/Sprinter) --- resources/definitions/tevo_blackwidow.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index f37ed9f24e..f31bbcff23 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -39,7 +39,7 @@ "default_value": 0 }, "machine_gcode_flavor": { - "default_value": "Marlin" + "default_value": "RepRap (Marlin/Sprinter)" }, "speed_travel": { "default_value": 70 From 5690aef3d55c08e9165e5e46328c4e4555b162f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sat, 30 Dec 2017 01:58:22 +0100 Subject: [PATCH 723/764] Added 3D Platform for Anycubic i3 Mega --- resources/definitions/anycubic_i3_mega.def.json | 2 +- resources/meshes/anycubic_i3_mega_platform.stl | Bin 0 -> 2284 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 resources/meshes/anycubic_i3_mega_platform.stl diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index 01abeb2079..cdf29ef4c1 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -8,7 +8,7 @@ "manufacturer":"Anycubic", "file_formats":"text/x-gcode", "icon":"icon_ultimaker2", - "platform":"prusai3_platform.stl", + "platform":"anycubic_i3_mega_platform.stl", "has_materials": true, "has_machine_quality": true, "preferred_quality": "*normal*" diff --git a/resources/meshes/anycubic_i3_mega_platform.stl b/resources/meshes/anycubic_i3_mega_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..cc3651b9f3acd67fa5ba55233ca0af407b90e003 GIT binary patch literal 2284 zcma)-Jx&8b4235W2iXHqgzzV&LL*8Fq=2X+lp+NbQRq{0oD}Ja_5@K5!Wpoi?OA8m zB%w01^NruLJ(JhP^mG38(M(>R-WK!aY|%`n%jSC6JkH*m(eUcN8D5QVZpWj$bk^Tx zwQI26<&^gAAU$t6{{7yyDXq4Hv`5VAhlqW-NDn`b*w{(Dew^TZMqBQffGSmTl4x1G z`aldHYxX1l!W`K-r%I4>sR-69LeEkqmSaN|K^!>ugxh6AP+g~<4T3DIF8qHSR%2 zXlFxJ*%L0N3P^8y&iPAL=S94GD|?V__wpXJWG-W*p|(eXX!T5%4Wa8%T0H>}k`bt^ia zDDh!nxIT72*oV3e BxSs$3 literal 0 HcmV?d00001 From 391adbdfb3aae0063ff4f25407122f96761f1251 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sat, 30 Dec 2017 02:24:23 +0100 Subject: [PATCH 724/764] Remove ID from definition files --- resources/definitions/builder_premium_large.def.json | 1 - resources/definitions/builder_premium_medium.def.json | 1 - resources/definitions/builder_premium_small.def.json | 1 - resources/definitions/deltacomb.def.json | 1 - 4 files changed, 4 deletions(-) diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json index 5fc4b46c98..b496dc524e 100644 --- a/resources/definitions/builder_premium_large.def.json +++ b/resources/definitions/builder_premium_large.def.json @@ -1,5 +1,4 @@ { - "id": "builder_premium_large", "version": 2, "name": "Builder Premium Large", "inherits": "fdmprinter", diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json index 56dab8f863..fe8a039fc4 100644 --- a/resources/definitions/builder_premium_medium.def.json +++ b/resources/definitions/builder_premium_medium.def.json @@ -1,5 +1,4 @@ { - "id": "builder_premium_medium", "version": 2, "name": "Builder Premium Medium", "inherits": "fdmprinter", diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json index 65103ce1af..a1660b63cf 100644 --- a/resources/definitions/builder_premium_small.def.json +++ b/resources/definitions/builder_premium_small.def.json @@ -1,5 +1,4 @@ { - "id": "builder_premium_small", "version": 2, "name": "Builder Premium Small", "inherits": "fdmprinter", diff --git a/resources/definitions/deltacomb.def.json b/resources/definitions/deltacomb.def.json index 031bd12156..7e6e956dbc 100644 --- a/resources/definitions/deltacomb.def.json +++ b/resources/definitions/deltacomb.def.json @@ -1,5 +1,4 @@ { - "id": "deltacomb", "version": 2, "name": "Deltacomb 3D", "inherits": "fdmprinter", From 28919a57a4ab98e13465e8c31158fecc6239a307 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sat, 30 Dec 2017 16:58:52 +0100 Subject: [PATCH 725/764] Fix testing whether tests exist on older CMake The string equality works on the 3.6 but not on 3.5. This works on 3.5, so I hope it also works on 3.6 (but I don't have that computer with me right now). --- cmake/CuraTests.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/CuraTests.cmake b/cmake/CuraTests.cmake index 3cb5a705b3..f93313e39a 100644 --- a/cmake/CuraTests.cmake +++ b/cmake/CuraTests.cmake @@ -29,7 +29,7 @@ function(cura_add_test) endif() get_test_property(${_NAME} ENVIRONMENT test_exists) #Find out if the test exists by getting a property from it that always exists (such as ENVIRONMENT because we set that ourselves). - if (${test_exists} EQUAL "NOTFOUND") + if (NOT ${test_exists}) add_test( NAME ${_NAME} COMMAND ${PYTHON_EXECUTABLE} -m pytest --junitxml=${CMAKE_BINARY_DIR}/junit-${_NAME}.xml ${_DIRECTORY} From 80ba5fc97dc4e328e1303bc5fd7cd3e337fb0585 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sat, 30 Dec 2017 17:11:11 +0100 Subject: [PATCH 726/764] Fix PYTHONPATH pass-through This makes sure that any pythonpath on the user's environment is also used for these tests. The same fix as here: https://github.com/Ultimaker/Uranium/commit/31106cd60af774d8cd0ed24e18615a6491212b34 --- cmake/CuraTests.cmake | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmake/CuraTests.cmake b/cmake/CuraTests.cmake index f93313e39a..ffe4616bf3 100644 --- a/cmake/CuraTests.cmake +++ b/cmake/CuraTests.cmake @@ -24,8 +24,10 @@ function(cura_add_test) if(WIN32) string(REPLACE "|" "\\;" _PYTHONPATH ${_PYTHONPATH}) + set(_PYTHONPATH "${_PYTHONPATH}\\;$ENV{PYTHONPATH}") else() string(REPLACE "|" ":" _PYTHONPATH ${_PYTHONPATH}) + set(_PYTHONPATH "${_PYTHONPATH}:$ENV{PYTHONPATH}") endif() get_test_property(${_NAME} ENVIRONMENT test_exists) #Find out if the test exists by getting a property from it that always exists (such as ENVIRONMENT because we set that ourselves). From 689a18ee5788d46fd0d27a83b3fac242aea6e30b Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sat, 30 Dec 2017 19:35:46 +0100 Subject: [PATCH 727/764] Rename sidebar_collapsed and code style sidebar_collapsed is more consistent with other options and setting names we use. Better change it before the next release rolls out otherwise we'd have to do a version upgrade. Also changed some code style things to be in line with our guidelines. Contributes to issue CURA-4234. --- cura/CuraApplication.py | 2 +- resources/qml/Cura.qml | 7 ++++--- resources/qml/Topbar.qml | 7 +++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1dce1039db..fec5abd871 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -316,7 +316,7 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/material_settings", "{}") preferences.addPreference("view/invert_zoom", False) - preferences.addPreference("cura/sidebar_collapse", False) + preferences.addPreference("cura/sidebar_collapsed", False) self._need_to_show_user_agreement = not Preferences.getInstance().getValue("general/accepted_user_agreement") diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index efe956939b..0f55ad07fa 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -401,7 +401,7 @@ UM.MainWindow collapseSidebarAnimation.start(); } collapsed = !collapsed; - UM.Preferences.setValue("cura/sidebar_collapse", collapsed); + UM.Preferences.setValue("cura/sidebar_collapsed", collapsed); } anchors @@ -432,9 +432,10 @@ UM.MainWindow Component.onCompleted: { - var sidebarCollapsed = UM.Preferences.getValue("cura/sidebar_collapse"); + var sidebar_collapsed = UM.Preferences.getValue("cura/sidebar_collapsed"); - if (sidebarCollapsed) { + if (sidebar_collapsed) + { sidebar.collapsed = true; viewportRect = Qt.rect(0, 0, 1, 1.0) collapseSidebarAnimation.start(); diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 9b67856fc8..c016c155a5 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -25,9 +25,12 @@ Rectangle property int allItemsWidth: 0; function updateMarginsAndSizes() { - if (UM.Preferences.getValue("cura/sidebar_collapse")) { + if (UM.Preferences.getValue("cura/sidebar_collapsed")) + { rightMargin = UM.Theme.getSize("default_margin").width; - } else { + } + else + { rightMargin = UM.Theme.getSize("sidebar").width + UM.Theme.getSize("default_margin").width; } allItemsWidth = ( From 948497c9a88bb23491d449d0c2231c56037da8dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sun, 31 Dec 2017 03:23:19 +0100 Subject: [PATCH 728/764] Major update of Quality profiles and definitions Removed has_materials, quality over quantity --- .../definitions/anycubic_i3_mega.def.json | 4 +- .../definitions/tevo_blackwidow.def.json | 13 ++-- ...st.cfg => anycubic_i3_mega_draft.inst.cfg} | 21 +++---- ...bic_i3_mega_global_Coarse_Quality.inst.cfg | 43 -------------- ...cubic_i3_mega_global_High_Quality.inst.cfg | 43 -------------- ...bic_i3_mega_global_Normal_Quality.inst.cfg | 43 -------------- ...nst.cfg => anycubic_i3_mega_high.inst.cfg} | 17 +++--- ...t.cfg => anycubic_i3_mega_normal.inst.cfg} | 17 +++--- .../anycubic_i3_mega_petg_coarse.inst.cfg | 59 ------------------- .../petg/anycubic_i3_mega_petg_high.inst.cfg | 59 ------------------- .../anycubic_i3_mega_petg_normal.inst.cfg | 59 ------------------- .../tevo_blackwidow_draft.inst.cfg | 33 +++++++++++ .../tevo_blackwidow_high.inst.cfg | 33 +++++++++++ .../tevo_blackwidow_normal.inst.cfg | 33 +++++++++++ 14 files changed, 135 insertions(+), 342 deletions(-) rename resources/quality/anycubic_i3_mega/{pla/anycubic_i3_mega_pla_coarse.inst.cfg => anycubic_i3_mega_draft.inst.cfg} (83%) delete mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg delete mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg delete mode 100644 resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg rename resources/quality/anycubic_i3_mega/{pla/anycubic_i3_mega_pla_high.inst.cfg => anycubic_i3_mega_high.inst.cfg} (85%) rename resources/quality/anycubic_i3_mega/{pla/anycubic_i3_mega_pla_normal.inst.cfg => anycubic_i3_mega_normal.inst.cfg} (85%) delete mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg delete mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg delete mode 100644 resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg create mode 100644 resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg create mode 100644 resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg create mode 100644 resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index cdf29ef4c1..a0bd0efb7c 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -9,7 +9,7 @@ "file_formats":"text/x-gcode", "icon":"icon_ultimaker2", "platform":"anycubic_i3_mega_platform.stl", - "has_materials": true, + "has_materials": false, "has_machine_quality": true, "preferred_quality": "*normal*" }, @@ -40,7 +40,7 @@ "default_value":1.75 }, "gantry_height":{ - "default_value":0 + "default_value":0 }, "machine_gcode_flavor":{ "default_value":"RepRap (Marlin/Sprinter)" diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index f31bbcff23..19ef2a45e2 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -8,7 +8,10 @@ "manufacturer": "Tevo", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", - "platform": "prusai3_platform.stl" + "has_materials": false, + "has_machine_quality": true, + "platform": "prusai3_platform.stl", + "preferred_quality": "*normal*" }, "overrides": { "machine_name": { @@ -33,7 +36,7 @@ "default_value": 0.4 }, "material_diameter": { - "default_value": 1.75 + "default_value": 1.75 }, "gantry_height": { "default_value": 0 @@ -41,12 +44,6 @@ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "speed_travel": { - "default_value": 70 - }, - "speed_print": { - "default_value": 60 - }, "machine_start_gcode": { "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\M420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\G28 ; home all\G29 ; probe bed\G92 E0 ;zero the extruded length\G1 X0.0 Y50.0 Z10.0 F3600\; perform wipe and prime\G1 Z0.0 F1000\G1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\G1 Y100.0 E12.5 F1000.0 ; prime\G92 E0 ; zero extruder again\M117 Printing..." }, diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg similarity index 83% rename from resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg rename to resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg index c4f6f5ecae..e46fb38e57 100644 --- a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_coarse.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg @@ -1,12 +1,11 @@ [general] version = 2 -name = Coarse +name = Draft definition = anycubic_i3_mega [metadata] type = quality -quality_type = coarse -material = generic_pla_175 +quality_type = draft weight = 0 setting_version = 4 @@ -15,16 +14,19 @@ acceleration_enabled = True acceleration_print = 2000 acceleration_travel = 3500 adhesion_type = skirt +brim_width = 4.0 cool_fan_full_at_height = 0.5 cool_fan_speed = 100 cool_fan_speed_0 = 100 infill_overlap = 15 +infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True jerk_print = 13 jerk_travel = 13 -layer_height_0 = 0.3 +layer_height = 0.4 +layer_height_0 = 0.4 material_bed_temperature = 60 material_diameter = 1.7 material_print_temperature = 200 @@ -47,13 +49,12 @@ speed_travel = 100 speed_wall = 60 speed_wall_x = 60 support_angle = 60 -support_enable = False -support_interface_enable = False +support_enable = True +support_interface_enable = True support_pattern = triangles -support_roof_enable = False +support_roof_enable = True support_type = everywhere +support_use_towers = False support_xy_distance = 0.7 top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file +wall_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg deleted file mode 100644 index 721aa4f25b..0000000000 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,43 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = coarse -global_quality = True -weight = -3 -setting_version = 4 - -[values] -layer_height = 0.4 -layer_height_0 = =layer_height - -skin_angles = [0,90] - -infill_before_walls = False -infill_angles = [0,90] - -speed_slowdown_layers = 1 -acceleration_print = 2000 -acceleration_travel = 3000 -jerk_print = 13 -jerk_travel = 13 - -retraction_combing = off - -support_z_distance = 0 -support_xy_distance = 0.7 -support_join_distance = 10 -support_interface_enable = True -support_interface_pattern = triangles - -adhesion_type = skirt -skirt_gap = 1 -speed_infill = 50 -speed_print = 50 -speed_support = 30 -speed_topbottom = 20 -speed_travel = 100 -speed_wall = 50 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg deleted file mode 100644 index e69d70828d..0000000000 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_High_Quality.inst.cfg +++ /dev/null @@ -1,43 +0,0 @@ -[general] -version = 2 -name = High -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = high -global_quality = True -weight = 1 -setting_version = 4 - -[values] -layer_height = 0.1 -layer_height_0 = =0.2 if min(extruderValues('machine_nozzle_size')) < 0.3 else 0.3 - -skin_angles = [0,90] - -infill_before_walls = False -infill_angles = [0,90] - -speed_slowdown_layers = 1 -acceleration_print = 2000 -acceleration_travel = 3000 -jerk_print = 13 -jerk_travel = 13 - -retraction_combing = off - -support_z_distance = 0 -support_xy_distance = 0.7 -support_join_distance = 10 -support_interface_enable = True -support_interface_pattern = triangles - -adhesion_type = skirt -skirt_gap = 1 -speed_infill = 50 -speed_print = 50 -speed_support = 30 -speed_topbottom = 20 -speed_travel = 50 -speed_wall = 50 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg deleted file mode 100644 index bab515eae4..0000000000 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_global_Normal_Quality.inst.cfg +++ /dev/null @@ -1,43 +0,0 @@ -[general] -version = 2 -name = Normal -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = normal -global_quality = True -weight = 0 -setting_version = 4 - -[values] -layer_height = 0.2 -layer_height_0 = =0.2 if min(extruderValues('machine_nozzle_size')) < 0.3 else 0.3 - -skin_angles = [0,90] - -infill_before_walls = False -infill_angles = [0,90] - -speed_slowdown_layers = 1 -acceleration_print = 2000 -acceleration_travel = 3000 -jerk_print = 13 -jerk_travel = 13 - -retraction_combing = off - -support_z_distance = 0 -support_xy_distance = 0.7 -support_join_distance = 10 -support_interface_enable = True -support_interface_pattern = triangles - -adhesion_type = skirt -skirt_gap = 1 -speed_infill = 60 -speed_print = 60 -speed_support = 60 -speed_topbottom = 30 -speed_travel = 60 -speed_wall = 60 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg similarity index 85% rename from resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg rename to resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg index 009bd89c16..0dcedf664e 100644 --- a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_high.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg @@ -6,7 +6,6 @@ definition = anycubic_i3_mega [metadata] type = quality quality_type = high -material = generic_pla_175 weight = 2 setting_version = 4 @@ -15,16 +14,19 @@ acceleration_enabled = True acceleration_print = 2000 acceleration_travel = 3500 adhesion_type = skirt +brim_width = 4.0 cool_fan_full_at_height = 0.5 cool_fan_speed = 100 cool_fan_speed_0 = 100 infill_overlap = 15 +infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True jerk_print = 13 jerk_travel = 13 -layer_height_0 = 0.3 +layer_height = 0.1 +layer_height_0 = 0.1 material_bed_temperature = 60 material_diameter = 1.7 material_print_temperature = 200 @@ -47,13 +49,12 @@ speed_travel = 50 speed_wall = 50 speed_wall_x = 50 support_angle = 60 -support_enable = False -support_interface_enable = False +support_enable = True +support_interface_enable = True support_pattern = triangles -support_roof_enable = False +support_roof_enable = True support_type = everywhere +support_use_towers = False support_xy_distance = 0.7 top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file +wall_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg similarity index 85% rename from resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg rename to resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg index 907b95fb71..d528e5f86f 100644 --- a/resources/quality/anycubic_i3_mega/pla/anycubic_i3_mega_pla_normal.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg @@ -6,7 +6,6 @@ definition = anycubic_i3_mega [metadata] type = quality quality_type = normal -material = generic_pla_175 weight = 1 setting_version = 4 @@ -15,16 +14,19 @@ acceleration_enabled = True acceleration_print = 2000 acceleration_travel = 3500 adhesion_type = skirt +brim_width = 4.0 cool_fan_full_at_height = 0.5 cool_fan_speed = 100 cool_fan_speed_0 = 100 infill_overlap = 15 +infill_pattern = zigzag infill_sparse_density = 25 initial_layer_line_width_factor = 140 jerk_enabled = True jerk_print = 13 jerk_travel = 13 -layer_height_0 = 0.3 +layer_height = 0.2 +layer_height_0 = 0.2 material_bed_temperature = 60 material_diameter = 1.7 material_print_temperature = 200 @@ -47,13 +49,12 @@ speed_travel = 100 speed_wall = 50 speed_wall_x = 50 support_angle = 60 -support_enable = False -support_interface_enable = False +support_enable = True +support_interface_enable = True support_pattern = triangles -support_roof_enable = False +support_roof_enable = True support_type = everywhere +support_use_towers = False support_xy_distance = 0.7 top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file +wall_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg deleted file mode 100644 index 682e198f78..0000000000 --- a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_coarse.inst.cfg +++ /dev/null @@ -1,59 +0,0 @@ -[general] -version = 2 -name = Coarse -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = coarse -material = generic_petg_175 -weight = 1 -setting_version = 4 - -[values] -acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 -adhesion_type = skirt -cool_fan_full_at_height = 0.5 -cool_fan_speed = 50 -cool_fan_speed_0 = 50 -infill_overlap = 15 -infill_sparse_density = 25 -initial_layer_line_width_factor = 140 -jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 -layer_height_0 = 0.2 -material_bed_temperature = 80 -material_diameter = 1.7 -material_print_temperature = 230 -material_print_temperature_layer_0 = 0 -retract_at_layer_change = False -retraction_amount = 4.5 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 60 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = 60 -speed_print = 60 -speed_support = 30 -speed_topbottom = 30 -speed_travel = 100 -speed_wall = 60 -speed_wall_x = 60 -support_angle = 60 -support_enable = False -support_interface_enable = False -support_pattern = triangles -support_roof_enable = False -support_type = everywhere -support_xy_distance = 0.7 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg deleted file mode 100644 index 5a22a4c0b2..0000000000 --- a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_high.inst.cfg +++ /dev/null @@ -1,59 +0,0 @@ -[general] -version = 2 -name = High -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = high -material = generic_petg_175 -weight = 3 -setting_version = 4 - -[values] -acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 -adhesion_type = skirt -cool_fan_full_at_height = 0.5 -cool_fan_speed = 50 -cool_fan_speed_0 = 50 -infill_overlap = 15 -infill_sparse_density = 25 -initial_layer_line_width_factor = 140 -jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 -layer_height_0 = 0.2 -material_bed_temperature = 80 -material_diameter = 1.7 -material_print_temperature = 230 -material_print_temperature_layer_0 = 0 -retract_at_layer_change = False -retraction_amount = 4.5 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 60 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = 50 -speed_print = 50 -speed_support = 30 -speed_topbottom = 20 -speed_travel = 50 -speed_wall = 50 -speed_wall_x = 50 -support_angle = 60 -support_enable = False -support_interface_enable = False -support_pattern = triangles -support_roof_enable = False -support_type = everywhere -support_xy_distance = 0.7 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file diff --git a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg b/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg deleted file mode 100644 index dfe39f87f2..0000000000 --- a/resources/quality/anycubic_i3_mega/petg/anycubic_i3_mega_petg_normal.inst.cfg +++ /dev/null @@ -1,59 +0,0 @@ -[general] -version = 2 -name = Normal -definition = anycubic_i3_mega - -[metadata] -type = quality -quality_type = normal -material = generic_petg_175 -weight = 2 -setting_version = 4 - -[values] -acceleration_enabled = True -acceleration_print = 2000 -acceleration_travel = 3500 -adhesion_type = skirt -cool_fan_full_at_height = 0.5 -cool_fan_speed = 50 -cool_fan_speed_0 = 50 -infill_overlap = 15 -infill_sparse_density = 25 -initial_layer_line_width_factor = 140 -jerk_enabled = True -jerk_print = 13 -jerk_travel = 13 -layer_height_0 = 0.2 -material_bed_temperature = 80 -material_diameter = 1.7 -material_print_temperature = 230 -material_print_temperature_layer_0 = 0 -retract_at_layer_change = False -retraction_amount = 4.5 -retraction_hop = 0.075 -retraction_hop_enabled = True -retraction_hop_only_when_collides = True -retraction_min_travel = 1.5 -retraction_speed = 60 -skirt_brim_speed = 40 -skirt_gap = 5 -skirt_line_count = 3 -speed_infill = 60 -speed_print = 60 -speed_support = 30 -speed_topbottom = 30 -speed_travel = 100 -speed_wall = 60 -speed_wall_x = 60 -support_angle = 60 -support_enable = False -support_interface_enable = False -support_pattern = triangles -support_roof_enable = False -support_type = everywhere -support_xy_distance = 0.7 -top_bottom_thickness = 1.2 -wall_thickness = 1.2 -infill_pattern = zigzag -support_use_towers = False \ No newline at end of file diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg new file mode 100644 index 0000000000..21169e428b --- /dev/null +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg @@ -0,0 +1,33 @@ +[general] +version = 2 +name = Draft +definition = tevo_blackwidow + +[metadata] +type = quality +quality_type = draft +weight = -2 +setting_version = 4 + +[values] +brim_width = 4.0 +infill_pattern = zigzag +layer_height = 0.4 +material_diameter = 1.7 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 100 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg new file mode 100644 index 0000000000..60f51b6826 --- /dev/null +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg @@ -0,0 +1,33 @@ +[general] +version = 2 +name = High +definition = tevo_blackwidow + +[metadata] +type = quality +quality_type = high +weight = 1 +setting_version = 4 + +[values] +brim_width = 4.0 +infill_pattern = zigzag +layer_height = 0.1 +material_diameter = 1.7 +speed_infill = 50 +speed_print = 50 +speed_support = 30 +speed_topbottom = 15 +speed_travel = 100 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg new file mode 100644 index 0000000000..51f5894885 --- /dev/null +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg @@ -0,0 +1,33 @@ +[general] +version = 2 +name = Normal +definition = tevo_blackwidow + +[metadata] +type = quality +quality_type = normal +weight = 0 +setting_version = 4 + +[values] +brim_width = 4.0 +infill_pattern = zigzag +layer_height = 0.2 +material_diameter = 1.7 +speed_infill = 60 +speed_print = 50 +speed_support = 30 +speed_topbottom = 20 +speed_travel = 100 +speed_wall = 50 +speed_wall_x = 50 +support_angle = 60 +support_enable = True +support_interface_enable = True +support_pattern = triangles +support_roof_enable = True +support_type = everywhere +support_use_towers = False +support_xy_distance = 0.7 +top_bottom_thickness = 1.2 +wall_thickness = 1.2 \ No newline at end of file From 7a0b49ca2ffc435218e767a788ab603baa093cf9 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 31 Dec 2017 10:53:53 +0100 Subject: [PATCH 729/764] Allow specifying the extruder stack to use for each replacement pattern The replacement pattern is (optionally) extended with an extruder_nr: {setting_key,extruder_nr}. The extruder_nr can either be a number (-1 for the global stack, 0 or higher for an extruder), or a setting keyword such as support_extruder_nr etc. Contributes to #1296 --- plugins/CuraEngineBackend/StartSliceJob.py | 55 ++++++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 21b3973bc6..22a0fc5e18 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -36,9 +36,32 @@ class StartJobResult(IntEnum): ## Formatter class that handles token expansion in start/end gcod class GcodeStartEndFormatter(Formatter): def get_value(self, key, args, kwargs): # [CodeStyle: get_value is an overridden function from the Formatter class] + # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key), + # and a default_extruder_nr to use when no extruder_nr is specified + if isinstance(key, str): try: - return kwargs[key] + extruder_nr = kwargs["default_extruder_nr"] + except ValueError: + extruder_nr = -1 + + key_fragments = [fragment.strip() for fragment in key.split(',')] + if len(key_fragments) == 2: + try: + extruder_nr = int(key_fragments[1]) + except ValueError: + try: + extruder_nr = int(kwargs["-1"][key_fragments[1]]) # get extruder_nr values from the global stack + except (KeyError, ValueError): + # either the key does not exist, or the value is not an int + Logger.log("w", "Unable to determine stack nr '%s' for key '%s' in start/end gcode, using global stack", key_fragments[1], key_fragments[0]) + elif len(key_fragments) != 1: + Logger.log("w", "Incorrectly formatted placeholder '%s' in start/end gcode", key) + return "{" + str(key) + "}" + + key = key_fragments[0] + try: + return kwargs[str(extruder_nr)][key] except KeyError: Logger.log("w", "Unable to replace '%s' placeholder in start/end gcode", key) return "{" + key + "}" @@ -56,6 +79,8 @@ class StartSliceJob(Job): self._slice_message = slice_message self._is_cancelled = False + self._all_extruders_settings = None # cache for all setting values from all stacks (global & extruder) for the current machine + def getSliceMessage(self): return self._slice_message @@ -237,12 +262,21 @@ class StartSliceJob(Job): ## Replace setting tokens in a piece of g-code. # \param value A piece of g-code to replace tokens in. - # \param settings A dictionary of tokens to replace and their respective - # replacement strings. - def _expandGcodeTokens(self, value: str, settings: dict): + # \param default_extruder_nr Stack nr to use when no stack nr is specified, defaults to the global stack + def _expandGcodeTokens(self, value: str, default_extruder_nr: int = -1): + if not self._all_extruders_settings: + global_stack = Application.getInstance().getGlobalContainerStack() + self._all_extruders_settings = {} + # keys must be strings for the string formatter + self._all_extruders_settings["-1"] = self._buildReplacementTokens(global_stack) + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + extruder_nr = extruder_stack.getProperty("extruder_nr", "value") + self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack) try: # any setting can be used as a token fmt = GcodeStartEndFormatter() + settings = self._all_extruders_settings.copy() + settings["default_extruder_nr"] = default_extruder_nr return str(fmt.format(value, **settings)) except: Logger.logException("w", "Unable to do token replacement on start/end gcode") @@ -259,8 +293,9 @@ class StartSliceJob(Job): settings["material_guid"] = stack.material.getMetaDataEntry("GUID", "") # Replace the setting tokens in start and end g-code. - settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], settings) - settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], settings) + extruder_nr = stack.getProperty("extruder_nr", "value") + settings["machine_extruder_start_code"] = self._expandGcodeTokens(settings["machine_extruder_start_code"], extruder_nr) + settings["machine_extruder_end_code"] = self._expandGcodeTokens(settings["machine_extruder_end_code"], extruder_nr) for key, value in settings.items(): # Do not send settings that are not settable_per_extruder. @@ -286,12 +321,12 @@ class StartSliceJob(Job): settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) # Find the correct temperatures from the first used extruder - extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0] - extruder_0_settings = self._buildReplacementTokens(extruder_stack) + initial_extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0] + initial_extruder_nr = initial_extruder_stack.getProperty("extruder_nr", "value") # Replace the setting tokens in start and end g-code. - settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], extruder_0_settings) - settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], extruder_0_settings) + settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr) + settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr) # Add all sub-messages for each individual setting. for key, value in settings.items(): From 308d220bf3ca1acd3ede6ca275f5e4e71fb5b206 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 31 Dec 2017 12:30:00 +0100 Subject: [PATCH 730/764] Add an "initial_extruder_nr" pattern --- plugins/CuraEngineBackend/StartSliceJob.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 22a0fc5e18..c5182cc753 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -258,6 +258,10 @@ class StartSliceJob(Job): result["date"] = time.strftime("%d-%m-%Y") result["day"] = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][int(time.strftime("%w"))] + initial_extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0] + initial_extruder_nr = initial_extruder_stack.getProperty("extruder_nr", "value") + result["initial_extruder_nr"] = initial_extruder_nr + return result ## Replace setting tokens in a piece of g-code. @@ -266,9 +270,11 @@ class StartSliceJob(Job): def _expandGcodeTokens(self, value: str, default_extruder_nr: int = -1): if not self._all_extruders_settings: global_stack = Application.getInstance().getGlobalContainerStack() + self._all_extruders_settings = {} - # keys must be strings for the string formatter + # NB: keys must be strings for the string formatter self._all_extruders_settings["-1"] = self._buildReplacementTokens(global_stack) + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): extruder_nr = extruder_stack.getProperty("extruder_nr", "value") self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack) @@ -320,11 +326,11 @@ class StartSliceJob(Job): print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) - # Find the correct temperatures from the first used extruder + # Replace the setting tokens in start and end g-code. + # Use values from the first used extruder by default so we get the expected temperatures initial_extruder_stack = Application.getInstance().getExtruderManager().getUsedExtruderStacks()[0] initial_extruder_nr = initial_extruder_stack.getProperty("extruder_nr", "value") - # Replace the setting tokens in start and end g-code. settings["machine_start_gcode"] = self._expandGcodeTokens(settings["machine_start_gcode"], initial_extruder_nr) settings["machine_end_gcode"] = self._expandGcodeTokens(settings["machine_end_gcode"], initial_extruder_nr) From 5104a48bcc9a1655b756ba8aea54754ecf25d4e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B8rn?= Date: Sun, 31 Dec 2017 23:15:00 +0100 Subject: [PATCH 731/764] Added 3D model for Tevo Black Widow + small fix Roel Versteeg (Rovex) has kindly agreed to let us use his model of the printer, https://www.thingiverse.com/thing:1933864 Since the model is a bit to detailed for our use I have spoken with Jon MC (security0051) that had already modified for better fit in editor. https://www.thingiverse.com/thing:2592417. He has also agreed to let us use his version. --- resources/meshes/tevo_blackwidow.stl | Bin 0 -> 4330684 bytes .../anycubic_i3_mega_draft.inst.cfg | 2 +- .../anycubic_i3_mega_high.inst.cfg | 2 +- .../anycubic_i3_mega_normal.inst.cfg | 2 +- .../tevo_blackwidow_draft.inst.cfg | 2 +- .../tevo_blackwidow_high.inst.cfg | 2 +- .../tevo_blackwidow_normal.inst.cfg | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 resources/meshes/tevo_blackwidow.stl diff --git a/resources/meshes/tevo_blackwidow.stl b/resources/meshes/tevo_blackwidow.stl new file mode 100644 index 0000000000000000000000000000000000000000..ef45dd1621cd2a0c949e16410456820f4138c252 GIT binary patch literal 4330684 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%0A|V2$?MmF1Xv9mk zltvmhJmRHeHGWsY=qHcdc^X9dSWUH*=2saXM@iJVgz*xtg|Dm}ZQmFon;dN;9iO!o zX(^q?to?iKOTiyOX&*d&N=@ZGW6XwqW!-9wm0dhh{Em9=Utg6-3R=h^X{7yqXe^wO z34AkU^uuD|>G#MUV&Uo6Nl27t^uxctO8;T&IgwxX8ORAnbbRMNx+8%RB;PqC+Ls^= z+WQarf>q*|Dzq~6EZK^J@K!XO)MQT=CpD>-()8!Oz0y_K{AyuuD*fhR-{sS<96fxa z7cHgvEyUlseCM>@0Qt3kBK@{$WhwpU>E%iZexrp%dl~Ilk|ea$cIPjIQ>~)AO~*B8 zspC68C7ex#l8BSDv==VY$gTGVQWD!)5)oBlImVX;mRuMuTz(C;k8!AA0^dN znqv`f8FYM}f8iODeILSG)3+Iq&-L9Zt^G>;m5j3~P;0d{&{iTQR7+{C|K)pyp){a= za33f0Mbeei?q%rrkD`{+NV_M)ugKgt3Z)tn_zBR0pAh>DB)D%>rj_pMXmq;spWBc( zn61^v7+LE|TtAdhEw0rE&9(YI+SV`b^epg|mHSkojp9mnZ?BY4Ev4y~lz*>Pf}Rsv zwb+J!uPtifxgjU`9cgb9!${a#IK;x~Cz_XRW3m zWr=I`y%m)xXSQn{N?ehK4KIlrt>xDjv_AZHgBFKhYrOSQLba4uuO|Nf!5t3}@zA_; zR|Joj==YDJ7V=ISX}@!co|hOUhi||byZMab0mkR0Mq26DaHG@MyL%b(HN3>H-tfF& z5A~4*a^-}cm#SJy^IN+6aB`AaiIHE6C#G|l&^l|YU5F=&mePzTdpt3k*C&3IdXws9 zMqlDes>N?s*>Yp69UbSV2{aqR3WcxFq z%~0PrZcDgp_K21+>+t7e%`1Y3-1WP$_Rh^K4!`65yH8Cb?99EOsD+Y2+RJY7yPCE# zY|qhtXsZ;BAlr*txGq{B_6*+o$gHrE)@LmlT4LhZt7<8&^*^jPc)-^#ef;sF1$CAF ztgJQb+O6!<9np>OgDU1BFuSI=~??e3dnxYoo0coVYo@=a+yZXUz<8FT# zw{cHEkI5*ZT1s7_wk3!XRwn5@Dw3YntLAl`;f0P zQLYftK~4}!V|2%(YC3~XwRnbtUDv z^{1!@Tp^DV&UN%&+I5bwYAMZCtzM&|(OtUV62^nvX~>>*y5Ew&4<%HKyS3P8GTm

    yhkuAT>f-yqe4 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

    (ko7(vw2M$zj@I@qRR_ai0|Hh_$w|S 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�H;7tL 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%0AmoLwkE=(!HcT{+serv03wizUkuVc2hx_Rh5|pG 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

    3vuv{p4;X+5eZanr+tudNkaU%E|>K^ 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�Z(WJCA6duzx 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

    X!~& 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

    Y1f$><7eedn5h_zym|*cxoh?tWQZSl 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 P{Nj|& zMEsoMls!vyi|peTIgndqregH-&5Oy(0=KUoZeK&WeO-A;N#$29^uB-fDTpebyvgq{ zprrDuSL{~*?fr|q`yiLp$GsX;F}f|Ram}It`rWNf{8hom0C5fcwpSFVY>IBZrZ{C& z)MPZ`o~JB?zD2b6S@Smr_oL=a#pu6#6q6NFxUM?pU?KD$>@w=UTavOV+A;^PfhBE< z8hltn7DDycR>xLCPCN&9cTC0T!B3Zv71A2$!iVf#7<9m`WwXzVQg&ohvWim{ZPoi0 zlT}y+&Ib2Fd-o*j!BmX?EhtJ^)?ts@IWhJQ&dzIb2l-2NNoAMWY8%02zhxU<74WS; z{@OM%HnDAP*d5j)OvPxf6Yit(3xnP#=7eY97MblY!ytP&@v9(p+uC~p>lQBw| ziqUt?EhfvFp`F5D6znFxMeEAFY~j~BcG;RnZm^BFbJw)SY)Ui_x1p_=iqUd+d&8Ax zi}Tkp&HPDUR0S>3=RD$g-th=^Zbf!8e;p8)p>>&x(L5iWyByXJPjn~>=Al$S{#=x@ z9ptez>hNN+1RQi@JAW$92W>G2nTpXo#+ad;L$Cv!u# zcjQ@}!n4qWOvUK4|5rlRJO3V<3xbNeEK`NV5$ zf^!?^`Ao%Vp7Xf>fX?#YnkM0pUAd7(irHDQl@?oXK^uj2;TNN%DKfmCMM3t-JMv_wd`7&n&)iA z$kvV6Yk!}Z$idy+B+L({V)PSvh<=e;8L|#63a%N_F8meaisv(1X|eT|b8{LL1q<>1 z*#xYjOvPxP|IV!*lPLHCHdsB-x^jv;@flsOc#V?p8}n_wdi#|`!HckCfn~qHJC&h% z?Q-t#Hxm^fZOIM0Vh%D7t}VBMa~)?TD)##YcQ|M(rebt@srnVJ^lr%+9LXgk_Ag1< zz1dFoPT9Dn_FaBMtJZ6!R|gSwMasxTB^Dy~U9CmlL0q-OwU#RmB+{#k9zHraXDGCuoXx0weQM<5t*nYU;C~+ zrq$`_ulhVcst2z)+&=bQd0hSX@&1#m6_JTb^0n{EqjlMxe#fQy7WT}Siy~Wj$t(Yv zqLi(>eOE*WAj;lSL?$XmYpEK*_v53hHSYQR2E~z$u%xi0XTKHE3XxS?U#tjA5$=q( z-&(2%@kT@EyEI0;Ni32Vm)*WAV$->!{V9(rA`=y(wN$?%R#@S*VQDi;^5TBB8KsDB zS0lRE6h&mBVzid3!SRFrug=p`s?|{P;+@mJ?}^An#b_;6DQ>U^uF3ZMLoXVYcXIt6 zk}?clB4S4pRp#R^&G}D|eAH_j^>! zE-QGWC#)XDTPDV)!_G_MkuepcMHcneT0MTrDfEs%DaXGOJY;r`TdFB?<`9cdX&;e3 z&c5AvWOpd^wnMIl3>PvLqh%}%e93s+iPJ>+t9VxrciSRO+|aLH)QTdviPfC&5a}a4 zu3oY~ngcOl-bPQ}L}DsNi##V5d)m4uVvpK?ORm2Yx>wm*^0q2>*?p{iWRJ2oge0>i zQBm)gT>nq#shNt=^83mst>z6{6nXzb@`JxY$Tj4##4Q3Vi#kPK4y4O_pub`&M)Meh z{t7RW-0-r#H({ehYRD^*{nnaq#tRkyY*vJ&$oOHj{nl}H;o({ShZAbNuTT$JUz?O^ zD{>!*ocP9-)*nyfO{BYVU-T+Q2~#ne`^LGst(*CuZ>sV-LEp|jB@($|VARr_{2}zG&`v=7_9*>%BTMc&0gb)Q;-dBTsksTSDK?RE!oG ze&tHz(RdjAOTNwaPr=xY#aqGVo%l4^+=MR~-ga6stj2o|rD7^ZzXEIZ+EMb;pNWEJp|QOL zqn%eAo<%&nV6FaaqTqDc5%{GVow3M)Udz z?;5-_It5n0H(~6GbSL)zQV%Y>oWjMjU+Ymlf1`KNrY3$bl!~bs&2_>^%n7}1i<IVb1t z|Gvt5{J3U*ckH!H#b~Y*bm7-!2g}dt~oXGatNFpMj+$CnzKr-ihY`DSR%(Sw2YAX72gZ1%MW$K8oH zSzBfKYcU5oFP=p_yPUghOigeV#_k)a2U9VcdBa}x-!Z|V!`t~o&{pQnA?4-OfL95; zmwIGT5WBXWKOgg)sTghkA6k#wVcGv8d;u=U*fq<3;bE5jLS?=H+E#txGkSOaq}W)@ zbEaan`2r{p@|y@nhh!s;Ta;TGk-xsH3VOF~=66QxG8Lmm=VT)vz8OC^2@}t4^crJV zRv{45nf<_Y+=QJOS^qzS`W+!zwB|B-`nEWblYd=`168m#G*n zIw$c~(YCq|cC{b9R_-;&95inyX?OFe5i0Y#(f&C0`Ih0A&z5`Dm>*2VX!DO!9?N!B zCq}~p^mnu_j~`yuc(sGZYeRLScxq>VC`KYvF`CC4Ea>ol?e*}9+XjUB#7KF$BwRx0 zZiG)<&dH&7B34nRVl?*?Y#`^92RA~7I~n^2%Q)Pk+|nsspZNTQOvPxHiE#h%d28?T zNAHZzwX8igt-RF9zH5IlA`_L!(e_Z-qQ@o#%nUotbzujIvNa{I1`6?pq>Hr@vm z{Z%F^Mr)}SeVOk+;X0=2OC*Igw5Bgn9$h}m_xolkA`=y(l?Svqf$4qtcEL1|LS^6g zL}a3plGt}G)x#|h^7lXJ{HPwR*<#(BeODfg$V4Ui+IQt~J6sq@@UaUc| z-^#;H8RnmIjUp^X@?y08Rvy9Y%VKxGJtnFLj|P!m<=#m0weQMf$Xm-|{ga4HRFbcK zR~}RFV#sX=>%FtxT1Z}en_<6|#~=Hj@1J|DA}mGnVzm8M9yhda5Po*OYB^=D**%V| zgK~Ex`Pz5o0ljEwdeKZ&lCOPN9{b={KkF)ecgaTL?)9+miuh(tPrrPKBDfw##b_5m6XK3YpKfcE=T>2dK+%7D0#6K&%P_-OCTOk z-neI?Vzid(@+o(Qjc2uv?$6oppQR=Htvq%!qMUKs|W2-4~tm9B~%1-mLYVO5h4?nl*GQLS~s-T zHAzNNxP%mM^j8-0)QK8K!kt{6s2Ip(vl?P^RXtOpGmE>#Rl?SwgA+&>$ zb%M#xl4AbHlCS+%1T>H#G>{R(QiO`p_FGGZ85P=$;`jwzcKfaf%-YaqZ6+!yiG9~n zb!|U5>~V$acR4Nwj|}^*2xx>u(+FFNaA&mr)>2`m4sE68m@Z6Zzm*4egV1&ZOOd=7 zZNHTV?j}OJo8bFQi|8O!_FWOUn+WZ0A`_LA#J+2(e)%##yehe$a|-u?eODfk078=h zGEqss_FZ{Ek_k-q;rmRB=pgypcjfWkiq^rzq_mWYO7gYu%HxlE^fY4+H-dXGxS@N~-%7YP^s3c$et~_wB7TCQS-yENu z+!G~V`>s52uNK(7S|%#V*S;$c+_409$HG#P-2+R$_FZ}4jwP@=mP}NVuYFe@LGP78 z1!k4>2d8k^?Yr_|L?$Z9*S;%{vL(wBw3d zu6Q(XzV=;ttZ7s~u_-wcGf_#t_FZ{2d0UpE1w&GFEGOm4B9*`LVlNmBmNxt@7 zdEkaOv^!xQalC%mcjdu|OjMGueODgIRW#Z;Wfis98?xF-+y}|mek&rmQb!0&5h_O8 zZ!J|)0@#Cx?4lAEh0%&gN*NI%6P1+2zH6yE6s`U3nzO zZiL80CHczt+K49&uyZa;-rd>GDO9ps<{wZes)zm7QpxW8V|Tr~vlQXZX#1_DYF9ZX ztegG*9{V{kF4DyAacZO_>8%S{RHUT{VJSkz zX#1`8NRGq^AtTOW)5v%=owa@66OoBZ%5LAa9!Y5_;vv$+?r}JFFCjd5R3b~Oxll3M zeru_cyFr9t?y_f?ZqdH)iO57HWw-BIk6$5$U$jOo2c)O2dPn2(iR3LY`Xpcbt%&}R z^heB8grx`-qwTkr3ipGd-49xdsU&a2VU7BH zU9tET$ve&^OBW8;-z|@_SFPl`z1oA=yAdKYRmsu^`zu=C5@H^l!u)bCRK#74jE9wq zQy6haPeqK~%Mey7PGLk>+-*z!^o=Shl_5BV5$Cp7#2GbWO{IUu{?7~NbmbIAJb9!d zKKR`b#)DHBA-l7bYUgi;u$o`G01;Y{B7JcDbNXBQruO&lHLp!6S<2|*rHbCOKN!JO zt5ztYwm+mEYgZh65+j(Z>^nu&_J`Eto6$!sVgyrt2^~;+e+c5p1CHs+2&Q^-ry|n( zW6t6^X{BPSo9pe~AHri^;U#IMVygeYKe$v(#k~prF05*P8eZmkupJbOSc^0z7CRsZ1*`XuJ8*$dRvZu1+kR-q}AH^)Q{jq;S3>y~>TL@;G^2b>e_&o&D`- zU8Z6*^MfVF4-;d9S|WmS6SZ%*ddP{+>S1^ETB^otCdQ6KJw8J{n9A%Vgi7?HwKad> zFvNhkug1#~?prJRV1!iGhP^yg{&BW-3ODrcmq|wB|X8Q&joZMsHuV zm06xhUQESk=RSZH(&o7vz1A4JOvPx?Oq#qB*=z@}+4jX|+wQi62ls)T4dkX;ONEgh zbUw3_-vX2??9Bw>|}%omxN1*Xo#?(f8?_&?;_YbGZmvnXKC`I zb9LdVw{vEqpb1KK*ao$36CPqml#1%Osfc1UK2@FTH%1&tSU~tp#prbFHpFQ35u?$Q z7>&GUJP-dEi?S#_G!}``xw1Je{bS~od)Hxt7Eep!3Fi>w*GG)sn8dARDn^TyRc%b!tB)@9j)G@OZ}2edFKH{Y_mF-zn-KZ#9PU!R zO zSBZ*pSTtS?t9xGcxutoRK%DJM5*2^Jn(8>r52o53UE71NzKHpU+t&-QmY5}ww29fn zN!iVUPTLCiwO;bR)@Le4o3)VE{Qg%qdLM3Y;*WtZfY~icUOf7ERKiyVmY)y9(rGGs zkf|7LmQKo}$H_V2AK8Uo3)F+-9?L1kc4Rp-nEc?}35YO$CM;R+z_?;6MoUz1lMG-@ zwRe#>Z%8}8FIv}ZIi(&vQ+Wm>Qem?quNrd0a3Gk9(PI5stC{%V`gY+b#}#=67>Uf? z^fOXhF0FIVA*Mn2(-`jRiN+OW>k^L)9x;(!hL^O<@R^FyyxJko_Vs1n@O9b# z&6tBcM!7|~rJd^zEAK0Tn2Ay`6{C4fBg*C-H9-K2tvvJ~*U&T`(pKDVn1itKnhA@o z12L|ciqU4VrEPWIw(8g!hy^(m^PJZumXKI-!t0K!s$;8XboQ^pTEbL}=5;Kx>kE>0 zeUaat*gy$)(M^j5jMO7tmvL~LFnFM%x&Jz9&QxXrBWSa}(0UZ#UgNDsTm1tB%W6DR zc?Kh%3}V*&g0?ygJ;+pyX4wu=Rl4Q)m+VvMZARM;Wdred_!LwS6-Hrww#tjxO*);lJ7Ns67FBwv%xl*dz;e{%Jf8)21-k3;n@Vj5ezteUaG^=wQeNpb(`-x6c0agIQseauHd8VB zRPt|uPXo@*m*o_BZ83Jar)=H{Kkiw)J_JPWennnul!~bsZF5uGsv#u(+vb;hBhgko zs(CE&EP!V7`Ii3T+2!62l!~bs&0`Gvp!T^Zea_r%WsrJsX`MR&v8m2&Tj)uYW~O4a zttDEI0hqN<6olSGkbSJYvRc}#m37zVxvrwaff(B+^bW=f$5f2AItdzYFK^5B&wDOW zupBk#*~vY~vl$-J==0P6OBA$0pEDJs)BC&^W^Dz$6qaK~@fhV<#Iwt}p;#IA9b6Vb z&k(H)HrE){pj2{#=rU>7slvnV%!NwMA7bI5h(GbdQ8&DB)CdTsVzkIX5<5Y1a_$to zL{oy7XacmANMWz;()ldXna%Tb?Rhq2xV?TF6TF0)GZmxlB@yKzFQ2R%2PpvdqN4K_ z&6bpxZK&lIKu)PzkAD%H;gG+oW8=YtsTggqhbWI_c$H-Pfb5_l>LDrCADMLT%HxDy zox<-f%nojVZ7owV+FtWf9^c^gp?6}F5`Th+*oE7=#5WjxX8{QSmgMuhO-j6nnllxn zrGE1Ikn#xd%2WIaPH{9x-T^Qg+gpjEi&0`EvBYJlViw9I5PNkKJQm#G-do(s-F0tg`icp?GVnM}&d zwdGbolz*H#JDgeQ$qL6*jJ9)|w$%rC`DELxp-qEtLP`M!>4vvX(SrKXNMs}nJd5~gA_uPdo_*OPUZ=QFn`x3qJ^hPDgaY#ZbC z1A?g-&GR3p?a?(sy;fOa7a-(BC$AbwPsvG7UOSThPq)~bR#Fpu1>d`W(dSIXXgLqc z3rE`LGg0e@9`7910T0pqO7t8_G20m7k#3Q)=Bw&N8?5gQ(N;{wXwm7*>s-p??|MZ+ z!SHrr8Eoh+&V;0}orDi$G%#{jI-!+AK2j><&K8DT+O!xckzcCSkkO*EwibaEBi;+E zkGJUXs#VB-P%Imo{jT=;z+;+)&#bQsK19u#iqR}H;>5CbV&ZYgKQXBX%}(wEp3RVu z5vBQbM4%afwqhzqbKl?uiMQ2mxvwUe1Sx~1R9>T4szq!n==v_WxhA*_qlBp#&1)C@ zqY!)Ntl2F?4>f0r#q0&8eOSUtdGJWIp2+7%-Z&E~MvDiJMC;LUMX#kr{?3-dYZUW? zB!l_F*7?kgT(ilb*bUC{%JD+=;`D)_fJtgLfSl2ESq?G8LocJZRDY zyq8DUcxSZ93O~kLBAPVYqeR1Idz9$mYImGzchz_&VWb>_{e!6(ZGJ^sj|<>iyW-Yt z?_!KyKJnUJnv|VS$j+_7S#2Kf=#RxnWGY76eVg()6Oq_9VSc=env4F^b}ydi>9h9z zwG(6gF+U!|{9r0Zi@sFeyHp-^5v_OOciA|h=0$NoY+OY#8So;XP>Bv%BJpW|^c+;? z?b?_fHbgy`N_5DE79FyUY3Gu6EFtb#qL>3F(K8jJqZ#GdjAAO$m>XJjCot}3~-bE3&_QXPO zD&Bq_gVD}ZjFx*5iF2p@@e*FaIALLR;v|eK(M{SZj!*G?y2lv@K9Fnn`Z4hc`h%$$ zE&5Bb#Zw-~LoYgc!Nf!#^atz0n2OPm8K4)P_20yVNR~{+Xx5$K?yhN(cNt;tqFQ!$#y8(vJui&J|qs*bHdfAGwavdc@TGG2M6K?+A(T~_DE z*mkrPQ!$!#z3|nCUB=lD=>EZLAFl?yO2AjYWtQI&`$r9C6jL#pS5!ni`K~$^gS5W_ z2$t1&rt%C%)H>)f_MOo=d;lvPQ!$z)KuDIbfUw<}*H>PhdDV9Ae~4*t1EL82hLOlr zjOO(ix>xA)4}kycVDvf5wLDXK24kLg485loH4j$-!BmW9IoP>zKOm;aKZ%N)(N?>k zQuC9R%jxIZLw-V(^s!4SB$5tmQW(v;6X$Mfv^alEhf#~S!6we;f#@dft#FBrYI9I^ zmX970&%fu;QHy`x4Po!m3xd(kJ-$yoe`-myh=2nmYgEJ9_ScXjoMo#di`OjK(|FM^@xdyzca_ zyYrBI?fp_lJJ)*ElKd?@Pw6Uc#Z;27M6?zj>4+)K;`yzXHS6}vZU~#fRwqNF9^Wj< zujXD9^^6P8)Z6E(8 z;=u^h;|mW)<4!pKdj2W7-$Xo^sxD5Z^46O0NJk8Q@0I+`4`$^{e=x%CJcI|M5drg# zdHJ{AmX$B9%Txol7DsP^2#<8c-H$z=-?8BEhzBF=WVc;gOCw?v9!HZ3dnY@n8hsG%(t^L)OjCKmL>x@?~5x)#iUNKc3XKN=H0@&C~gd zUpajb1mAfu8fTm~PvtLPrU<6m(V!%HCs68yJebN}bQB)xh*`gn$zOWJK8$wmv-&sZ4;i8erm~3m!Xq7VZ=);o zFWoXNDitHxT7=Pfm1O%R`JI4}vCC8zfnRu}BQChUXZ}eGXGA<0!FDT*Ms%@*&&Y4_ z<&202Q`w7!!Xq7V(5oHtH*cL4@n8g7q%azK(WATMulsmb#Dl5qWm4ghjyU|(7Ww4^ zUW|A!f^B0Mjk}3PE%W~>d@jZ#-aY>7w(y8~ z5f7%a*Hwf^I->QbpLcuk-vtp5MzED0qn%s2_l9o0|6368U@CjDPI#mvihp{oTTafx zJrHbJ!)U~fYBRN4eh)=3mA!ByJkk-@_PVay?Nb*=^dVcIE4}NTVC){9$TijUDRZsil`o(!U)lLNrXq)6PqE+8>9wcFr@yIt6sIskZbr@C53nlMoe{Mz zBbdrwK2jdf?dlsJT&;U8r!d0et!Y~|T6jTx`PMxVOl7YRDUUB-x+OmTdX)e;g%Rmi zlYh**Dn1Gb8SRW<_~!YrVahu<Uvp zb6TV+;uJ=h7EgIx98|>5{$I~M5KPsuaBNDKg_GA&74fc@tB#CQ7-8B$<#GJtiuk5c zsw1=am886kPDiZVKOVpQRMqt{f~m}^LwRifFCL%qlIr^G)hFS>=yXK)28-f9-=aE8 zMlh9Giztr3AZUUWiS`hyWnWtL9LWAC@-#IGBDLR6|~H#kChFghKP z+@tnDFqPf#E00^2KOMj7&eNmTl|4#c2bTU|e(8v+c8|qtvit6VU@Eg5P#(XmcsRZ| z);FrT?6u3kR36MP9kKbphvP%14~=**f~o9=UwMek@YCCh5Sihoh024`>4?dT?~Nb+ zOmW165lkg=klaTr50QONe^3!3`>dX(JQ$sh=(uA{ywRl-qM9>;smuaKc^vogxOhqa zgs2BahC4a(9?&=Sj9)t9;u~&^KRR@BR1Zclm08v(k56ac6d&1da>PSq(HHt_Js6#i z81Jr#cmI9b9tfrq`C4qFl*i`97sR)GH!Z5UNa3fQsXUlpI^y^1PLDtG){Lkgj9@CW zxKJLOmh^}Z2^1k`gVtS?2cy#weO_)Kue)(pR4PU=m04UUk28Y2c%3b?qEba?oR-Ri z(dmdDIIFF@^2MmF7{OF#$)P;1UDiC_2nbo>4=wF){BRY=S4gi!Bl3E zq&(`(`g?KTI`bkPa^?*F6Z>y?H4?vc#E{0{Ev~cgYkMG=$}F9fhn$_a{kFVMT~8qw*c)!RU0vr*~v8&N*R8#6$Ej_NEr2(-F{LEr$Los)y)g zCMA>yBRD6#r2JUjMXUC%h!CPFvKO)#osMX-_^L%$xr(S%f>;q(9*p3eocpJ&Zr2IB zv{YuRB5lIxbVOd`8@pavPkAsx^kr5jMuW#4+1;jg)3&mEa^b-U&I$2$st*udUsQ8O zh~CfohSAO?b(RsrZrOzgBRD7L8t!$E=q&d@h@R5M7^Crq*Bvvvjp(3b*X&4y2P2rb za~~~vU39Nee=tJytu|K}?c7-_KJT`FJ)MJQe<3^=!8zgO-r?)I9rvrwK}Lw)*ycQ= zVb_<~(G9xrsODz9Av_qtIXO3`#XkAag-7*Zgy_F*?P9cZUw3bjf95s1CYtS#@L&Yz z8iD>9Z+ zDO-&avL&DA$$Sz@Xp{)aGGr;CvgdcsbDr~j-k*<-2je36 zen{7LM3c?vvS-tt7$g#aYEUr`L?CbS$&uJA?KsH{yhb5{@3~Y)K{TD>OnN2ln+_t$ zsLl=ZKm>k?^h-()Pn$^667xU=-`A<^gJ|-wA$O48dafEf%mWelCDO~Vv(r?DLj>PD zs?3OJ(sVlXM%qvBJ?ZgKog3zX2>cT1i+(#X?WwOs7DWW#pQ`MOXk%vAo0_)pI+2i7 zV~2Sl0>4D}QFJ$0rpm)!PecUY0|zoZ@H580+x8HujmbO^fnOqfg9h)VHTd?9ixA#@ zw!arav@yGf%}RTwyX*-Vo7rGy464v}=aT4w7{ybpMJ7{1Uwe_1*lm z$}?n_iU`(|&^<1qjcLAbQCgefzj*s|*8R|ZI3n;%#=Pn-NgMN&?6wiX`W}&GvNuFD zSv&o+G%fop+0mm86e93Tr2RQ|S=x77FGip~6rzpEr#BiFkPc*1@&}Om^LX+cSkbf3 zuX1uc=|fiZ_T>A{jVF6N3DZnXnt*n};qYd%SVt;En;*tUy04ZmkyU&OS(whR>h>Vt zR4tEYMm`=`&g0QyUuNX{AIo_>29?N)q<$u0(p#$QS}nh->Q*C5R-{7oFB>u=2Pesw z$S#%aIp>piqg%-;e&??7-S}TtqQ`4=NQX9Mdsh1!XqHpYy6&ZMywnx39 zWV`i!c}{Jrs|uH9lFe8JkH@xaGil6M@ak&(b(v&iCSiJ=YhSYcOt(De8S>A7REX|& zYCKuB%9o5u>z!w<-Jk3pr(TlPA}ex7L*ZUnD=RWPNAhmB&Wf}dqUG>?a=7f11E~=G zW7(|8mv?G8zMGk3&-*;zp*O?q#A=zO`7Ycs@Aux4NiVc(Ir0dxiV!CVfmDdbGSR60 zm~78yCb@&D3Raq{!6^B*U<<7h=hDn#R02|O;k9GWmQi*CIu&`Hslf|Z|3 zIEg$XM&rR7qKAl2HKt&1fuLi&A$kZ*iGFuXf%StRqTUe6i=ceSD1o`0p$b{^-ig| z!W2Zb9U};Cr`Q&(HdIo$)sQM0))v&-ji!t#K=kp)VYfJQ!FufS$u~w* z#uOl0+P|`gHfHm@413R&!UIzf@!0KIk&oW0)J9rx!220?w>rjN6S?mTL?Bgedz#xn zsnkYVaQ_z>cEaHc6hP#$rV!l{#I6`!Q9GzzgjXs!`^?Xv2W`2S_}fIM!b_1>AR}3Hwwsq$>$mNLzi6K zcabVuJ{}+bi1KDprh4LZ1@BuzCF@l*%!o0IGwfyOFE|S>o4hodGNu60IMQgOF3+%k z`tyS4*BMg~!DafWd_}+HwP#T6);8|5U*C5#B9MyfZQS)0{n~Xt$*|jBVcZYiz2pl- zAQiVwhubUqEm-->414$f3(lvXb!&+Tq~i8({V?(HMpOpzI6*vK+1T_ZL?9LSu^B@v z`aN;ViVS1R`f^I#5o!E z=}N|ZGoeyUIgpCSW6I~s^Bx(aC&U`A%+K1@tAM6PRsEojgP-e8h759u`%U9 zDxOzzcWGTYG(P%OF>d{CHI`w?k&5T8vHxm&^d=sm1mkwuHaP}?R6IYnze;D(*S^lM z>wj~>ne_4-G37uio`W0I*O_|hA}Yrv#{Ia@YcU9<;(5OBZL+SAmN%^i<*qi~_`q@? zRWzQ*2fv`i@5S>P^haKc;em*FRQz3y7ap&_HQ0S* z@M14lBd*USU)NPGDo1Rt{P&73DhHx9EV=SuEcD9J=bJ3@tt@T6enu8~J(c#*_=^$o zs5tK$FXdQGub74DH8ZZOvk&CZy9vSr`>Vza5C5Gw4-t=wzpL@W zbI2>Kw8wM5<&d9cX%7tx;>3Zr?uH(M&=ls5XbnrQ=uHco-ed82@Sc3kY2m?pa&2>s z7sN~bYumGT3nCsB=S1TrSIxGhxuFtGFDeK2rPy43QkX_wLIe?yiodJz!h_yWu=TYx zJ{OsDtBeUgFVV50@fRcFQE_QCUP|u2cjuLZ_sbh*R`JF}qb8Z;FIxJs#tRSsy*m#P zkBYym@xr6spXURSyO`|;$(+W!{t(0D=Q6Jm6}AdrVrVGbo%`)PJN{?;UK)c$d3d@x68jq-Oj zEC`3*0KNW0L1+q7AzH(dtIQpv?90B8cj6M(kN5U9{4LEDQ)#>)=NPT@0>$&X2!YrOE-*6ay;P#ZzSqe8Us;5kHoqupC>$R%q@ z-k*`jEDGORNy2@a=lc6LUOBs#8v6w!co&IOh;|z1lI^pg{m*-U!b87{R2=40Rk7~> zp=FZCgZG`7f{5ewbLmY2-VbuFR$TSK&6+DjAQgxCv{n$8I#ZV`0#gvNBPo~OH&7nY zl8kl{fm9sklT_jHLH*Y}9$XGgLBwknbIH50^5|IY8m}D15lF@1MHg7==aTPEI(n1j zY_y9hh&X>~F1-<R;s@9 zaw6BfsXQ*3Jz<&hz?9+$_qwWnu7)(L6x0V&Rw|EyZ#N5iJ0g&Z!+g^q zJhG3x=(QlX2c{rm=B+to|Dile+*&i}C5S*O4)ZOL@Ti$mI%p3}K}5gWIrRQ{H6MZP zfe57HFyAf-4@6)JB1)Fb@$L`=v1WL*UtvmdM5D%@NTW^h5SW69hxcVij>cVUF$EFUuIxx< zIvtE{bMCvCf`~g-Wk+W8)b`MF^BRQ+q-wn_J2I|TJRX>WhyjJ!k?OZ7BKPyuKmx!N zL==3R9r@}$MQEO|MWKDi?1eY9B5Yb~=cBE-o5%af94(1X} zK}6Pw?8vjPYdJJm%mWcfH6jXpgc% zIWPqg1G{ENuAWr999+AIK&sY#32{<+Xs#H6DTtU)JnpKut}q1=4>!$@Bve#{Q*hfdL5+4X1rdDn z)BWAzx#Dsl0;vwy%#Q4=tUNGRn1TonZ>pjQ_x{#FU116$e*QD-|EViPAl2cL|8K4! z1raa)lLd8!<-im~Tz4P~+T+svW`=1^o(hg(--rPduW1 zw`ZsFL9Q?b5$!+9f|=pfZbgB#gb1X1D@^4GM%09Hhk}^_QxNgUf-D&4S`IEbrXV8r z#-z@{HC`{_QHv>vU`>wbOszbMBaq6TLb(cNI7DCyB8Fv==14H_DuT;_DToM-&VsqU zRi96mFp3eFf(X_-iN87{0;%RalLaeI{Y$U#_MFTEQxLIoKo+cnS`Mx&OhLqJJ+k7g zwT!?NM6gCmRO&+>h(M|e-LgOen7_4-R}SWZDTv^Eil~%lcN|vv5ndr$S z|52M`3L?(5%mV3k_DA8MmtYDa-o26LlDHBwrXb>mRJwN#q;PBxOhH8KJab6Lh!D%>Y{JAhkN3a|ETK`_H10;zZh@Om9Zy!G%* zuXepQ2OdbpJAebF6*1`PmxC5W9!SMIfZ2!iY^m<0x5njxRJ;S&y+IL4U*8g!2U4*- z{{`Ja#_kP@mjkI-_GR6;ixHTD2;Kp-pQb$CU21}IAOfj)2e5dQA`;uZ9<&D{kcxKz zW&0}Px*Hyki$E&g0ld&j5pI{&!5W1;kc#E`D{oc=_FY6E70cJGJ1BLvLtn0GM+5xfIf6;U3I_cis}gL8!lq~aaG>t871`DWdNk|P4CSe~!GP!U)T zL?9JQt`zhbApS9 zEw%jLJwtR( z%&7KmTm(|_o*_C@)70;zb<5S7U0AG{@ymJoqdyaR|z zeg7X1q+8@a=Mg&svo*^pl-gVRC9uMAsAOfj) z&k&WVk3SS`K|~;xw`U0C_O#xY1a*Z7q>9~5U|k^ssW?8m^P>BYV0<6~sn`x7{;dom zkV-8Vq&-ILG~Ud>BMMUx!L~rr+a)bWaRgGS^^owO`>3GrVhSSEx<(Lm=jE+Y%mY)3 zBck_eZxkE|W;jG}SgF`fC;n|8B9KZgdn8v{avtZHf(W%Y62yl+YXmKbDa8@dd(OIv zR|Mri1c#Ms@bJvwmNc3t&J`k%io?S z?;J=On1YBJ9W&uJobI-RUV;du;&AjfeEQ2D1a*Zeh+r$B__z9qKq|E>k{0ayW$%Co zrXYgtjZ}*uwmlGmRBE9lJW6!05R@EK5W%)tQ7wyKhtCVz0})82)?C7)!K}#v4@^Ns zr>iqTTO?YN(Jms8io;QDk(Qm71i8W#M6fkre61HmAeGt=N;z^K>l5(66hyFHVN`qP z_8+PQD-I%%N-YtE$Cp?A6!5?lM6eBJd@UqIAeCBe3Xehc6M|I@QxNg?iSdEX6x|;0 zDCwOoou@ew5lF>h)qsk&AI}V!f`}o4vSl)A_9un=(`^mOz=>gF& z)p*hIs#BwMXs3^eN5#5h8ZUZetQk%E&YtF(Y89gH7*nZ!neeE!=5f2;1A@>Lrb4ua zg~vS~tqsp7-99eIknY)mrtHgP;iTozc;T@c5b>z^yBaS%NaNR5jbGK@<8PtXoW={{ z&$kELW$qLm;doStmR$88*Uu@}dAL^&)SJG1Y<8gWtMP(ZGohdJNGCzWqvD)syyR-~ zwVmzfDpmA&biX|_(7;vwO{UVY@c5@}XS-uvL1+q7AzH)2qaA7Dw(~W9vmeRyG=BM8 zNTp%nvHrKV_P7C}@vABPEktWrc#w9q({0iSuN+uHY-f!Z9*BrX#oyI<;jwFHnqB5h z6OV^-=Wnq!v1*lTydX$N*j63kcvOg%T#?qj)$oky(6gm4YufX-*wR-u`!)VzL_8`) zORmaPuV}whxwBUew&+$ZZ`6p^c;PWIsiIxBq9Ec?@pm;|cu?Q9wC|#hIp$sCg~#h- z`&qU8-X4#NzpL@WgXa;ov|uY-wyxk5w!&qr3;wRg3lBuZqe8UsAiD`m?IyH#Ifbp4 z+3JG7tMS5vY%?si&4@>ZXyLK_LKD0HRXJlNLG+ua|NiH4UR%}({6s6+tDq48-Z&b$qv9DM`XfNRu z91|Mvm!nA;TkR&|Q6XA*+?t$XU;A%PcnH~_qvr-)so4jJuJarwFCO(%>|^vsRUNW% zM=C_K_IKJfzCOKKK(Bybm>FK#op@l1uKN7lm@k<>>2>+;=ff-MRYV)95FM*~o=|O< z^Y#xLLx+y{a&!3v!ne-C{W+gfMD4ti%kFYI{JSx<;qPAF{h;pk5siCwW0o)4WMx+l zIaU7Z<)V()1FK1Q%(q@eZ82k(E!$+ZZ5VPc{j-;gRER$BWP>H^kcN4o4@&QGZl`jf zeu>ySi=8OywveZgl6j$0_4YWwAL`{I6{5xVS?y9^{JV>F)!B8<@PB%_Vh=8Mo2Ze5 znnUC%Uiz@X{gn(Yk_sg zf7Bj<_4~L2yfNuEK0B}sB@5{j309@+wp&Mt2ilzDEdbs+7}KR}DeHwc+pP`M9!P~~ zv_&T$LOX_9>$(>>@1N6LiPjY7MD1Ns_sbZoZ!PP;u3N0b)UVKX9&>`XCuH0AL@jH4 zzb)32$9lO)g=owny)$|P^^$}=)~D1<&=MYR8t`VrnBPj}g|4`6kG1=t^ea7yM|6yZ zJeSfFZgMt{^Q6{7Jb z-k9r3?XfPIkQbUjb@j||*?~~`DBwd^_q}XM7iQ|t`@6!!;AOB#vEF)$*NN(WR*KA zbBUgqBARE0sI_d@1ADEC^-@C9sT`NlJ-OP3VrlWd-k2?a?6t;pY7v@C?SWK?##%6@ z}3eg;9w0PLq-g3LMp;0O4 zVJZio>8kcH_CEAKU`+qi?at|IN;x%%2T~y#dnJ{l%tGtRE)%ToG|sR3gjN9G+8Xb+ z@h;t%iA@$-@3oj<4I>^%h3ILsv%%7PZp($vJZplrismb{)y8`RwE8wC_sjw(ao7aw zF5-byh{hWMW3GR#z?!#jsP#I{?TeOEE&3MSs5yXo2lO7xlme^d-l0}Ys$HZ)bl*j^ zss+~MC7aH5*3X@84J8ET7jI0^-ktmbw3_Qo&YNykrCx$mh{p2K%<%VaYt$=w;RDp$ zd7P_OI`?q(k-?)Ns=c%P{BG;mpOeB@5dx_Y%`=0}O2)i%vWs)({5oqkwK?8%;k_FA z%Q2>7rI7Q{tDCGF&QN=Rza6~0Lw`AB8(b~qtomk?)$?#K7pV}9{ES(9<96$sq6B9k zwIGkqptl!h2Xigz)*JI?tL;`dtCX{z`W3gW&d7-75ghg6v8BrvXI4rrXU@r9F*;s2 ziqJm?z3JV5i!<-;T243WiAaSSVmP{t$xg@%U)o@g)te+4^wxuS!swI7n6Ikmh5Me^ zZPlh+Ar+$WwwGR5J-64n_u&@dJ=CvIW9$F-s^VO-&pDo!5pp% z5)W;0-l2Yl`l8a#;#EUD9;r``M+eq&zJF|sQ-xX(sSwS5A*x||vhTo^=?C^%rD!!k zuR}Z!>fOK0i52`g@v`oNSKe`cpYGoQ??{Dc@@=@k zMfmkod#%^0&5;Vx*iQ7y*w_NA;_jhNPa07?m#DRaH<#3q`J8)bRHL!!v;u4LnxW1N zYC)tzG|xWZxn<&Xt3}hf);X%()9+Dl_kC}mh7jr(8I$nlbZcv;xz<=3A4rAhYp2r8 z5cvIg`n~DSi96?79Z6=unT%yzy`4rMAoO--)^ulWt-01r>bppVXq@?sDcUg9$-J+? z`tw3B7w^n*CPH5(##Cvt!g_w}IBOQQInKzqF5wJr%<2EFu)cd}oK=D5E2Kg+u2c{t5I~t^f|Db+_D+||xdW7<7A<+K3pAab@vta}@-uu9XYMJhzc?xXH26>_@0w8?35URE5PWn{&Xy&=v@ zbPG^DOgu&Z{3xcY4vNy(>3-PuUxKq^GDv=lA*5?a+>snjC0mw4b_26YY48x2V^7xp@L zx1jw8A&?5uxI>~>*$39LbXDVht=eG7zE;*j-U(}eGp0qqT2`MYX&odUNQG$G3G2!k zuD-&V+-IEi>Zx8X);r3$DEk_-Gi8M{k7l@8G(M0D(b!JL9HCw~r^#F=jm9~z26|?J zJp+3T`CQJLZY8JBbq>?|fmDd*^&{$)>uAqfPP-0UthQ7Rlm}5O480_hf1f96IlVHr zScc{jq(U^xkK|juV(HNC9pXPxWCON1dbyx$eX_gSQKe00qxM0V<7qch-Md$F`Lq_P z5UpWG8&m4Wg-+d+3C?6QckVv+pSA!eBd}h%}n$O zYRtpO5}b_A+pTR!Xsrb;PekLmG3MWm+&9ko zi|Pug5Y5t(_IzXfvsWv6_9}kvPy-uJKaDA|Xp{5yxmMO}YC-gKh8lF}G0i)Ta`ZF` zsSu6YbjCb+c%L<)@sO2nF}VcgwpdAK*u(;-PVJ|h@-#kpwp6*@Th)BIooCdj6n=AN zfzxl+Q0ITtcaaLwybeYs{iiSc)_S$}L)Ii}4?GLwk*cdDp0F9y=FfFj&yo*W{fP%s zAsSC9jOko`Q@Ga^yR0TOGhqM0T_f%$jTv!#V|Y}RUDglOcaaLw*x$%=%cd5gKZ^ER zH&d?gj1{%K@#NN+`57sp%E$Iv3Dh1)g=myZ>D1tnl+fbSd#&BnOAvunvGQ&xWxLb< z=2F&4nnk(ZRSJKR&dXE^M=yC~p%>cjyi&20^%u1VQXv}eTa4NN$2#Zc)Q7AbDhKva zly^`LqF2B#`_|DmM=C^PpC&)_Z>EH|?%C_~rP}2^r&`|1o>T5TWS6R*JX;@c5&rz& zz0PrJL8L-7?^2_7!e<`c;yl}^mX%C%JJtz~A{<@hv%k+4=g)SvtOrPDKq^FI9TKAC zLhGe26C6H`LMavJ51d!%^y7wwR*9P@IOnJZkqXf$`x=u`@>{E9^@p5J)Ju4L=vc!$ zD7>4ZQ?+C3tj>qJIJeQfi&TilT{ua7eQLW2MdHEi-A-BbjztAevKVA%(R&jWJc&c& zMamfZL~VEU9zn#TV#$Kz(+Dk6MysN>ZVmFS=G`J!AiIK}CFMubTphGbcxYGhkGj4puigTjzlB>pj zy1M1)&X&t@_xVinPg_x>uuHS(EePS!)ej5e>c_gezuzPXO=0ec*0AJi-}-vaVqYU= z&hJ@~J$uS~JkD>XJ;%ZFUVCV~ARhd(o-;U4bXek1aZWT|a<$>VChim4((Eo5gdQ{$x^M|Y*UKb;gk znRrzEU5ytW+sN|VJPuQ9n$^NaP*B%-#JXUlV?rwDi5s!+$tMS6)3qtI3`Z?UM zIOXDOJ&scboXDj2KcpNQ zFFa1IdE8A%7eqWNL<^6l*LHS0_*!8)IynV7CJc5XFNj{BA~>bb-b{MOM0jYt@aXsUVE5;{1rd)5 z(Za)@OT7Ic&j8hbkR2q?AAkNVJ4g)+4}UK45Sqf@LbQg3$K$7mxo^%APlcK*PQfvu z@xlWU@u(0jJX-V_xU%V=`<#w{%UPe^L86=>`&zwGr1Qj;be`z&d17%YMWg&cvgn4j z;hVo68B=o3?@Q;&bBDj%*07Z0_vLHDFZc*e;rwd7F_ng;9A~DCa9?|=o;S|9CmvfM zeH6#G#tV;0Z;f!T{9O?7sQ9}YFFfe1&(gC#Jgq^^kyvdJ`#;*P%-ZC@=D?M= zPz&O%KHllX-sAK-voZA7<-42`B=w=rjcAC72X@vXiF&!A-9(6X6AtetkP6YLqhpNU z9^Pue_0B5*mk{R_jhAx#Ky5yBOg*dTu3u8(Q7Jk)UlozpnvA9CKIy#eoW zR0`)kj=pJtJ7i<}mHyUgoAi+L6x9_{A)0qZQ7<0f)m!20={3$-PA!P1XSgTF(>7yT zS}UA(kBoC}qFf;rqH(WI7VG<3gu=9sI!F5`)Yw36Gt@$(JK@nOq04vfbq>&O0;v!! zJ67GR`DaTOpDkg%mMpd8F2M z=P30nKIPE45AU<(Bt&1RSbQMC8QOlk^Eiz`q(U^_a~rdv#-{LM($2h=MikC6_+6Zp zjJf=ejo~+{>~i){FF`6qBR|r=svoj;{ItnxbwJlBIfvslN-eMPOpdf(WL2|xRYR)( z|3#g1?I&0hsw}j&Qm*i}81L)2J)$$iTMtdJN*-8X4Wjczq(U^_cAeBf+}dMh})Qtf`U$$9Upkh7jz5UCK2`Yd$TcczO|WWIGa(JU(W@|9@^ zG0uN$OYTx*Z$^JFx63NoV^e4v@jyL9ya7kOMPvS}zRP<2gN>oxgg`1p^ZAUP=ozyh zag;T4SVQ~ovnlSx{@Ib$pI2z(bicEp-SF(lqZi~n;J57T;EcnV8Rth@o%%JjS6-Ux zA{C;aeIz?l|6}PQP%C3q`G&LCG@@YY6tVsJqNe*+o7yTwNE9UG?xi+ z@Zd-*Tqe~;DnzTKFTJEpz4Gn@KNMPL2(gz|&S4qyE!_h$)x3wZBF9O?gL#uAQ>VOJ zZhxWmW64w(sSvIEMB!1Xu+VCMLwS4Ze<|)9y8He8sFbk9*V*0~08`!kQ+9B!Wz4a| zg_d2dyuIPFR2Qib-FsqooqrcpwZ9<5(1}?=ik>Yn59@t8%i5p_I$&`Q zudHf!qS{3&M8}>pym%CalL#TIlo3-MAJOItk6o+kc%;aghqqdXg&Ts5Cs!v42Un z+fu(8|4CNlrmuv%o>MZ_?JKf^@o!A+K6%dKqGUTd#R%GSuO|(CxlHZe`9l5lm^lBWb{fe^T4EfOFB5Uk#iT36zQeC7% zG>%}B8Gbw*e*fL(_EH*AFBFk3#x$v2-jnO8YPY}1Ys4gN^S`zn4!<&?x&8i?sV-6> zn%74@hm{tr{_08RzbXm#hEmjmgK2bDmU7^!>i8G3g7T5h-Kdk!CrJr*2b$qxr~s|! zqQZmb5=-Y2oRB-JtR1Q2h z#F2Wa1=ZD$I%@AC#6LGCJBidwkP6W_f{i&rtHH0^3!MfuGw|G=u(z^Ti#)eKl2O^4 z8F)3=`HX~(nOnQO`^?@#=PAk+QX!gGgVSHhm&k77qkL!XoFsb#)h^D+I3{qc7_)VD zzB8E+lPFh6g=n0?X+1xb=w9+pk#(GUBCcL|Hhl~24QDsjnL2VH(S7;bBI{9_;gAZ^ zxY`->cSfG|^uc61f%@(}&(rMe&kVTgpCI3De6u0Fr>dhJDyq}ZcqhKr$sk&0u}7#bVyzGT-qLp-oI{Bd_y zq@a!TCG0&UWvr;`&Z_A;r)X6}Dnxr{;qPj{8q_M?`8(9u-f|(u#kr5AVqH1cZ^?pn zaP_U}PSYD2+ba`OU8F)Z&Xsg`x1`9qKr`H<)UR;Pz%>Kc5@Y_ERpj(KmT3P>eHW<^ zjdP4KmHH<;<-0VqKRcD;Vt#Q}!`aT5ZqFn;HQF_^r;-eZREWm%88d89L$__pD5pBr z70Vy@rAsZcoH&Z??pV@e8D;5}I?j{(H+0+mKGG?oxdf>Y&5~uUM%o@t-)ZiCIPgfQ z4E02o8Sbbh-_^4>9uqt(y;f4^tJzbVySFtt658m?C3h-Rtw z`RBFGpS?E0&K!2qGBm@z;}Um&eqH!?ws&jEr7b~kHt>zIlzjXD66`%$C#@{%iAaU$ zdzNGet2XTo-kD@A^zG|5Z8I*T$R-!fPrpE5ZPU%htjasBaG|EA=|By2oo7)~|QJp!tFKK+tnT&^sN5y?f z#9s#1 zqOQoC6OET#(KvT>oX4Z$oM^n{>Wll1IpfF+4d)IeOO+=1yBaS%YCL+(dES2mG#(Xy zSL21p`wuL39-k`jb0T-$ZSi+CUU* z!$TCODvp+1(H*@_xB4Dp@NGGsa5;)oAzFC&wR;f{u2I$&(VAAx5o7!o^bkm; zIpObWSaRjx(MwM(cB`*<6DnCsu6#WJ525lWrzjPFSL20;ujA!%U7`G;atWg~UU>L= zWF8_O6@ORbg@>=b<1i20L9jHbydF0m?) zScI>CbrBClYglsS>-%^Jlq@js8ZQW6rzoc6oT5}*4n<2{`MNkB0woqjFk0h<2O{E8 z@pm;|c=$SAUJJ%Mx#92P&f6G7XbMvyTEmhnU-t2Mu*6cotK509ypugtWLymk!k2wK zgr;zQ5v^e+gC9Z7EK{ zv90mK!`Bh^5b>xGEj)bfPYieR&YGD_rSXC|OH$>jdwtE! zI8=z1T>0{@S8|pIhkhw-&N43F5A%05EC^rT^$?oEREXBFsE4z~91})_6hC8fB}lb37_UORi}Bu+`E6PbRQ_I9{zTjHy4Qw*B7@v9u^o zrCRqIFS+{ra9jIGhS*JLewjPYI2x8*(Y$M`ZHA`sw-Bvi;nDfadY0N7;JKlm_3(E! zUU(c{U(ZsThImx`U5ytWG|nxx=D?Fwz1iUJYP|4xr`2YwXLGUth)2cW)p+4?Hl>Wc z+qVV49;auz{9TO~9<+YgYCRB-iodJz!o#=WwRttb6EEB^YrOFAZFoIIJSvZer-i0> zkpGd*#JXK#n}I71_9cxM9(ylsYX3{t94mMIk{XYSd0-DUX8q?G?lq)T#pQ^9)-$fy zxzFAC8SeP9#y(#6{pHaUp>Z*%oaj@*n72R8a5r9V>{Ul*Eyon(7wc_d-Ip2eOZzTZ zoGVO01lkW9(_=-3+vVT|Yt{DaZ^jfvur7{z*fHj6LOgxwf@S?Re>tWg0_|?eruyRy z*C{7;g(--Lwa7i|WVrpdU9e_P{j4RXAOfwqNC$FFhU!7s$}fb zPd8eQDTqLuSYu8u%W#(-yI@`QZT;n#f(W!@BfY-)8SdrOf(^>oS&k`)h_!Gly(+`K zukeBu9`tTYOhE)%OhH7f-S(&j8SeU0!UIzf5e@STE+6+@Y@MAXCwDk6;q8LP%cv!3$3%)<1DZ0w)mfG-9>sCNQG!` z|KVG{(K$nd6t{6gPWUe3fm%9vYlT`p)E>1{+^OH@hWio%sSq7|YOwHViu>81<*mM; zn}*_dUV4hdU%JEATQd7#iW} zrs4-lZf-%ol~1`sDn#=cfXXP|9SfhHdv`3}-0t72MCV7n1(NgYVBU4P@5ZOn8C4Nq zt?d z!MyA6yo)J_;L)tUo`QMTvHoiE1*RZ^XN=YlS8Vgr*|9XDu3VYn=Ip)Ton>GOB6wC( z&wu1SX04v4L78{GzKbb{h=!Sm{`i%ccBis~n{^KB{IQzCq7TP9snOqP z51~|uUjHwB$=7a-((@Y%_+6ypuxc%kudrI(gO`CY1rZO?J$F=VGRkGNiwLCRa8v_g zOOtWln-*MhOhLqvzvx~)(D70p#Suuw;YRya)2a4lXM-0*Fa;4=N3sJw5M!#K&h*PS4j}T zVWm3pLw2Bl7h4WQAQgvImpc}LDTrvaE*rGGyXL5rdTGiX6fK?G}T zO*^AJHvR4deHRf(6|3X5piK0YF-$=OYi3?vri!N<7cB+PC5S+(SY6I2W^|0j2qI8t zpLB$;t{9XYQ;H)#zD9GkrbBzrSM(1MtP2)68qKVKmNsn8b0m@C@-7K}kmK?LjRN9WyWNk+$5r65(TX8&`G zdj#VHQxL&g{_)ojL?9K~1sIdq>7JnPVhSSIN=VnMXeqco5P?*&c15&udana>n_~(h zJiYL^>p3EjDpr#`obqq*0x_l_g0;$3euymxB9IF8(CMX(OFjw4Ag071VzgM53zs|w z0aR#pL+4jFw+Z?#rl58#>cc7r{vRDJgVB9IDg zLFld^|NWrvVhSQ+Z5osZmje+<6?@jVb&m1sigSf2h=|qMMjnVjs@OBKzd}QTa$pJ~ zQ2U$qI9H_xdo@HL6`rse^Tw_X!CZnVh={c}z;Yl0snCkjn7^K^5$x441rf12!pehd z7ZFIs;po2hj*j03eHT*@f!fB(f&WLx*zh71hok%RNq_zov^l0A0xk5vd-5K|Bldmk1J_ z6?=xP80LW~h`{q?k}MmgxJ9LNLS5)Y7!hb!g1pJzpjL`|!#BC1W~ASaREWm&Ybtrm z#_o|i>DFU}!1iFBE7b(V-eb&mLe#rA-D=_Mw<{H*S;tE~n;8=>N_Mw&&U32M={ah# zVQ=>7xODArqHpMXq-E2=S_$i}4KGbgPobXSB_ zh-Q9Kdz?F`_p{uN^3EvQ#Gtl-#!GvUX9|lvQ+RiG@u)ag8ZYG_>wyq?E?Q3eh`~awCOp1Z_t!AjyX3;VeV-(!xGfjugtybXeMp69r*Uqi&qn33BCWAIrf#~EM?4PR zoE!OXe+91`m=nw)*;=yYOXGBB9`QgbM88%s*L&Yt-XBaRuMumGj&wSdNwr5@pBwq; zec^#rh&IM0YryqQMmaT0q}oV@=<}E6M#_dOcr|UzEz_F2mCTXwb@cuq);pFKYk_na z-fr#|et9_jIw6n>(b!HT_5G3P9{8-tsYi8n_u8CDpN#TeU7cH%`Fdz>Is@|Wyr(ETR#>$_g|K3V}6%!$?;xE z=bYsKn-gibMayxzZh80q1BK4J)Z38?(O5o`8K^y~m?NQ2spMR{{N^=(muq*o^&?WL{wKZf-(fkC zPOBuI&dBx@I`5N(|7>b=q(bz}TXQ1c|EPVp0p(~x?~_iCD^hLDFODJ{U1X_8h?=jQ zboNpUA{C;seB`@rP@ePC_GGse&D8CW(H&hw$!|%rES;SrIVn*gC-UW;T8;uo0adRQ=20dqOniYYn#if zx?ytWFxl_zJzuKg^;hog?z1U&xn?NuOKf9Q-TM zewJ#Nd-Y>)RP}gpe;sqWs>g$Se!X=PrWaP{ljZ%vMEe+(9H|h^eL8EUe2Ly3s5;8| zqfbLSmk`_=vhS|u@tE;_c7$K(<~HCS!>>b2d*qfF<@6cU&>m0aKq^Gvv5NE=ddipR z1xeCK*}E{``opi?X=I_mZI1QB?J@Z=t*hMGN$%UT@~w4*Kq_tbIcg#DF4}Dde-V7t3HTCx;+cl|nk&4HPqOnZIOryU0zYFvNF_j!;9PEj) zeYb%6?hgx{m8Ge6kqXf$6B+Zz&O)b0{qlAS^MID(*+*YC$CeG|E1Tylq(U^$S0(pr zn_ox!s5>6cvz{XauQ*?wmsua%fY+!7*J^uQ`)jhhhI~5xM&&>%L}S~KAFsM8ZjbXh zp&G;kM<=eYIGSlhiJTbfNj#7W(YWp!a|4a>%Rfl6Zzn{*+BuPT5~aZIQ6nYR zX7sUI#N(RW@M-b~fK-S^T@!ktVql*0!47h(Lc2S)sNmfXo}S}rJ-ut$JI`^b$FHT+ z52QkLtffWz$NA1Rv?AO@CC3yzJ;yH@Lq0hi^2y<{PY$F)G+Or1>BoD`?W;B%4u3%Y z0MKR>ON+HY=ZVvs+o?r|!vm=tNQG$BnIX@3ub*@lR!eZV(rz2=Kk(EUPq~fxg1kVr zrXBZ7lq;k{bgae5;p2(+)t?ku{m8=x>NCXC*_U1Fj>Cy|$9IdYO!7d3RES2c1)6u4 zSGAYl=sL%!@ZX=}Gpu75Uch)OV2z(Wt57`49?`4)*5UFC&aIfl}s@Zg^=J2T++r+4E8q{=R`&#zjFYPh;#>V!X-s#R>LLe2QQHP1V zUu-J03YwL7UnKt}Y>A+jjHolg_8)BRC_L;#h1QU&<=ww&zCtQQqyB{FE6gEZVXo&Z z%(n*QZ{h6{jx_RrCB6+^_HBq%IPPMt=&o$v%HtZhNM<)sGY#t(QNr9b@ewPzN7Pu+i4a>Dnz5+fic7X zSKe;$Z=uzTS`amz&^`ujf#^N@TIKCyM+z-I z_{@^6Hl-Zo^UNZjXD<6ZLn=h0u8G%z>`~5ZLHri>4D2y9C(?9F9xz?@fQeLyM&8EU zcqqkg)7Nd)gK8J`DRJ#Xe+T>;REm9Y$;wujQ#p_d(YPiO;>L96daE&6rihO%ZF9V- z#+z~SyVE+|d9Ybyw>SCNLaKNcj#9g;r#83itUnx@PvyW>8143P)uwlmX~p^Jz~RsU zf5lPjenfMh)>{tpv)wbcQ<+EVlOcKP6KntyrUKYy^H*8vQv(Bkl8e%kP6XQ zChxS?rqf!7Pixs4NPP&Q^ny|id1xXph3{w5%0{yfQXv}k*2rSy&Sv(PsmWGv;(;YZ zKLc2A#*p7ZoBR%1>~|2U5RF=)qyaHA$^L-+M$Mqw#kB}^AbI_WdcPpeew#G=9oFne zDn#SjWlX!JMb1OJ6Wy<9UF57jlIYf?H43Q^jcdCx$GhiQ|0AET zDO3)&^I&UPZgU)|ID*L!{S$fCb~>53oN|R!h(_%#x{ne|Jx@DY*E>G*<`Z-6V;YvT zaNknTLud-;3eg&t@o}NVDC^kJhOSM$1m{=G3FeS&8m=8>o$J%ky_fnfQXv}WWAc(F zXZl{QbVcU;Voo$1bEY3ta?UTJH7w=0gXZ=#{}wvw{!FcV0F+)(sv#djG`H{kr_kw0 z>mX9$4g&WKp8u;b`M+}6{}ta_miG8yX;r%|`7yoCmn_wG3D;MY2FYh8$)firy4EUMIgtuwLtJ;sE7!n=_O$Aw zoENBe*&bLu6`~Y|(i!<^e5RqjVaZ6R6ty5yAsThW$=Ye;Nox`LZ)-!ngl#I>YXp}N zXHJ|^jmdiHr1e(a1UHjL6jH^YL6jn!>r#wqYs_OM5(+ z*4RFto^E|i<-i#k?ZI&dCrSUN#&+92=~h>&E2Kg+YU9(*Pv3@ixk{s~YiVY{6tvaG zFB$XB(+%z07mu{2Q=20dqEQ>4c3yHP?3G;SS1v6|G8&e;^6!K_gr;zvAX>vxSKFUY zwsz5J?Mf;+_G*+SV{7-*p~=?OblY$l)h<#Y8pozFUA{jYzV6-TZaVc{oB>cyz!}4s z0p#8Iu8Gavoh17p6{1mo@VsWPB(K?S)N8i%U7Vx%CO)cRN}jn_l4ow0J#!bQ(swg( z?lNX|7?IrmZA18P|MuJ3KZLud-uE}}Ioeb=|V_Yk^n^S7{v zYgl;rmiHb)Q}|nm*0AvKE$=;qjwt>X=0wB7!?(Qm5Sqf@LbQg3$MegJtUrHEbPrQ+ z$C9HJ1kR|`OUNhr+&y$>OFKxULNxBFy|**jql1?#rQ-bJcQq{K`1a}A_9edvLQ^=u zh}N)_qx+6zd-{+(rvk~;DA(dDgR2j{%6=f(ZkV3ujHZdLow_7IxFb%JOO zOI>|-sL*+oPCs^03*rd`%IbJxLB2T2XaA8K%DbD%XFpOQ8fAF8OBHVaf(tQT6p;WWW2i4l5+~mR2mk9@3Y23XbST{w1y>Dz8@AZS1O803< z%7MF74GRzQ{AJT?v>rlJikBm{Rb7S11dxmfD^<5{Q?zWK%(TUYELCYe$)F`XR;D+u1x?Q@lOIBpyRdU~Nx6TS~^55*4 z6=~WzjMb7`|4l?_Z%s{7TTaU~@r)co- zOwbTI^=G18;=>~6BjSNni0*!SCTJn8+J87?(+ew0=q9euH(7yBQTvaw0-d7%-(`V@ z(67f1hw>&hCr=)9Ukg--UOyuXw2CPpjS@XxC@qr%M>4eNcqpj1`nV=Q+ zS*ynO{Cerm49XQ!A$sSo@quQYF_#_835_QG+MX9u?E8<Zf%eX?wG!-FmQRU@fBdKq^Gz zn5Wk^=`D!INl$nPl^pe~P)iH7w`ks7SmazvI*OaA1(6ETsFy`26QAZgEoLUUbdu`b z>Z=YE_6+PX#x$naRX(4aINFgD9$qKK&7_jQ+>&ha{c%1Jv=~vl zkw(u@{$xEC$`$Y8-q|Gc70yu{|5ObfQS*KYx0*w*J3LIeDo&+noV)03 zsUW~G@lyZV_UzrV^Xfk_Gthz5nUlY(@xtQ=^4B+apCIB<@pm;|cr1SSnALOj z<6b$CJJyfJ3lBuZqvG#syzqGX{Yh5CGs8R{C|T%?!{60-;em*FRQz3y7aldwHL(wE z7k`#G<6!-0yztmg9#8vk6+}EL{;tLgk6+1`ckSKc{X6yN@t&@{_pKks2fFSWFNk)N zN7!5E2*SjnLbT+n7FlxCdqDi2SGY9O(-Gzrl=L(#h%)4T|NF-Tp()HA(HfRq?I(MN z$Z$ZkzMVx{jPuNLC`O z3CMn`SaN3FNDk8*pndYJ;X9M+kons3mh4&n+@yYeW(ntH}l}A!b zvI?U!_a})5QX!h#oV87*9A#Ce+lDXc)ETJ|jeU$Xe#t^; zbiTYdp}oW_A%AkVLfc~Xnm1}rBo z?XK;1V&_IH#kq(U^Wob@|u z-~D~};ZT#eo7>yy%o0Zq%j(a*EXW17@Ra0`c?v_7Tr!Bz>{ z=4`E?G?jv^dg#?<;S z+^Q~(!6Q@-q(XG;4A+(JIUl7Lx|Z?`NAeZx%5$Aye|6_&db;&e@`m(M)0&zI_Dp^<4a1`|`q(U^#k0eunT4aqnkZ7-< z_F(Cb_5ZmXn0MZVvu3}P37Iw5r6(ruDYWL&$bE)p228=cDnzT!zO>+2vX9zMuZ(?1w;A{? z97Q;~=*EQh=A&tkzJqEPsSu64jd{P^DCe004eh_EuGE@?^NX_q&Jtu%Rc4eki!>D0 z5dx_Y&3jIj2FR+BYys{G=Y*1| z>?T~bg5Ymqjbcs5*iE=dg=n>#5FS;@*0Se^I6h~HN@R`q5`tbP{e^o8P$3%S6*{vd+rB)q z?HfQm)T)W|u9kY7ceQ+ya-@@1=9KGQ=V{`BRESpFKB=owEz+HqBqyFE9yr#pXJC(^ zv+&e(=gpfN+iz0sA{C->Y?5{xojz9kvCuj~>j&1mT3TqCq7nc}8LmnhNQG!@C$g`- z&UJpK7t=>j$<>yG>jZlS_84Q%Hg=t@i>lf+`L@ruyWyN5TJ24wuCAc7t82(U>ME)$ zwRU12YEi>fYIP&+QTL-H_va7ut;5u>kP6XiA0<2*l|B;gMN-Bt;(`4KXEmJd$e-nb z!{N!(n%kWSfmDdb{zkSkORBo1X${#z2(^jf{9;Zphh*U<{mSBgg;a>fb|O2LPx76w z=q=NAgg_YwYZPmme5B;(J2gK}vXg18MJhz2Ok~XDpXyoNCXMj+wRn1}r}A7TjhFU7 zL_8{%qcvV+YKLAjyZ%FYmrPH7`CGUr*LXqfKRe7m{+1x(Q6XA#)ptvpeMyO?UODhw z1W#x+UU+=8GtF*uriq7$N5$XOc;Qid$|PsNSvmK?+XX#=WGamp1fBahdQudRigTjz zlBychLus5*u%IC@aU5ytW)90@ZP4^M;sQ9}Y zFFgJ!+u80|x1z^GZ!P#+c$=YN;W3$B40*1SAT)))g=h^6kDATPxO02TDJPz*>)j21 zSL1~Tous;Yk{XYSzpL@WWBqS!?QsKY$MnSF<0uzlCTG3lBPhboB(1*CO?6fO3L{g~!3K9(RWf zlru|B;cp>Y!@`5kEL}RYyr>-Nu>f-@h}87q?)t|B5s!*~y`$#4qhP~(LM zwV^3k!XvRtXSe^gGNM?rP~RK)U5ytWqbhWEAFe5gcvSpdjTatec8+q_t}Eqf zC#dYqDQbVr-_@`n=mgTG6G#uCDNKcE4NI<09BAuq=piEt{TE=~HC_at79yGVRI=5>I ze+$tX79LYeHg%8uC^rpwpQ#=lm`dX>M#Q7yoM^n{YFJ^Kdvj@7&oKqtK;wl6NdT@& z0P(2!yBaS%NRn|>_QCs1_2|Ig)p+57hgOE?9; ztGz^cTwSYlc)O2?M}=tN@$tldPRC9nGhnYq8CTUXu;j{@050Oet0?^=B#fW%RoOg|va`@7c$AhJb;(j=a=a76GibNJua;8GGh9y`2YTzM|JFgjf znyvAI@K+oU5s!-VuJKY1Ukdl+5^gE=rN@#t`{?8EYWQM=rZ5$vH7vRE`<2%dHHE*0 zy;9=^;rFYH`mRzTT5?4v6Rw_2s8qx$EP1mJLjJDC3lBQ|aP{;f9u=a6hcD@Sb)_Xo zD*mp1Nf7>S!b4~ZQz2Tzk}Dpq})HDS1u`zz!XGGr@L(~le|%dxxy4gENUc( zJ5RDU6(TSN5hh6x-~L@3fhmaK)tPg3>O^tG%FnZcHkdF|!jCo`QxFYn$;mIS*MiZM zF$IX;TOjCYd&EN^mGy%lV%uZeZ2&B5WJ>umGsjxN4f61O?`}ceEtd-=|ku_q~(-dp$sKhb; zy3D|*moZbwBi9`AO?8BHIgtv{eA*WEP4#KJW_FX|$yOn08}2(t+PJp%n9a@&Z$Y`_r)tm zS-(>`kP6X!I#{?_{52X=W=~F-e5KlLsT_K)&R)`3E@dqgp4C|1<(nUw;YyK)=_TZI z>1SUjRjClIH$URlaqW@A;W=~*P@8z@nLelBcUgMn8&lzNe(&LMebQ&xOgh3yg=pkQ zy0v?ALjHY}r{B)ER?LHUbecoGqnBL0v@<8vobJ3fP+cLF>PavapNmFIUWGJLJ{xw@ z`k4@_U&2&+FVA_`yL;gQ8Y!NxGwU-j6{7j1ko6g)t50k z#yNw}NY%?C+t8>lMS9z5c9NaCB;R_SY-NxN(KyFY-=(o}^%ws~*OkZFT)qE;LD8Z_ z6bZxF*O}txem-SsUo>r^X_1g6l=@cR%2F!L43QC~P^3o5&Rp*26SpGyMk*~T*%Bj5 zl%$&9^PK1N-247;fAi1W*XKO%^PK%W=bUFLjlMPpAf43#cief9^B8W6T;t(Nwm*(s*(m>bt)B7AzC%W zWR%R@waKYjr@GsiY-Lnug7Z?H38qpl3*iA;7S{eleGMX7wJd}O>1=l*oo$zOwsAi5 zZot}fOvS%hA5M6X&RwTK=g#VdD;1(~{wKW~JM7(9-(@*3zO&Mqs&c!OsycZ)nXqJ+ z^FEadsSvF%?oz5TLo%JoG^3uO{=jzUdwg97ReMJey~y|O`s>=b`)OPu6{4}9j9J+% z*K0|(MW54JqHo)r7tU?I#Zix&#@yE?*UP5YaF* zf8btXZ2?x2Er6@G0NNiXqEkJ%aBi`aOS9@m>JQZf;(Dk)9QT20&`Dc?2Azvkh*oVO z>A`02kiG=1q%o?w>Me0zIQno@8uQZIyPWq9RdpYuK1V7tJr zBq9}}(W@uvs*$haD*cW+_mO27&K$mJ)?E~5TGG2Q>+f2B$V!E1)lQO8(un+cT{yqC zTS)5_u1h#FaKuo5H1?e{N%O1@S-v0@qH(pOh|qTzIaiPk`cqVM9HZEx*wSR})Q=?B zZJF+AEG-3k;oPE##xZS7Ir8azKIvaIppl3*)Ef^*W4jqcdbM7H5FMxokqXhOu_bLq zdKu9`FT>hFvQ8SOpoD~y6Iq7sD~-;Y)XuF(`5?=p6ho=gKm+(2U&sSvH&7gCSd6Gxp{q?vgRAy8JsnTj*mm^U9g>Qp4j zuRYBuq(U@GfX3{|Y3bfh`|T&xx_Aaa$r~kd(ubo}`hQuu&MP!ZkP6XwW*~q1B(pCd zT{X6F3&}XJ>xZNPj-lXE423AiP(axL(I^vHJsFquudJSoN?v?tq4EyjMyPZqHxoaR zpQ0J0i}L_!Qy~?iRVI?#kFV(@F}dToXeH9Q(^7GYmWuP$dI*p2$kw3LFN{7%T1ZHR zXsw6v*h=TY2+hNM;-Qikr|8*<^Hu3gc$BB}V8$Iq&YgrnDn#q~N_dcNluNo%9_vPN zUhFrY^U}9;rs5W1FZRM?9Z8n^7Z!VG69TCa&HVVyTX;N1^4p>&x!!0hmD&k&UaIfG zRBGobJStq$(jDG3*Q-SRfmDcAtsdd=CTV4QEk}6wklqsJ#kJ*V6->n~!to}A2UwZ< zNQG$RP4RI^3U4wqzH%08g#~gu=f%CIH{0B^m)5Kq@R&*d6VLfKzVcS8IZ`27<#wqD z?Kp0*w?ZZ=7&9NOl>+l*P*lX8^i;tu%C5q3Xe~z&-;=-+(SVR>gxiIC7cDu zyg)i+|65$_)TY)&Dx4EI#^@YHecruku5*mq3c2gb!1ch=(y2)L+~Gb)Dn#pABJ~J7 z2v{HST3%i)b=LB_tMgn|(V^rU_i56?u1TvXQXyLF#AwpSC4ZJTyczGbo;2uic47~P zX0w@3eV+Mmywl~>A4rAhaG$TIS$piBB5x4Y9LFfmBAi{u?4y15C5oFdiF7%U3eh;G z$qJif_BH<@@2%7yd?w=vH{1s}i*R<)TQeaFMrC>{sZ>aXXtjKk{`i6PcW0B{c0P?O zK0(x8Q{D2=H*==q^9O5q2qMt<^;qKa3eg%#gmW^c2SsmbUv6KtBK08OdGpN{mlt)Y`F@{IsZx&wMQ=GwC*fMu zR!D_tjUFOACX=7A9hYZ%M`&DeiuOmkyLaL7W0yAm@THmFnWU|bRETEznxhX1kL{#M zey3L$A4Pr6df~b*>DvV7i!U2=Cqp*dSNvWWA3;2j3ej9Yjy@zjN+@PV4(&LvP+Q@9 zrb@+3rINGMqsP`v|M=h{XAdEe3el*gOENX-QjhU!`=iKKh9xA9CBpgY+dt>a@)bub z5grRjB3rtkw*L!h6(bd*S-xUV2vU#99b5V(S-Bp!6}BRdC2VzL*ki<5RdT&XR1c&= zG>$Q24p5&DyCTzhiTYg6OI%(Y88~8$xxZT*f7h~1jy+&U3E$Roc@eE=DyheeEt|ZL z$)|p6La5z8r(pZ=OB_dVk+zz)ll(1_-~L+(fmDdbb|Zg%`?7tuM(RbQ9bZ{BW&`sJ zzt>(_n(bdS-|NKQtdI)PXt`j_1=Jr|Bw3aVT9?n6Twbg#wgTC)5F&C)t`n!Ri&T1| zW3-;zq^(-MQO|EUzu2P_i`5HP*@xe5IZ_WJcvPk&8QM90+BrSmIgyITtD;fMpS(cP z{Ak~c;uTS;aFxM)aaAGqZ)Bf@kx)P9dUnzHMZ80FXYSV#Qi@i6;dIZ&x0J{Ncx=Y2jgTv=(GJG z-~4h!E>2P180HbyNGaY~8t+EFcVaYakqXg#r_a&3gvW=~MtCn!?OBphZxoz@nnz&` zq2bj>cpp8`)KAa~hg68>yDau!BRpQ)w#iASSU)2wIx#?*axcb!~Bf7ad4*hA@N|D0jc^9cM=aA4cI<7dMLg@yIk)Q+NbE&+1eFx zEGlkAL}R;ATkVZ^di$4b|0a?wxm3y>H4L$|bSE<{-s#MP*?xJNwI@<3n(wT&Md*el zv$`MqYLj;>@jyE$lnqsXSNePt?PybXZSq{2gGhyFlo`poW>;bSUGf`6H$~RYOJ^tc z0nTQ+f!tXbe~x@p4It}Gq{6w4eM26t$?CVoLr1;&!~>;NT%%B`Wh?9qf9hzmI;6Hj zDn#SjMQueEJYSOUoyt^mlvq?>klP0(9AnOSyV$#*_9?a!LMlY7w;mZ+uM8;i&ZoF~ zbI4j2Q*e#KoTyY3f$uWf*)nNdAr+!=?J}kx#W875Uedmx6^`G}^lX6k2K+vllJrOa zTGfrr+~rlIQXv(h)p9{b3E4;Sy^poK;}f0US@21ZBOx*sp9lXmdIvx@ST5OMd2EA) zREWkq4vOh57ScXjNb^ma?ooWhrh63M!=-kdXXxf`Bw2g^ME!wOh*rBIsYh^DbNH-= zCtiI^<6grPGR4~_5B%#!XF7C~YEO46Cn8$k+k{6A@@4S}jrK+~+WG!d=LgQ<@T}cg zS{S{D&IiLtl0hm&^L;7DyA&Q@^e=L%lxF(5YZkE#?$E6W*!k&!QQ{cit+|BNd`4`VhU!{6h2NazY># zqWO-T{jCX)JIIQ)!JexAt5kFBTih*i7d58h>|M^qe^m9)B_2qHXdDaV4}d&{6j3DC z(bR+d&Y?R!?v}WV8uM`5T&Gb^OaC;QA4r90eivascT$gc>GiekveNj)Giz2ZeF= zLW_AJ8t=}GX?M;DrwjSINpr;l-g?1veIbv zpyql9fOon$A1PWhA;zsPjq+_RQibMSaLX-i^;UxncN$5seM!E;wGUSVTqQyt<*aWJ zj`hiTAsW|88(TIS#Fn-GGE`Q>nTj)*&b5{HMalNnXWLh#LP-y0yQDV~kG+xL`iiSF zuG$p4hN3Q9x^0ukvCohS(YPKPQ;DJobbPx%Mzge3jn!R(?fog*PdP#=8^pPI+cY>E|*pxjxuZV-#a=M678Z~}rO&8zQMMANHGl~^P)qI$_eLg*~w zybyuBX+N*9BC`4Y>Xrv0G-^GU3em<~_``}wpS!v(=X&TZC-XoA=0x`A@s*K*E4rM7 z7`W*L>)(laAe!P-U$8O~>Cv^ri99%8jbDmr>hmotA~XKetpm3eQgOarpW|Ek(W}FV zmuki$i=VIFQQJ!M)fudHQZ(tXY+ex={Z{pk+JhPwncIhB_-Q>-h}+LDiFEJqa7XPy zMd=C3I6sk+Nas`L z+EO7EN3-X6XIzgkV%~wpk?(H)&hkKn-s3Y5L{t1Ie@UeNgMvV+zB^v9vDTPJ7;*oa zd6AwoG9ug`h|o6==7DHqhW%%Ln@KMeJTN0}=SrfM{dR-S$?bVP0EX52U*K zADSN&tB>muM!em7Mx&W&3Xt`BWb?a%K&snM$+vL=nMWA$LH#L_*$sPH z9*964I7AzB>A<4MTj%wX)(w1+af{}klW${kGLJAKzw)F=xAz~A9s~sH3nH4LpI$#c z^6Q5WSRP3AB}tha50rU?5r>vM7s;43()I@;@HHIK6py82L1gfhk(LKiX+%fn5k|~D z@>Jyb^OR)i9H}(Q6!QopYCrx!_Becd8Wyy=z) zB2aGy(WF&;{*{rZ{pq$pkV+#KGLJCg(M2sH6?V?H{ecM7NI^8+U!C7RGK~;;NvFrtmQxc1JDjsIF?5lE#G z>zGFv@$tUJ9d~wGb`kh;O?(tEBv8QYu6sl}0ra9yKNmEon7V zdJt0(!8gLH`$e}=pXHY{pD3dQ5lE#`n}kP~9@9&Hx@eiL2c{q*tYJFyqd6s)MovZ` zmBx<}9>dQ6sbodjBFh6)5WzRMsaWwpuSk^iIean#sWiHZ@Mu`CVyx@gvNB)_BGgYA z&v}Y(u%T+Kpz5zRP3xE|(n#QxJg~dnEg;>Js~C z<8)hdL?D$$J`x^pmi3DL@!b?#4@^OX`dgE>x?#bMu}S5p+Bt{_q|)d^!sF|AhsVbB z6A1uQ5E0gzY_agJ*uZ-x*is<^sWkG5@YwU>=vWPsWO$xq3L;QT)0oAt{5Q5V_hbZ8 zY19?r@j!HJtn@{Z$S?&Fs5Q%DH$QgSYbPU+N@L{+j~c^Xj7?r7k|m}ff?pa^@#qh1 zoEUq8q*tyvB9Kbs*a(kVbzhF1-lUfuC76N;_2VUdUTgK#*k@;oOpOSn(kL;)W7@76 zvHkCfq>m|xP#~|u|FRB&YsT^fm9kv zTXwFx4K1O3L;cnM0ou2(2CgG^G`+~l}0s_wmPl; z%GmUK2pAvQAqbEAIGk3D*M= zNTu2$sd}`VHQe&hh*Mk-M28XA{I(=^Wu>{62O^M)$1!WS36CK;C9&wI#TKD4OPL3v z!-)EO7sX=#`R*hHQt^CTSawdpNl zec=}#)z;34ZC-b|<-vQ@*T?uJm#j>)3KRVUeqlsT)2XqVnY~UzAQkVs{2nbl_N|>5 z`?N-{*deMp@3rf{79Pkij5uZF#902~2W&kMfmHg!FFgL;oF6kwAF!ojnPKoU;eqHd z;th9f?D)iyCn1nZH3x*p3!mo4;!{W3Qn9r3{S@JW{KAN3+n$JxymqYZb3`DOYQPAO zb)P>IyQt?_TPl|NF0s}F5>rq4g%L{z4~kXnGvOozQmJN*@L0cSaIDXLf?!$noqMDn z$S;f-WA2F2{gtgbB9KZo8imJ0^KOid-8sdUie>7qR|yY9hY`2;yF9jY)pW}P5lE#P z7s8`7(Is~D!|9d>pA8zf7aoWXBZ4!|NeHA;jSJxsoN;Wa>=~z?@IZcH#I{AXV?A!0 zdlCYvRFgw^+_$!N?2PVnZK?RIcHtSq1Nns!eCB-ey!j^~kV-X@gh%<=$4hRlCI~*I z-c`o>dlF|<`GpaWpZY_|^zw@>4@4l9YB~vzm*3l3vgE)bTXQ~bUwl}2AUceA=actK zW<-~rgg`3358yXe;o*OtU(&DjGP{=Wt-<0w!UOq*5n1DhmeBo`tp_5IN;Q&%#|0bm zOD=e+#FmQhGPZ9Q9*7Pjh8I;RY1wv#MW{v-=Y{AnVn!mXWLoDHwp4s4v*t(Pfe6fr ztm2C*EH{-`S{{5;q!F?Z9Y)ao)$%%j2oJei5*~=aoak&YsX_<0lJHPn6|M)O!-$+J z13S?Dl`Rz__`Xc*glJ=y(_P;-uA^6@;`v%dZb0>F} z7NM`~%mWd~o3x|p&T=79+0O;$qH>P05> zmo*U)_8vc2gAq-dnTuOQZre56)?D=#mvPUAVNdjOASv9Db2O^L+=`CgSi5%&7GJ@Z^R7OFxF&qK(6%qV?sl@lcEOz8O)5tx%Pg`dugWY3UODk4}j!mr|+3I#ak~*`=+t9)n3oxX0*BZzg$LKq^Fs>SU&mIO?<}9rxb@ z4+6!9guAR!S+*XsCd%)m&jFu(4j`52x(Zsf8?$VS7&E$fmvbxGW)u@bG-ZVf^Odz- z+bWkLHSIZA)qjK#NQG$RXRRQdzzV{81iJRmMwUCv32knZd_^u%9$)6I#lZs_~h`}CkIj?nsuOKS86>zeY2iB zcTurN@rtY$sPg9ucPzWCiCT{$LaZXhVL~94=*txKrcgXgfqPPs9QXzMo6Ifar zSML`)cafI&CW;%5REWm8lJvOf^Dpu6*Mv@x>f5l1^-h`k4&D$gLOdXzNHuD;_&IFS zCFKo~JYZS`rlj&6wOaffHt7=bhG-F(f(Y?**rZF!8zOlTv>)Wq#`f{ z5#r~tNtci}M9TwH5FvgJn{-Ker&J!8f(SWBH39FGiog^^h&M#(r*IF7w@~R1q)PqP z9@PFwrKm?zL5mkr>_IIRB9KbFh@RMk3%{({0TDGu?asOk@>?~TA zO`bLLn%UWv`px|@W=Wpg{;x9U?kY7ePNj@mjcDor<`!+t7jyI6?WY?zYu~KETd1TU z;_j~biML;B7RHS#Ws z0eh%fFb8v|=D9ms8h1(l)DRD(`u4v3#I(xIgE`oGO`dyTWtp?IPOD{D52VT*M151Y zc`yejzmn%JX>Qzi?r$FAfmB22G@0FAdHniOo_pP@GNM?$4Ss!k*F6XWh`9<F}>?vj69I)2fDF%=8@(>fBZ5#&#ha_ zxX*q*IfOu}SOMv+jUyh`D{w=q$LSxIImbqi50wh3et9WB(PU2ZU|cPkm*@U`ig7RQ z^IQmlR8PE`pXj%$xt#^ZoV6&=?NLtV2i60rQr~%g1T)I6yG(Wev6FWkLGYT$h*694 z+-3iidGk-L8I(#^OGM*LqnWxq&;4qDnfKZ6vpQf3BDhX(S8p2Byul1=-3G>gt*}3vs(_ltTd@IjAR@3*F$S(&+J_dLR|A!A-JsrCz#_>QT=4@AQ2x zgg`1@=lfkI`wD4!({6C~na0i!tOru1zVrOxm`fb}o%bm5tJca&;S$rJm9>@9?_z_6 zh;&qZHq`Ip5h#clVtGj91K}YaDTRlA7al=W5{pPj#rf)Y;SofA3n4f~d|L_+MF@`| zvYbVvqe8Us*hpUG-;E%J5b3BmU;QpTf;d06 zRN~36rR5>M`&wEa`dxS+A{`aytKWr35PitjLwrlLIH?}tQUwu?EJ9P5JEHZslq!f= zXzL+90j1By51{miem@zJj*82!-=!Ww)HlmRyafsm9IyIacm$E)iiGG(-wV_B&(ekZNst1mxaH-ypK!l< zOXA&Wd2NcdMQvv1iufRGW_gpP-b+uo8X-?pm^-5Nx0H&aV7MAxMf{uvc>xdoE(nUW z;c5gIt-qyIFML13J+(xlzKM@EsfU(| zsr0)bDB6vyapKZZaoP2|)T1&*)A{CxFKnsAN1yaL-;qqdTl!qT3lEAu5jSM0}^Z9IyjUjz$P5CWaX!4u<8dQ9ygb{p-6y32D;>B6=TlDV~5ip>C z!b9^#D$x*Y8c467cc^E1FalE$A$o*->f`-9cE&9owN!{eD$x*A9;bLymMa2N5Fz@I z$^+|x2&57XG37Bc>p9DV>wzhV5WP<2as7E`*?OFaKq}D?Q%V1W3lCf@B^w#|xswz` zh<>W_`02Z~$x>lnNF^F#%47B5xgC@TrXWJ}y%cfargM@!Fy%zVRHsGIgKNJVm8=IM z__tDtzOW*&KM;Xbq9LZGdi&u;NgkMj2+?~^#{&^aB^qMNW6mvek~PN^M2NmuR#5ZJ zXYIO3TNhJKL@Yb3r8>7mf$a~TgNWeYN+tSU%A?%u3ColRrksfIo3#u|HMC95WLqJE ze=C*f(<=h|0})6i8e&?iWqEazrNR_Mh+RNB9*96H(GXJ}t1lRtw@G3b>x z$-q~2c{rG>`ht) zrNaI|1X78HnDRgbrXWJ}y%e$LvDCQ2loJunTWYB)T)Q+m+7ZFOl}hY?6!A~DCCMEJ z5lB_XzA~VvIOSJ%}lY=(xWiaplX3 zU~2gr>0=5azAr6E>{*l!fhmZX@Jm6W`NnhzOhH7iodt;lrRfluf(U18LE>Dx9h99@ zYr$g|QxG9GU)mpv;5`ZvNY(jU^08Jw9S=-F#K27ji8_}kV%(yfqy&H|h*-U@Ao0OX ziqKMVJun3k*RL)}+&b_?1lI#o5OH2fLE^(vig@kA**V(hn1Tqg!8@_7xKxNhs@Crp zBo0kh9zSH9mXrW61rbwc6(l|`Rz#Bn6_WDB!xTiwdx9dg2f05m1rd)8CmyAW7}mR5vL2X%2(j%vu^!9= z5lGd!UqRx`qsjwIg(--bcRQ^N<#cyO1g0Qj{WYZHd8#7LeY3T#2agg=L4?@BrmF`c zkZNwUAaQjy<$GOpYr> za6K>u5n03|HFod4p?b1Zn1Tqgme*1}+jCd4brFG7FU6@I$r;sX%wF5)Tq;aK#2xeV zVV-L}xaOFGi13R^!#!*4C}AF$f(X{+xaLuj+^hAtYoF`}Tn|Jb)msne!;Yi%U>=x) zh?N8LVINck^S~5DJl8w_|JiFX1rg%oLhFG%5P?+Z^vnkdVBR+klRGD-AcEg1Qc?!; zz!XGGx`tk`PLgD}=9q$rm%HVsk*^qmDTw&*rTHMk{ruwf$vKEAh+wT3m6nb9aKzAL z%@KiA-RQ+6C0TyaW1^KAxKx;eh`&1IgY-K4?RawRVhSQ&yNK43v=TC=Afjy!y*nqR zaO@9EK}7f+XJ`4j$+kLC(r4`^mT~dSV9eehZnkHGNB&Ar!=7EyT}8nSiT<9S=(yf%{7x_7gG?yCxERDl}EL;-zD1$5lF=+fGX7#(SGnGTMuqs zL?9K*^E3a^`zx#mB9MyZ>z?hj9uMxFW%pX;IWH5kcuVpRO`N6ZB(+)F$EEPW=NIl=NT_1ON9ue;xj|4b$dSf z&QdAaNFNbM#V3GN4{AMlBq9Q-ScXrH_E#$Pwlj(mn1TpCGo(f$jooC;5rI^E0!WQ^ zEEOVlU_6 zTPmbti9EHo_lyrqt|gd)2tG5U*2KK?UQ3HWDn2u$R%%+?ZK-(dA`hhE6F_P=!2Uo4 zQn5sy+Ryi1_*t@bF$EEPW=QQ(TPmMscLN?*h(IbnGo*ITyRNC3Y+Xbk6`uf7yEE1U z5lF?-vPxnhLl|LO{eG6@<1v+Go)l6tOxQy zDn2u$B(ggm$xT}-q~a4mO6vRncpw$a*RuB7dcpYW(Wm$rTO}{9CEmPUr6NiqLv+4RvIjBcM8wiNwN#C&o|dc!BKWsbiRV~FU_B6lRAOtXua?ih zo*Gw}f(Y@ftM{Uxwk=4mK8Qdnv9(kl^zNLLGB5=Z;>lNe(A#!$lpq4B#MV+JvT37d zCff>A5FtK{l?S#JB9Kb$ilhhot++4A15*&e_C~5jkmA7O3K2-97D~dS{GI0{YmO<1 zVB4$@{?T`XA0L~W><>gBm0EKNkJo2SPV&GMM2M$r<&mn%NFNbMCAOB@A02L3k}MUb zAcCy{|0NxIDHZZS1X8K}pdbqG?wjO+DTrXZ!nfNhkFKBBO71v_Kq|FF6do(i_$tW* zQxGAZ+4Y76>wyTQQmakjF*qwDxvOCcBE)yR^7!-n3K8b>53PxaKq~&N8c?Y+@kqoJ zM2OdXr^~mb4xyNmMiy$8KDbrJ8(xclSRvYgir}1>>m(q8+RHn@pv@ zg~#vJy1Umm5`?BO6{7XG@VJ6Baj)pt!1Cb8AOrG*2U6*8;j#XwZtj?Yg3uJs3(@*p zc#w9q*K^VnmWS4yQ?Q@)yYN6nIx0j9kF7sM+{%BoI;kEK!CW+q!=)k}VOMp8(@}9r z^t+UbwC;B;(YbH@Zfbs zEiKpzx8{RV54OV1x?b8!zY7mUq@&_|^}FyOy9sCE%R_8iVJour@(UA$hkh3xWSil9 zT_lKfRGhDV7am*6TDb$hiC7+}V~!(3zYC8G|8C{(-6Du|RGhDV7aj+%{lZyDTEDy| zB6n;b{VqJ_UG{|&Z7Ya$RGhDV7aoo0t&P4Oth>1Cqg8@_7ap|kMs=l5N5%Q-cj58! zg_Yu4f*l7}WZakZyYTocvr_!q6LvLDQ7X{?9b72gYMMqpF{U~{!Lyyva;Pn{}#p@l8rl3A)2+k zBWDHr^fn53*_-i|cM=aw(OsYO4drC^Q*`+||B0`xLLMEE3ejQR^NjPhdar!GA-eas zKK?kqfe5U#@O;j<6e&Be%xYV`Yya2~{p?5|`#z{=eMI9~-Iz(UH#)PbM!kiH`}nBi zb<0QOhdi)eMQt&P+T(3>*0+v&XYA|aBNd|m@e06_b!gL~=*&vny{=Rb)GrZxXR#AS z-4+u<VEwHHoUi1-|9Uve?zPPOBGtfs8q<02aCWXzHNLpx19veO$zW0&{4 zq~4qL$spGDs3%8}vz{2#Y2RNvy$h(V#3zGLA)0^p|3R($TU@rq+tQ|@*NSEo-|4FM zFpfU-KVZy&oGsq5vnqOZxl}Ml5sjnLn0U1X&XAiXI4x=Hp7Ad20D-kNzHQ@MI{DtI zyTCc4^#tdB>OrJJ^wik}VClU-Yk_xOWP-DVN`&t{GV;kq5YHMXAlCZ5X~!tu3h94@W^f68OJ|y9wP+4bK$!h`pcnM zrZuD9+s|%v+S0CuDfo7W{&I}@vrg3e_>+y!c-qgA3em{Vn6(#ean9P6;SHi59;a2B*AuJbu?^@7_p#?^UWf>UiNSLjN2T zNAcdxUh8i4z3WK=Kq^Gz>@ubxqbPn#lkLuZRCDy!gKxsybFKeQD z9V++W(3Kbev(vePW)xB(8sF=UdC<*{@7=${nN2;2?T%E4Cf|lXw~s&n=MLw2TCb1_ z(b!Mq#p9{f&W>+~c{ONFBtIlh+LMW>60z6{30d0naTH zr#bCg&vE{y);;z*jrPFz25JbQevvW15RLm4MWa2s(}{H)+UXnW z50orW7D3HJl3pWQoSZ!w&egovQs3&Cj8`9h)kPgYWA1IU#W}Y{MdvO;AQhrf;vf&0 zZw>9V>ex=Feo|&g`EkK8wLfnrME1<~@vCV@Ar+!=Co<;qL1UctH^iJyB#Z8Uk#@4cHw~VOPz#OX zr4AnB+}JecRN|EybkYzVK1bbDG3xbva--MkAK7tqm607s&W5-uk%nnj)cgLcjb5kS zx~mBlu2H;4rR-R~Ydgoe`0Z)V_q2+ljDzzIWg=s4?mWji`tmeq1|g6N(KsJT0%$SE z*-rCt1NAv0)Z&N{>SKv{q^zCRcc3{wWtw*fA&?5u%p>J*XM5VXP5o1il=cYNIUN^_PpXz~Bi01tx z<(2Eez4g5-=q%OkPn7_~FCS`!p_fEs4m?ob%jvV(X-(@DQlT`7@+0|HuTd$w?R)W` zD6&BddI2Rr!dV50Q@?M~<%Q!MtXvO3D}#>}j? z)%kwyhWO3Y=SYQUl!M93=G1B4rPs{yme6SD-C6q_=N;Z_8M9;TG_Ro19Pet{&yfnz zI3JC9ss9+~r>kP#>9oS(9TKn9O#<(0ytb#TYgRrm#yMV_LiZ65q(U^_Oc`_botvG3 z{p)+XY3$`6c9u1&@3oqazNbNt7~;Swzy(B{z-n4wAHlRETD2Nk=}toA18Ox$D3u z&N`|Gdh$dKY`p!XbJW6(-Yb81a%R)~KtE@wL5CjG>}`~%w^2xiXw;@N=7G|k&V-gj zSNbQ&B`CLrC7I`6UhNHU@}M_~aqLw$_+!`}4 zFFShfp&d>J^#@WR8s$=BetxrkH0!S&&dpRRL?BgI-i>B&@viAu(K$-1D7U*x;s2%k zGL^#7OCISyMz?rR*Qn?mr1c7^5RLCG)E_^8;(gJwhckxy1IH-JJ17Sk^U$g5yk{Hq za3&ECq(U@~X=C1Tvg38O?(inlxZ*RXTHeZ;Q{Ft}l&YRQul=lj{L?>ncvWbgBNd|g zl$x@Ar8Uu`HPPWU5!(c35za0;K@Q&R4Y;npa}Uj0q(U^dp)rR~U*I&pae`N!`W&TH zTt9GKG3J!|3!DeDCwPYlfmDb_sg}Is|MQ76x<(IMbDkeM*YFJr-=>VI@#iPb(nGh= zOPS0;^|^{@JcS!m(z}6Q@fY!6CUGU2SjmFpKSZA3Hyw>uA-|0oc7FqZUZI>{+7r5?1ufV#+JlmkUp0<4Q$mmdbNHR9+YSHBC7S&4i6PQ67RPDdQ4a6FD4ouwZ7 zU3lF3$vyrr*9syX6{3a5((}9f*9KZ)Iy*T9N4|a+9*9Usg=pb1dG%BN$lOn&+*ap( z@j{}Yy|h)6uU<&}c&fCI{uacqiKqOAKd-e2O=0ec*56X9+}8K|O|KTOby{=IOX7-1 zTj_T}Tu+F$0U{k0qNP;5Ck*iukBeTPA~>b5jbkD_^t#GHkjtbGjBUnr9 zd5~9tI-ko4lGl~}U&{$ne+!RbEwKnq;k*#7zlFy=Gi8s!ILx_q`a-tohy zLN({|a=bG=ZR>BT$1ls*#vcz5n!@GPc4I32E%o^PV$doJZns^JVPnoM(i7 z7aoIOdcr?eDu{GcoUeWt9(32|=v^P))}ZD{SX;!UckS7;HhQnJBr{CjW$RryW;LSm zc87cw)2+nVi^bREz)de$KUd5hXOaGvQZ4#ngn!fMjL@v*8X{VMOU(=E1$pd+gH~Qb zJ&3RR_@)zn$LaIehUmd6TfOom`=HK^Xo!dhcGfjXc_X3IM3hbw9-k(V3el*eW6U7x zkMjG(BPq9g!B4Uq;JTvUr5@bp!$t`r9Tm5aewVh2nxc5s%yc z@b@;a@!dty1~jhlZW6V$P^|~LN+GX ztn*ga>ftq~(;ZSFnomV3FCI@ciFvj9j`6ao2l4g{&*XU9X3VQ}gVVXk7<-yPDn#R1 z-I$MewvWc?9Q8Mq3NkP6Y*PsTh?BmL;3Me+Bj2T|LIM~P|0UH%g468R`QA`E*CG|7@t)C`7fDCvj`~}?12nGqmP6M*e9xAf5RFi= zcz1?3?3yj!Jv0ZA3eot^ZOmtNH^vu}cINps&vBK(d~sDWrpm7y;^S*=^|sR}K`KNe zKl_5kyPCr^Fb4RrPmQo!$xFNc<65Ye`?Rhtz6B08B zwHQ&a(~goTjS`1P2~r^%wHu9T8Qy0E?%DcSii{e{q_+|8$v$r}GdT)$QrLl{8i1-4IdW&?cR%feo z&&&HlQ=Z_(TDF9)QC5}RDw zM`EFCTMgZ_$r)Lzy8Bzz93QC=ec!}_M2{b}t;Xm0-XHU8yCtXQ_`@dVCsXupflJ~{ zr?{q{DPnpX-@C-C?Ix%PkqXh_dxrMAGySHyMb5~IIX)prY`x3SrfFaT5l!9 zLq$#*A&?5u*iUp9esQjITlfv6zaTMxf^e68SLz|Lx8*lQCOtFWsn74(?xy3^A9fFy zloQd5U(|ZIdpCJQYgc!VP+PTmHa|J8u-C9RjcN4dCa+uj>h67iXZuKnXuM&i+uHkz zyoo<$x^L3_82fI1;-U|PyWUfBZM(+kH8Yt1#`N!39(U;i&TgX-&t-t^1JiB z8RuM8?iM$7jvBQ(wc3r6sN>|T*t_#7nuF`lAL0Gox2bz0l?u5_q-kllyVvH!T5{`= zr@Z{(P2Jl6X8TBmXe=$sCChd>g*&RcZ_tdouDBp^N(C9!I8*!YDzG=u(&ud#?sB&L zSk*mBeU4O!#u-d9!94hOmr`3jzKe7*rb_GbnSA?psYlNvaeX+UzfN)?P)3-!IDas-BYLBNd`?2GbmDRNc?su*u7#Qt{fJ zv7@=Y<>a;fj=bh}W#HZ5$A{%N*|B6+_wU%Y$s0&(2~r`NcY{AakeukOwy@ZHfTDU1 zB?PX>I45wf(1~SMvDa~SJ@*1y;gAZ^xPp`5w!f;sd&(~7D%wAA_rkmBOXzGktEH~g ziQQHG(d%|OcbOa?sSu639cjJXRpg8>&2$&hjJod8g5=78yZ&MF-PXUJ?rIHt7dcyL zEjdcF7O4=8(tt5{Jf7)%Ns)CI@VX0Y__y8ZjwBf2xaJ$PeL$vj>Gf^gOK3(R6{35& zq`ei)G-LYI7#CmKINN=Vc;H;)lhB$UgE>gAfVzSkv&xK%pW7tc9Z^2V4^hEP#kpzB zY-|I!A9jOp)@4{cxaW%M8u6HEb z(%nq^Ij(&y6<>T<>al)vKJ0@ZU7G8)ZrjpbNuva*5RGdk*_} z3XLnILNwNoPTPZ;`c;~b@EX!6Vfo{xTxms?6Q3fxJC^iVMp=5g&hwUooBGRlKIM_c zp_N6I3ehZCUf5jwqxGxp{5J;ei&iEcEHhkQU-H$vH(oh;ReG+1u2-|CwDT`(wJ*9M zkW2LD4$&-S@Ed}xyN}E+c7CLl;d&Y+xLV@8!_}46_C>|cWpC7TFCzp}AsXkSF~9tp z?N1%JeC1PADm~pX_p@3^WKwRc@$~zJ|7tyY?alTF^z&DCqP9XRMC(ne)T94brO`38 ztGz+H8qUr(oeGlsAkJpeNFl`NH`}>8NLoTFL_g7ne19f)&THSO=hs?Q>>Z^3z?s7m zYm27R&p6YJxolQFzwCozFG_17QX!h9+D9MNK3`Th!%aMT)G4K!zv>qx*VhF{NQ+>K ztb^q#X2alRx+dOueujI^xTDVXR4SxG^mR)pr(oAM=FqE?oCSd$Jxap54)S?fzsuSA zPeRNO5b3D65A?hA2cP}FGH19hNn|L6rR+IRl*raynBlh_eAJskD;&!PN9xNB6z?+4 z3#D~g`e^Z{&M0atpW4dfwn8dI^GnKu+{dloPGA9LR<#&Gk_vCtm+oVKh$G z#ig`T<7hz18%K{Zr&k*n^=LPkO}hb7AsQueV+#L!)XAlOcc~uOQz#o^&(b>%A@*lx zxa(G#l`j76lQ;<2RPWn68nUBhovTf8mc`9pUG&R4$+kM)FTA0X0EalZOp zc+e>E^fZAZ1IKPk3ynuf@UCX-f&01c;an2^E~N_I)hr?%6_-T6OR0hx<)>y8zx{`2 zQA$gXOVw!ZB(L|M;x7YRQFml6iGG(-(LDEbo~NVYlIV9SRmn|UZHW{g%bvJyXPM1ajBY7U!$qg~u#H+!Y|wQE|TdU3dgH z+qNEfcE(=Q@4^ES>8Lng{VqJ{Ueu*GdV9+`?}kGAGRk?axUtaQi!zn|79KBu{FHn5 z>4MM{rb4v-79ON!;i{I!(^nKGH7mMZOFRON3;iuTeDaBN_yy6j&=k%K(fV6>^dgTD zt!GFMyawhLCSOVQxA361RF~dTEkaW`FGTBa;X!&CF6m|1SLA_h3+)ccc@<<4 zk3eG8?}8xR50`X5EFv8hqNP;yM(@(AzC{eVtT0iZBri_E+UjpX6#qTk{dwFZufq18 zOEiVKBbtAwWVq?1v$SNXylrbwabDQc`d#Wludgn>zS>fyqe8TlDi|eEo`am1YKU-) zs^*A(7aqY#w1{+6oUeWt9>FMamUZH0j6{n_N2T>(wD4&4&v5tY ze9^Mdyf}qh^!@Sj2CcsZ5%i$tp()HA(fV6T6}-{QNIcUZH0Xz$ojf+q--COKdIE<6J59g9du z#rf)Y;SuOYSwuRCmGccF0{yF#cpzGTOQ`~VAB#ZA0?W?db#BtGHgSmWKeE^&PNdR# zr{AR>fi8|kpu~dt>USyC)<1{)N9IiOUjMP@l5|v@FP7Grb#=S@eXG~7J$T~H%`v*U z;e7GrO|+ruv1HvYZ(c0#6bus?SAPp4kbNvdQ@HGi*5A@r zfu^iQ@Tq#TjT9-`vCQv8bW&3`R4S%IwEh+zfxf6k=xE>+Yz6%;^?0n$?f%9#l`SG2 zm7-I3WPw~_5iCsIH<1KzST!@#P}x=pzDubB zdDqsQ<-uVqq|aH#<@aIESAPp4kasOYQTlr@Xh&Owrf^<} z*5AUTZQtA7(*jL$?OV?4$vTCJuaC+7h5i;ERqwvtJrHP;YYOLuX#FibX#a3kUsNRk z&g;xbVdBaDGOqNu@c5bh&wbWgG)y&x^Fp-#79O#U;`2QmP}R z-Q0b7VmG1X<-Bmk(ci*@)?HU^Gc<+sLbU!C9^F?ocGTVg?+x{?hx66%!lQJ3V@GWo z(ou1~`dxU?Ja^QZ18-9GWrOq8@51BNPG30pwiEl0bX1(Leit6cvn#vX0$TtaaeAlA z`RaG!LHmcR)&uFNIA8rPJOUeDmv;la@xt@6eit5r4X;I{qq02U1>2ZT$6LAH_hOrY zI}VN|{VqIcy>iu>BOMj<(C<=@^^5ZSvq-6m>yiGhXUyvGz0cLfdH&dH#{I2Py^>VQ znAM0zp9;pj@?M_5p^EUp6hwr*Eqt;f&wp}fnZu>R6hxr?ura-3dH!vC%A8eOT6Dw| zM6fQ7de|Wg9zr~{x6E-4&RdQth(NnrV=BIr=X+;MJun3kVT;`3UY_6o+cIbNl=nMe z3L??X1rcb+ zMtXho^86~)gH5V8T#hM-2wS*ST9xPDw5iOA4}Pr!rXT_>@{M_JL7rbR!?+K8TXQ+4 zAOdwG$)g;NtNFpW!W2Y=wI+|zXfG%$a~|mT+%il-MA&Y7#QZ#eeMMRDlJu@$HuZ`Si?eo*YppjQB-LNwn2sElIYSorqbzOmS~ zJ$P41t&gLE^^v6yzNZe>T`O6pr_vQw5g)A2^Jl+P=FNBNmB@(WlPyp@VBNL#z!XHJelrjK<0vs# z{8^BES?Axnetbl~``fw6I;p9@krts;h+h8(L-&|$JkrRNE?`fh)%mHWY87N3xTBjwy)v<=cYfzH7|x^M`g2 zP9uFxIT4{+PsZd`JTuu=h~VE!b@=mwr2bvF9*96H{;j&)VFaciqWLEUpyhqlq&3NU zV9JSzlqO)O*C!_X0}=dNsaUH+wIRZ#LIhHw9*8kTc{e883R4ilS_COAixiiUA&nHI zLcIgB!P>sm&JUhZm=Z#eKJ40Ms>y*oLI|J=>oes2TrL?!2~+sD=4&-&*QMnF+PFv+ z)~&@-VG1Hp+mw_hdv8s~OU0BE5s!YarJDWqEf)!&kv<~$w^B_ZE!KPYDFRD{2&CfQ zDLwtMZ(f+}b4)=5Yiv#ZOL>g_#Y>J|L?BgI$7_D&RFpAHK?G}NR;k>=>c*vN!D}KS zkSeUp+5Xje$x>koB2Z`FnCfTNNY)%vPDH$OmX>NwtzF5r9TEInsaO+qz`1LwwE84RA|j9qZ9z!0|B9cI za}ZMy!Fu|sbvIQLio6ImF-R5G?0V>D>&k=!CVNLRQ_8-Xz#F&Bz)+$%|AzTkc zAQkGN8{?FFH#r9}C4>lRu__m?c?bbiXmvyPR~@?~$1bLzb}Z_{DhK{QGGxJnRQx+- z%~9*F=aOR=QxFlhV@YutX|-`RFQh_S5MxL}PL5qnK}6W50eK(-sls=C-@IjPTXE}R z3L?Tf+sFeENEN;#I~X0BtOuqb0=2*CjB`d#@~nmkq{16E(xLzHvt)l@3L?Vx23QY7 zAQk^kod>@tYHb@NPN9f!hiZNENCGD()rv;AF_3Zu8tJvAcGt^|3L zy+QqKzwO84qHRdO9jOqF_t#YO4lVtC4Rf8l34#5=I#;R*h@*$%m=L1zjk!*Hx^G7+ zM6-?;>n+NietcJ^zqvbEn$qn#YO&#H$Js@Gaem13Ck!j{_7MW95FOS$JJv3~@@}%o z{ful(P=;ffvHuTZQHAm&*&93?U)g;}w)-*Ju^<(q!&=3p>Ex&eHonW^%dvi!HC&Ig2cKaI|BKVoQ_EaAg~RbatkbN0!A%g=n;6A}=?4 ztNLAE-Q_i=nyYRUbI08PcOPT6?y2fe`)rptn5^QF3el>6CH2^NL5BbQLr0yTsRwaa zW4#r%uE8CZYONCf+s<;`Y5u?`jJOqJ#&3&(w+6t)k?wn#KJ`Jp~kik z&VH#dao!y=`Z~=kOnlTx`+UiRN4*5C?;WVEkP6W?A1h1@ZLVYYb} zw-hG!OcEXw^9mE){*}@9$MC|$4Xflk-H~nIrd+L8LWPkX=Edz3~yj!~RNIJ;=| zd8?k^j65#nQaz9g(Kx1Q|De$xCua_msUDni?~^U;%;C{Kc4rGajv4*goAR4>&RA`~ zVk_VIESOPBg=n51-;_vBdv9ILMlXGzKZl2?v(* zUC)1IRhfQAZtm)khn_etmNK4dAoC9AJZX!FT;i}?f>elRxn$X4o##`2tLpA7-sPP_=X2I|R_k|sMP^-R z^-M#)+xAv<%hAc}x6^Wbq(U^l57QiMlmn7R!>SJmBHw9Dy0w+2XsXw-9{8~T#k?j4u-UQ^=1whL-AhT0<5#w6(%XNzCk?O4h8 zCebKCDnz4J2gSjfRnIM1RqXtSJn5j;3)-%r%?A0CnO4so6DxLpA@3JRg=o}Nu|9;N zI0p29GZW}>BQZGMj}#$(D1HG^Zb&Q?#;b&y=hbrwuw>u zO4M{>``XhhsQ;3tZCbjg-J9!0=-vmZ5RE!ai&O;2U{YjB_rxgu>FTx zACiLp-c1g9t@GJy9a140^(QEzXM5jkF~7EdkPtX?@O24i8m)<~=K`KOt zt>{j_rj2{U#hKm}bhm_Ug0l!`moap!=F+X2$G2)og=lO;W1h{ zYD4V=){bV&H<=$t2=OW1XLP0eE2Kg+>K)J>zy;OaX@6{T%F!r6O((REQJWv(v9o@4 z_t3sg4tsk;Dn#RaH0B%fIy9M9xJguVd(#+LWTHk2-&wNNrttXb?P6yRAxPe}ev0%x z6Va$^LRw)hePtDpb9|}BmvQpD(>d3> zwM|R^KHATbDxHO+wC;OT+PUS|mqyo6J#ZIByM5fXDK7Hs?cA?+mqrItsgMfMJf`)P zgIf3AOt0&0ZTxNIm5aT=aGVC_j%7zJ0*Z_LNTzr86>aeb0`SJBz|FX|7ZLNw~Fk>>K1ZQK<(na+K*8()vCnd)$jq2a@-XN0WY|NVDH1&3=zH`;iLKxOW+I#nN3~ zk8M@`4`{Tb4LI)M_%crSyKnCD&O2Du?@X#->H`C9ida#`bTg!5v z<4naFOr8qwFLJhQ$@HsGsgMfMsJ%t+QDUj*^GlZQcYNo~H|9FV^tarF2bOvkp($J{ zMC)&vA7$l7IERKc^&Nh|f5Bb&S-w5#D60Hqg{YG||*;`3iOdB|+b55Y4`jQj!e$FpZKAQ=fg9YMXEkQM(O$mhMY_ zD2@L4W;_21dWl0SM59bZamnNzCp1d9-ErsC-_jq!JB~$Y3YSVt!c_WO`eWwO+HN=U zW6HktP`bnY6{SIAjwEWkH&*qXRkU*=6{2z9HRggLP5+Ov_l}pMSRS`WNh$_J3@AwO zAPAU2V1->3F9d~@=R8U!P5S)abEP2JpZDHXMfXyo!n ztJW1=UA>}wqWswIM`6{vkZ_5X%I}S8`LW%PQ&M|pe(cjH{ggZ(d?Rx{IN#v1J5!gv zGrjuuNuMq?rxs~uP2Vr~oLZ!rjW7G% z*_d!xbAP{TZRyGQv0baem~cqAM6U^HKelW2*^L$HFJyh(c~Wz>YI>8!SNEA~D$?7@ zXv3Crb*V*~&!(&q|Mu$I_75D8>mzRlz5(bb@Qo1!SIFwdM~^!ow?up&YLTY@5U!d% zPgc#&#j9pp+vPh-N8;lQQ(2jNo~+EB)0MePwJt5}o56Qi5WKQ;WmZ5-!oJOWKdE?G|Rerz@hGw(yfC3-H>erz@hGw(yf zpC~;SOXA07qcHP6BwV8BBJIa!v!fGTT;Swz`X+O4l6xI+5YwmqA zJs151|J{hfIz=Ioq($0FRao~UB-~?F3D4`ln~lQSB1NTAiEEKI8@is%+ZWh+WL|TX z(5KSlcm=a|6R*xJI>HEQk@jON)f>%E%=qeJ>h<|rVO}cLD)!q8YrPcJ+_g$+t4Cpl zjgauCRwcaBer!Zxg^iGKiP|9T$5szn`70wk#fAjy!CtB#n~fVUIz8hnf4QWz9>p~; zte=?H{-DP!^jz$d`?1+5tkD<}E>Rn#{n+YJSkJO({X{(%-ye+b$jga#H{5kNvMfeR zzqYTeOFm4-2M;=RME=TcZM;8o*obH(f6Rp=^820Yqxv$!o0bvYoR08Pi}VP|#`TN> zS%LqXhM6l~TAAHlY>Yf>c$8E0=>@~1oT9658jcL14eJ_aHh*Mg_DQipEz;*4J{(y{ z^H;6zk-7hX+)NpX>-*}6D5vNjPmYLkiY|X^1Tut{{%>`U3F8ltl{{p;7FwhiP8xwM zq^X_v&h&5JC)-GJiq?KNEXpI>Sa*1o(RRXi!;uyCu&ky3VcS00M>T^ETBMhJF)Yfg z3xX}b9o3^s@@p^ryHn=mHIkeCf#pW9>>sa_T?JbB{kUn_s2(#~cgh_iIV{v7%{oax zYR^8|6T9!7`&F(L^DlIi-S4xG#Cuzi-rYWZvdbik?tQs~)FRD%4cQT4#iDe#-FC=z zmhtn&?+lOfWDb9Ac$6n|;ELhMdii7dqV#i;we>G)?bIT@Y}#;S)?Bb}F8iS5O?)PV zj>|rErL|pV(=f{>2pa8`%bqj4Y3^=mSJWb{W4E2B`PFSMW9M~0S(L4iCyFhO&mCK+ zL~C0L@x!9*9JyB1BF*Pf_8z!=ugt`bmD%ZXKhD@NEXo~ZTl#dj;m8CWbJ<>*cekm` zR!9yDwMes#$*f=LdEG9VHP=Z!*s3SpCi^oMa&h<+1i|JPSESF7tlul79@HZJ?7$Jo z-dWnJZl=}s>$9)R{kZS?;ZdFypY4~&4v%uNf}nBBx|xG-Sf71SN<}TweCDGZmYn9W zFwcrvTFl;(_wI8t5-vH4ABYWVk!D_&tjY1*lxl@v0hLaO?-^=l3xpNlP$mGd8}uyvjicxF-^~VzBrQF!|86!~{;^NyyU$Xg4Zd-Bef)Q`@tLf6 zdif_tBx&h+{dcpmRMzrt{iUtt-TC8TVXl05uJ?yUx$geE5l7yAbLNxBjR+F7NL#5| z$xMzt|7q)@}c<`T6|+K;VNt7JaI-S^oV@$Rwcxmb4p zy_`tWB5kGG`NA3Lk0)Fm-VZ)GywCo-5nWH8k$(OjBa*bVB>uaV>eKx$%Usp-gRtga zLp>M2oc_BJ4feS#^T`QDBx#YhQvH76g!FLP)oQ8qwza&P>!^}NGD}1=0d<`!^_(>~ zQjde+x4sk7H!Z2iY$rW>YLV9GL$eLd#v9U`SaXQ2r(bvBurTjcC5OK~ESf9f$3_en zV#_&3xI}A6+K;W~m0ynPaf0l8^0>rz^^H91YqPFi=62()?D_`Za-!Gcr&XhROs?pZ z=^^8T)FQ3EXnL8~!aSsKW=mzA9n7OzC}Fo z%Oy{STBP-!U-Y!wxLdN@KFh95FPEsZdJ~tQy?1yO)o;_RIklnQN3Q+eh5J#xwqYjq z@XB;OiAGV2wEA=l!LcIKx5iZg8L)wq6U40>bV!P|sr^Oe|>HD?e1iOm72kIxz zI>+zFq}}UgZWrQtsRy-4^WFr(v^{sod?Y)p?kD%0cS=2S&4|`}&O0m7bMf2nTDB-% zSK1Y|NUPtjdDd3*ZKg~~A33E(=42V$=F@rA<|D$~QMJLRIS5{UW=i^@Ct76Ql2TEN zw0=3;9`9}Un=e=Q*yle7WImOcC7&Gi)vv$9S_YrAAUGjd)8ksn=J;N&F11Lj5C6dj zZlk?qF5e~b*KH(*?3v42L(g2*dU$rL)x7al6SCJWugIJwZI@c4J=a<3AlOHCYFc#7 z`t&pMeCVtMzvntz!Jj*w)8Nmhj0v}@n`<~^efk=?y3``Aa~k4S(k{q$fBc(HnG@v> z@{Pl%h)-7#w0fkrdmDKM*GN66MY{M6clxdC)91>5TeI{HC;pY@%Ih^@d(BN99_H3t z&G(X>nqHHB&JwXfEz)eq;^|*ek)Cn%ewjz*4)RX%J;*y71YcfMkv>IsEUc7vMJ>{N zKZ;NN%*u4-*9|i@azE6&)BJy}2g|O#aLw$udff5E%5-jh!%Q<7uca1g)=6^c56Y#N zPm}R&`Kqy1YrkK!$Mw8?3WA_V+gy6p{HC(9ykr7Gi?n*knz?Q*vEr*m=_lmL{kOas zC}G)orXVQ988Q-Q$Wel6e}Tv3s|Q*!$>^Gs)=_>-d%5C1M{B*ed6L2&pb71>2{ z2j}aX8d{`v9*aN0GQ;i3mDwpWH=~V|%JcEHhCb6mua(cuu$s@1e(g^(H)Eu4ttTKQ}a zEic~&d`kpD{RWlUHdpSIkr|*lYLV7Hr+Wi3t5N0x99KK4M+>RBXZEWN&+OOQ`dk3J zRxM;Mz`|cf^%y4vwMhG10J~P0H<9yM5PB|NQC{hyc@sHmk@k5LW}~UhwY+fp%Cu&A z^WEp!{Ho;{|5lHig_t5c1P_s`OD)oTS4yVr+EKMlCG&o!+(G&u8bNR$PU8%*N4EEJ zA!KJ#&6=bZY5FTcuxwV-+@ynY*?v+FokgSb`LyglQ%}q8GoP#;S4mdp0GZo2Sn5G7 z(muD(uGJ2m`edIMKk+812cI>z47M1FEp_gb9n)>^%or&ZwMg^X41%Q+ecbiKMd>y2 z{or-?nHFBB*aHwRBj;WQwMg?mNp5ZXT=wI6O*1#k)%Cd~dQI3e*kXd<_q}u3Po8g@ zX{n=qg?Tqx64E~3#IDuWvSRP{GCyitxmG^gNp1Ly8rAYyH+DbTJlP`m@gq~xtL1)B zi?q*=G8-N0uc^IAyo@iz2HOwcYJA(tdX`_WuD$!d12QKFK`qj3Z!%YAX471K`G)*g z2%i(9Qaj|?~~-WKRqS;(&H^MZwNsjhgXzWTH-!ares?_ z)gn_N-&$&srcV?EcYm~J`i${6hy7YcPdzHHb@JcsevnAgQa{>%H=jByJDGKSWPI4K z^~kTDi+ytc-H27cUzhpuE+dk(NL#5c`EM$-+2;Ee#YwCs$ulU{KJ{(=}2&8KH??y=6C+m@-BrPq8|8Auk*J8&^qa9BSOU1|*V{iVu z*=W#g$IQf?jY!hc^ZM^*W1Z|u(%>i?;q~jT=VAoGkIlv%cU_%1>uMuhqUR#*$7bWW zCtvUJ?8~=?^pku-5J_5kUjN-}{L<*e%<*k(S1TX2&~tG# z!;j6z-LhlI4Lcd(5n~iT@IzQL{N{d;#M9)RqkIja}EOQdG zEUSmFSilk*(Yen}xrOH$k))+1@!zAXoAaydo{UOZLjT=t$Q{i29Zb?9Z8jS2a$@fC z-Ry}{&%)Q<;CcObvr*aP#N3%JjY!hc^ZM^*qrsBO-0N@D3$qj4cUFndKi2d5u@Mr1 z%t-_?BwV6er2W`R_0!kAa_?MVPZZZLVA=h5BW{p!iH3z|FiA^G;=fy|B)*&T_%7GQ zV9W61a>6BQowOfYscyXY>RcPyUsj(euIWN8KQ6(CDI!8e(>w15gi>-)bsl9W@BZ$`aS+zAd3OH0vXyl(6jnyV;P@*Q}4e zCTZz;{dcn=zE7?DJ{uaVs?ZWM`YzEH=j(fDd-ZWV|J`g9T6;(&Y3X_Wce9~i&dUz9kvRWyszkq*sqNc` z_3&dOwv?~)v2WC?)l#`ct&{d+E0v7nuaV zs^Be!Hq@IaU5BHzgyKh=M^;pG)gtZ3R;t3+AS7sAzZo9Q_TP;td~re|NlVM_zgs;D zUU=x2=$-Pl^wjg#HTv|teq2ttM72o!v6ZUOuELh+5&+EUN4T*l_Jo=HOMcQl>JpJ%mdCjS%=k+rgQRq#CgiBP5v>#ik z^l6oKSi?IQ?}|2P!LHZn+MgYIwrJ_QTIuf4@vc2aBx?;?@Z+PKt+^7}!8S}BPE72l7fQc$e$2b5LlHr(^81lg zDr)g=%K9Z=Rb;;DJs~|$GO#rx)>oR+j2-tlhP59at?3m6_sEJ|kIULrYb2MGTBJ4F z7Oze9%#r(L_PMDdy-2bRSNtK_xP`SCHAd>IA!;snytd(F85^uSSk?oO{9S61)(oh} z3u{739>Ar0W!~#hnNCXXs#=dK@5QUhl}YqL$}LsFub>fJikP>d|Y13?qm06 z0~sk{uCwMds1|9B6ly+$)qI$Ywr`(XneHex_skPL7qv*s3^$ntk)5!ak(G6tREJw5X-j#-x5KvL`KN&oxi%r zyHXEok=87$cum=#I`&C_CgYr6$kp}iFTGZt@1ghEb3*iYSzYYFKIw4>?VTAbrJ@#T z&k(a#^6<(<>7APGkl9n_%6QI%p38G4RLiq0%m%V7!ucP*)*xxmvM?Kxv)x^CwlkWu z&F5La2AWN$T6(PcaAret?z$Ip?!vrq*CNg5KU&>5t*aaRxU8N_V^;p8y5DZ4+F?z@ z+}N2b)6=9>)FSO8?p7*U!!#{xm}YbhQ(kwC8F!!v=j9-a@UW%mp^yH?1c z%TSB7XA4=)+dn1w67nXkk(ztnlAepLkF7EYJ`|$AtV1Vb^ciZA_Dm?$_6?y>e#{EMu82KOIig;?3GV94Hm(wEDZlUk&8RdDwVWR-%yZ%tQ9p3HQ)R-VhL z_284rCs;C4cCJjz{Ev*z|DYCW&;GP}e1F+qxtZ&3O%IWKPU{|@Q7x7>oV%2hxl3uC zyF@M0T-7rO+Q}**(=T41zF=!xt5~!Dv>qC1_OB?Pv}kqXw61PUEk1Xion)<~jVznk za(dIuD0yG;y~LKm79(qa?wLz(Cz)r>#0IrU^KBOd=btwreWc7mzg23^Hp(l?D;)%r zE)mc5%Zkj_>Ma%W!u5)hW}6Oz%?7W}?k2gft>x{*8hXS-X&FUVHjXxmMRIVgHKt}cjNb9};>;usArbiwGviCqn_8v&<-UHMk%|3&y zr!PMHbCRppUu+clIQZ%pc>}tKLPqvb=%ITk&^I7WpD4_e$#|ZOdtMr|aDPXm5$>H? zWI}ShGLqw!)*LTtk#?WRq8}eiPvY)wqkGhsoI5X-O1xBhUayDQSS)i5R_8|b7%Evv z)FSQmFdJV;e=sG_;Rvzeo|j6z@1*B-@62p$F8#r}XH7_-BLuZbd;iL8NN!X{a-*`E z8>Q#cb@TOHK9;UpdPO|zO}q^8EZ03hCEHjCYLQlZI_7OQZj#Kl7uxm7R!gaTp0L{R zd=J&~d7f5}ITX@tjz4*mD%$pZ;9v9+Ujl%r0n!S?bl zIlf(=w9b{G7R&DM603)-5ufoj;=R23w)Ce~-@E>t+gr5%i%m0wB@25ed5cnuwAV># z$;OrSEKhi}w);Z4AACA_2aBHOV7lD%ioa^RA0hXgTBM8b`9gVWH=aKsd!<|}woyJs ze7an!j>OVk^Napr4qj%NwIgcv9zbm zZ=Y3>-ArYiwT0u zdhM56IlDsl9tc~BMr*aaq`gmN^_cY8qU@`(rvAP{_`H9W@cQUTobKRa*XsTivfh%c z+kc7>)FRF6ChPUB>6FviNM}lG=P0Z1*`W4{$7_#T-6?m_^lW!s&5By2Idef)b(H(j zwr!tqUo!8LX?a;&UIkerUhc=Vt@@-N6dTkc?fo{pR(s1T2zyMQl9e7ym>2H8kB;5y zPCaT*TV?FY$d@xGU(T$4IjN=X)oEt=2SGD=J`Oxn_A8PnifSx^5m+2QCFX;<2#(_M}9PH9h1cRSMi zQJk^$&+FD_t7M0x&*kb;i?sF!b%!In=Q4k=R^|`pbpD`5esxDKm3VH9+9=LQnX+Pa zZ7*4Sr$(MyYLV8MzV6OtHePO2nH?@Wrm6Sp>rAMGnMcJLLPNHw%(j-5DGrruMJ>`A z%hL60%*F#>E=uQH?U0)x_e0}5x;v9fJWpHep}l*5S4!MR=8`R!=lp7^IkiX^=Y`8W zue8kb%IQ2Wjn?T(Dr&=XcGZUViv1c&EL>Jq`AAk((UoqgMY=dgxZ~v&*``9ABQ@6u zo!j6&@O&S&7tSBd%KX8c&L5-}Y2KS?_E}D6pRqOYJ;>H084xe5%)TP~HQp>Xs70FZ zN7?iKnc8_%WfhO}<$h>HP**V0Yo+l-&(dSgR1h4xG@K!w(;3p#Dy4O85xeIt_wAGY zQr5b^Pi(L?@cOXz$okY>`(&jrm0KzIgIc6{-Gboa?`pe0`Aw(XN#a>*soXj<3|ZPB zn0bF~_w9b@l-peT2Blg~Ys}iOh(uT_cF5Iyv?zOu*x)=U`i7prYxjJSe9`V(xhR{F zdQgireMXsGvvO4J)3R=q?0pu_^YW*Y_kd4x5G-0Ts&=TXO?A1<&ZHKfZQdJ+c*&bb z=51$n-Zs5dzN6^XMzemiI_sBOr1|a&=Tv89PIXS_RMTVed_lcF^l*Y;+b5@FFO%<- z&Jv;)X?<=$zHB#2+ocw1zPp0plGP0}2g)jG z66Fln9PqvY=NstwVC?B{`F+Dot*pqtm0VqF>FAr&K6AlZ$!*dfJVPRDw?64JI`5r3LP|v~(mF1p z>)csAo|e(q{b#SP?IPa~jZJzlj=gyH?qxJwMtEl}SY10s2x^hm_@(CJnT?qe7wy$; zbZuK9ieh2VDx!nVdv(h6eQ8v!u0qRmk!I{H2*g`TySK#l!`kvHL}Nv|R#>>Uh+h-Z zY;QsEmRzeBX0PtCL!ss#17J*-&tnkmCdB9kt9xj)mRd#6T_MVC*Q&5mNLE)0;k%D- z1HL7SR+J0Z7SX*v^<1R+t`y(rTiL_J_LdFT%Wz+fPb!~a>DSg@(?jOI=5+2Wwdm>5 zw~JOI$?9q(e82MT%(u4eJ|w#?9P;I&tgLw!u3zF2A<}#w%RGA7MWCDPT{BVM4D@UH zr1A-t9jDsl(p_I_n%h-MMJ>|wgM(mztf|&`v+TS|c?L^+sUF`g?$`b#9$)=w*?Awy zwPGZNG-D@0aPD?(m~L2$=uXM=k|J0>)}yO zwLyYslKJPg^HNvL?O8@#v1oX>zLVM@E#pzU&r79FJG^VD4Lz^#UrJi;`Db%elWyqM z_4`82T}#h>ud3vhdO?6XxKdANEcf-TIK(rpk#KHGJnR+I@ zTWEuXk8G$7(z1u!F;i1x4&E)LcaU0F{4_k=qeyKO6BmztGIi}a`imprRF?)L}-Hq$2>^OC_vi>Q~!P12x^_a#fW&#ZP*Kf zms;JMn!LxEp$!tufg>#$;a5yZ)!WSoYK>?zBHWWx>rqUMXfQt2Yg)h11_|a1l9t_1 zkH0gu_T_%zJ*U=(;$`Z7plYL-_}|Q-sk-BxQ&-(v722Sd@93yD ziizxoTT}b>9v0dlpJ-U{g;$nADiYH;qM@LEyJcPvyJ#l(#-bWGJ*F*&>+B$$yxTB6QP4@{l@ z)#T6ywR~q%wNXr*)w5aZ{j;Wq^&r9A7}B!hN#pHPADm_cwS2b|wNXs`F`-VX{npdN zQjuUj6zL#1VCQX8JGL=`TE4rA+9)RafAmqej+@O0>p@~tVRb@%Cz1|=E=^Z-+w->< zLV{YpW1ZS4Cgl6kZAJIlWdt*8NXse(ZSU#UtE~~#@*Qr}Mlo^mk$t;8|InQ9T9IIm z4{2GyWYVy1+mD|UmWo=wqmJ4rAtu!6cJ}^r%Lry>k`97X@@=~vbJ*OlRFshL9d*>6 ztm8GIPS*tu=7j{cH1_5hhQ-8(PoLX$r@BT^LPC#q2OqOh-Sf~FU;WGKK?whh!r{27<<|L@)`{S66-)?C_BBri4Us2Ho3pJJ)1aP7d2H32OQ7LuO;a#Yfa!_@aGrC?Ua&J&6v^ z?^*N8dk=**CqXUW`N(WM`uCYNzb?KvtT`nle7!ZhRwq2yyJr06_l5N!K`q~X$ZUN4 z^mR42U1A;pB_xWoCKtYNRn0}>W$05&f?B@wiP?B>bal;_1y6<&63o(+nZ6GXthxS_ zVPQQ;P|J5+F&q7Q469i^#ym1gNHA+w+wO>(Lmwz7sO5X*n2mhDF*WnW7uA|mLW0@x zGRE@ZxSC*AIYBMo$Hr_t*8HBDZQ7j~wh~H6_&Q#8&v#jHU(Gw)of(#j1hu%|jAZLBFv6_RA-9M}cB_uqP!)(mUOs(mA zll5^(P|J5wG8>H^d8+2B9=nA#r-X!$BAbn!kDgl7BUMgN%Xc3#8^63ht>&>2b;FiO z2?-y;HX9pXd$#8GLDowpL9OCFk-C2SLd~S>ttU(g3C~(E8*k5@S+hmIa)MgEleX2P z;@4R zY92b@B1M#t@F%kV3wph%?-EK#cyzGHMi?XW z{gw1wq>G6!8r9V7J7kABYJ&u|JgXzNF~6(D`h3?XwL!X=m?-!B_5CeoNrGCQEn+tA zKYWhf^RQIDcqs&r-EPd&NYn z?_Q{>xnXf=g9Nqod3^rwb_E-SXE3y(PwlijHSeu@0qJ65$s5nsygasUjouFu)YA8g z<{?`>uFO7LbM%0^HChjSm)vrx*&tm^ochpHHQ%Rp3vG~~mS+f=jlw%IB=jwM+F@pc zbTP5bR!`K_xnTdWR3xb7nNDUy{N0+Ph0vOZ@Al?qgLE-*|H?@<>z+9xv_XPeKEiJ{ z8ofTL=D%+q5!%qN+Q%DpBv)pcwjGtfv|z88=)Bi`H9J+DSw>LHGY8DZn%BqGytU(* zHUE=(=(l#^$7X}}iis_%#?_3N(J!nA32ONWzuEZfza!LV2ur12##OV;2I*qrk<74~ z-^W#z5!CX`0kbjutr0b~_f>_ZQg7+=d(8&z6%*aQy1C}HV~5pf?3DzyJOjpTw0~!a z`f#BQ_2E+C>;cWe;gzSVzaP zR*l53!cvi-mS;4Yjk~AzuKCwj_l7pqr#}2>vq8F;IQ^0%YF5mDD6~O>TAp!XHdg0* z)~tW|q0ol*4fZ_HY>+M{3Vob1f?A$&VK(~A>0C2#`Q(rY`#3Gk2JICSr!8wy^Wte! z%Lr+n#8I_SIT$Yc^=Fn0Q+HoCoYSJ-k*VsO1?+W<&d&*~ZhuQfV*s z+`lz{&-NL0d&R`rQ{J7k_hvJ~wo8Iqp6O&Z?s?{mIWxb1AuN^lw!8dfHb@r}PrWg1 z&ZHi*%Lr;|JV3`-%|`D15pyotcXs$L(Wt?UZ_Nhn6%%dm>_121S7FUbP|Gut%*O8T zj+nFiU30=xX)NQbugnJNV&b|9b>{57|J;!9j3zx7>0)A1zU`d*51Sj7N@FswEj1e? zcqYjNoKWY*puxP*hDM5fhb+>?gv762Z1$_!u-KB>Ai*;Q!P@b4x@PK|4bN54dXO$A zI&XDFSBYPRr6Qs6GOrWqAb3$?eWT@C=~vCi$<+o4o=NsTduD5m^_3AC_w##0T5|3z zW*HJb%C0s@(6+>>C1!cG+;c4z35`>F8zU|2QxANsTg5@MLqemqzAGLHo=N8RHGQF5 zivz5+lhAmpKP#kV-rZ5FG=>~rUC+PJdXV6mWPGsI>)nQJd?73q35^^3Gfz6a=cx_y zW>9a*vp3WR37#nk9@}M`)Hl176B_^acM0hr7}=mn>XY76!*_}24yg?iv@NrQ8nsA` zz0}@`B*Hj;;T=pm2-34Urk+_fIke$<3u=P|&!qR`z|?nNO%7{LLdPTgTS7Vr?!2H^ z>YllUZ&V={SZ$EtnWUBMepKpt`KoEV@;nJ8bX>*1iKJz2hKv=xz1+UFo&!}%@Jy1Y zzxtHahQG@R9Ut;$^WZFtU&+91I*1wsEs<5Fv%Gw+pzj-R^kOIl_LRot8E*!IlO zhG*=k4H7()ta!5G-qhBO&kXM%2^|M^AD*ozP>eO4Tk3&Mo<-JcuT5^P^ zOwn8eyB~%5r)q-)&lCg;kD8j=*loA)p8I@0B{aXl`-Y^0;F>q5r!E+3JxI-&@ct_a zo=Nf<-g-9GX_EC)Nobyg_i;(f_k8K|sWW;n4s(h$Tg3a}BzUGExaH-UsT*&!-Zlx% z_sGw-z9H!#==RI3RR1rnN6#E657EN0pRvG?_4go{vEbI+`lH?m374oAX+PHAgJ72I zhVb=5TVdP@J=Zsqg*0nfkI;r6n~kl<-kiIwP1|rKPnVRI#Lr|l-j+2pcR99hSgHkY z56_P~+v>rR__5jOBkOWLxkrPdn(Mhp`?1;h;pm%k6W7^#;a(~|*He;(w05@D!;j6z z<|p5j`}R;HT%zY9?Z;;0$B$FFa{^nXd0>Y@`Q2L|65fvv%?IU2*EuA-R(@s*&FY@bmlRPysNgYvyk zHyi%D**IF(3P1N7Ba*a8n~g^IU7h=}_l&TW)Gi&KUwmhe@LDxrH9Y_1rFK93xSVi_ zS|{ztR;n8}T$j6Z%J|TR-$6YWwfxv@y!F?0xn)&GxJ1uI+KndBq$@fN&);?S=3$GG{KTJU&MvIFSVT}u z&va>fCt@pAIa;T^@t5C`zvZ|M38f-IE&V-r^3MrG_2WbH_x{#6EN{D?hvx5E(kMFi z-{UfA&8byNzuIWKLd|2w2$z%+$4zQjM#z5BZO23<(PO9e_}nR5mJwCCQZ28?ZU4M8 zI#XOGtp^EeUDWZ;$X+o)35j2V(fJv-?@%b!;EmfHWL#B_1hw{;*?=8yu&Z8dgAx+w zemzRwt~({voCLM>_l-Sw{XYn5H9l@szTeO!8!N=UrgeN_G*9g+x2Nc5F8a&GC9L{LIve#cSyM{jiE%Jv_= z==Gq4#8)!Yd)xy~#CN?aM+u1!b{>`AV}24r35karj>_+|Jc*!$#3AiQqLsAh)uKjA z_Q&6qIo0wu%KN`ST1j$Cqz#_;w7*8?N7dOS;SN$lVv8R}$~V}Ft=~B^Y$dXeX^s*S zxn(2eE9wNVE+r)Hd~c+D6O#x^NDR-(s-D+4k=`u6=ai6G@XW~kheMrUsVE_F%*2uT zaTAjWN=S6MV`P5u(@6v+Bp$p@W`oWxCG_f2LSp=RBl9o6R!ZnwloAsA9y>CB#QRAE zB_wX|GBUr*CrJb)B&M|to48h#kWe2b*#-$}o&2uMk1M-_ zdUYuw@qNvRO|%k9NUVHZcJWPYiIk8y_O20|Xzi4c=vFmi6HgQ+Bo{C0VZI=YKT6}*8{PqTK-`B+` z>#O;>XhVBpu_trG&odJVYFS?`sphoKQvLPH9h>NXkf4_Kue`tG_16Ez{issH`#Z7{ z+f_4Xdd;;55%p!?9-ZI0(3jQTOPjeH3;n_6SIz9~#C&LxR&UUI$foNAB_#AX?$<6@ zaCCHaO9|J~-b>tf-fYOdQ9p_Vwequw?NYMCdS)Z3S2ues; zPsWLz-!JXsn1qD&Wa=b%$dr(bkg%Ri5z6q3!CI%p$+TFBoUO5u%3()<$av;Qdv*N36_cy+OVEX5&Ya2aVQ~S zJ((ne5)#&vaiYABV-gb9lW~GIr-X#{WReI0OHV-gb9lS%s4 zQbNLdGD!p_B&;XnM0p>_BqXdSyRJPvp&mRJZP>N?zijZlI%3v$e3Fe9 z!%?z5L+e)Cis<;>-|Y9|dQhvBeznma3H7j+VX;Xq`@cFh4YjO(rF~An=dMNC?q>4@ z8$1_n=yC0s|H}r?Yi(h-1RIo)uojb4DiYMPYgleW_O}RIoJmTFq^ny_xR%oMU$QG* zeg|EmT24GDZNYypCMY4n`yT{T2JRB|Ye`V6rebLR{$JZ9TwM~>nj=K>mp!t*{NFo9 z?_EkreBE+r{-SkBHb_uwg%GDKbQ_mF+$`$RQ$phW=0o$7S0>pYL9Mfd*y$s;@%3X} zBhQi&68r8tG=KT$Nj6AOtDO*imb#5b!?q3kgZe~KLgJ*I<(@Bc8#^xEJRBwavxK15 zF+%+Hwc9x5yXweqr-a1&O@`)YzV0^SmQ|G_L9N$?*!oAeF|K2Slu}v`N=Q7@cxe8l ztlM~a*#2QXelH=Y^{5d2|8N^$@3UECgAx+oH5!_q@`Bs&dT6OgP;03W%^LV~zA<

    @D-L+D4N=R(nW@!G-aY;5vP-~44hqiMYk9>D$_?&CB)*>F}msl*r`~-_-l==*M zt*AxX;#x@rB_u53<;1&hl}5ZwLc-!&9TMJfl#sBvRuVx835#nb5tNXyh?f)P5igUF zu!xrvZ0(eg_%IyRFD3MTP(s3DPDunMBrG0aZNbZ=|EqE&sAW;AjtTdJ5)u}_a-uwb zWfBq=rE(%JS5=M@5*DROA}AqY@hd0F<5%USvM7}kEEOfRVNt3if)Wxo5}!m+Lc*d{ zrG&mkDIsAa@uh^`b4o~9lq!j!goH(@k_bvjSj@?ZN9)@dy_Sj+5*ju7W80**OM+S! zrE(iZcQ72IHwg)gIXO{2Mqf@?oGGbPJQuYr=Hxb5DoRM051(X%1hp)FRcb?92_+poE0Qube24Uzvo2MX8+N{h)+|MX8bq zN=R7z%8By$Re7l_O67!?O0O;@v|&-IQbMmTB_u3LmGu3fgoH(@k_bvjSp3R~^7xfW zNLZB039q@rJejB;MF|OuQn~NLdQd{bqEtx)B_u3< z$|NK#e&qy9MF|N#?s!8|EQ1mf8a0@4d)pG9LEA0~YH2*c`_ZzhW7!zJor^Xs zV&U~DAEP&dT59jo_D<~4Z)Vur)>6?rOJ(r~i|E8xs+6D>d-ufzC8fl;C9#dFaKC$H zEf2X%cop^7BWZd(;w6hM#x|Uw)~k(TIyrJzdS2Jk{A53-4a<&p8`RRw0slQF^jc9u zLh}GTMk>*djiaLbK?wh!JOxZINh$TH0HBLe>K*pEp4p)Y5)b^64cV((*I$+C6}yw|}gYmx>Y+*7I^3hiviKj3k0u+FMF46>U&Udr0v!C^e6+E+r(i zw-jG1uer7>64au<5(G!D`8bNuQ$j-fSMeP@X~*f&{UAXt?O(;MpuqEo7fdsX* ze-*dHSKsLzeK|=`OZ!)GYrpl)#}Z3Lt+0O;Jy9)Q3Zf^9HmIdNulT7Q`{!MWHmIfj ztN6_@Hq$PVpqBQp;!Iz6HmIfjtN4raWL?XXDJ7_-{j2z^_T%}lCf1x}|e##RbEUE_yYMFm+Gns>++zYqzQp@~n zC(6BWBdBHmwG#u6|2urQYb#-?sHOh3&#w-G+qY^Iw%t;KTIOH7jdCyCN<}U6ubq&$ zPxM5wRMgTe-OYdNUbus|EVw?gRMb-6_t%e|U@M^wYMH;{t>mF+E(yogHp+XK_gQIg z;pT;VE9t+*(D13%=bY!F4fC(PROMc{S*Moy*G`=9KI_W!|zAEETO&%RFZVTn%rJ|Pl*YOuezERP8m-V2Q`PXiv+zYo-QOo>m|8kal;YLu){A(xV zd!AS-YN>x6djR4yl=N842DQw;b{pkhxDnJc|JsRiFWd-fnSbqs_*Y%+ed7IEBdDeR zb?lLe4;R+Fw3SfH{A>T7mwVx6gIeZ=JHa=cc^S6$hQ;BUgkKqZAD6Dlp{1f0Y4d7~ zjxFd{jS>>(Iqg{Zs>MuUepGXlkTCBoiJ*jp#bJ{ON=TTO=|qdq8b#g`B_zy~bz3QBP|N%|C-{8u zy+keZ)a*=2exgZ8m(OM&@Wgegt<$j_O z)G|NOiGHI_iG1o`f+1KtVMw%g!uQi}!|Hp*YbV57r1!sRa5T$2zJGeHC?Rp~*Mm2? z5<+|~YU!CawGu*1P^yZtSLZbS?lTB*yGGIRE}@POwyzka)P^ zU|HWMiJ*kUA?>Qs5)bOh)fVEG$Tl`#+S|Bj%}kbxHhA7;TMW);zDp_dWAY?VY%LSl;_s`D*cClQp8IB-pM{_(w%2ueugmQ~9tP)P(OBu@Rj zI)BO$rG&nHC?Rp@d)2ZwRVkr8FG@&^eyckF$$3t^x3WXn5|yBY#PD3TteEA*&;NNQ z>T^;;V$GcD{MI))!B#>Ei3QJ8%Q{}Agw~uA61P23o&R`rDWUbCgv2out7UaDC&nCn zZB%ngNL)R>I^XIMCs+?kNOZZQdK2pbP(mVGRh?h-e3A`HNIZC5wXDRJL{LIv_?6Z9 zPhUzRC?PTaylPn=E{ULo#CNAw=i4kyA}ArT@3GagYF!dR35j10tIkjPFo~dq#O+y{q$QElwgRAu+9WwX7oOgsiX;Mb#)Fv0$6(O|JV9pNm>o?NXiZvczq$ zB~n5{kHm5&eF#M_4w5_A4DDF0^S8;%kZ$KEw) z6K_#UNNhQDP=2SxH#H?Bx>XIr*MKdN5)waMJ1GBF;unV!5(};xgs<9p!)}b;43v-< zb^f6I-#3;%=lXn5LSo~YgYb3sdT48>gv9C-2Ib#~JOC1ukg(O}OG~9TC?T;&W>Egf zL{Eki61LWTk_}2o9J%kH{Def0j1m&MW`FGUHEDEV^iHIN#APi9<^NmeS?c|ugoN%e zknFuuLSka$LHUk}9x^2)zS?e3f~T*gqJ+endV})wqTa;fLSlNILFlot zl~6+B^53fR(-M0{l#qCMLlt^n#WRs&35f;ks?fV*sVE`Qd{xyZdXSWms9jpMiC!ut zB%b=D3O(WCm2_eWiElorLT{V(poGM&?^SK0M^6cfYu*tXQPiM#CQ>XRvEXgF>WRI( zm$n(3A2V+Iuurx?jyLvf5FK~C!G4cxp)HYGr0)^>uy#gEj@NHzhAmOwC6th8FGS4) zr8Y_lYHcROPR-rM^!^*7=bRD}`))l}Rw+obL4sO!g=o;&ZLB<|Pq^B`Z&GtgNW8Pv z*!)*UOWcqG{% zL9K2=Z1IiTSa$PvQM;mq#PH3=%4#G@Hb_wGEFsQW>NfVhH_qRsgv6W`C$Tg3$MJOS$=(jPlI!uxc64ZKBhzl0Fjitx!6t^o#Nc{cl7+K{e$p+6w zt#^gk>t(m`?GBxyXe}iqHv9LOXnzxLx%$5$-lc3g4Li}rYw{gzEhoh&K5)#ejo%sBAN0!_V zwLyYfhYE386Swh?r_PGrqLh%>xuHCRTRHKcFMo-i4@yXEFK^MC+m)6|+Z73F{YT!S z;{vzwZikLt?TS_9C?V0M!PxvShq#TOJJk)}?Rq~*Q0r|W{`l3_TZ`|9mWmP*)9a1R zKe^V4H$R#lm5LG)W9y8~Z+5zuDz;LUBSEbrgqXC#ZIGaZM8)4@^0)U-vO$7c%$Hjc?(HZ-YJB&c<&y!ocTmqbxlV)M~bLOn$*)C;Hy8=Zkv1N^MZUR4fu~gK0bitT>*KLm~ynTk8{a%!(PaD*_>cuhn&zd=L{V(x6782B2@XVNe z%l1yBHY`lMAJls0kumuVot@ZzhwAWJ>2ppS)H?W{G5J#uaboS2HzeAi)=eYEi=c z^cimB`B9b8Jtsk}6VDivf9WhI_MW#e(FU~^94F7<*-m&pwC&Ocwe%N z3rFYEr}-UxWYKkDsY-27YpZid=X?FriQoS|IP!N{Dry~a#_0T%-cCIJRKw7}(mP0k zT6h0*biV&_P8_(|OJO}qOGT|6dXLUOaFi3f^*T1u2DNIA9i8vo(}^PwxFhj?P;2Z_ zqw|>_PAr*yUSiFub^qa`^DiCb#QkrM3rkg64{9wtWORQ1zE1St{KV*~<+Y-g{=R)j zf4BP+r8bUOJS@M>es-?I&l(=Ja6N8RM(F*Z7HM5AHhw;iXfh&diIk8y=!IdMcxp*d ztKMZp5(upa32L2riL9y;J%e6ztp^Ee>F+-KFxGb)E+Mh$wQ;G%Qnj0L8%j0tu2-UW z2_+;nvnF1Dch6<<`l6JOnE&<=*obQ)t6AY()Y4^oFg9(oY^BAONIzXw6C{=DdY zMJ>{nlWuenWY2pwe3xh|p@f8Gt8Z4)^HPEm5|)#mL{LJ)a?+CsN=R5vdJ;hi3Cl@O zA}ArDIq9>PB@vX6u$=VG3)iaEufxK3qTWGDNLWs~6G!xZKYS-@?~W1@maXnYX|}qz z2HtjJpEWOhYPIc>pqA#L-_^p2S6=LJkUzB~sAYNRPMq>e@vKI# z2emX0z470+w{Q@YW~)0vEzLt;u*!*16FMi>gIb!0Ui*O)&p+EQ`ku2M)Y3fkU0!vf zG+W(EMJ>%L|EkuB1Ae?9@t#vl^Tqc&_0PhNQ}thYG+bLG{Ng}DLi5lo=DLkf<~>@p zwuqmLTAEcJm+HQ@7e_Uxb!v^2wMD#sLGVb2CehWUgoI|5$JdHq91_&hEZx|~Ir|J zwJZm<9^}W z_l3`S>D48z>ovwZ{jnaDkkI4WF<$d|yL5``K`oZ#qAO+3hA~?uc(0U@;NJ8>aKf3l zL>>SMY7GweX-FEuB0;VBvVQxxv$y^~N=2>nW@|sn>v476si9}7t%O>%FW6@DE zmWo;@$xZ^VMWgz?zPKsT2DMI;eF5e~xdtt3e^0!+)LI~|WON}jA_zMDYiDU38F9|f zK`rZ_yNw?T{qyjihkboJ7j0Od+HK7ED2_lCKh-nviMtAeCAXq#(z~WES0`}NKos#ODgl5MbG)xt&?j` ztpR6M=6^raZLIz8ZHZTxS{L-L%y*35SC4dEn@CWr`w^9!c(=12)T*91@c#!vtv^QG zA{i+S5?VVYBu@NhU;?36my%KN_wH0}L%bk8XvadGuP8SV4?ar_Te zQ7@GQwJyADpo}OwF|U8WL>tt)_r!rR&gsNclH=>=yZO zB&c=H(F5`aM!8XYUa&Z-2PGt$w3JdE?Kbvbb$?VU64V;A#XuQFcA`z6C!&@}f?7}i zZ-9(cJF)lmar}w|wFZASKt{uzIQPBR66-;&j;{`o5qBphUAJ{2L9N_#17uX+iIcyr zNUS-v`aC#5G6$00?W_m2{unVpMjD(rD>FFJ2DRQ9Fd&~_?8NJ%;s`x$P;1HM10>7B zi31ke$f&*(Nl+_w)&R-maAN9tuP2s@TE84WK=MnRxck^cqc=5eP^)>*0g@-<#K`(z zg_Z3SuZVI7Up@5ws9jM)BHML*>^heETQ|k_06rj_5QX ze{qzVNrDm*EA|~Axlu`_B0;Uu`wYl$7iE}^yDA&ioDvfEwHuKC^$@qQddqBdbxBZb z#9jmPyG5C@tOq3|dbSymza`4wU3OXfsFhGcVnu5q+IgwmhQ8ZLP-|YR0r@?nJmh9u zP73RxZI==f3wIwNnSiA>N(pNHF2t5mJ~c~435mMR2jq8-vb=Bkb5e9aC?Ro5vjLI= z>HQD4p`{{0txt9vfNb@9rq(}LsiktQC?PReh`W}Q+R&>@f?9g)`Sfv_l+d}_9>3E0 z)$2dDh@j3T^xsQI6k{#YI?H_X-#ngJJfav&NQ86Wn|mBCE|-od${g^5goMt#uRbh^ zpoE0Z;eX=NB!UtWx=z62JCg`XNGz6B3f9g}A}ArDD5`ctkNKsHJnpY}bgp$gR#ZHq7!%aenbYxjRPl&nOi(MF2fc|A z#h9R$&T5Xw?vB|mj^gmWL@k|V-1{^iQQWO@yjuY!r9?cUxcaU^(N~Rx9=n##0FK{@ zCpRAvjX_dELT4Pu^(bEdDn1vr!r8#lwc>M58`RR-RdK0`M-*cT37rib-@)P$#h9R$ z&h3p`N%4qcOi)W_>c%axctkNKsHO96~La32N!A&DaAd9#M=5YK5~iBM+c>L@_3)rE@ToJpeuj)Y3Va zu?J8*q8Qttmd?S9J%Hj7#h9R$&d!WIfZ`Fwn4p%4|D-;a92B&fCN*_kA$rN3`#L@}-hwMOq+waF31SVBUhRJ*SAQGntR#n=YV zThXa%lOu|;goGZ)BZ{(5TsWer9x}C962`TH;H=aR(bc7d1fy+1(4=0R#d^fd$|%3p zqQEwbN{`F4ShY7nEz)Mg=U|;ZsBYAcqJ+dd&r~8C_maN#yV+OAqqTM}YORXJlIYup2s$SPhJtcbp~EETnujju%J^6uND6A5a4Izl4bQFiop!zV_4HQJ!o z?bVgY!0tbKT1e&U?_b+=@Bwk%=?Rj-2GRZ6c+9&bqQfr@!E0L{USur_k zS1c8^nw(jQjQFMfHcKoOwN{)cM3i;^LBlqQrJ~kTVGP-`Sm~FrRMZ+A#*m%3{r+QT zCAAW2>2s4j3xX078uu+H^bS%|N{oEz(1bX(#gI)x!Xm6r{CHw%47r@>8^(~m=9iSk zkd2_$MPUrtiIIgEvetvvsdZl%Lw2J7bEPq4vq3G3^*XWZ>!mSdBdB$z#E=h)W}oeU zb{s>dgoH(h-Nv$S;}|jtYFTvHi8&`)3|VVVf?5_GcH)g2;utasYFTvHiPWMvhD?H5 z79Dot&jE1^nFO_73S-DlY`NNE$ffn5)=6OuxpantzT0VoS{5C4;+-A)MQ=C~)Y9m1 zJd5swk9UvWq9mwg(P6jo?%Qz;nFO^gI_$(9*TgYo64d%Nj3GO5UOJ8;lc1KxdY$;L zp2d($uP(J_NDR5(!ov#B`Q)B)44D!V7P)mBe8Z8T))a{$cl^k0kf4Ob;SxjcyEKWQ zgoMR$PhD-?wjrAtasU|_KxnT_1XVHzFv?BZt>PQ16BrI}UdUds3k)YOZ5<}jqvD;wH zDIuY8-(8wJQ5r*b2?>k!x(|2f4J*Pdq*eMgz`3YpabLF)yfiudo@+fQA)ygrpSK^^ zLf<|lsHMjndPX)1klNrZ8eO;cnojmD;jEit8`L7L(MaF5Y10I?^h}%Dmn@c$&~mPPK}hQt7(_Z3S;EgKzh zqIh4j*ao$1Y{GYNk+rPyx&A@gIXF%U;3>R#rsXf1hq7hzV&h^if8b|1hq6S{=cP8u(h*Q zQ%j@V?Vh%sc7ovgMiy_^CyJ6%V%(A>8zl7DwKU@G*Dwfbn-#~~T|z=5>2WG-fto%s1>eS89h-gigpK%32JF1J$`D7_nU|bYFQ-ROI5rtSxivNBI!;P z?>7+>)Ursr6UF;Y#00f0lI}!lyxm&^wJehEL}|R;32Ip+-HGD;CgM_2%OdGc6z?|? z6V$Rux_>!K9Hpx zzE9*ckf4@E(qnI_cz58qRMfIax__OE_nU|bYH1`r_WFwVn}`W&StQ+U@a@BTP)mPz z{~-vzE}Fp;+n|=luiYbe3;JJHV~2!>*Lskk*0rq$=C|taHsb4Bm7|2jyIT&-|8QdxK?#Y4KMu&BJ-C$6 z`#}kb+dm(W?{%jWPn@%J7&Xv(P(q^dYXkE4-|qzLK?#ZB&kxA=nVLjULZZ$?1M;WO zO(G~Eao5NJ`3Dy!5tNWPe&B%oHeVzWl#n>;iUIlYKRVI%k-p)z(yL1eiE)x)+N?q6 zo(mVBu^_%udUYuwkvd^OeoV6@f)WyaB*XOM1Du#Q;g$IN0SSroBszHEI&ZrdKf7mi z&v`Ctt&$AWPmgvRUp!kIjd@W*;uMJvKDN?robt+&=o>|XT0a~pnX;cd5nrvU9El>W z{UoY(zL)BQCclR@*ZUDbLZXXA2Xl*(Y>=SV6p0Q_xyfx@aNj?pYefl(P7)n_;dQsM z+X+jfYej-uYbplhduN^Snrl5sP-~q;2YZh5QmuOCjBZLPK?#YAB|7-z3#B%+C6b`l zdlKv0Z>rm1sVE`wm=Lc#S!zQ|MS@zVO1|hxFT0H~C$~wd9i4GV35jQfnDv0$cdr9Q)q+pQ0% zU+0GJbSb5U2CJv+S+M^zeQs!vYtL9B$iFB%zsy%L{LKF zphqh6mk&%LC?T=sy_NZguXCc^(|bklc1lR}9aWjXx1STN2PGuVkP-J&E_0&QYwg3Q zRv&gv43rR^}@c{VPgH9CcD<{_eDmc1wf6ej7;0aJ+^P32KGEx8J<* zE^!v5ePHWBmI4)Bu zL9MqX7iYm1W-lhRRFsg=ESpz<|DmK*N>D=LF3H7N{Cz2*rJ{tySCWgh+lLYo zog^2h?R+QRx#OhB1|=k#NiNR&wNAwMuqsChiM5i8^WNMff)WzXOD;}DB0&iW&1Xp_ zC@CiR)bd?YO8C>Y=_iT=we($5{tRkMBtb1b-tQOB^5)eoC0t8;tbQEpYfB_SEzQe$ zV_wqzpoE0x<;;p&No=JmM+phd%UShCk_}2oXqL^1A35=N>n$SRhY}Ln-|4dU_mVe* zUR@H@(!88i%iYGo>*__Voe~n7m-C-rocN+;!{~{kgoNhhoVJy};VM$wM>Z%Sp?Nu5 zwswM7ml6`1mvdKlCmx>EGAb1%Bs4GQ)6<=x4N6F8Ue4T`k_bvjXkN~a_m>iSKPVxg zc{wk?R7z;urG$j$}~%pPc0=RrVDZH!EU4P1*5|r z{rVDuT0^9_-Mozxes%TDKpWK3-gd=YFIBUBKMZ^Hy&t+Y?4P@&lsJ9eZzW#?eWJK; zG*Pm=ZNej?goLgsob1C< zLPFPKE-#g~D@sV{y3V&8x1pq!C_x*fb@k@h#&6?$9c1;dDk7+*Sz)n_zF#z(okUPe zTTEg!TGD=8jPFcUjPQ3fp zUQwwiA+cC8&$`sf^ei6*poE0xl>MVa5*X@=P7I)@bQ z$NDF2F9?0ZQ9?p9#CC7(1g{k(Bs4?prF0TO2?@;*>wS6>K?w=X5Sw*P59%st~`FP;rzaqh#*SrAw&>FP)%Y9d9R&NvQTT3)E0X!ZTTi-B^nVCv9#7!tJbOt z+LG^^@W*tGK_q^{n)Ckt^3Y z0yCZkhY;X!gj->SSn&pT+huU89IkN$R)`g~#5r8!2&@oGYa(*x8b@G-Saof8jU(a; zvDO#$#jmz$Jzdv00xQIduhz@q8b@G-Sar+b8b@G-Sas{;8b@G-Sal2M8b@G-Ska2! z@Vo6=Z_qW4zzVUVrS_7$#t~Q{R^5NN#t~Q{R^3Or#u0IaSYI>5G(p~FS%T&o@Y0?&a&D~g*h)LP<33_Ty-f}vQnU>O(h&5)I&aRW#7`*4jTaLY&W z&dc#`p>YIm5-IAH=gKvXz-=Yfb=NhHz>O%?--l})fm>I8`3>=Ip>agK*`@M3ca0-( zdrYrZynF46#f^ooaRhECscx@a;|Sbbp}J73mE+yQms{aZlcE(Z$Ge5b5xCQ&XsP`T zy2cT>)1;~GccPLt|h%{7j|ohC)kS&nxLjU#ZU$&6O->?L=NBXFll zbp+rVN8nDAG|FJSTWB1CJ57p6rX24U8b{zxlOkI3a=6A3@lKOg3|EeK!<{I(#u2!o zq=+mZ`|lgAIRMu<0(XyG{w>A3BObdoMgS+*VS2Q6tXtc(?H7R`G_C*0b`b>l#Pkj(~#Wn-Fe=J57o=SdMoKjU#ZU zNl{Cj!!?e;ohE5bWV~Bw9DzGcs%yJz9DzGciZ7}h?-m+I;7*g`tMziY#u2#Fq`GBr zjU#ZUNpJcX;Snbp~q>()UI&^ z?ldX-DCcmEBjTMVmHnV=9DzGcs{2~kI0AQ?RQKnuaRlx(sg4<3;|SboQp6?Yc(>3v z0(Y7ev5!A1*Ej-qnpDSEu5kqJG*P5hFfiUNG>+iSCmo|cw4$zY1mx;i)HRO4O(OT_ zYZc46a)evq_K=smYb|Gi!A^_9mvi8LlVaaQc|~J^a4UE!W`v!?*_{t}kED@4o|Plq z3hBq*xkHE9S|OzAh?uct`y4TR)LX575Wb}8h`4Odw%@=ZjU&e2Ho2+vT5aolzij;; zTK^-OZ1GJdPl7=74iJdU3dq z<@ANh)w{!Aja1{mW2CQdUsa6@{+s85f_I0SXS;a1{#)tb@*6mS+ zaE&9DhFY@6R#gbsI0EvgdsQLa%IngJ;Xan?n&=uw_*lJoQmDI*aI0^g18{^};TNo; zwm0`ZvNd1g2)BCSoJq|yTPtNZdgJ6++mS2RIAZ7-lbS16uEuqZBVIXqQuFBJs#g5E z#t~zFFsXUM@j@K9;Z?C5XyIJrh=IpUYW6%?h~oKy^!i zZ`>kUT^r;*x7sku9|w8*45o+qs~3C6bGDxh@7%2%y<9-7*MsO8rN`yTXhPEF5Sd&ez%)iqdV7>5UXC*2$ z1w(V7ErjU&2zF}-=hzr^A1!x3(E`{&a`BqNTiHeI(>4%awhz$eq2H+(FPL%-i> zmBSHk^}@%~LkuU5E~|EKwI!}`#7;k&9`^9|&TFEV!x3)PBOvC^*`Na98b=(xpsBr|J!b%+w$d&tYE2L{JUXd#yq;UkEZn5V_7?q={_Td>SUH16T zdZjwb8pFDaGAX@Q3upYs5hOTV;|P>v)+Jl!C4cU-uC0}4j&LiKsqas!S|8Uq0`jOn zee`r69o%ZEJ0fJonkdBaEALZBxkv6ax-ln2EYtFxp7VnISw7}~Tx>l#Nq6QZR%lYPRdC5~__#zf+1>$QB0me4!9#u2N9 z`09{kzccEtBisrx(U{iQ`RaWcUm;hnal|_zTAJ0`g{`*%4oA2ZVFSY0b&Znp2Liq;bS^AzCWV9PszyzTE0J0dZPu zrs&m!i}=blj`%u6OVwv`IKr)-4~Xxy=E(kh?USupHP<*|xfov!RD0DbNLU+XzDiaB zQOw-60HG$urn<7MbrQ-1bZKGqgbE(spvO@_%${D1?u!_1@b%}kdIRt8h+y9b`Rx9hL%!~x%i{P0?Jjz?32Sgi z#SuY%H{Zd5^vzoPCa(GC&JQDFvjd`|mC)$zmTj)R8SB41sg)~7xYfD=@%>$d`0J3v zTRn~=+^R?D)rx&AU;g|DvH$oy67>fP7G@weT(x1v`^xD`g>OOk!5$dx19YUPin+m6F8_j;!F ztX$&=^d;%8UzEcUZgtZ8q2#T7kl)#=d+VLM#u01(efl@-wRDXmHhOLPH|*zhjUz68 zVfr`h8Fh^#j#@a~_N7kyw1}x)#8Gi_4+}8eDuUD>d#Jqc^+aBJN z4}YyycU|L%dwx0H_6grM@a0y!>l#PwdhK-Ei@dbgq85j19C5*A(`~==Zhw2a#o-!9 zoI7^9?ZQ^cQLkL%h@H+29F;r0UE>Hu18LpG_u&Y)diJF0-?0DOHI5j1)bwxIxjU2?ixpYy!W)`^v+c~?_J}F*LR=RT#%nFQ@lTXAFgo( zh&M z4!4p_jyFdg*?3@UBBX&YM@uHhx1Jc;_}@Vv#CbBTznZWoIowJzIj(JtY>YUY2x;KU z(UQrr(+;OJ{=CPc$bl7GI0F~H+)6SzZr|#Z#^omyAq{*vS~5A_+-_0(*a4@+XNA>< z2dvKb5my-ICo?OZi0;D{wKujUqRI+6Q95%q;-C-OcYb1I#owt@zR!^8(mK&qRI+>l}?UDo37J1 zcden3!!=mlxM(CflunN44N+wUze*>^xo7lh?DV&NB8N2ah4qjpjN!AAOpd`n=+!v( z9U`Q0zp#=ga%}MBc8%p<85lVnfwh$@{fy;MIyoFsWd*-VC&yEZ2R4R%xn1N?%ivb< zTShE2gfy^nv}EQge;*CBb=pw{4&RTZbRzQi5fN2Zj%GRXT2ewl~WQ#E7V} zax^*e@1ul(#`mtdr&=xlJ|d#Z%F*NqEkhPshITwF-;1oB%&?NoX9dI+IYJs(Ia)F~ z4mo93{jQm3#awBZDKx%ERq5mya@4H)Mb{EhW#wpc9Q^fp+2{*r#x@Z(`{ZVZ8y zWO6L~^t^1F-w+`UtQ;+w98*sk)&Bah3t~C6s}UOC6RC7^JUeYv`=vvOsIqc2Il>o} zg>Nu&X!kNSzV}(_@9MIXqX|4GJsChOb$m#11m>MCdU@@FUk&heg16JT|YrU=MTV2GC5|=yD0l) z|0g0s8dy16GC2nSbDwPX_Zi7xkNYPf_JJ?t5U~%eB$K1(>-%JfpH74{uyV9ya^&A& zth@N4bf!JNBE=7q$&r795g`qHIa)F~_B-x_`qq!;J!jaNuKv|;CGk5=!abuQirFde zovWQa+G7A)CzuMdmPZ@*y`Dl*^S$O z5TBKw=-@4o_eK|WA%3z40<|RbGr29COP7d^Hs#jH3@T+ukga{y0%%Cp{zR(&VE`gO~a)c|jrX2YS8!%v6N*)p(_OpY-A$ifIRBBX(pqa~B$m`zuj{mQFj z(m8rLeF9No|E zmF@T{5mi?3t8{W8$_R4+vE(}C1{yyjN9p7k%t$68s;nGMj{K{QeJ#FP?R~?Sid}86 zl1vUqNCPWJOD4yG>krMkZOHj6wQ%s|k)C979AF4(;LFjH$&trCvE(}O1RAvl@T+uk zE$aW2Cn0I#n~CkGH+b3~OD{3@Ls$Ij_p-}&k>8QKy&6WqK8 z4I(Gq^rm!jgmF|ojH4o=%F5B?2w&|WeYJ?y@NGlm-?q}p5n6^p9a{!yWaVgbe3dP# z-?9T|?mVK$$Q!XQ&`Kvqc!PD#^;KEHuhPl!MHp@O{msny4eE=6FP+K;E6L=*h`#MY zBBX(pqa~9g{{~|%Q6vLj-s?*yNB#{)gf#HwXvyRV^Ke<1hl>brsZleuV_E6s2=j1R zn1_pqDl7O^Iyr`iR{HkMI>(bX{gge7SaItYtR$1;sU>5x^}oAfL`VZGM@uHhufs@q z&OuL<5b%XjSeI4EA(eMud^uV&Ir2y*zCrak%87QuE1evUP`?e0 ztQ<{_P>$Iuhk9WkFx!H*1Xhw;<(RE;E+>e&_mX;mb$ylF70Bp%-ND?m>h!@a1U9oWy zz7*raN-{a}dC`cF23C%iOpd&zZs1u#gYzVy@t8{KC0C>mjrXrgC&wcfj;dcW zl!z)TN0Vd4+eWo-cQ6rNt1$}G_(SO}j&^ZWS;4Q;$q~jMgEao|(F9r|)GJs?CPx^5 z4AS^R8dy16GC7uGlo8(`S~AsLJO!O{qI7bMWF!+2RaWq;baK2FqL@z>^p5Xby#ajr zTa!!K*mWl> ztRyp6p`~u9rPdjAk>jc2-cOxDM~=`NG(zkX+jeQ-%h8g_5h9s}A{l5DQ~3?6lF1RG zrG}y(28j`UY_AyO)M6aX=%p6FbIC+><*Y$ONCS39OJ=Ty+RQd;b+@ni zo;k}+KBbdmxXqqdS;4Q;$#H&|eZ1mM{z`_E3g3TdxtMp}k-Jd!~DFSdRVtq(M4YteSWFZw~X zO0`;OuiDjKRarTj9AR#$p}8ge7QbjD%fY*_Sq`PM9AR#$p}D0hEBIA9Il_p(p*a9* z_*;SBo~?9p0HHa6Dl7O^Iyu68dqcnWsW*Ve@7tD4M3`@H=odw4!0u?t%+Fz5FrlOv4J z8~Vjv8u)UwWO9V4uc4?ZM@uG0_{F55Urdl+{7TZwNqz>IPT3_#_*JH%UuC3GX@!<2a^&$< zj4V;B^&6C1NhU`gUqys8@a1U9dlqM6Z`@v1Ocx69T>vvFgl3$>a#DcN$u~BMp2xS~5BE z^@*`9Q3MH%+7I}ZOhkG8ZqfQUS~7EmC_}#j;3?|&IxnqcBEl~X4gJy}4cHwmnYqe) z&iJhG2J!nKe7TimayUX7_;R#la&-J{TVpjJ_p3J`qT_Gdio9iooCwWarE?i+YoL~a zh;%N4-#Pl-~758>Jd8I0a#+Ca%vHMPjvI>4r71ihc2`9AuW`RzpYwUyhbcj@xGUZvS4s z4j}#}l+XM49EsA&5#siC#qCvA@T+ukbX>oyylZ6YWgEW*U(%z-Q3g4YpE=y*v^42HL)}r-6ECP1aeEp6mnYqeaxQLJjz8o!?9AO@= z^~x4Q@_Tk!T3@)y@v((NZJ2TWit&A1{F@2Qm!_>4zX_!iG5DON^)=Td zqRI++S31ivV~w>M&rTT@IsQ3heDjIp$br$sgJ+XN>Ew8FleHR~k0YYW3VxMNj(4B< zy#Cns$3_lk=P&N$P&zqYSpJLpW1A3BWd*-VC&xwPXDhtkR6 zh$<`iRXRD=A26+c^7}uE9Ek27ozG`A<@5>7zs@0t(#bJ-@U;3l?-5aD1;0usM;c$P zVDZ%o@tw2hWO}WZ##gjrOhqfn%vBn<(~1!}(UO^~G;XIA<7=WNljEEfR?E&9c36B? z{uI$Vt6nL+K%AZ?9~;8!vc3trfuapTQI zNCPWJOJ=UlIC^P&r}fy1{`cJR%|C~>78;Cx(FVh>(#dh_PnNdd{VgJ@tQ<{_E>F*H zKY896u^jkK=#{(a_m4jx-+c1-VxFI8V{ijW5E zj+V?^ZQk{O#v|Y95zBFXxAD!s?~%jbnq+c({qo?(9X}#M8u)UwWO95od6&j1Cwx0{ zpikYT7oX25J;yg+T!qg~GC3R}4SYFTGCAJ8rf1{DWA=+2{?)2xz)I;v>~&ku#`(jD zsIo#%l+Ikexcp7+UyeIBav++x{$b|*{ojsnJ{S5ASV<xZmjZ?fMc?Wd*-VC&%U=@7%uHlcOUCBH?|X zW!@*eJihts=gFaTa{S-3JGVddXCkVs;8*G7xaf?2jaRSRF>>flL9^fXlIHJl5ew9v+gAV-ZBMUz!hika zl}?U5KK$pPn-AoEwdS@Hnj;p|FV`xuOp?iQ=f+D1eRcp5(!iIaC6i;>tfSiJuh$me zhu1i-OG+n4ZRSz!S8qT>l@LY`OTX)H_4tk)C8Ce$wZd z##2jc5g`rO9W9x;O6PspwtEjCnH=f74|{!&SS6F=Cnx{5eb(=O7<1*lnp!njDV>P7 zhWxhu^I1exSs^D%XRdC)bm{CL4rWdCuXEP>?8>p;5#Nze*>^%>l7hj;OM7 zG&y>ld&lepH(`6_Ptn^!rIW)ERaWq;baFiQL0kRi9oVbsi-IqW&tN5)92+;<>Wlgl zAq}h?EtwquUbtTUt!>yFcnjz6K$`?UYRw!e&&24s;uBw>Et+n zxkDQ_T==b6uN3J+<0A;kMEvuKLmHPoLxeP7ceG^YYK=cXRbTIvQzM77pEYwrbJJh4 z4OV)JsIo#%l+Ijr{_E%MleWocCcB zPoHYv>{z~!E|bSM*A4Fg8jVumSLx*VviVf|uTLeS%F5B?nDY4EjaBDv7T-B$&n{nq z96o}OoFb$FyQ3vDSEnC+>26CqL`(4H?YW{QBD!35>27c5h$<^bGgmz)+%c$E-X^Ly zfJPA#{3@Lsn;N3Z%F*PQxqa5yKI;>ol}1I-cxfdQF~bnjfZfrOnX3cdT(L3#Y0krW zZBPw|mC}h=|HFWIjEE{LPzY$zQb~OE8}yzN+-wPmb_ZO<+hDw&9URxKi=0lT9mGgsv~%W#+Bjq61YoMv|G`Rhdv z$>b={Sr%6DjI|ssIWKu>kIB@q=VQw}_L&;?NAYe3+zyO%BFcMAQY+*HcK`#;T$ShH zaDU~xQNx=lc|NsdBFgh{xTTU-yyKE+$;?$bre?|Ei?@67SxF{GIi|+#py?CU(3#Ta!tLoZj?wKA;djo~9xS(Vv}EQg%q`)3hIag3%bUix ziO-$)ly4I`Br{izkOsaSEtwoRHR99!)QIQ9jpCclB?oUECx>Kml+T$6CA^VVj+RUg z-}!=@-@B~BXM)?_AAEi5SPseLaD+7Q=*A(C9_v+|lD znH=GZvNN4758nrCAD)lUlF5<(wjG}p?^y2}%YnPwFJGZ=d>@j@k^i%vXDpt(s(VBN=+ zzUKD5JoHg)B_xxhe5O-jh6a+J^B2^>B64dM%4{&SW|GC3R}4SYqvIa)F~%5(bc z4WQv&&+Hi_rwD1l?!Am;=BoS~{bk`?1J)(IHCW*ed889j{*At`LaSwX0F02)=aBd z)rvxcx-?-=w!4xGMDKjvt2AJDv}EQAy|Y#!sdt7iw6zcRV|yi;9BVQHh%23>fiFi( zCP#Ul{?xDnoAtHv`qXf?48J?HqDUtP5L!=NWd*-VCr5b?R?$Y?+iPm8E~!-_M|lrc zY6ZVSlcT)v?y}f^K*RHJnfJGEV>&s?`|fa>ZrRGwfc@Y&-h(cJP4fnNE)KxgSMqDJ%FDnjGOIgbwHLl7r{r@+t8AUA^=2xoSA2 zw`>K!LX)GszP&*3bX)RCW;x31+i^;7nyWHLdH>*)5W_L@_ECyt=Bm7ZkfS27BUTq$ zGILd44_D+0XYT6zD3_zW9xk;)PK0Kz%IC0L9@bMcF7e1hGILcvhlQ~Sd?~($m1J^+ z@rRu$%U%suXmKta&VEobIe^gWPif%GdrQgW$j^F-5rBF%_(H_`$xD2jlF5MxdBZ+D zp-CF}aB1d`OHorSq!LQJg$x%K_kNqn&9wA94qI{MfBQmh7 z--VTA=Bm7Ym+u)GMKVD6o2}K#>vxN&NLG#}M|u6#l<=K1F2QWePAf2mlT1W;{Z(P5 zcn(&QS@QClRDKh%Qg0B;Vc$x}Gi8gO#lH!mnXB^oqL;P$DDN}W+c8(=^F?uzJik;~ z!LQKdD4$!)kr#aVs8KRG%IDT{oC#k(qLWOHd~_FQyr99jAHLAmzW)$oILYM5N01RA zjW~psCvx~nQyBLRJCfsCL`ZY$9M?)F2TrpZke_BH4SYFTGCBOTX-8=E3%^Pyha;-2 z;8*G7D6gSs%K(jksgj96>!avZ8nAndBbm7>|Nar$tHniIf;l-@X;zIK<=;Oza|bK* z`a(-4N4Pg53-@L;Fm~3g0W?0VBAJMAZ$=jG&4>tT!0u?t%vCsTA=7CKswME{vnrCw z5l(c-bfSYa@a1U92DjpF$h^bM?;9ptRRM#Qt0| z5&22C5g`rO9W9x;%FpD8PZ$06gJ<)bPz{G)rIRB+lOrOktl(Gas-tfd;)Z_U6DZVmR%(snt5ha2>52O^*Ej zk605C(W^bjctGvE(pirD{*Q>LvVvcwlfzHhjJ@Uc>_0GSTzogb70LP2<()5)LmK#U zv}AJRHv>fkZtc)~E8ki^_a5IS#|gDse)~{FxRs+NGgsxkeR${E+lP0qU3*N=%TYSF zHnl?DSr_Q3Rx9rf=g13IyrF~f23Q#Q4NU!loSK7(#*t1iVzFRx>mH9#FBNBIo85GQu9 zf?uIq<*++OrpCNO<9^Y?sZ8-+0J~$PV3(Dn$x+_JJGFJ*5?a(^cP`Uej`AMf)Czuu zCWp^PVV+7SI;j1Cm1J`GjF&X9aO<=Zui@-|^zOjp?;oI##0DoCwWarE}qImpBq)dnGwVNCS4xe-ka4x$@DS_Zb)usxOgDgpVMl0lT9mGgtXu zve=5E_1U-=pOv?ql8MOol9gI&usd2ZbCv!^&(iXjV?Ha%85lOv58Xr;acR+7mPMl84oD|uGlzm`kxh$<^^D4n_bi`@)_nH1Gm{2rltESb5w z+-@I|2EH6EnH=S_)!B+dqaFZ$)ryj%e71Vgp95t_LwpL2(GD{Qau1?zWi$wZXTxht$N zt`S-?bCs_B;Is0UQ!+WywI9V3#c$iN;wV+ms=Q|u_cL6nux=QxvAlF8va*6}N=;u5q(Iv-Fn%i+7?rGYO;OD0G8+`+;xS~bO2@a&i)FWTVZ%z^S={nQG6 zRTIgP&hPU3;H(O3zGNcO`CVEmMuC-Nmb`p+0#=K#mU!MV%0N01<+Brt63Pl3LNiz8 zGY4>AD%)L;^du8eK68MPWqhLXwpF4LWxx}2RX#UrN^7l>TS+EI`P`_&7veUpbdpSt zbUra{oz+s4Bb`rVo5-0oq9v0fUDwBV?$M-Va-{3}_|82FlT42C8A6Q0;R_KGepiE) zWO9_x5Gt%Zx|d9jj%z;@mw`VL}=zJkEvq}2djRs^6NxYJYxyR z14<`H9#cm|l@D(*dxz`NIM5J@CtXJL| zNG?6ySn~K3U*@y&=c9BY@;6v|y3oi9IT4z1HZUqPL>>DE(0qE z_&zGE;8$pJ;FllWCFB~-K*6ul$x*&9HT=4i&ojsheuXASzSbb-%4g3!?@A{}zSbZj zs;uBw>Ey`YVEp9=?^bI>@zxMo!mnf^@>&uR(!k2ml9{V~o+0K6vj+M;;!Ht!|FBXz z5&1krL{wQJCrW3o%IDCBxs1GC`IuY?a+J@ZFGlXNf?uJ@5muPmd3}t+q4CyPG7;tT z`q-X>-J^TS%vJf`zGBwEXNn{fQNFjYn2plh0<0u6SLs?#_OEtM%naLgp8Xu)dCZc?1CdV~k_nu5LbG3z?z>hbj_!G5H@vdYd_O?_0r2)I6B{Ns) znxdlD*Dt*KYKchK6tOk%5w>LJs(hwwk@xsTwN8s=IuYeFWs4a|FO$&BRXW$FGXW7l zuvRhxV4bej(z!lbG14PiGIN#2SK6xof5t_LwpV>df&g@4Y#j_3B6Y*`o%k=A<-qDT{dOmIX!yGd%OshI z@Y`KOzuigWd54ueu^j1~3~L7GVOTRH6Oqozq_vNczUoyvm%%;mv4-Es-RqLckPTkE)A1lV@D6rbfoRF(NXLV;;uw%<$>d1mD}ED-F zXy$4*S76890Hf_@e*P8v45F3JT&=)cdm^IB3VxMNj{NuYh(L=h4))>XP&zsC-_IkW z$_jp!PLBK>`iQ`64fZ%g!0lal@Kh4uR^M_ax^)7g^&=?a8(dZuNjibk*+UcTY}zFZ3*7FzWG`$U0=d4RaVG}(9BgjHXsM1d!p4+Ggs-@plk)d zLX!ix-Guu;;uqyT3s$G-oC&3qqjR`Xr(ZuJs;uBw>Ey^~qaug1bH;-?R604*`I52~ z{0dEuj_Y3a+XVVo%^RZ}NGAt+=bfGynPIhIl@2XS$tNUS7*u9hr>!TIr4K-BSIQjIa)F~I_}5O?<#m}`n|>HeuH|RZ?WOAhIugHOxQ@xsGa-?&8gwTItMHI=@@CiX3rvSRCp66*U+M>%1+E`pA*aUy(yr;1HTmH$?iGZq!*6_n-6W z`d1{G9O?dZ))GfcCP#>=aT8{IR?hA*uF}b|geM_HM3oi%DxDnZ@8_)H=zSJn!5S`^ zi1hdKbkvA`P@~COE&UxQ{fhKOkt6*bhaBkpiu*q(v*hXT=V|Oyj%3o`&(p|4Q3g5A zvKw{OB17Y&ZOKH0-_=^T_DF*gI$APIp8iH(jB6ik-5G{mFia0^VzP!ljlvX>F;~9o z1I?3bYNK3qKxIS|QctwEKQqsei@_h;4bz2>Y~ z4j+yBI8*85xPHj2`ou7Uj+mj!3VxMN4qsu)bwqq08bQYQ5!b4+<%?~5rr&X@tl(Ga zGgtY#jQDhYhQ;f#WOC%| zG9p46_;R#la-@5H_&&TfkW7wr&ky@^%?H3rGC9)ywQR4rbCzhyazl z$PQ=kkb^sYiIz+bM@R!-o)gLBNcSR>1G|qfX9+9GT zV?CBkjxeIP`{=P7kXD`($t=fTmmAPnZRG*6mK^(!iOs8yVXgjOZBldgbfP7b<7Gog z17D7oT;j;kQUfun5ATwJ)r@0!hlb=5M?^>iUyhbcjt~KKI0J&^;I18(LozwiGazWi zb03J7OpZrBAKN(bwjqz899zx0xcT_>edBxn_wO!lo-}jsI1-XvAWq5=(tzF3l9{V? zPaJy#)C|O;@GF^!bWa?u@SYWaN@lKh?=qnAn;PHwUjMzU+4m>iV&3P55yVz^cZ(d7 z$??YW0~*VBCPEtca`iG;fN|L_*FVN-duh_wqoZ2kwY5z!c+Kib@E9j$K+-Gvtzpw zA&vWml{}Fne;<*<5qP2~lk<@ye;*N1Wd*-VC&$-ckB!!N0!ME-z4`bW-->=AAA4t) z_}nCuqa(tt91WQq`O|IS|L|Wl8H$7b8_T` z-tv=|h?dM;A^+hC$7kg&z|kjP+GW;yclVEooGy3-m4uYHoqk&g!>LK^sTv}AIGU&Axq zV2}7iH~o1pBbglG7x(Nt@AA%jY2eGzlF5Oms}=~gy>aMAabGHGIAr)$IyoFsWd*-V zCr5e?B;SGe`jW|kC_^WONCRKqlSw9rpI{c}!t$G9{fSB@M_7@PZ8ETP=?%h{qa~9g z#BiBnIMk9y!nX|#>Js8B_*FVNLJZeJR9QKi9502hc8&0@<0-?}{g>>@@BH-1t#()G zIfo%msIY=xrIQ1`^$ohlTWzJ2!x2?h@T+ukq5)6{SEsCUZuazTLv{nl%u_FIUU<-_rSA?_G?h!8+dCVnTYg!AC3($Ue<3nl9?++ug7&QNBZ!Eh*f>NWO9U9 zG}G8X8u&sai_rwEBEsA)ZnVaC&YH+)1sUxX{7SAyxD`hCu#zX{D*vKd??cg~kBWg% znQFECtBr^%D{v@Xxk3q87O#mOe=421g1rz`R`9EIaddoE>!-p94(m~@Ez)JL})$%8oUF{ARzBbFTIb5sIqc2IWU3@ zz)Ih? zCFof{VBmP#@8#8y;1x9`N( ziY>|HD96-=)ky;iv}BfJ|4wUV?K6fo@E-jJ;%R@L(0n<+7h5tprmnqKw(_M!NW7>#Bjd7euJDC z&iLi8aws`ua+H6AEUfTEg_cZ??qhe!{&)uOWL^0`6XKn$@YU^$3C(xHovg5uOpcE) z-zD4N`$R|sD@RKvM|qxlVr!=Ph_5EtJT+xA6D1Ro zuDPR?f2oq0t91P?IrvLHzb>w<(Knc`-z{4qCqgq<`I+RgUU3aAIqf~YQT{Epuv)xlftE~;EmzO7`%d7UVft#}3*Vqtm`WzcPW3FC zy&VzKz?Y*XlcPNTm}ujVi8lVAOpfySqp-SuzXC0p9LruBoPG4;9wt`=w$&sE3NDi*1 zAzEK8%aNW5Shj*+p~(@>Zfk#i7}um?mG`6b$-(viL@S*f&)SJuRaWq;baJHY6X{p& zAgm;l!x7TJ%Hti$MOvQzr;uHSB(PHaAUE9>qXy~6sEd>y)EavV8-M7GB@ zL`VZ)j+RW0@^4-f?KdyB46stmK#uZnUWFCDJN;rNnH=f4ANltYW>RM?;geP`L5_4? zc-abmxx$p5YPIy-L29rf8ub`{xt^MGt@hjG+`+OHID}?7%IlUUw)Sv(izAukD6d;$ z8wFo@qS^r}nH=eUXXc8l)mbLV zIr4o)5g`q%94(m~z7o*K0Eih5+(s+*D3ikxZslmn>if#34?k>5)epDx#C6MIreTrekk8#AekHs z!~Ida4_Pt4KdP{Dv}AI0Ztk7!@fh#nRn!Mx9wA942N1jG2x;KU(UQrL?)l+6@bCS_y%PKze1BEKkFsFLCta?zZ!GEN;1olpY;+E(!k2mlF8vaqnH$OENY_(yjN>_xOpd`n+%}tb zAn&91S&n{7Cp2%{n(McfPL2ZtVrq`4vVvcwljF=!4$01%%A3a3Qo|Se44vp8nH)fz znIoiuFGouz$AV+}W&7X0W2`04t{D&bRXRDIG(?pZ{3@LsG`bZ~7zW+Q!Evd4CU!{|yJQvQnH~8Xi7xq4q$x)sQ$E|qj zY@KHA$Wd-fu#bWFs`K}3-nTB99ObqIYkX+M-?NF9OpfwgI96S+9iIt$%WEH6J3cqb zs|{E-RKDp z-9=cn?v)%|>q@j_a-{32X~mV&L`!BlypNIwzPN_E;5c(K(Y2c2F7Nq8X&-!@t%PK9 zI6@k5I9f8xkk1;0usM`#%u zVIO@&;4Ce)2GHQQP4y*`i3qJv3n2~I9W9x;O3#{P$=ymaInuKx^A_$?oE=UyPj2Cx ztvY9dRybW4N$a+f;Ml39-QZgPGf9*baRO7EstOYbJ`NYRwXAQJ+me)t(UKL+Cu58g)h#FF^BqUS@L{VEh4I{9L-#%=aHq~w!U+608u`V zEbTeV{a|`l7!lqYNM^3mv%;7w)niymX0Fn64bqyST0)NWTm!xjo@GF^WOAhEu%uQ( zkRv^Zg&aJ4g=op-@Y!0lGKgNGK{Tm*W+kTxX~6Di$;?%H9x~qtX1UHB%qNYRup;)! z=g4Bcs)O6Rl6*JVURm6fB( zkhj?agVw3h#tS{ zs_rVCUgN+(D8cLPQl@WuTxY#Ahz zqx`!8?!u;(M=z4ek^lY?bLBNoPZWNYPLBNdkBF$Uf?uVRqx{<)a|K^MN|8*C@^5z> z*T9#TRx&yAx$u}PA0ull3oFUw$mhZ%LK;{(S~5BE-zFkLkr#X^j)s+Fa^$~FM1(Z3 zau-EUtv}5YtuV&+4^W6204*Tj`VDi zVr2SYzjRbwtEFd)q@!OS@78MXUo$4_a&7N8@_MURTXW1-`^A1~;l^#v-+ybr_^c%J zSvf))S>H8=Wj&&V-#ySC;U@9Y^lB$MOlEl|i2EH6EnH=XoaC$aw*}M`0zLsv@)*RMO4$0)Wz!1{F zm-t{MnH-P5GBDeB8K2d%%i5aV-{(7jx~;7_Z!zDwWO6t{8u)UwWO6(ozNoeGy?sZA z_p#%nY)e)=XmoSx9G){GnH)f@og<`yFGouz$IqIb2CW)?_d>mzczyWpj^Q_P(uC2? zIV1S3NG8X^dpiwUH%CYVUyhbcj=9GT&;GGw&B$@sz_#YE-sU_1PrtV2DX;Qbuwm)_|IV6)~(5B~SKmKTRL`VZ) zj+RW0%fC1$JK)>DXved9IB@jtyjT1__S~YadC@Yq?UKpy=Gy0G1FpR#BBX&YM@uHh z8)x;(c3QGed{%SrYisVjI^V}3H?=kQ`-=5SGCB4?rdQUsln80y%h8g_@q-&@)-U+{ zyvWgW=h4kEL;0T9?m4=-!(j3$og9v+vVvcwljFNLkE&mJFlPsUHZ=G>tn3$7Wsdw5 z+9X$wmQ0R2AG;{KjPhomQ0SnA2uRe z|9i{Fa;O!BFYhfSlfx0xz?Y*XlVkX{r(~ZGUsT5v=&@I5&nL4VY|rB$SV<-a5TE4; zX<+4O$>iv@-nrQ?etJvfQ11+1-a1Pr$6vlYC%dcHFCs!3_;R#la&)`qqU^~3yck=C zdqVs1;En7*CT!T&oH~R3hh%cRdDBJN@k5`F2x;KU(UQsWRX88+p24gB3C~Ih_?j3v z`u>C*lF8vwpEU60XvyTLLWpC=k^%9XhbPF@9BzeN39TH~YDXP8JiF?hHDjB&cmKBL zNw2X@yfgIeeP3WdD484^jUS$U=UyVDL4F-AS>-6cs5|x@8{-ma6j{Kp(p8QEQDx<5 za!h}HpX{mAdd2TU5gB|fIkl~M*nIZ2lF0$Y(>X#K_;R#la$weA^o28HO;n^0Uq9Qb zt@*#*$sw5>kA8Gs_R%~dq=7F-OD4yaSSj1&N?G-4@WuDceo!(w4hgGqCv3{qxYEFv zqa~9={S)dg`w8|@kP(Z*ujFckTg_Nfpdm9?zg&GxwqECc@mVP%gT}ui$tgk_usd2Z zb9L_yBeJDeEg$QyM%(b^wNElR@;0$l+u_U6lF2dfi?P`Y3-*a;nBwVvx))3Ma*+4j ziY1p!j$H%d`5Yk)d^uV&InMoJyX>-8xlYETK8+yYSLx(%M3oi%DxDnHoO)#TNpGH# zHgH5+^WERGZU6Y-(0<&=x+|F+KQn|h@a1U9DxDmtvpQMDM@6cy@T+uk0HGRRWd*-VCrAG<^KpMZU*bJ|XB$T=ogD9klM27e z=S!-r;8*G7==RitLAySBQG8ZD@;c#^(apg}mB(%5xc9vUgI;SAQDp_cN+-vaCw)*K zJ&(7<_$rD53g|=(ZR3M$??W( z0dW-(RaWq;baLeLKC$E)ZNrz(o=PT1KJOC|(!iIaC6i67haa2cyTPauaM2@2`T50wjAqv1de{1O2=5Ar$ z2O5v5l+JRDFhrG=qtkLI%78EL$t07*%OMSXbwtlt!l5I(1? zbaJ#CqRI+CSy>QghX(cZ!i0WSr{^E6L>Oh;S=MLngZM@uG0x7D`KK3zC4KC7#ywl!~B z*guwIg`3-&M?Ty?=0q|%vaqW7`qzk%2EH6EnH(QBMrN!3@Pk;6;bC0+(sx*nfkWDw z(>G!{B$MNoXGUg63?M=p_;R#latys~RDJ7%xySwHT}C$_7{$ErGJJIN(;u)*N+-v^ zCXK3h&u?m~vVvcwljGkPENg%5f$zs>b<*Wyo7bI5jxN`YZT{jsawwe~iym3l{`N14 zsIr1zrIQ17Hq?~JvHMmN!dRAbOFLXJG0O0(baFVN$_jp!PL6j@J~A7;P3Op=rwd;* zLR`90XTA@~Wzu5^LLeADn~?ASvi^T96YIc_>ajUnH-Lg2EH6EnH>NA z?xOndw&Tr<3qNdY9+T(&nJ%N7|2dz0N+-wrhN!ZFU!{|y*Kh8g{lL0BBYwU8#x|!N zO~3meGPZfm2$n-KIW{+hH1OqU$>dn>xD~Rk|8R7CR$lU6hfHeTl)rzaljDSeD`dAm zO+=Ly{3@LsGY`G1{=%TMBgepFCN+DW%)F2J!KCI1$FodICx;`dtl(Ga9_CVcP^P6j*tev94(m~-wAQ(xBuEZw(UZ|m-jM~$Nz_DZoF zj9yp{&xvGmI6@luaHA!AM!mPJi4vf^>2JPlF4z`-}cGg zI-Lk<;LFjH$uZ}N-t`w}j)@%JvuttN=;kZmC!f;EG0zZHR`9EIa;$Uqwe2%5_3<=E|d2@0}rc z%gZEL9L1UmY2d3PTDc7;x2*hb{ge-nk0tjO+1o*-lLLs;azvFC_>|6atbXui^;-}B zapX{o3}3IDJgIr~ajavK$#Kl4m(@Q!h6rik%h8g_@%+?V1`XMf{oo7dOlqE)_kAax zKdIFxDxDk$&AVmL69b5-vVvcwlOuoUu^g_M+jVk_L+RvjM3oi%DqS4K8w`B$MOzerweaJ)8(>VC87Z zDhJBWnEKKiN5|&_jUo&9Rl3SiAgZh!O^(I077UvF=tZ#{YLVe<|4E~pBNhAPGC2-< zZo!~!a)etsTC&Pf{O*jeQzJ!vsqibg8i8+3R*u&AvsUvt86PzuR+p91Sq?{3Ss^D% zXRclevpB2evpC)|C@O|urITaJa0|`caAN`9N|hD-DxDmMgx?^CEqO7<3`;{D-D9im zW68&_KDoJW57u4DXLKA+S|#-RpOaZN4{weTMhcN+-t}U-oId za4`{8R`9EIay%XGX}I91gX3>rYHQ)kYoBCt;8(Ky=JHoEY2eGzlF9MU7dL6Y=T*j{ zKJprI?AYemybV@5Iaci4vwgv0BC4$5SLx)~`|7i@El!#h#|E`;hjm>eSxf#N)-(Kd zFykP}rrl}?UFKJME1yz}?s`|ugM9e+8t zdFp7sbET8xq3)|Umi_zCh^VrHU!{}dq!oHJ{=LHiB?L6yeh5L1JCi`i(^zSUFlUIkx`dyzGVRX2x$&v(C|1{?$e+|AK3G z{pY;w-%E(_@7d9k$??Xc1G5L#-abAnjkdwzGtH7&jt5>EnB7n#LK^sTv}AH@(EHW) z3woX$IW!uDFU{$~N-{ZaefO32SGOZV8dy16GC9KioQ-flXXH@t1z+>JP6)RTajsV~ zIs7hDY2eGzl3N_O12l370biOohLz+Nhuw)(%sM+-GC98La$@$@1Kerx=-QLR-i+;H z1hDUVlbhdqXS+BykW7v@w>dF;Z(AayfiFi(CWqn$L;^Tzf5sBVZICaUvu)&)T#axm zM?+?=0!PM3L-%ITFYX(7WO|=i4$0LBw>rCjfriXnd9=hE12&5q$j9E_37zXchr!bx6&|Il2Z<8;LFjH z$uW1Eu%_rnt|?M2fv;ZOCx^9htXGoBv25swY`tTNkOsaSExA;V_}+Q93!gjhVBz~v zdZ`={QDvnv6>l)T^MxF|&82&M2kxor&X=+kID}?7K3-)&3ylJS9)u(LavH>mEM=iS|TewE7jxjnDeX0E^U41 z`0n&YDV@10uLDS}z#%kC&TpLGI=;K>K4&@pa2sX#RXRBwQDp_cN+(BopVySI&uh#0 zo|*T}k@I7(Tz?Y*Xlf(DK2?1aCber5fq@5g+$uafX z)3d3UH)F1(fiFi(CdV!_PtSgJV>5n(w*KD4`t&R`{(9P>l}v`PN^hcvKq zv}AJR-$#79Q^Gf~;C8DLkH1OqU$>d1yGG(mBJ0Qs+xy4~|J8nEpbK=~5e~J_33+(Eh;aBP8@ONHiy>13`2Hwq;LFjH$r1MIH*`by z*-uXiCpz#p(s@r6cVSB=BAl$+(8;ROfZfrOnX7PWMB|hFpNKQt7yV^QI4Oc0ZY7x< z;be-&0k6-G2x;KU(UQp#_GUENF64+_Q3ibBG^3qXU|b@Z9O2Z6M&I8MAq{*vS~59& zCz4uGXx>|6a`Vpn`935Q;k%ur0lT9mGgo=t77J62^)bPc{##qCNbM~K_As<>TN@GEp$4n_3P_&1^Sv>a7djwZ*N{m;)<{WJFo z>*>Omx15s60mN!KLK^sTv}AJN>1zD!y#e|qjqa6RDn|pzDl7O^dcmQ20B-?crM5)r zC5~82s;tCOj0cbDKD5zy{dHola8lWJZ!#A3Xi_qBH6kFk%@NXo-O-YntNfI-$bs|I zrme7h>|fnVGCA^-*h;yAFGouz$A>QsYO85P2kW>5j2{IfnUkh2z_fE(TZwowep_oVt$V|0vGQeGkWAG z@2N(QT(&~4gl5U}aa1geMse`vy}o2}muez> z`6xv)Ir9EIBBX&Y)niymCdWtT?U#MKt!HfElq*>I$W$^p#viy}cH2EfNCRJvmQ0R3 zvWy()ITeMY&(I95IUG@C1;0usho4`f2pPUSx|d9ji!L3WUHq#x!;Cj+V?^g?szzcg^H)sW<`e`iI%JaJ^oG6{S3O#40z80s}ZQP4~aZ;W7cFE*$gf#HwXvyTr&qI!16iy4oTpxV# zgiyvPlF5;uha3^oz?Y*XlOsJ7a8TsnIe@#x-cm9-(lY^R#d83OmQ0THOu*eD2T%JW zS~5A(GXZIZ=XUKwL`x=zpGeBHN{QfUp+qR19FC~6f?uVRBfS%e^$I5k?)xm?KTa21 z|7FUxT6!l^*$RGzCP#jgKx}4YnV=gfz&nqb0K(>6x^C~O&RXRD+^DK+^p?M9SXUX(%3edcZGR;g#17AGDl2($* zk)C17XT?)Uca7h?O3remXPB0);8$pJ+;Q{FcHP>8yDQMP!xwKU*{+*` zq=7F-OD0FSE2aKiST}(l)Y*9+E_0}Ka)i55>VN-?h$<`iRXRERW+3$}@WtDJSPseL z@Y{!^fiFi(CP#XIE&Zyr@XPya)n29d*HR-Z_!XKQd2bMFBEB5_jsw532grXnlFV}C zJx)YO17D7oOpfwBSZsaZi?;_1ihY!1a+L4E!fg(;@>WeUIr3ZI;yYJg1PxB_JYfvK zV5O785mi=>CI@cx-1!NfAfTQFzSMreN-{YHANN6h>qm)@23C%iOpf$UZ@zQn5aV&&(!iIaC6gmPJ35V!6fKb>Jv*9p zm*+(jEtwqoJCAkOYa-98Wg9G+9Qiws2x;KU(UQrL-kY&&{O)*aGTTJ8aO6nu%_v*J zuh8T;c24j5&R6p!1lRDyW}=l&juoEiUB4+mZK28vew9uRzgqCtDUMb;Inw)U*l}?WIu9URbR|G%~M@R!- zn%97pWO9T%E!q`@t2V$25$jLCX4@s19N|ujc18Nqz?Y*XlOw;8tyD{(QG^V?swL#e zZ+(l1Dl12mBfYnec?bG{)ftN_x8z9g?JHY}188#iEys%P;0rPC#$hfCR+7o#2x(yD zXvySw@$&_D>dg z@`zP3IYMn8)UmchgFYPJ3jC_JlOudlgY-pJSvi^<`Pd-V5+B_mx<@Puze*=ZJ~oJm zDl7O^Iyut20n<^uM)c%J?*>etsGcr4(tG>J;WIaq$$^<7t+J2?zBK0mE6LzcW8Whg`Vt=D>gUVFVh z`?JpPd;X~PSnv09z1G@$eb!!k?KO-tnqkvWf)=EuG{dG*JTKL2kU(16yJy%misz+z zf)=EuG{dG*9OW#jC9vpoiM7Nul!$pLZ5nuExvIU*{^T1y%fb1n$SudOb2&G|G|w5P zv>+{|88!{qmh@m-!e10D=y|iB$apJ+{|88(gFUQ2s)dTx>@`iz_6_B`9j zx4WIrcHvl5_i-2IEa* z)ah?loV2GAF)yUcc+)tc^Qwx^-40{Om0FJIKP8!SxM?unG+wM(Rk5$zp%O&Q3+Xc6 zG;VP_k{;g7zVPB3?SgtcQOCZ%+Ic*THw`6XUPzbmrcvFuS&yXnwtc$WTVjU$4I(Z6 z?%>6+X$*O=S&wUr1TFAVnqkxUZA|z4ho{=v9FzT=cKfY89LAO>y3zcDQy}j?9x2{!PvnicMz8Ej-HZq z>1EfAchEGp?b|%Re1H)#FQrWbwZs0Z^R_;wrEjA!BW33DP1Epmn_4`*ZLe+hQu?wJ zu1)Dc;5)rql=vxE=T?l^$$9Pz)-M}B$y}*L37gm3%IC0DLkaa7{sq36S)DE=)S?7u zO_pCPwJ2ddGHNV8YgIQWed=ZkDWP80vm~(~zpmdO9(%x;|C&Fn7^bN>V+N|&+5$OF7E&50U&S(l~6DAuXs*%r=b329)yu}hNgzk|S6XuQ(iyGv z#{boMz0bIA9WS=}YW;cM!ExKJ|XA*PPJw8gP zm-WI)bRBchQ@kIlpSeuG5)ZezH<~N;vc4~g z-eY%(=1RS6T$IF7O|Fb;sF(HUN!++*y4S!jO3R^McsJPZLlUgLSwg)^=WIW`^+i5c zAk?CSjR8<&_Qn_aT%mctu6 zrg3uj{=OU_)S`rq4pU>z2_L8RN(uGCsM?a}Ni_NDgs6skVZ`gE`6RYGX?@>P<9?`y zdf8|jiPZ}}h~`SYY~+qai`(vtYN(fuA(Qy2{Xe1_>Sf;tNlZKFo+zPSHur%&vcJqJCJt%>SoD?_Q_p0)m3Wi`|b>s7hjx|og2H;ZtkP#xW zK38~m){?6icU(0h)U4_fLcL1&hii;bFKBZI)ZowiL5mW063qdT)<-Q$;8ZJ~?;SMo zt5r*uz^Rz!B?m!^5M71cv-S>?6c*(E>kvEiF3H2)7h4$cUo=<-XH5+&42Ph-gCHtBU!`WsY2y_y$K12c_hAFcBmxVmalqI9RiuYY_s zy;e%77k5K6jXS?TFU^$_>ZLm|=5ohR9rPrxt`h21x<}(f_dl234<*!#drexd9=+q% z^nNIzUZs1O_UikOu2vsQua$anpH$N*yfY)3EA`Sn_S~wJ{)eP(iRMbZN_XG8{qZ-V z)_T?jdTY@(h)ljd}-PoVsp~~NnY%Ni*(sN8cxagn09IG-K>ZQAg=5iOj zdP;X(-8mUTy-Lr>?KGvk*T8$NT9hc=k<{)U{;e({)JxCj4gMh1qD1Lww1KJ4t3?Uj zyD^u$|DoIFgX-eSp@e$rNw{u);sX=YUsQ=jc8)CF2U2sTgnE^pF2Ahr3V%N){ZW-y zixQ>h*RJ!Pjn?9Rs6`1qxgz8VS62!3(zA1OxvGl&{k2-?G}NL*=_wc^yFcyAvC5T0 z3H2&HpR@T_ucp6RwJ4#dV}x?xX`qC9>Di!xK*`mjMD|o&Qq_62D1oy%!Wp@OM?*lil;wmnwtv1ZP~P9eNU1uv!JeFkV~T1q3#o^vYTbERII zuJ$Ezxryty^er{+$4|K_;T_QJ#?E)Z|2=eBBX3^Vb)8;HWB+!(S(fHXElLdkVzOT! zXHSE`;5$x8OTD;9{QsX&uU360`&EKQ%>SW|KSQbH|CjO;Qwo$pmj zs6~lI9VaKXhs1KF79~Dz>+WEi7@-y=-rQ<(vhJ^(%Ng=jomYzzw{JK(SyNmS8T@fS z)S?7;q5c2Y621S6TrI&$O(Vum?d)5IW^1cTG&J2of7JT*yyY5dQDXh?YLjL+vgGUj z^t|t7taP>`t3(zgP{lca^Ou^ElM1DQ*AP1M-uJt@8C5+s6~mcSJe9X!sR7bixRh7P@B$_ z4z&a=oLZEab#kqrvtO>E79~0zU7M`?Qcec=laru{3mC~;tQjr^iI-hbayC^xQ^T9jCPR*n2>oA3S)ui@{Y zSd{o>XpOWCNZq4jDSd8(;JiQ9j!Zsf_S79|#cTiwXhSuIMm z`MkQ39)MbuSg@kHkzR&cl=#QH)zXu3eII{y(f3h{5?{VqExje)LDWRGC^6}^YUz== zKAeBYK_5;nN}TtK({Ou3l(y}tC2CP(@yqUhq&)!U3WQpeKsestRf`hno%4GO74W~k zO)xF>LLZ)e?Obl5eC<;&)zEi_>{pqfu3ku~{HqK~uIj31Zxg*TR~O|_LcI|GTz&5d zfpNI27uq){8^5%45oUbpwNfvoC*S18MT=)-=W;*ZaG3wq;&-kVB}UdxNEQyWQ?*Mq z)S?8>KQFCUD7jjcC_Vo?s8r|GqQp)IOh_j7W3IMcx?MV|rWPfJx-rZBm)JMGpnzN{ zp13&f}pF0h;C~@^(mC2@G#x#^ruhR4A>)(IXU)}#Y4Yeq7<(}^B z?eD4a<#m;Q^yBgjp3WZ^y;cbiTOKM zx?Ln=&krTkYneM+_>q>>Sh@7|wB%}0;#Ws((25#kue;Efe3~nV66)2YO=Yrm8xo-| zR+kX!HPD@Y{LpGX)!w=IQ{M|mZC8sD@46AlL-vSiD4||y{NH8)7R2BNPH*fQ@HozRmq}G)(#?mvyQyFTJo$H>C)%<($`<{_v3377+czDJBuixM;DRJm0bSpv@wwJ7n?tSYxQCq}46iT9>exfMfM z0_~Mrl(^iTUwm)>7@-y=z8_!ZRzAfDwJ6cWtCG|sMgj$r?VrZ3H zgBK&zqQs~D9Fg|Ov|g!2iGTF2l0KXgYEeS_cEKO_LoG^ZzqD~ey|l+!N?_EH{dSB- za-Tbl&oDlh(>F-p%|CJQ z98`-E7`f;E^rhucixL{m#ZT-_PN67pc3lkM~ZJ^uEuTpO*-PGgnD75 z7<;B#Ifgu}D@H;&)C(iU+;KIR`|a2%=@^-6s24_xu}6++yfH>sj06q!!box0Pv(-Q zx?&^{>V=VF?myvn75{9J&sFy7su#w6xf4n**J{&G{I$y7bM?X~?%GY*>pOJR%(Ucc z$r3Y`v*e$gJkx6+S4!CEuz6wJH{_~EvroJRa;1cNVXQZ_qORnrhFX-sNO8DU{M{l~ zN~o8P)wuQGd)tZ;5Nc5ZBgNqkZh4BX7zran>V=WwP)j}^-p-c;zgpE$FN_q2nz+dz zTQQO))C(iUp|%g5cb>nxSwg-1NOAg$8oQu6y}Ft!^}-l(_|@(`|5C4kJE(+uVWc>; z45ceZ!nIN_j1-5~=gfJVN3WH7VWc>;aGQ0i_Wj-L9aJxj6o*!H^N0VLj<9Gs)C(iU zp{4%I-cx<9vL#n9j1;pskjrha!muww9T|Nm2sOGp%x{u%6Q#hw3oof&*N?^_Kh>0Xv za+E_YO4#0QF+wd$V9oH^N02C;YY;3-V9jv9{YaF~H3$|Z{F>n%NhA;IT!X9KH&e4H zfi=TNZbE`3$30hz5?C{Q<)7RMK?$`efi=UY{E#JZb=9JT?G_p%)S?8|3~%%aiPE_S z!J-6K0Iym>Vs0~?YY;3-U~TUn_h;8fp&Xi)dfA#`YVcZtP>T{+0UUC5WXsdi*$HY< z0;_?;FRFB|K}buzumU(-E9MIKTrEmqZBEc2fpRFJUbYWptmJA@!uIQn5o%Gw_R@7IHN)Xod&Mp`*8o>nElOa`aA+Cy z>Z(NvtQmgu6qZ8?wJ3o#!|@hQElOa`aA-xTfpVxt39K2uejamGI@cgrl)#$d@cekD znawr8S4*`hfi=VB&nVPHwJ71&3`d`XYEc4fhU3p#wJ3o#!|~_2T9m+=;rFl2KAmxO z)uIH}472x<%U$uZ%{9PCky@0%n&Hs*;T^=aQi~E;GaUL?u1Ds-f7o1uU{L~VhS{GB z3MhwKl+ZQ9ZYP~?Gt(9hd+*FxZe#b0Uam{O{Ugk=_fie@QW`t##OE3)p93bu}&ZvVKr(C6W^AWxeH?hFX+BKbU8MT}Q59VCXkT1;N zMc>&hN}wOiGfjd&%Apn|tjFT<&R)Fevh@1jp#PFT;GgqB<_nk(x$ zb51G=w4!QJ!g|hG0`*EQN?6Z1MyN#z>r;~`?^Bya3F`-wDDP936V{WB)pkuwy{zX< z4PGmhTrEmi&zXdqRh&L?)S`s-eVMEBKDDK#Ue*t$26Kfws1_ycnMe&1D2Ed2Wj*Jt z1_-q%VLj&Kk`McB7Uz8Hob0$$be;2)N zvnXLbXA*jK)uM#;oMVJqlt9m!?O0I2{ZNY%)^pBkpq8jb3F}j5323NA3G|%fPaL%< zVLj)VhFX-co^$NUsTL)y=Nu!{q6B)*@g9I$l(3$2OhYY7SkIY+>-+dGaiLFb7A36b zOv3fA{MakLzN$qD^r=ISEYy=~H-9%+l(3$2w$~T>)MinFXO?H5wRY|+cc8FST)X-w zGQzr3NVVU^6S>QJDIMR%0|YGyldv9nY=;dc)C>D(GNo{(P;#{>VLfu&460iQJufG$KTm=sN9&^&Er<2zchA%- z5Nc7v`tw-=t&duiu>O3EP>T}Q(IF});lLr-qSB9tbZM=?V6T)S%01yyt*j4 zT9mNlbRYNP!1*3%lh+K4G?Nk!ussN>*iuYT9mNb>l`RI8$Vf}d$dacx=8rGkWJvr5)g!SiR zgj$raG4dFp7A34dA0yPFg!S}El=t+_qJ;J5N$9mwixM_^&Zl$v=($;xu%12%YM_>= zMG5QaX9=_n7}?&cxU(X9uiQ%!z2)8J|5DsPks2V>OKJ2`xZ7j!&l2i|l(-XPF1JJN z<>|a7wJ3q!a{11Y&`^sK2>;TnS@Fp^^z4Ro6h|#epyzb<)OCwQ`Cj*ymU^M*y#2!@ z<`(z5$Nf+Z^+KQe?Dt8G-@x{|$LfA1)C)c5uIsH=%+(_s*)r_ULeF{bcoOA%-5a4^zUMrLMEPF#MyMCY$ah&pqI|D=Bh(8$ z=e<55!Md2eAL@lZN~k3yP_OhpYb~)pHSb`b3vI9aAJe_=Emx|6p7S;9H7VY~BOb85 z?r{fIUA@q!-k~jt^1bd&L%q;*URXh*e6M>W)C)c5{)0)B&Rh=HM7?YmdlKb)-J6Db z*)H}ZJ{nmU2p z2em{A^+L}%d7i|NdtKo*vgJ@O^qhOYPNICTd%ITZWxLpuDBtVe2=zigc)t%xXx-Iv zs26&&zi(nG<#O4*?rBlNdd}3y?sZQ>z0jwQ=StPp3w_`48!X@J-twyi`oUYj%Uo&6 zH7)hRGcjnC?{#k)N}%T)?%-)RTir!1(X`YHJ?BtMzMWm?YYEyCCDaQ&=TH;#57qjb zm?hK;eds-a%KPkj@wRry}`R&w=1pZcw-B+B=?H$uJ8bAIAH5~VYj!*y3L z^qfQMQ@+=|X{Z-^&Y^`X-|OB8^+L~CTG0oyd)*tMUg%SYmU_&!w%0v==XwX#3w`SF z#3|qF-Zaz;J?HRLE8pwh2=($k=k&>0zSq4G>V=+jcsiHwb#H`vq30ZW0Ofn#8=+q4 zIfq_`>zDYto4r=*g+6uY$+*6cA3aCkN3X7Wq30ZWORj(AiR^Dsz0ju)J+kt>?yVf^ zg`RWh^=Vt8xl%9dQ?m!4#Pu6bcPmzH1beXybN@Vqf9aJS*+x0kOX-DWCJtVj4=Q*Q*;$Pwst`8h3Y}=jRmt=5}0EixPJ_qFr-py!p&~el6KG8A81_ zYB4=Iu7Mg4&MSD0j~t;EB|ct%dNOgX?KU3n2CkJ7>h)!_>B(bDsnK$a`+VKSUN34< zqQMc{eIL_MLcK;dnVu|sgBr7r+Q@6*H>egR4sygMU&b_)P_L`jnVyXKkQ#kI9O$p^ z-A+R-N}TM7(^pVq%$KA5)xADLsMm>q)F*%cj2a6MpXJN(lOxok#9tiI{%vZ6J5pUj zsMj06*1Oa4sPWxzUwaLlf}s{A?smkP%VHWzsMnvX>yw*SQ)9*+_dSiA;hw8SiMJfF z?~<5?66&?ih4tw!)S=vHOVpx7&Jp_Uj#PCCp=KKli};v^eII06>V@!g zo7&e!RZuYdNud0CECaO^kh=B!FEDoE_dBJb9|e) z`iH7~){C^YkCqZr=bzj0MAB8S_AdTucPgrVOP#dmwf^@p+}#hgD1r8|b(@%m66%Gv za_K$PIOnTh{V!@u*Iubbi6)L{-YTY{gnGT=TG9I+rN)^%EcJC4`+lfJiMfv0r8zae znQ!fGoy(OH>b0S3caLwN#&yH?@#RRIhFX;P$hEuU*V=2AAiqL4z(z8pd;4*GNz$~dRgmAjW0Ir z>dS%Nl3J7)=GxtpR>U-vP%pHucYa2VJ5I0ehHLzb(@={Ndpe@++c6C#)C+Cp>BUn@ zbGc@-Tc&R;YEfdYBTiiw(@;Xa&{p2On&oJ+_FjLjFfT(bO1$cbJ(p19tIZ!fz-m`@ z387xrx^gwg&TyXkLfc$fJW zuerjvyWpiXTGX|>8eK}LMTypqIO#wVpHA30{Y9xoi8ihk{d{07S4ybY!H$^Kml|i> z^Pz9yCc8FKElO;);q>H+Q%Ee?x~FeTo^o|pElOv?69UNU`{qF=3` zhUQ8wO1$mb#N{hV>^f_Le;Q!dI<+XV{*U#^uHBid-+R59eq&KWz0i*B{nPKodUe+7 zW77Mf79~cmbS2-E8kcW8Hho4ZpXR02N!-${ecC1}pNT#aKI!*1iI(%$j}q$D zb)3_9frS1(wB+iAryB25E_d8Jhx?M_>8utdULRSXJh6xxd)3d166)1&NPY6cGb9fF z{(-b6s)l+k?(2So^GVG5=m>uYu_jIl^+J673$I#~=rq1gH1t|2pM|4hxH!fHLyQ}66$sB8Fk4~i%D$rk)88{awwr*?M|&r zUVom%U55=!Yl#x-_1>_$WW_5aY7YI@*F>~eN~qVvC)Oon-XU@7ng90X_$ouF*P{a* z@gEZVer4mksEMkfUZ3@?OJ4nk#5a|;LlfF7CDiNKBkGc?e<3mE{?NiHp=1SGo%f9wA zSLHJY%%X&S;g4x(TIywA0jW_wbHFT0*qi`rtT{pVJPT*msu$)2gj&+%s}s_?tLo}y za{{Qb-AT6R8CnJ<)C+S0LTz8Y;DfXmu7rBooB(Q+&m6FltC!6QAW=SZzzFrSIRPZf zXAT&lUN$FyMET4CBh<_01du47Ibei(*_;3pLmtS^956z?Y)$})rqgZaK=yv9m(2;_ zQ*HjA^L<+qzMq?hdfA)+5Sc2RNR-bUFhad-P5_DWnFB_s zm(2+vQM%_@_8P_3>V=b{AG>__BH>oJ`F8`nt3?TfN44j*+WhRt)6oz0(wx}2*t-^UMHS>qElS{2?dLXSIT|C> z3*i~dvl=MJE$(dlMGLp_>gKgw8fH8d@PBn)y|Q$9u1L_L#FI|@hF^Kl@11Z%+ES}U ziKlm+>b`&MR=igCpF1OcA5@DHPdTE^l5I0r7r9bGy}sCKs{4*ZjWZ8>D}5hSixQtY zV&Jlvh7#&^N}H+fdlWS`-*wZpf29^BhB>13+gT0N5+&5D)3#IHdrJP+`99P*>$@M)r+Nc6`<^fP+@Or!YafW4%P>T{Zj@Y72Rs;833HADAl6Z_em#L^WCI+mec7?~iAF^(1+ z#AY7a$Q@LR5*VvlIWI=2MG1@ty?T{6bGmy}j8Kab7}u&jBu1!3 z30nakBh;dV?e&x^UMsim&bK}o7gdWA7z14M4hg;IYEc63?Yx_@eNrtg^}?vp_48sH zYEc5CM$K-_68J@_MG1@=jhIN{+^w$nCCARgYEc5CMsJ=%LQAd|B`|7q_7O2cElOb2 zsQ-R3LM=*Q)M)08BvwCBx=$)CN?_FJ$W2ISIn<&AMvYqi`DgL_hZ1U00;5KYKaUY= zQ39hz3*O8UxPxj@!jBp~MY4xPxj@qVZKJYEc5=uqH03l&)7(!g|Y1BfUONOTEy0?R(pX83N@{ zFV#RFKCJXU;->S{mRbq*Li~by_Fm^~-8mioP<5qGAM5(m^&4bzh1N$2^{Vw_GMxQ+ z&d^I!4YepS*^kL^PU6N-av9Jnynb%Ap!cKjg+_PD^Lw z>OEJB5*^$K%iq&E!b+$`iJ!N@2n$Po*P)mD+CI+RbG0b3y&o?j@$8}-{k!wwj!=sd zv$vS)R@abVu28SkqQu31EF(+co~uQPNBzh|j8Kab$GK61=hJ!m%oQ}$qQoFK2Jlq6 zdO!)aD6!bplDgvhhTxBqtC!Y{)5lL~q+Y2-i3c9PEctlO`k9&t4JFiT(aTe$CZ03= z{&bvLEm>mQmDG5w&B7eXl56nCax>=&gLB|4q$h+#28 zElRW8DbNCc@#vzGESJ>FnOYVNCMTv`sOmXKZk_h#r zISag!U+sfVLoG@i(SM3N50Zpxs6~nIj-HZq=@lc?qQvuuPjTm3 z#t5}2@y4N3+}W8VF5F|8Z%gL85lFQt(fZ&i?sQKQS`M`+f$(M>vrjer&hbvp-M?)n zkDb+r_Z`Lu1rX|`G{y$nHgd*cuqa{keRwutP^orj9AdtYS(LyS#~qEFaTqL0*sPwI zhFX-cSv@gAElSv|9unpAeag#WvwFA#X6YG+*l)!ws$sKwNa(dvixM`gCq}462^)ta zQF_K^o+wmsF%&; zA@N4Z8Ha&TFPq6jqV$ZzK&Y3^>>mk}&V*i0Vg>L1&MGY&N^^};wx$kjf3*v>7;l@jWOu@ly}T<+DC;fzDI zC}Hz*m@ECAE1_O^7YQ1rXB-BL5;l{E8l`6(2131TCJ%|yGY$ixUN)15MCloaflx1- z$wQ*_jKe^vm(AoMQF_KSZ%|NMz^xkWeq1$-`%D=^2M1SL$Umc}SF=aTo~ovY9+2v@Oy5pa z%Q1AD$I`bu_0n`PN-@0s{zZ+8{&s$vE43(5<3?CwI|#VO z-i@$yO!u?>Tk^QbN7@oi!y{ z|0EJUy3S3XQA()S2WL!4hMr7fy&?CewOtAInt1Azta@dl&lTohDWP87{yHVu z=?oG_kG|9sKW7N_+IG;C$wgcc2&AM58?QVD)mx&QQs?5 zI+xq7Rd-*nd`m4BC61qaWh1K^H7)gO>c;xQTFa7OlxV2e&@--(Ts20h7qnX!_vH=# zXiLpLt22W|3DlB6 zG~e#zw3etviT}9K!QsDgHQ<#89-2ODl~6Cl@0PCA+hLv8QjNnNuSyEVReuwPRi`;Y zc=wcGIZ&_EOX44J(v`(syVpnWpn5&hyQ-1aM{}iKlW&?J#IarbMN6(;NQt|Gv##5IOKMSK?X*iH ztI1KX)S^VcFDD4G*(XQ%l4JIcTCzk~c^~ps?Fm|xXwr9rtkv&$UU=fDMTwEM6J+K6 zPG4P@-g70?>-5nRWOe^W-yRhu)a%B66J*bUb01#c*Ao0bR71UXI$(nAYoH}pLcN+F zQJHj2ck#Gnw#{_H{ZNY%TkPa=mF~8%=6@IY-ynKRN~l-;`V(YFhn_qC&zA!&gA(d> z|EfyaHDcp-SNLm%--iXKZk*KxO0$}S%FwZ7F~E3~_+pSDRi=Bf4jemP5TxKDaV@{zL9SbLJl{{oCC;uH`F*DDmBXmC4&rl9)Yno3vi3MTt*4Rmwg^`m0q!y$;x`GO4|j8tuDH zN;TA?#EpAY$_`Dcp@e#M*|RbkJ)Ig#s6~lycdbnBnn+^gL)-fMfn7Y*qQs|dD`ju0 z>zZEeukINcLcPw|xiUHa3~H?R;R*itf!>l@lvuVyWh1+CDWP6>IpW&>)cDI6{k#U= zanz#3!0juOuZ#PX<#H2$XzoW13T~~w66*DkBgS>7hF)E@C^2Qb%B0P1B$ltYuis;9 zXE!pT79}P-V%Kz+w5t|f;&*%7Y3a!oN~jmYgTMVX@@_ETj_P#oY2CKf$*7HOKJBiZ zt7ZO`mP5Ui)}BEwclb@;r)`O*rL+&X=Zvk!G&Ei9OXPAVKlJ)jpwPnYbIIhi9Ig6J zPUaO?K`e6N8Gofl=?QtkOX;RZO_o`Dnk%&^aZ?|cQX{J%f<=k<51HJ^Y(upu@!Ua^ z8=29l79~b@ncT>%Nwp}ksN>{DW@f5IiI3a5s~esDsTL*P+-kDSFfCmL5iCmFzTxD^ zELQZE)S^VsJ!;dskX;24(o(NMf7Hs{TD|9LQDXh?Y8#oqs}>~+AJxhn;nGzQ!J@>q zuhq&tWX+XYl(?!;+sIsJwJ5Rpf!fCAQ;S83BX6peIoqYHAc94Su26%7riCUES?5>(dYNA?{IC^G{ z)b`R<5W%9vfz>tgiwb4ODu`fFV)0oujs0rHqQoylYZ_@8)S|?XN7hK|Q@RQwSd>`O ztwvfnEr(i^n9!l7kycbKN_1#bBQ165Du`fF;^USzk>>~Aanz#3L+jPZGfK;$7A0=~ zxw?_(pjwnz{B3n3&sw!8(dP5&MxN(tQDVW0>PGquYEj}J?^ZX`FHwsUU%px0NZ&^- zN=$mKTKZR|=iLR166d|*G>ZMXa5vC0s6~mzFT4AZ_WAWW!u%<_a}Yy;MVc&beIaDu|%2UPvjdf=~@rS3UHpXD;Xd?Idt@l~6Cl z$Jb4$1>@qainC)8juYyo^y0^=l6T8y=N>mQ3N`4y}(@={N zr}nQ(I!5Q|t3`=}+*o*gt&CcfsC8rEaY8LhXw45-3cn8})C=R+<-aJ@T_w~D;rNd4 zS%O{|_hmSjJNQQXUW?IlCDdz#8`)kMUDKczB~EiA+ef7LJe0jUuNEb4a3kCM42<1# zwJ3oR=!yMegj$q1$&GC9m+slmT;b{}p04sYQtaZe+X9AF(wJYEc4X*4wU(5o%EaW7f(0F+wd$V9a{p^D#m#N?^?Tt4Csl zT9o+7jcm`DlO<5E)S?7Nphr(7(e#-X{(fLIN-avvb0gblM$fcRLcK7aeEGT5_~?(d z>4=wFl(^rGY`0I(<`}tlxvy7Wx?CxtUcEb4CL^LJhA5$47=d1AFmp9y;KyF$3#XwL zCFa(3kGPTy6d1@4n<8q2yvw;u$xx-7Y;JM}LD#s24_{A8ARA ze{D6|m*a0vLoG`D=7<*QIX`PZxyqMgOomXeCT%L+sc*4fpK7QVMxY;B&DFBA26yl! z#~6TGlz7*TIv=t}OhXCv!Z`KJ<|NTP_HZpV*;SaCT zQ9`{idLB*sd+u+0GftHn1jCDaR}>ftO?)?PdZl~6B? zUxu1U0_D)U1e&{?lzx?&aQU?hK&?0lE0IE4s`1hKlau_{EJv3)fAb~B7k4Gp3nTa8 z6xa9u`&#F}*fl%cbM^Y>soG?t zOQ^BMw)rTbUig|3&Mdxm?d!fA*{iEwm)%{Pyi-SwhyS}?v>fV%?;kVLla#l4E9|GQ zh<-BwaISFs4?of z%X~S|r&dC}@UgB)uyi4M#(>L|^BbzJr zO8!!t411r%(Km0Ne)-XIs29HP#7|6DLcQ>{hG(zma;>)L>uWpOcC{#R*4DL2*X7LB zx!d26UR@>B3-L2j!mcd-#ffY|UA^#4Cp-J+Zk-ko0Y1fEe!sMljFYmy=9{m^nKpXjEoZMg)fbv zxAfZL)1&uXz4~;jNv=zKWc9tL_*N8SeOhw$!neuL>&xBWJDMx?8og6Z@~^aKdC_5Y zUIV>X)le^d=M25qMVs3i-fT@&ubW!cBpuTp^3fGj{WA({msCT&@clFN^gG?y+2<V+?+;f>|jqivm6wjAm;=GW@v!St=D>rS?I2`dg& zL%sYr*7VJ*^n8QxB~HEYjWxX8m7Z@92=&4@*6;>ddcHv*)C=EO!&|C*ul2tV^cl1q z>VS6kZQH${dm{TAR4;se4R7?N=Np7_s29GmhEW53a%!&B zOTV$^a2vWO&E4g;OtG4T|`%o>Mh6Ev0cq!us>Z2=&4hVflhTuC7|3H>!QO z3ZWciaCNb^@45Qk{`&NO|H@?Jy$|Gle1)h%|<)uIH#p(Z}@<+wbQl1p!@!0PS}7u#-ux7HyFPZpjg`;hL6n}#&JzQ&bopro;aZhz*i|sS(p;&!df7GHy;yh4udZ2?u&dCn zNCXvpF~QX}LcQ!7vR;*6U9%`*SC>T4;F8Mb(S*Jy0gb(;xr4 z{Y%6Gngp&P!-0T?66%GLvlo@iy-}>YSq=5VRS07;LB)0|q(upBF><-y`#k7Jom;wG zUBB^k_f^l%t~l9+=NC^qS?$90>8T{c2VCUWvE1;pTeT%#O0VPMw~C&8qJ(;l*l2q4 z!aY3s;xBFD<#yc>4wvj`_hwWe%-uhcU-S|PD3q9+_}MY z_k}l{=E3Xho;Z@0dL7bYx;q`1<=D7=8-I0QbsB0>;^XzFyD!x|QHKgBhZ5?wL-Xl! zGSC4(TonA&L_@Rb?)!O6Lkab|xyf`n;b^PN-}Cnarvs}+iGv)`^2?Zp66&>Z zo$1M$=}Ardd_B;Y1K)(zqQuFL7?GaT)N$9*{_5iUxf1GC_eZ^)IJH^-S^hl=@8@b! z;xCTqP~h>^#Ev;h>=wCE7S5ep;Fm>V@_(oIW(J?PY1t zQY~3xVezCkl)3ad$h1Jy3t@c@hBJ87k|lT^4>ZCbyi|kfB0heyTvmhWTALp`6G<(W zuC+M!3})-&PB`-KgW>sMX{ndB^VXk>JwJ?4FMEE(YKdBuuxBm%iQ!7&eXz7=$-Xb> z(BD-8&y2Zy^zu*V#V$N!xxE`AykcLA&*lET_V0dm=40RE`$zCndXS5MXtmL~+^+9T z@omY4uI{QuiPnxde+O!4u9Q%(Htvb@NXtIOp3E0rx_XTUr=b=l4tB(#EvWIzS6BL$ z0V9w~sMl8RxpLA5Bs5n_sMluh88vYa=4$rnhr9+x?$n~hZ1;?sk&9_4pS2QMC#w$w_f*F#OGC--OW{Fu0FY~ z;%QL$N~RVidOPB_PpL8Wl4E_Y?#~eFwdT{Xa?_Jk<;0D<#xx{U2SMIET4WXo#QKjT9i2J$$B@dn8bm%k4S$XYEfeG1NCm^G6}u9YEj~W zJL=u+XcBjH8{~6^-=JEQ=ze{@n}JP2HPoWSCDZENEbkbh7A3}2)w{XpF+wd$bRFk3 z2F3`rD1j$+yzVNYUaya=ceCze8fsCZ-w@ZU8Ajsy7Kf!*S1n2`?(2SoWuu(vGpI!g zgl8;|Jq@x1z4jVk7tz44RxO&Y^-*FPN~qVOm+NFavDKPFdU}Ks>a~91nnp$kl~AwE z#?`sgBY1VSCaOh=U(RwwdOwsPLCj=)h!PB=qzMwJ7mX&pLN{1PLvNT9iO|v-E4m%H^H&t2%V?J9+5o z$vmxj+51BlGalhwuG_ym=kIK9M9k~1zpv@Vc!YDg#Z9{8cWc_kk5yyTnZ0eCOgeM< zroE6Z<4vQd^S;YbC{N4_=`!9lZgbv!np&=S;wjVRxv$Vb*fe%@8qYT|f)=KWw<35k zCDX90Ywv4XLhK`q_e>CsHw_T3b@Nv@=7n?_ZyM-{o!M zJLuC#-9-z)aTvA+K3BzdB~Gx#$Ptbz2 zlxEm8c%5*?aIJ3m)lS<(n9nGNjbOV@LcNqm*m4C={BrRxt|ADe#dP7t_;MoVr8LW7 zBRgd@9yhcAJ!72rB48c zO#?*BB0&q%Qkr4YnA&4lepS`F{kL)kRu*LL$Sa0b;8nK?~C2y@40Q zrtwFM5&2Ia|Fi<-AOSBuQ;}iQ0P&w9K?~ASnqkv;?f3KZ_qDy}%M4~b#Z0C8%Opap3u&9G@~@Y>k?ArlsR4VD~fX-*h6 zjrNa>&0o7wQc`lHr8L8)f%kIU3;eNXiL?;roDzmjL+ceSNGnTorb;e1X73UC`P+Tk z01fs4ke1ePhE3zDO-AG&m}>+r&`_FTD@Uugee%D5w3Gi0vIl^)^oh){Y1ACmCx6!i zM$m$^lxEm8kbjn5OU|<)kuKv+Ly4Fd(q+79)Ge>dPhHx?_sF=C6=~@jRfbKY|A%h3 zp?1wZK?~ASnqkw>dyd&gIA;)P*({_D{PT)omLt4>(1NtGbU3l_lXbh~n>4rQhpsW< z$_}KdU5$hI-m>2XIZ{=|J!ryOPW!+T+Va)zSx(vq&_2M2fOv!R}r8EOPANK0vkP2=6ux-{JM!vue=bO#!}2aGq3 zs$07>{P#N}VqQp>@upFHSM$ABt~p0qy2hPh(h^9`M_cMtxqt57Nn&#!=`cP)?4PAZ`;pbD?MSAXQv`v#+wF+rbQy=g>)Hj z8arNkd&9DC&-WU->k#)7Lb{AM4JBe;NSE=Z@$rgw6>DZr^cviO25ITuG7Ou>rO!EH zmJzfdEu|SYjc;1?%kR)>ORvGbMUa;68p5z?e7s%1{Kl<~pap3u&9G^l-*iNN`=$2e z-P5L&>E+C zXS`{&xTS6W@Og)olpGd%Azjj@!TthTI-5znfqyO`%oPd@n?{yUFFd2*#gt4#M^c#< zEL?j)f=|0#PKlV8(kur`V7&kmu;??K@hnFmVqQv{#`P;Y7Y^%SeFojTjk~fTUB;Wn z4UXtjBw}7jm+_`CeB!!=JM+W*9n^i*xMLd9WxQ#uxP9Hi=sk^yc_CfKn}+sFm|s}* z3CFMzI?h0gmX-iXilZndDINW{FL!FbCR?jQS# zYT+(mNSE=Zp+w9J=`!9lPMtHW;*wu4@b^Ra*y8S4NSE=Zp+w9J=`!9l77To>qQed6 zcnw;RmhQL3uxT_1L5rpfFQ#M~Kc4(%#UAZPdkrPHLzn8A#@IvOteCU65iu{M%Xrgx zbLTDd<2JWvt@gaQ-xktkylMQq<(B#WI~fu4Lb{AMjdkDYmLIxKCtnWkv4ymB_bi4@ zV?7~gL0U>PY#Q&scuKxUpH;pO$NjI6mhMxD(9 z2|)|eV*eUm44Vd@9cUr=mI^O~xyKU2rjaGo3;Q^c4tqLv`>iVf$fCpiOg&9Yd&LZ! z28f4?1TDy~(hOTU#y>tbU%l48e{d%*q@_J1hE3z@>&ND=zQ(?P(1Ns-X4o_qojf4_ z#q!MxxK`|iBQ4!mjbYQ6bj5)DWq&t<7Nn&#!=_REKG*;azD*!4-N%bz(*W^e>-{`I z3(``WVbi$x)5G$wjBM-cE?Wkqr9D=LP2(ORXhB*^Gi(|I{xUlM>wq_X-DS&wv~+hl zhD`&+FGYeDq@^^&rqSxN%?i&C9pKBMZ|>SpV7zI7SXv}vUPzbmrZMifz4FsOv>vkV zhRBu^=`!9lPTiza{?!+ahke1R6 zo5q4mM^#+j?-GBl^sPvr;fyzpqi-EmG5r`LVqQp>@x^kW(iZ!oy2A$73?p5}n}!F9 zM9d56GTt;?54phE2|9*EFQm(`5pD)VfioazftS(@TdwYYK54jO+E{(pBTGG(u1|w*Jm(mPduG;Q%X~WhVkM|n-#;fBOj5m#)g@}0}UB;WnjY-oU8@h2z zTxIRu@kxes8E+cP9&Fm9b&-g9Azj9s#`IO6Hnjfjbg!YkZI%}4GTt<12odu_x{NoC z!~fbgKj9mDyVG8g{_YrW8Xuq2Hs58r5iu{M%XrfmFyoy3ix)oT+bgy{NK1Pb44cNA zx15tdem^5PY#POH6D2J*($ZZW88(gLw+TU#$w=B2c0xKZZ< zN1fSbz`~Jcq|2}oZe+W_k!@Pwr8L8qt2evvRp@@& zFXV*rmaFL_S5-_{e2Ul5w+0>4WxQ!Lbv^JeT~8dp+L#y8WxQ$J`|PCr<%5>`FAePV zAuav7z_4ljv}jVk)nzYuf)=EuG{dGbWblCe%rET=FHcKDT6(G(!=|AGEl5jghE3zG z4!bujt)Eyx$@RQUp0@#3L z_1)(G;!iB&d7wy_@us0f%nRu<-ZZv6w0U8|puxTzR7YBR;w{6b(Qn)4g$vF%f)>p? zyqJ<{xY6^18*ld-O7I+B)iVtcZoJ(SF)yUcc+(hpO54J=UmaFP=;^==o5mTA*rrI( zqUpk`RO9egoeH}@-_2_%!840NFy1s?`DCxc1K%4F^MW4ZtsH!I;7;OBaV0duSb2?f z8IBX`r8L5pt6TRRk#Ew~<}>hAL|F8^LxzobviXSopAAOP0(GSswp_jb=-B)fP3)^a z38bYbBr8@yib_ z$gk22TRB!8=Vl=dv3X1E0U#~?6)|iYAX*m*T9B5~43}Rk)^?wd*Zye%T8pwH;}phxGZtAN=!*Vbeg5?6N^iJwXf7;%^0B440P!cMZEs z!OMq>yGt=_8d?rokX9L;p0>I7UZeBvj(yYj^zmj=aozX+o?}#nr}Z*y8v8h6w<19c zG?Zr8%JJJvuIJiomDeDFwDfdfhD~GtXHLogd8rY!AT6aCHjOzSAC^C6bX)(c#c0%= zFIM?-U<7K(LTgtTHVq|cL0U>PY#Jlp>z05051Um?0%@_0f)~T4G13vQ6$x74r8L8) zQCyo*Y!mH7CZvTs$X_bMrcwMp=m}aZCxO;eX>z&Z{1Q*#8^p|m>{{UsqD5P~Rt%d) zaej#>Xn}^(3|l$&b#KBC@Bf&;=XewDv&8C^)(nPCfnjC2`q z8cM{xkS^m*qd0!$%fTKC($drA88(gL_?0JUL0U>PY#O^vU%KGu;?-T*uPS-1SPp$( zX1r-!fB4b`A3ke$Fy@7H8E+bx_0qESmOfX!x=2e~PKHfmrJGsPrjrr0AT6aCHjUy~ zcpg`o=eQ#+9VuYgH2yf#kDhyi7Nn&#!$l2$3vK)gJukjNu;oO$j5iIv=P@s&%Xrf` z%f2G}YlZQhK^s_Gt8EnHP2&gqQtgSD7t&?CX>7D*vmXEXu*wtsMZu!=mGP#r&pOR| zd{ZQ1UP_zBs$*7FytLHD0Q6~~d1t(7TzdAZieU?lhcr6@ zq|12IXmjqUhW`DHh^5BYQN_MGS_6z_Azj9sMnC60tN0!j^Fq3eH;v+$ zzORWKH9%TtxKpN%KjSxlMHw~?T{l4s(o&jX)8I1@*9vVP-UnepnB`zNPNhQ z_{hx=I;PqPTHvKL!=^EGQnLmBC_dG+=cWA}#+$}4A!1%gm+_{7TEcpTFIYSq4BxpB zM!JkQ4JBe;NSE=Zab&X(dhB+E^~g4M`$-(%V13b>&aX?pEA~YhZyHAl5%WU2j5iI} zZ(qQEJ9Y{|UmX_gGxEeD>+dq&G+e)Z0sHMSFQrYxy?->gIorPOl7I!fpM3s;X)xY2 z-1|p^o3rhSn3vL~;hrA_H|Ne1*s})jwXk5voA(CWJ1*l*!#zJzBIc#EX}Fmj1vit! zYhdr4`IlI_*tv(}mkgVR8?!99*&?2x1!*bGuxS))i6<}{m#1Z6&Mv}8m+_{dM9d56 zGTt?~0lE6uRw%C!sywhY+$i|^#>#jt6()~CSM zhZdxzG{dIhR;3i&subT|Vb3$ZxvLk$rr|~nQi2wwr8L8)p)CVu6|*hDEEKjSj4vl* zUdRdKEmt~Hg#G$hm#{AmPeo+dG?btPX(`RHX`mb&3-9E1{^7ebb_e3SGvh-!NW{F5 zF5^wZy|FCd8;e@BjbglMxVNGOd@G81Azj9^9QH1V^64jb1dCwVNPQ<*B6UL|I$RkJiC+JT=1A#m+yxq6oJu z-VcVUQA((n(g>Tz4^wZi`170deaYV&R+p@J#oG3Er`EYMAgyg@ylE&A^Fq3eHx0L@ zp@&=3;5D>2p}%d$n}%D{(8H~1@I=fD=`!9ln%%rp{)xeTJh9sC#8lthp6ACNQI}l( ziwZg6WFyoOq^ zgB`}KkuKv+W63#>HC!;$h?p1BWxQ#y-l9gb&42}A)EK18aGX#t)+MH7xte(Pss@hY zV81?$U%`Ui{`lR1VI#gjW>o`6ifDnl(hOU!iffVmwZe?8{)6lrB>Ow?V%Ri_Ymq%c z3%rzO*ffg2+C2WpQ;nt7-y`EqLy4Fd(q+79%-FGcVefNnwuqKo`=5+AjT;YcUT8kV zh?p1BWxQz=XR-Q{<4MnFIA*l++0J;=D9)7iM9d56GTt=YsB@v~a+_bm9x^QKu_9f@ zo5n*&wk)>gpe+rS0ybjjvAjKGE(!<4t3G*RH?Fr$NLE z>5?`L{eAG7z``C9(q%YKu&vF~xayXxQ$}>o|2)^8IQr!L&*AReo!{(t&UhnE6(Z(^ zoG{*Ur9CqC=#duQGkO0RHVq|cL0U>PY#PUZ)2(pB*Y-UMdzkY3Dc@d@F2hEQf390$ zz0EuMJ4g$>lxEm+<-Wca_`Mc8tKxet(o!#mP2+%{4lCR?z`pR(g0z%o*fiXih62Ad zV82&>A5t%dO~bAFEx1*`z8th5Eu|SY4YUmG`LQ43G z=iyzu+k36n42F$xUoBID7N{%Du;ps)OQ#h6Jj7-|U@upFnt?o6nRq|12I zaP=yW8iGIemVCN0zK?j;9{80K;W=nMGScBW_(E<;#p6|DeXjH>>N`2(tsF|kypVUs zTRG-^GO?n0tMOigZ|+Eo&pvoDY#IZmURrT|b0cVhm(mQIhTG$}z&(ET%nzP1f^->g z8g7r@0{8fhc_CfKo5sJd9Z-1xMq4dA%$?_R(u!t&UD2NI+?}>>H}mr$88*W0NLt{I zq_jX?X@)IV9bJESvD+sF_Y&vTEMIBgPY1eF5WZURn{N#mHjRb_-3kM?x0Uy_AT6aC zHVyaHvcT`0dZrex59f64|1eGEz5GkuxYqG8VlUjkrt$-G{dGbuIY$^+e4@V zB`1NjzI11JJ-*a57&eW;yN@WiJ%l_#3(``WVbdtqM1O^|r}kj)Xm~NcoIs7sdLbu_ zw_G9ryzguQkd~bbV5b@}Y#K_?g0z%oxJ1MM&OvZp5xh84f$=38o``u-k11K6*wa8- z{IYImLD)JL#+PXLs~huz2IH+9Zth3Ht>^T2a6^BBoYkvW-0$(eN9~?7Tu#seb)^}$ zTx(plf<)TT2mRH&e1zO;xG{crFH;=5~_Kx;7kxv$+rB|BqM!0!o zDG~Eh+H!>w^Dg2S#d((aP4F4Tc+*fK=7n?_ZyIC1zM!ym^Xq&~#3@s4FSNRgQ?0Hz z#p*7@f2r_d*fb^zK?}T;X4o{`uBQd=ddi**($d<; zuxb2wL7&3jl{@)6NDIpFMJ)E2MWwPM&b2EBP$;fo1I z(1Ns-X4o`-{c}QL>wcXZa3^slXX`fhtktI_!=|AGEl5jghD~FV8^@S(o9!IQJBYNj z#bMYqKwMTNXhB*^Gi(}H9Xh&j$~SNLdi9_?e{9Wct5?h1yn|z|uxrJzY1HpLy712B zw&MvcNK0vkO=H&ICKZl)(e_riGg9qZX=xcYjp4UWDlBdPmS0yy3(``WVbl2JmPv)v z`q@bW?cM!&dX7Cm7P@f#410bsY#Oaxt_FW+rxnnGw3KGpG!~ycpz!(f&3p@YqU)>Q z`I%{G?}cI0a69P~+)g^4pap3u&9G@~u)M19?UJTFP_IzJwY%E=Ko78XQ@bAwn}!m! zAT6aCHVrqEyx{g>@ws}#JwHzW*2PIJbjQiRZm+$xHG zBFd$3=KFCXri;@>SH(ywM~NxvHt}1p_1e$9-+O)b_i@hmkD2#lz2DFEUTg3DS?j&l zUTZJ=h^0b9*`dkFKIj8==S7sKUn*av^CkHFgbehr{?K3*X}%XfGIGx$2M^x2hrdU5 zb~+>ahSc=_Mf$=3>vd_)@AH6O0Wnt43PRiK1iHYPrNz)RI zjQljM0odsve;tP2KzYT;0@*$yfkr+ejjZ&1t@7QIoP+^g;x2`jIi(l~0x7u^pc+eiA|(ty(=&?v7+Bil#XB{WE1 z-^+0#gz}0J60&`W-~=!<$}7^y_L0t;7;xSMvpC8tj^dH+WA|l84L*Odzf6Hfc|{u8 zKA!*QR}JoZ<&@l>5a}zg*aINjNA;YAgF`kpfkt^n8reQ3@4Cm}^A~#Vl_*1b#Rv)6 zKE83<9)oN4GJ!^UMH<;Y_{GvD5>vTVbBuy)f+z-plYwLvX(F|ek&ACTY_RaH{^}_` zr^*|ndt}!`!~r#dM&2Wh>{6vKz7P1~J1v9qinH0s_L06SKj5qKXp~o^k?kXWWplt+ zHubAzj#X{#-ZR{nAlruszT}BUc|{u8KI&P6{9G|_sJz_kdp;4_KI)l?OrTL-kw&(U z@($8c>kcwohulv@t4K?BsrE_Z+TR@7j%zo6w&y9=PHoBhoA|^+WE1u8JhxY9bJLU*!hcu>|_2V6Lyo+ofkwBxoB8_Yx8;!hoFlox? za;d(M<`Ac?yHob@K$_EEyxKmH?c;)--#fVffzMA8jq-{#vVG`z zA`;ig^%Zl`2qR&btA>E}a-%Z^5Ltm>{TVxaEy9r%gdDr_0Xk?eF>_0Ai z!ame9yzP&sk?o`GKd@4t0gY@Q^U}=SSL@xG9`Vl4_aj;%+lPqjY66Y&iZrr)ylb6Z z2LGPk5$djJu6W+fc}{XnmAdv_iIz z`Zw4qmGX)-vVEj4W)0F8v+{@~wi#}n{rf<+k8RUD+_DAjJly8b9&T~S$v)!m}t`-y3B6h`$ds$}7^y_EFw*&X&}DzBQeZt9+6BiD(sR$u8CKwX!Dm zWXKa;EBBVZKBkdfs&ty*VCVWY!87xGqOaAhsZV^@FMX|$?IRLslvkvYsd;V_bCmJI zJP+rmTGxlCo%CU%&x)(t{yu1P<;juEtb7$EUw_K)O zcqG;1n|&l_o|O$ioC0d5<(Q zSGPM;^qzUHhpx}^vs_zb`zWtfw2HLkVIS)0=lq-dkJ#%Y5Bor)yh>U**~i^iEE#;_ z;veLhiP_1=O&8mTM!#pCV=H9)&@YP9fzc?hNF&=vj7w-4l-J(*{jh%@$o3KA5;V#y z(#ZBvj%)AyqU#Y$f@~j(kbisVyiq+@Xq1=6ve3x(QMZYqrFK84C*zq9Irc%ek93NX zRzPF|jq-92FdR9Jj69g;!k<>ZuXT*G-O%rj-=ItNw)BhoaNVDyk@rX=yHs_&n`{2P z6jNV$ov&4_Epki5c?Mk{d5<)*OI5#{$iG@e`m=xR+I}&`K1Y4m*9zG_(wB7fHX{>g zlvkvY?c=cLzjtuNW1q?OAbM3^u_Va$k-jrA;6zU}$}7^y_7P*aUH+=~5pLVp|EJ!! z_}N9akMvEBLHc4=ZmH2IuSg@?M;-NbYOcIugoNDjkqI=)i|ZyUWc$di&wXd#q^JFf z^xHn`9M>cEWXSdr2{g(p(#ZBvU)}t)d%Wb{GDi2v_EF!#OrTL-kw&(U@|~9=WaXu| zS)c!npGsu=DBpQu6(etC`_MH?wa<5uNLYEf7oDGe9pbQ zgIn#Xg4TuZBlLjEd}|o`K9yyWi@&9&r?pY#()GnF%z?E7HjJF+4ly*w8bAj*yW} z49`Fg$ISs5XDz<&GB*?BuB+$rvq>){!GNx9%qrBo1j@-Fc13mL-loxT3 ztdQ*^_UA->vRXT>jr!7cZcC8uBlhQLlvkvY?PKG4?;lM1j=zNjp}b;?gKQrno>3EM zlvkvY?IS){x7K4o<#ka#j+Pa&eZ=PqjjSS#Y#(twwOauHKJ;WTfo|D$e{P7oiXCI$RYalPYd+%(8 zY#)#P@l}JHUTp%6@`^OFeW?8W4*kn<{OQ(Ux9o%TVWQ7UB_Z9VI{2D(7JMR|FfUI# zrf=_@bBOQ9#_v7zwmp-qd`Y*DlV7pUg4=4M&r11{ZXXAwl^iE;>l5s?lH=MZ_Vqna z@;UeJn|&zykZj`Yv|41Z+n$zZKhVf~q>){!`ioh)9@E1oA&n%AXR z^xE(E*+n+-mY?l2xZ?y9XyiT8$SzepH~i-P&%AAyF_-=9m!5fBwZL^Ey(Ks|yw6G{ zA>F0gAnp47?b%)_t6jfGeAM?@JAF?%*7qOT#Iik(7_2eb1R8mdG_p%|f12f7r=I21 z*z)vS-5UHf&5OS9c3&&fP0UG8$<6gD?>;M)gmjncqE3jq-{#vVEkp=$3O9oxZ+x z>zkafzTKs^OZk#+AL%T*<(x&=XQg~ew~yP?*WMog#5&eU-{j-754!(|Jpi(OZ1v%T2M_*holKxn zUXez&kKr-SXnw970k%EdqFI(lMux{YT`QFY+NG*j&^7P8E}P+JceB);>wAyE3$Cf(&?nt+fH+^&2=%V!HQ#~bpR?3%j z`;aB^kNYCu1IG!zZpii#2{g(p(#ZJezGKnzBMm*7@Gnx{&GXi+esR>n zx#pW5aOQ0nztq3;*k_RLdTjNIb*p<1G|^|Jl929FZF1L&<$K(|B>T{JL|>NrT4`eY zLArgU^PQJ-B6Ocsr0wJVX^-%+fAA@;v4zua`~TX>&lTzR@#igesvf%4M4y%NCEY&m zSuua`{*An|I7Te`;>|biaeIYq;<`W1A8hcD=fcs*d!&(Fs)N#-j8D~(O!TgAWNbXg zK1erlNwR)P{r;oRN+luPrDCR5Pb3=UCHb3YIW|PL529m;Xho^W$v)EQ*#pko)>l>j z=c{hp_4Si;E_OYTO{5dL8v>2IM;h6s8r`ftrIPY0FMZ|aj#Q6WClmj(NlWxuMcSp> zbISD5o6cUGpWVM7onrO6A0*OKzNFj7Th5q1I)1u|J}c!*x_#6u$#Yynlp)PssUKYZ zgkv9M6Ce26F@v?Py)F}I*$h>YZ`ykyu>hH;9qR&eCl5QWbnYU{6x8F-=FQvav zz2?l@j(vsO#Msu7ZXfBa#?f?EVicP^NG zr-?o*W6zHa=Q`mA3x@*Zhqm#Y3AS+0k^F810x-Co5O2iZRA?~!E!jq-{#vV9ECSvpQo z@63z`vV9ECS$bY1#tF#wQGX9P$J9i~%1bNo7te6Ji)I7`-s8qfB9jq zIlX~2v2{i^adaBdFF4EJ@j{~-MjF{QKk5GYgFXN18AxU(loumxSs~j;B+$qz(#ZCa zPB|WM%CUBaeD#_B4aONLWcx_x_6;~m8IAIaG_rj>@~Opx_0OBudD@j%v_iIzAEj?6 zd~=q+oq$Gp@mrAl- z89etj-sw$bsk~x~gKQsX-M`P^u6LP0qr4)GY#;SE=<@HJ7Fim7ckTtRbvuu2qW%V5 zCeX-xq>){!`XqrNB8~^h$v*1S3Nq1WrF==ZkN8$b?W<;;rD24ve36Fv;?o?aUIKIMySqW+F>CeX+#(#S3qt%BMIW^1L1BW&b;LL+*4FKK3nM@H&%8gi*( zR21J8knVca=QL!Z&q^gBol@mCF%xk{D9(SAZXc>Kqn17^d}tR^`$zEIi!)i)gv#?R~osWh*pti z^fEG%=E5shx9Qtv5c(>t>Y;p*U5~ULt|8FmQU#ivT&gq&FklYgoQqFt=8*4Sc2b@X zP`;$whlqRXS%W?+cdw$BvC*`?NY5w&7lkyy?@+I9q>ND0e(PtHD`$)4m zq`1X^UcL=20M|y8C&U=GC zE9FbNee8a~^zj9s@CY($Ccp8dJpNR^q}xXtrH(U7?Xyz8q}xY)$D%LV@+|SZDqqs= zR?3%j`$*%c<&2}^ zReUg=+sL~+((NOSqn0y{>a$Y5q}xaLcYbF0ouAR%8=Y1_+ch%M{hhZ~n%AI}K(6Z% zTG7~&#rsUU>!Eg+D7nu{`I2rQw9?|ZgUU-Xvqs4HXxH_jQC=m@6Qi8$7kUs3A&nnXPQGZWAKfC%mKKbgau&Xz8+m37> z_4o8MfyVi^G&was22Wepy&8n_(zj~)%_BEH2I<>;sMRiZrr)#JEIXV5cXO%#(=R zPeiLoxBXy!KL+|g`p`)vSdrejADQU0Qb|Z3E|oNz*^E}ow@aj_J?F1dp}{KB%#q5j zecIIvQ});+BU6tqp=+g5l{D8)KJ;fQMgTk+%9nI}v_zkk{E_Z!_4;F{4u0}W&%^!q z)h9LY9UuI{NzHp_((U7Qf#|bRzNFj7x7VCkUA^|M`AOs#B~6UmNVkvYuRpJP<5PZi z`>Y~uANf+%*D5~k`qnwWN79F{RiBmeCEY&K4E=x^`h9OWDZh`9hG$IqBAZBW0S3GU zKqIS2BfC^_-vr*JiN8B!6LH@Jnpk#Ok&{cc;)AQk=hicjM0c|K`NvOc<}Z=$GlzcJ}c!*x_!hQp!zyCJxh!eNVku;%e2o*`I2rQ zX?8JSL`ce)bo)5yAHN!X z?bl57St(!A?W6vEGlzcJ}c!*IzD0x*S@=n(F-y@x-J@R$Z72x@awN<`DHSZ8y(UR5^>QbfmoCDr- z#uk9KR{oGpr1zWy-gBanRiu$!kB_dNSG{Ee?>JN|I^!zu`A}Os=ilb%-Urz}y660~ zR*^=wkNA`*f+XLuG(MNCd`Y*DNc34LU()R(#-f^Iy3p0&J?RmPYPfns?>A6M{yygY2Bh1^r&HVh%6c5tXGJ|k+efVV;d4IGsRt#A z^|L)u85-pkX=M9IrK%{E?rm9iS#|5NXR7u8dq&&WQu9b757&d|M;gV^+;h^0?|Gk9 zr0rw>bY(B9SA{`HLv58W>GttZs`H2*%7*O^_Uzmd7q$L=}rGc~cn-#2(+^Z|jD==VQw+Sq0rL0rB6Ha9|`kyRvC zu0Lz+Z;K&ht-qL8E>&$MdEdu&2tI5-OkgGA*5hW4?RV8B^|ku$U#H|XleWHZzG@_^cn7(nN`J<}S!2_#kq@=hpIQI3=ITZQD-rAM zFl+4oYbn+0w~g-B=L0JddP1BB-Z=G?6K3H)#n3ENu2(V*<&Am20lJied6of zb2KHfYMnV_8~#(zZuuKTQxelRo-?-F!w@&UcJ1a#L{k#mZ8>Lbi=RWtlm29drX*Hw zGiU5S?}V5!_QAAw+XR}DIB@Emu|02uxcT?jGz6NG_|VPz+6sj7*PpB+ftAwV|GYUh zQQmVjvWkR$D|eiVkEgBK)*}*F;d_%$LYz6ZB~&VDWEBZrk+VJs;aarUN}7@oz1!{= zrF*VD)n7gHhr3gA@`8|+WZkD-kL~k;rX=(%Og>aZd9Bctgr2v(UfJgZO-bmPUa_E$ zKvNR>-Q2zd#I!qiXljn8B=pM%pFiiiJ_1ciD3(}wRUd(-Bowb~b9oTXWbL{fN ziIz9Y(fRPR8?7RJ;`25M(QAy5(a1+6R<6I<1QBv1uyUQY3_jx3jl{l>*-FH%$89!Y zgltXBSMpltrt}FSWNS*|>KiwkFhaJbBrf>rW)nup)|A8-{<_(O5wbNUan)vv(wdUk?tslhWckOLyEMNKG$rxcqc*Q2%ktSpQxa>PviXFOr8On-%u6<} zBg?X-MpF`pUBCH+k)<^yao>u~>&UWf+tHN7alhDn!pPE^lF)PP2tXs2e}ClH&4?vF z?L6V4pRsVWdc>lb;oyT#ZSF@TuoAJ}4x3FdVu=J+BJ_LgAF)tF>Oowx-XAufFhaJb zBu@Xw<{?6kzjHJtv1*+y>InIXRPzts|B2>Wp(%;!8*dRJ}7IlPNKD%g2 zV&yhlga|qMKvNP2PTiu8koB$m8HcZTvnW}iDTx!Gx5WezGMbW5PL5vnl)P{CubQU> zO-ZP3s2`jt7PY1%)YncFi&|3>>dz;NMXf0b#S9b0qSlmz;*yDCQEN&< zJ;Ow?s5K>#dxi;O(bTgfO-ZO{m?##trX(o_zjont5cU|e}|u- zFU?)rGmeT@kzP4-%bb(i&UWRpN`fZK!JlZ)I{$A(Gf$m-K**2(@X=V+`R4RyW*ck$ zKSb14N@rd?+7A<0iMZ;u&;CD@3M-fDSq;&>R-@<49s6*758iNz-qHGgtUPsYeLvI> z{%(^En^~M_73q~Tcc|}&h*#e-()7+~RFX(6yI}6vR{5T*$NBtUf8F#^k-$py&n}%i zcGP7&B_DeE5zVYxB(M@O@};?B@4pmc&)@vCnInq?RwABu-Q2OgKPN))73o>;^wP9*Xsi-5ih=P?%3_iAm(3qOD}Db+s@xwf}d zSc%yG@wsF3J_d362X^m$60s6-)8EqXi9uQhLMw-X^~QKX5_E>=oEdF^>)yPg2C`w{J1vPfVh z;>dO9jZJ+I#A6?SUvH_f5^?8x^TyUZ8se18?{3Cb! zft84riMaf5d`whxtTJ)xP7}0=D{D>67x}?I^0x1z|M9xE9t9yQ5t}U7InTDJJWB`X zz5boO1Xh$v?>tRB@X=!$qGOe6+wn1vQpK8QB57jTB_DonDpfC`>vQBAE^Ny_+0j5I zlI&6q`KYai=m#&Dh)5brg};1n9z6g5KwO@zM8D(H&mX(I@v-Y2?F>B{d_d^VKJcc# zQlaT1CVl+VsZ@FrW6ecKGeo3*(1h;!t-pTV3q@tCTGK~7_-6SK@#Jlf>=FrSO2U0G z*J`VoyEJVHnv&3O<$d=Wn{r`=?N`%_S8Q+EY%(u7fy;fL>P#gUE6%gAV{iEJ` zU?n2A^S48sb?Lp$dWKjJtVF0U+2X$-9$32QYkf7xN`(5WYnMa(>X;LH39Lk@Pdxr+ z5qfridBs@MipEl5B|`n~JHCdGmwx0Ky*{uKp}zfN*F)U+`ty1TtVAe&xc@7ZYU-P} ze_>zEu@a#e<=AWRap%Tg>m{%fp*U#%)evVr`-0w5VI@Mb)?QzNc=*P5^%7W#P}FzI z|AV;YKcC)PDy&2(W}Ngzh}T^sfzpVC_@ ztVAfj-nk(Tf6G(Ns+ahbU?oB^{I@@k58XZeNfQaIloQ@D||7m)+j9iD*h< zlYh;a;7tRXlGt+VnG?LtKvNRi?KyLTHzsIGV&g+*)^BCXtBa;2Zdo!jy!lD1shX>c zrX-&HY$EddtNbKxykql}pec##Zkt)p(3j6Hnv%Hjw=?S*`m!EqN}^p;boUJ>4X(a> z@BE!RteBOLzm*%O&!}hUHS7H7(OWg+bAD^0v68&=mNV)ZdJ*g2H@la>O2l20X4EtE ze@n!>Zu&qovmJe4CE~m_XG}0d9|^2PT=0+SVTOL^E7oo9U?i{-vGVchVTS%Azu&64 zgOR{W#8IoJ*E96FWjO81ULRPA*!QvNX}*ND2EV)f>&-7J`oIbw?F{`R^OsEMgS93q zVY|L$^#vcAupX>6(N$LuD4`rmx}^xk@4B_j6{d4^v1;~fXx-g|Yi5}{tAe}+ER11k~gCE6MK zW9PiNw;ouDP%qKW(69TqV|xj#M5vc&XXuwLxwE$(ScyDxz)mh^t08EvN-`et;W(%TVzhbXL|HCx|Lpvff({xn-}LiLC~(3Hf=Q=c_~4>UtW zdYjQ-D!nn0rjPKzsDickM)QIR`TcfJAFi4ov_KjCg=E5gwnmryL=K$ zDw=9`b$D*poAHEY~QEN)#$bOA||lmD2B;GM8B#aFrfhOiFd7sBN{XY;`iBSF8_3gj-!${|TNE7qLpT{4%=fB@}jb1|aXvZI$ zhVe(N2i}#ht`*}CrF#}fzuJ#{u^q9XDGA-1{t-(guoA8N-;P*z`%ODyi3C<6^o;e7 zSR#Ry2tCLBBbG>DB|^WIc1_XLyW0^x zAdx;+BGj(5BbF0>-i}zJ53EF}?ed64ZTqU(?T953Scy>k*gs;41Xd!{2KSFxB7v0% zwe$TWmPlYFBKIY|BbG>DB|`mG|A-|LScy=S(LZ8|1XdyxW%Q3&B7v0%MH&4gmPlYF zLQzKlh$RwOiBOc$KVpdlRw8ng(K}*^1XdyxOZ1OeB7v2NiPscG0xJ>i+S)Qsj09F9 z#_!)^!V!x#F<;4w&YyM)Zxo+?U^`-oKFC*uO6Ue% z^NLpZ=qKXnPJ3T9q7$K!Ok4B+eAPD1$SYb!x*e;PHID>V^0D=gW=?QF@Gh$koknE+ z*D4a)e=IBN(O>hHYVEykzx;B`M!}r9w{cUC%INm9A*^vHqmIGGh2z zt*kY%>=0UaU}D;KpKIRTiC{%SEFo8+-v5^vgRQoYuo zEESrP`1f5Vg|!AJykYYu-bGUqf8JwKz1E<7+R>E6H};+s)*8f`qbZ4%FPjwB8ccuB zUCsC$O-by1z@)I&;JW3%ZwNFc@$1)53TqAi{Ik=VwjE7L-29eFVXZ-|2bz)?UowC4G$k?X#7SYTLGsbm98F0q{otet)*7HGiIu0O-^T>) zmA}>@LNSBB4kB4mM*F3ZSabD#`o4#Wb{D1kK@;V(tJ!6~S(0a+>%Eqmjqdjmts>2O zzu}c<s6$wRW{^Chlb49FtRYfz%B*|{Hy;Oa(yim&?XfkyR+1p7z(u9fq0&D&k3itYM+peYHSp5Z&F zh=pAceqPxHp}tnDShd4#=>?x`-nd7rNb6Ui_4^|ue^10!%iq^Yi}$PrGn>OR&SO-U$< zYFFJy0!>LMQfpV;M*>YrC>rcvb&sYb6mhnz?xPPhC84OcU3DJ`G$o-`K|4Z}L<-L3^d)}Stofh#OJ=D^C2hqr1q>-_XK0KcwA3PbNk-J1` z#XN)3kxeX3-%or;`i`RVVjeEj^?Ymg5$0Y;Mn0H`MTsb_B8_Yx-`Qr}!Bxi`oP995 z6CKBf$R@s96Qxz8kxd-1>pREKc-x8D2jeKwaTJE!B}%JEBbzv3>XgBgn=H&eD6i-^ zDn>T(Y<%o#$Go+ii^neowmmRq%{|2#A zsj!kvx`~(Gd(vQ+g=;UDCeAIzxh&F6yrd@lG^7^p!SnO42rK0TZQ@VoE*|{q%hPf_ z@Gd&eOp$J4RZT>zSa!+KCceA<-Q#Dz@Q8dr7}3ir&Icfy*dv{gcWOE*ue6FZvWXME zdD!5{H?GR{h%-fTo{4l5$Jd1FftCDWC7E;+#0?^tX_l2_-a#XGi9Rd6!6e;pk;QD3 zzTo;(eHS_98{eOkF9dJHQ<>Z{RFq1Zk|rmY>bvPX*jqg{FW(O|&IVl`Z3uDb29S5T@#ILVzYN$KmNL9$K-pCMpltVHnCs2 zRu`sgB`ZDE+G{5t^gc>Q?h>U{q>)X$IDHxTvg9Y{RreX9<9aXTE>T+1mt@~{PA2@X z`>5Qjr5L9vVNdJ>RrgVv`LC@ajf}PacYn?sg?!yoq^H^QT-sXh5<^xg{*3eOyqg#q zsoSdsIj;~QcjD_h-9GB}YJq%U6=}(&n^^l#%f>H$C&$>w}eilWyW8sV#YH-Iiz$QSWGF#rsqFKsK=;5mzRnw2CyciPT*%G+bS*vX7dk9@$TYrtwjiol->~CbExcRg|zLQtw<5xAU%9`SSEBCuEl@#qAYw zJDTjTj_z}*x{>~^tHzJK^053Q5=UjLm-*dIrfbE}8qthpV@@U}C*qMr zM5~yuWM~uV7ggyOC4x3XR^@wVR#}XUq+e~NUu|g>X=MATf9LtRVl*m$ikw)tM!Jc| zQ~s;c_voXQ{9z>-+5}HKni#jS%9}{7OW;FRkw)en%gBgM+IYCWR>}*4UPd_~+s9GK z`oz>`DK9jA{#qZY9{IEa5%hN=h+Z1Gp1+bG6OE>hmY|!QQu=Vs72Ro$OjeScS-e{A z5`9*YX69~WWZwtp4|e|Zj=ARX4KH&&DlO^u@#Jmu2UkqlDL;u=$sbmdNpDKky;gC( z$AezUk*`9%_Cr*0t&)}U#j250x_xxw-8!$vbUo%m^`OR?%-u5}-Ql?ZkBuS0R-IR!Z0JvH6;A?w=;A2Qyym z!XLgLXp}FtmCP>uk&%Z}&Hwq%yPKM$DG7GryB_*if3iYT670g4UH4aurX<*fKU@zq zCBZKIVIOEpf?fE-1e%gy7ydATrX-Y8vsb2b2ho&7XRm&TKvNRz!XGXbnv!4_{_xdB zQxfdLANGN!B-n*NOrR+VcHs{bXi9=z_`?L6l3*A9FoC8d*o8lQtTpw?%USYwFmn^ zQxfgo@X`mGlIZL|@AyDd5}iHn9Rf{Bup?VFSX$k9`Nx`jj;18q`I6!Is=b5py0!by zb*;MbRZCzcf9x`Msk-r1OJF5J_rE{BD(j&+AQ9{=w-5cRzo?N+Z6&j_Tz1{q2Te(^ zvwWC9QxfbfA12V01Ut)z2{a|a&T@0VCwf_%xYQ{KdN`jr`!=*w~ z66`GRX%p+6=_SF=@?jrnN`jr`CjR??}9I`D(I4QxfbfH}TGk*KB@K zXi9>e@Zu>^Y|%ysu|xxl8rI-G9;$Xi7rnv!5=`7nW|B-mL#{5wZe66`Fu zj~IocDG7F#50?r}NwBkgm_Sn!>?|K9(3Au_%T08n@boQ|v@^XV*jYa815HV=vwWC9 zQxfbfA12V01Ut)z2{a|a&hlXbO-Zn`e3(E}66`D=CeV}wJIjZkL^LI#C}V;sJiX`C zZVnNCb9`x*y`H81CV3|!i&lCk46V1wl85VoMm{=3q8;g%Epdi3CfkT+)*LGlT2s`VX;E#k?6h7V zSczZ{jqk^gPr9I&z)A#rX#A8c9-Yx!Dy&54t)+L@=$?Q4xLtdFU?oCpW|}iCsw-C> z(|bR#5}}nf&6yU}&ad;=jirfq5G$qUbxZ87sV>-Qqh23aiO@=gW_L~XmlyjhH>D4( zl+GR+U)`7f^UB_9g_Vf-wr^=Q>ETzmQD1srN6U$o2;MZ>$6DY1WAD|)N(ApeO&omQ zxxJ;rN<@77y0kjw@`Ju6R+@Nqu~Is#xBQe$`OMzEKCsF;g*Wa?tB1ezrd}Vsqt8UW zr^WTqzxs=sm@hK#=)0{b`(vV&WL6O<=ZOidG9CBIRGeuM^Xm0cuTJRt$obaq%z4W$ zI=(;e60&05YkaF8*S#)HrFyiTBhzl6v_gPVb?AB>K-WjkH)%>D-Q=;qzFejm*n_fV?1n`3G9miIo;_&`(o&~K$V)1o@$x(8pV^2sU^SSek<$L2c| z)l(ney=fUDft3jT=9@Dus(I`Dq1OjiBGj%lXIfN;Jakqsft3igUCo&m)s;6c>m{%f z!P+n1kI#Jj(_ibWIaVTAQ)VKaY0*6GvF2Ebh^ttaR?E)1x3^SSiHK`CmsVSz{PNzb zi_!4B5v&$c&P%Hc-mzoT?nVMD5v)%(p?~#PmI^DS zw=0)bs&uAB@BP3^MBFR0w7PTS7xofZiC`6?%F=CpVm+`D5!WZC{^Q2qH^0G1U?qZG z1@^(27ScolE2YPkTpwp4MFYKvNQ&`)nVaX(1~#CBfO!Ceq59=31dCiO$K^ozXU$lIWbC-67DF zMCXL=4uPg5I;Vhl2s9(_0fZF z?(>0_2+o#vJ&wES1I?%?`oKyAXG<&RrPYU?d{fioL;@=joGoo1S8n#!ULRPA;B0C8 zcU4GGO&9jo11k}oQ>UwA=iJxCC9&pMiRhd< zJz>qU645zzy88ZTT%YLpBU(xBoH||Y{GM0#)*LGlol~c)XCJslFM*Ya&Z*PY_4mJU zx4vf=D-rFf)B4qZ_1=ejpIxj(Oguv$uP#<1CVoE{39LlKeJtIm4^7NhGUIl)qHllq zir#ueS|x1GwCJoPk5=R>AKf_sdD36jr1t~OXgkf&H)Hjb&K|68JvzI=0{3HBwc2F0~XKDfGAiH`dR zmsZL!c>%TaQZw=c{!HG$rwjg|pf-Ejk36l2~ttS?&31 z9Rf{Bv}?9kr{3V9hqexprSFu8cyCUhH@iL4qB`^^GeeZo5?G1e?tt0txqa1T)BKGs zO2S$ttd#!Rqh_~fT2wE->2skKZGB)RVy#nV*JoOk&n{0~w358hC9~TzEvoU;riB=; z^?{X$!>*s*o@r4nUFB0Sq=`PTQu=)>X18ZrROw8M(0{Z(uo7|HFJ`xAT2$YE;B%p` zZ3(PItoMi6?U@$UlIiF55?F~i{U5X2Gc7t#NvsD}B37+4r#;i6nla~MdquPp6wX-bR z2(>HCnHJU4J{3nSErFE?wO!3AeAOG?9Y-uJft3igqRW0;pMPGASXu%r5o&{*Gc6{( zx>$)&JKvmXQH)qxA6SXVeF@yY6eE_F zz)FN-iRMg;V#LxCSc#Z;WqCSA@oGyzON~ zHhgu_lmw%`VS+O_GEv`W$=umK!ly)-@L1M_&!I5EnHJK-XIJ~3b*6>V^Zx4QjeGZg zv{sSsK8f#2vVQb|OwTz_7BrbVZvMia{pp;ZK`LH9`% z!TN$&Lau^|v^t?_86tsI_EBF26X{HgW{#{R;&twAKv zl*Ht<=Cx;9bZU;KB(@!y*Pdz7A<&e>RjcQ=XIgX!G$nD<-{!VwT2$BGc}O!JL{k#` zKR&lT)1tcS?Tea`7n+hd>e0FFnHHT=p(%-HJv_HP)1pJ5DT%i}IJZ61qMCQ?Gn#s! zDTx=~H@7|0qT>TiNqpz0bK5g5Is}@MSpEIE?U@!G0!>M*{MOv|Op6YIrX&`BV{Ut< zMTbCB62G{4ZhNLhhd@&jPrGhzd!|K)KvNPUUz*#VY0)9jl*G?2o!g#i(IL>3#Ig(K zhP4LiH`ugrXi8%AoVo3p79AgGN@C@y>G$#Z{&v?VRESW_pc4utE6Qk2E9m%8-=`BC zO!!m^6PyL1dC~a&63s5N>odLBJB`@V0Y0bTB{!(pQ zx5tSDR-*Mqu>Mk^kyRuVoi%4#bgq>mR(7%~%49{n(%ZG?=}e2Zk1DJpt!wCdr2Vzc zQ=)viy3wEFtF|6x+%Apk5eY^86J0CkB?2p7t8ns3r{7Nu3B^($!3w5T}KLIj#j2Y>pdHD_8>oM|B|G$o;5b91Ier{-u%LM=vf zrbUN9Qxa;G+Ew?u^ZJt&nvzh<*RHy^y$LiWq1Lrsbsq^dC7~9)U3DJ`G$o;4qFr?# z2{a|4o~Sv~qI0d#l!SV_=1hwYfuEo6nJByxn)th$e-LQ@ioqS{sWkw8-tiqx7jEjrf7QMl5Y_@U}H>>W)8BUYV$^vYbja(W-mrHRL0; zcCC+i&sD1Ci+jOG9);E41nl;lXogCa=(dlFK1zcAitnHKTBSAgoohv@BAw;lmHn|E zSgC}0^x99PmE`ouao2?+4z86;rhoOVIo^}I=HXPtW<|U#i8T7Gm|-C&+jqYy+pceC z)vSCYcZpoX`h>+?!niuVmQ8%{t~-{0@Y_rB*AU}6R93NyMmBNkg?B99`a4VV7Z=gU zD$>X%ezf6?@k2klIQxK530Ye!8o5i9R*^$9xNGreZjZ$xd5!@7r|Zt$)uZD*}HGzhGCD7!gbXoJ~?>fgBLFN#Z6EfEN-`_n)BdbUwo8TMq^3IOcT*9>WgWXl^ zIPDUpRiu$kbbnEfqcdH{zQ_~(YTF1oM&U%x_|X6UemmbxRKA>Kr}`mxiP9?4$R>XL zwr?+(J6MvxTT5gqI>x2QCT{uEw-=l}zN9LxB8_ZfY@H*<&wS~L*@u2>ic&?#{hY`q z_O6N2D$>X%(rE=%I;|l4VDuw8j*yT|>{%0~Riu$k)ZbRmKG-uTnjMFdNv})gZ>#5P zg_Z6aR+33KQJo2b8a zpM9W_Riu$kbXtZqk5B)~cbw!8xl1TtG+0HN{#=x!fNYg|mgcuz_oAc^{|2**JmF*aq_|bTFIo_#}n!6_!m7jIp1@v?cFY+|dLD6JxmY@+^Nc>ew_J7h((zg9BoChG5n=kM=grIKJJnRFAWg=_#r7l&HMq zB|6SuA)81~VwJxBo$G<7q{)d=g_t4rullWJA9Y`g-1!aWC<9INyQ^vW8|s}ao%xbA zX?>yy(eaxT$Szfi05VZp@db(OyUvMv=zrf2@{$$3zI-EhiP9?4$PjL?ay{yZK9{7P zjYRHTt31L()3$>i50F#)JCAJ%v!|xpb7o0*sbX8Ab{8L5*@x4+^~m|wS20^9xw-$f z+$H*~n)_eej}TebEtyN=(WL9tj#A|(Jc)^DN>b46wQ|`Ui>kF0k$u!7)9fRRQk%LA zhO8o8%dNGfA)=n^>+=z6URy;Px$UD;1TdOTQOds$X4RB$oRdR#sZx|NnoerUzjHLo zH`2%^&VBB_gKM8XHT$5|mk++^AenR%3x2iF;GaiM%|5V_53D4UZsPvI-J_RGJ|g>I zu21<=l2}3$XFPWI=qJ`cBKwF|kw!L=qCTB!m3=VtD<8zsl1VpFpM#ZsV5O2^C7E;+ z-SLO#igUij-E8k5L}^9*pmb#W@W1u5TSqdvR7JZI+Y&JzN2zUZejkypW#|6x?>;tq z$?p&IwW{Y>RT8eK{2`l|wdShPm)(0X%>T}|9%)pmBL=%NeCf!7RPF#)|uu@5|l1#dZ(_THL+W65|<$5q9tb8en z2xJp8-#ew+@aM0}*9wiSB8_Zf_L{54b#-OMS7-87cv<^B8NMxJ;^^-_Hm*BZT16V! z#H{yD8K_k9!B=NQ6WuEv*~F=@o-$C)ORGpDn@FRHDxI8_eJ~d;n%c&zU?PoJs&qP6 z_7SZjjcnq9ou`d%c;VvggZCfu!N^oTkWHMl{{>qcG z55B}CA4Gbhk-J1`6=`G>pR0}--DMw-op~!Gnv%p4nn+{kQH{1st4Jf8IO69!R_|Cn zKi7jd4WhZC@_}q(QB9Oqkw!M*e~EYfj!rc11my#{OO#f;$5T48iF6)ImCj=sst4~v zM087)&SR<4c`W%_VWpB_C7E>ls82ujJ+FUv%9kfx1hR?xgw^Z=jjZ^kibgikjl$cR zBCd}JWE0&;-)}~9zTr)5cWx;?y9;=Bncp$tk!ddBsd1DFQCdYB*`=z_kIL;XBP`Lh zqLN8BQJ)``+g+?w609VXZi3!f8deD864r0Pb3K~3;bMpYN~=gC+lT+9uXT)@^R3^E z=bUP}OAJ}nQE^W1M969EJj&Rah)ntNOBI1^A8G8IiP9?4$emK7BOgv{IMV8}=ETv&qO*Flw(veN1=yhDtYiSi}WD}{~9nkJFt0r1+1oR$Q zK9EhMb~h8HRiu$kFcQu+OwnCCcGj8I_R+nA5b}YhqKHE9L$SffuJ@_aiq7u;iqBX_Hc`iL1LcKA{vwTRV*X!#II0t&Wu?)?USF~gjr30W zfA)cF;;!xQ9@VMS@`0wL$;m`HYoHalB3QqR%*tg^VSJv(`tAGEu-3Uww~zXMQMDtdXx*La(TFD<)lA%qU@aR6(Wd~2qcTlbVwae{8ea7)OTPEGa zQ`hWM{r2*y`6H=w5F*G5gS1 z=0}(NT2Wik$R-Zh^_`<Z%^JI7&x0vGlGx7HAbx zX%%T?6P@!?FY&$`(Q1jbA4firyF_W_IbB}`WD}hzqs|w)Y#+NspB1}=x}}Of;`+2K zr*(F!2lB8FG>ujL4O?=8(Eo0)vL@}+5|N*bde;_mmnf|wjclTO#(Eo(>CL$I-6+{Zq?xccOk)5oQu)mOem$dXC7kNrQpxO(Pw+vk`8t4K>Gy;Jl2 z>{4D?>FombK<*NyRiu$kq_fEfoJ~$%qBZ)}epl54*+gm+2b@igMpltVHnI7|i>v+C z@L9h^sazkeb(KuIiM>9yxVq-=({p>Jt0*h3kJi&lCf$Vp^_&drDP_geCm+aNqO^)M zvWd0-v~2X^M~=_;gJ?-KEslI3cZt#}(#UlUI%mcE9*EZb1@|1;ME9)t){1*08rg(? zf09&QMc(ZyJ@0TNy|b<_6V9t^73uzUeUvv}g|z2`dT7p4GNsc0ejkNKC5be0mylJy zxAm?adKsl7cL|jQO-YjzL_506n!1h3a*D4Sy55&6s(tS~WEJTo+sDJHcfR9>yK`H@ zs6qLvcYgf}#|)&KNb{oAzwLK-ZcDIIov@Njx`{i}dWmi7-dXotE0^ViCtNb=CT>k@ zCZ?rx+@qE9#Y!@?iCsNn$vtNtncVKOYs9j}e_1Bo#2y|MWgl26U#ujPZsMx7cB$sC z(?%Kka*Ikx6ed~G2Va^R8L8*`vJb43FIJLCw~zXbVkU@dWyQ|Ge67;^$oW@$zuL%1 z{nj$qJX%E>**-eI!8BLg&Khjjj(1Xe9OJYRvgYoaUcaE(w=F+`NVCfgk>n;WsndH( zRa@nn*H*})O{90J)sb&pm7iUnI9(s^pk&fbq<5*Ah*ruME6LC%(i!X3pHEqq<6ZV< zh-QvNGU+DL8SB;KiHKIp7c0roCgQb<(JN1haw5G;py3-rSjh*pi52PDea<>wYmk3A zb^AdZtei+U@!#n;xOu&<4=d%1m1NQ>mHuZ9i{96Cqe=NFBTEy?3yrK8#b+P+%@0p| zim$4-)@?~_sr6Lq=@U)5OO@iQ>dHho-}Y(8%08TK!vEHD0QJ)ct>+jb{yuU&sv)aL z*Rpf3>rp8$VouSzYkVCDxl5E*kw!LA|331wo1f|rJKoXLt{qOwiF6b7?;}6ESgC|q zNhaOIS58|s`h%|@=Brz`OR{2SQ$CPQEWLHr=#f_*mfI^dvZC!0jcnpCvlmtuJ~cTL zw8$cuRg+A*iL_p{O6x^)sjyPMSV<<`MEyI@ZHa!JI%7cjGOH$;bQAUOJokfGDPOE4 zlWyXTp1I5SgAp%2v>Qw^=_b;8(dv;GU7znqY(KEV2YbmzM&{hPq`Lp!I~Pbpl&X9+ zpQN2yl1aCZ*@;-0h-ejQ$g&fpdA`@f z@f}&wd`DIUa+fHrB8_Zf{R2)MJa+t|{Os}-YteiITQcb;E`7y`gF~-bl%HL!R1&Nt zlWyXOW2O!+xOboYi;7>B=X>$l#{ru+UtAm+dE$L(9{i{K&HiZrr)yz85X4L{Umzkq_EBv_ zR$B30Byy@tHFd>;*QS|gYOb$uDc^YNAF_!JH(Rk_aUx19PW@9lvWXA9ZPECo1HGn* zZy?Jme%%<^#B<-XXngMjyru|^N*HNm6KlVD>R{#Xy~aydS6_~kkNACRWD}o!`_#dg zf8#Y?Xt+1f^=~ly&@V^l zK8ohaP^pkj)W5;(1C6XAjclS`d!E~?_)P|`sQe+D*d>iOQ$6zU9F43Zjcnq$!w(+( z;`x5B##i1&(E3Ow-NbuqB3h{)SV@L9apgtF48A{leQp!^zP)I^jxU*X6X&0I%;3(0 z9W!91e6f;Dx{2~hWUQvEpq4>CBzM}9&eKl&ft7qf5BtznRE(>9xuVGJ8xu-}Mzj6O z7aF;J3-IE<9zR&}RgcxEp=iz?kW9Ku_3?imKY014JXXUhULVP%n>aP~1b@7Fog9~N z(t`5koCe9Hn|S)YCk=jl``S4!!AkjJC7E;+_ual^@Tc=vWFMT(5c8Exx`{(?TQc~c zO}>?V#C)-e{!Dym|5fA1eamrsJdcHwR^$WO#0}M|@n3$|aXT7WMH<<}lm9w?@Z3|D z<+y}sLWJ(YhX3^33F#(o`up*NgDzc`;}Wd62fID&Z_1Kx;<~8|2d7P%l7F@O6|LU= zlKfn$Rom~SmPt2peNCt&Sjh)gl1VqQ!DcI#t5=hTZ|IATU&lu_vEI}b%hhw1R*^)SbLK}0-50l6h!nTXOV(#R&B z{rwE9Hw-u2W5$7=38k_$NQ)V*d)~-bthdNt{8mnCQUCMK zi|f(d=BeGia^|;|D=##%iZrrI#h1B6#9yssMSY@4AFc;hkwzA6BHh7J-9c%H&y{aH z-y7LPdP+w1l$2JHMmF*Da~2Q2`**)r<4%dD$B|6Bi387FJow4-Y5AUGr4nK#nRFAI zq@MHA8`jQOmmX62az!PRZsP3JJAdv=>nx8}$`>oi&?f4!TE15NQbiNpi$LxYrB$Sn zP5j^`caQ%py){u@YRUA)XVHw}m5yxUhc!`JMH<<}$?ngy5880iSVi9^ZghX1?|HO} zG_r{;Kec%9yf015{ds)abqBZjx%+d{O?>u~iwB$jZd&fou~JE}l1#dZe}3|q!QYO$ zKKr1jS3PLqB$IC9nV&vp@YDgU?NFcHy8`C=s*+C)9KG!Q|bDl1O1 zQ#x{&D6JxmY~u4bFB@O)iQ{uUn5R;{jIfmxvWY2QT{iyezaF3Kfd+s24mqXbo8%)S z2YqDO_;a50yKTx#zWaUA_d_{JwvRg(FB?DdspAKwRiu$kq;c(laV;YVm4s1>azZwd z#> z{(aQ4iL2N9*7Bu^D6JxmY$C4lioF_rxO^j~JE$)uZ@ljag1UcF=X zfp_JrUgqm>bv;NovE=UggKgH{Df_@GmR&OGCT`wo%HRX*r?)0a!;F`F5Zx;s*~EKh zOc~s;;lir4iZrqb|68xWs^=3#>#k{TK|YYXL}{hpW1OXEXC_YCddlF%n|r;eygziJ ze?__MANI9EwvTyJrVJKu?e(H)qa=$STsvCVrpBAFE#OwVdk7boz)0 z^_DujB-3@eiRaEdVzA`xUdxGAwRGC3S|8<=BgoW7$x87jZ6dOXhu$}B zR4rU-6=`G>>3&q)k4^qHxjFS~=arN5nNjkM+!EXmG_r~`vWXPQRElI&stf+HX&di6 zzG*WyAl*cYmMTR{%6DaL6=}(&oA};$=2r_h*eTcimNRBFzwIxdFr#U&NH>vMhDt4i zd|;(~v64)>iIsDYs5VF=NNH}IKDilZ?!4vXX8cLIi77iCQE8N#uVQT#Y01zg4%>Cz zYR$v^``F}PGs69t5$=a&6S{-#{b;Qsjcg+QYAgL}bE)e4tdd;tjmh~puXJP+sb#3t zGL%-_|6GqcCll$tLB)Fm<)!mul<%S|Cg*nuB9Oa8X%%T?6Dfup<^ABshfK*QwTRws z&naU%=S4n{yF_UfX=D?rH>lJbD6d=2nA|*9*PJjpJXcOP5uYopA}yKpPO0+!*!Yl{ z`CL1feP%Q7v)!JSyF_UfX=D?rudUL2d#=a*`^{+P`u5*#MiaM_ZX)%ynb5VuO8&5t zOuC6Q{-_v#?7ZcS<~MQIq#4beCFv$s*MxjvrF^lHOuC8mF16xaD$l5_^em0P+ig2? zmnf|wjclTRuIl?SCESlG;eJ@|67r!Zj@ddrOV7W|tv0fW6kk=mk2>Vg$@!cpT?IWE zIsr;D=_XQqm5FF2e^^O|Hj$!?N>PS1`InkbWD?D$PX=D>=E_{@^aN0f*TW&owpDikX z$R^TUcqU4#NF$p_vpA!AD--i_sod`>z1wr9nW9m>`6;a^N%UCKOPE4K zD{AYUd<{*cw@dPoe}mB~(#R&#Te9j$=`ES^+UK!N)7n8lOGmBRG@mA@dXR1+y@{(H zO>g3)!79>{NjFjVAGsd;@0Nap+t|nb`%TWL;wdN6P1OBIt_N1i7c0r6o9I5fDaNfw z@wA-sfo!7t?7FR$)h$a}8rejev#eNOvgnE#xzA8Zi25>J$B$j2w2Cyci8M1Ys+kGp zMSPy=x>T`*CerN3sAfM(t4Jf8=>9(3MCFTf*G+Qn>e}Cmb6yfHAX%(mVP}@90I)$|zs@KBXg@Nbl$?y`wL!B8_Y!%^_FJA=Anz zU!o<+q?<@{$Q5(QSjit&l1Vqw9Y=ZOC94a*F(ZtlEO&|0YUhuP9BSxNNXl4)=ZqY zrmdW>t?bX~CeoUTiZv5NcgmMhkz~?Mq%{+nh*ruME6LC%(hAe+khH=ydKZ1cKc+Wx zCzRGiTE$xZDXn6SR*{wrZK69T)8@PK@#)Po)+M@gGPa8ON`|(NtJeG00?llzR9bna z`EOY<1Eq9i6PK@Eu|TuurB$SnO{Dix74M@IS?~^uc^LU1-9&mHm5E%cdKO3iu#yaI z;ak8R4S30tZv}U5x znu*dX(#R&#+oe&xUCKn=hAUsiRC=SNbYv6h4c4gMV3k&isni?fQgwQRZhO@}OGmAm z-t_I=r=;6n*-9nBN;0%dmDV~}taWCjsFDy_N+#VzTI*b~))_11iArX@q$M|aM$&6gP# zUn{4ZNb6)O*2!QM^Oa1x2}NYAHQ-Ju-+dpO9>yZRvn@dkhn4b$mQ1>dZoAvw1NF|V zTkBrkZo6wM<%^YMX#42Sk+u2KGN?{nqB}?C)+gpG8QMO&;}6eS$x6R%-bW#uxY03O zeiG5BB+PP&MmF*F)Txv@Jp{j#dInCf$U3&TZ3b!)O(0$yT+CkPc zbct>sWviI4WN7<1ZR3T5#oMtCz-Otegq*Q1nbXrvZ1dcOgY7nA9e~ekSH4(DhBmS0 zjw=>Czgee0GoO;Je6PE0=Ge4!#(Z9NoS*m=WF^ST@0%23}D>UUy%r86Wz6g{@uyys?Ay&*#xUB^dxR~!0fOtV|MdS`1E;}O|X(f`JyRlax&3f zm*Ko974ugrmE@M-y)zp5z+d!jBFS)q<%^YM(oJ;71~Zy>P>Q3O zvsQ$xcT*<1V*^_$U#uiUo9NCh&1mMoHKKpo8g3IcqF?w-e01lQY^8j$k_>Gh-FIGX zTdT;McWgx~TE8XJRm4j9VkMb$`{>T~xg8X(w>|A#pJfv#cjo$9D_Ty`$R@h`4cv3e zN?*3o-Zhm9*+h50L2E^iEE?HFcb&dl23gS~%LlTF?mB%(0J5UR5shr(tzMUr;}X3S zYTtRKnY;8}HD6uL;w9Ncy|N~co%5VtZ53%`6G#4h{@^=LvTtH`p3_xHHo9bX^GGkD<^p;@EiIwuj3LlzPHPKz4IJ=o! zqBoEaMdX@uGSOY1=$=LSVkH^cM0ZZ#(W~;+`>1wK-*T5It%!Y?GBOG_pz zS|7=zH}%Lwv{Kozk_>I4yD!zhTG5PzL?D~!?o0L9NmjH5qLEE>_tDR8-rdoYi9qfW z$`_5SUVBtaBb(^HubtV%)cjJF6S9f!`&zdQveG+Yb}Jy8V3oJ57z3zOL@!E5Ho;2r z(kjx(CN}HrkDA@A#nG>}-5=$26W#q$wo*y-+t%(X$GvU#wN`;kVX#42CADo%jjwxU6nh0bQ-S>mO z&$80`0F-H+oD7G;-}WN7>7?#F4zPW+ zw0)%hykZ?P(Vg-odX-GNiSGI_< zqm-H^ClhJ?)gZ0E%07r#RCZ?WB$IBU-fxgwAFSj9E6Jpr=zb5Njd%D($wxPm>3$Eu zzs_8b|IgT&$9*=||NkaSG`86=Nt&2_=sSyLnENnyN>UBcE|i!N*+os`7KsUEOV+aH zYl-aC+#mUh5weU5VUXlYrLoKQyI$A(Jg@V|6=Mi_3v$O$@{7XEGfF5Gc~>h{HnhbEJ;I$Zsvil}^we)G6>l=7 zgl$BqWyG(llqyeS8 zv^hC$L|spe_bw{MKqZ^wM&xrjt(~D5^lXa2&WTb*TSUjPjmXCbt#v0AZve%>HX-)e8&Ti8@m%Rjsg5fZXIC_~5%s+r&lMi2JdJHcKDV}MlT))$yu7s?euGu` z4aOL#6a$rPj#~^?@W{hmqI7wx={U9#tP(0!p2jvJ|IUQkXM839fLR=rC9L9EkTH6;|`YA@fw$D5&t=j!sT_YOXV&wDs!raTdkwC@JQupY>Sbv!LnS5M&;?0D}84o#_%di?$3e|;hM+QPD+dWM=H*! zj$<29yod|-{i1glwxp)i^ewM>LV8qd~~$!U4us|eyO6djbKHt zRQ%SYQX8;Y!)vw?tokigp2jvJUteo!iRKPhY-}U)^|kh!kcwRS*dpwUT(YFHUFwdD z&kwCQ+;ZUfXzRFaBc=^Mabt*5wb$PpdfWdwt|p|`pJIrRr;MkslRkXf4{BnS*H_u3 zjX)(@YmrB;4srQ*>s|+eM=DR~4t;GNgw*=;X~kUCD%tjZ+5beK5@FY4L0yiAo)~c> zG4S|wW!trZh*_$0g{LI!E@>n1l!V>WZ3Lc@u)DpDz*7?Tj%p+Dl!VUPF`Z+>x%yl9 zn%v>*JT`-K<*%SWZ}xmt41Is@rz}c49^_aM&Kz4)uINz(MI4Y39D1L5qL_%YUFJMo|3RuQ5%7$B&;V@ z1YZ#3df+JuYk#!Gz*7>|dTEP+rzEU>PK+a~AKpN&@RWqL?se~$Pfgdz&-^`!gA01)oq7tp^wDEpzG4K#W>B_d=K}zm(g{LH}FQY96o|3Tsk~RWQN$7WT z>tu*Aw@*$b$5Rs45{B^Qz*7>|j)pk*FB8(U9ZyMEPmu`SC08CWG35$RN$5GY_lvrM z<*yb`Nmwhjjlfe9*4}L+@RWqLAlnE$C1I`9HUdvc=-u_mui6MaC878HNmsWKcuGQb ziP@L65qL^M^_6umY9sKJgz7}go(pmN2S=v61W!q*{;=HH5dKcYQxdWMa7G(}rzBK= z_{L8}ly5aWC81iz!>6^y=$Se!)`UfT?pv#cuYXfpUcFEC>+XBkt2}+!2Zs()L&l>R zp3rwR+H1(3KxJjpx9Qqy$eyt8*Zd$p;p{6uyle9svc4O%AgVlJ-xh-KR}hcSiER58 zQX7G%BGy%BB=og6 zt67%!E}oLGFX<2?yB0DP!0dh}vS{DGB?AP#b}#B@%C}fNfl7pZ{RYBc zkFp%pGVD8UBFbxyhmu3s7v5Hl!l%xLU+j_Z$6Rk z5!if+XBSUN=*n*S$+nW?DGB?kQX7G%B<$Nu z5P4lx-*loDZogE~`W0-sE`%=!o-&4>7_(P{$m^o!DG5E5mRm+d`Gmt$5_)_Q@zaL%YOWAB7mJKO!>4Wg~zQr?H`Ri0ile(ji2H-SgF z%7_rV>2>zM+LB29)FB20dV5lfNUA#B7%%JDhKU|e)G8gP$2*oI?$ao%Bv9$NzVP>- zbA>9VbnJT*k)K`do_kb%4Q&4~yB@ZG*a`L1=Wjz-P5mWaOp?!Eqh1f<6{QRl(jv_4)sAOx`;Jwcmp}XYBkIzlLYMwwPLOXgMdLG0UfBjSH zBl83*5!%sn*144Yx>ugvq^%sNL}-uoML#9RJ^!^%YspcG(5_uW&VjgepJ!Ujfl7q- z^BR5@#J(F|-%6kop&bh!I~`)jCFiu39F+*|>Am-95I29|yw(_~M11(MseQMeB0|6O zNuz$%N}v*<{m-8{kr>M^_g3rKMI}PJr$2lG#AjanUhCOKCBpW^f_P)+D_e7gN`&p4 z1u^W|&06n7R3dCYH;Ai7EZdqZR3dEGH;8{cw5T;#s6^NvWe}TP`om4z?nG1~Y=<)u zUC-V6*XdQVZ68HqOrO<^lKI~UDiOBVFT}(59MYOAR3dD*G>9=%7N=*4kAX^r?Mp^E z*1u|%))=Tn*e+wl(0S5d^th6vipRr_&^$%+XQK9vPS5tZTUz~0j61K=GqKLR&o<>K zh^PK(JrlMYEj=u!eQwWI0u{Mx`ebf7X5U0)syZhk;_+$Z%F1me#}m_agzfvpPrs2cuGRQl|vqfc_IaSS9H>OZ z=lrb@KRWNxG@rqj1CIlccaQ6dvCa41(;5Sn2))~nxd!68&z;svpc0|_!{fgsSEIkY!6t1b zMHbJPa%HvzB5{Lg-V3&qYAOcbzg5KP>E1|?&$x9_|>mhZp{@c z5w=%6#AnYR+ZqFv2-}Yy;+|U`ZoRKiiBR45$qOO&S$RZju26|k{d!6wcHi}#H0#CR zC8$KG4*$Cgh%wl&7L^EVO+fU2WO6FGpJkzSMMEZ9U$2f^zi8PWEL9pSPzWq18_N9S`AS;3)~Mm1!T%z*7?TUCy=`cuGR^kUw;O z8-b@JY-T1z7%NI=7f(sp+(8j~if*;thUqTBQxZ0JkQn}4;VB85O-T$-;3wi2jBXqEA* zZ>Z1mwGiX$H-0Im0t+gJ4*y!pN(-rgtDiK=q_3PUq ze!pZ?x`LiSB|@vox42G(uKAS!H^(@i*rlIcPbUIbti^D968gPHoKyp=#D!q%t~(!#R$Y- ze|KDKIZ%nP6(bP$?r>}C*+nJ7R?9*RRt{7mY^^24ev`i3S`JhqY^^24im&b0N}v*9 z>sTO8nSXn0IZ%nvTcYWq-}0G@TdyE05qe8BJ@m_6*VlS>QHh9eiPS^?<s`{5~C5_o*NvT3&) zvHj=PYrP(xRt|T(ix{K#nVzn>SCOt_(9-YDmBtEEYdiGNr`CNqZY_Gf4aDis(#loP z>aB1308C%^$<&@myLh&1Pg_3&o|0G+`t;jl;OQd52*e;n?P(*dXQI4<8vmfQ{=C^Z z4mEvWa!;UAJR9F>BmC?H`)aba4RqXQd6&5=RkRK4YszgkGCazOk7wV&ZX@uNgng5| zjlfe9_DymTy07kf)z?M!IqaL?5m!{c>kwowU!)}2>b3NG1i-YQfmxUBJ5j}#CYhzE7CL3 z=L(ew`_?4Hy-$9iH3ljX_N7~h`D52?B~Xd5Z@EK!ZLO;}<(cSng-V2dYm)kve=>Li zl?eNCB*YV6Z0d=gKqbPy97&CAuo$RB*jKZOF&KeLgnc#pKgB>LV)M@r4P)DFG4S|w zW!snQ{}X{qgw9Aazy0->da~=m40TV~m(q#x=MOB?N}y5)q>py%K%CYHRn-+^FP>Ikz*32pLEf!Cp5~2He(M)3a z7Kf7!HHJb_Ate)G+oqA@E!mt8^5E-Ddvt~7Is z4t}UWroZagJb_AteVH4=w^%%Z zN`!r-8^X6(Jb_At?b86^TP&VHB_h@(T3alhKqW$TiS`zYCs2uK<`k8+K2M+$!5k(% zsqz+!Cs2tPczmrvTP)`B>B?5^e7U0;QS>bqAA@v7D2Gjp#Xm*8igY6pYWh!pi5Q+x zO{=y3^WMwdh2sjnkAotd>nJFR$`+-d6MF@B}KwSm%N9gIo`y zOO?@~-PV4tJfZc+oVWkawwfbEx1X!?D(x+5=ZEX89CBq<=KM}PuhPnU2y4q4;oHu> zUF+{Ft+arSYc|q|dwx9{m8Z#JcdmT8sO)--802~o-L6LyZ^^N%4{|*`flBmce_W;S zqErrlmn`|;p-r1Jq?_*DaJ>C`ke1T@!u*hKJ)a>S4|aFSyHshW!jL#KqMKN?&~xPpf39RVCI7=UkEF4?lJMthkQRNN-X5#X544p7Pf1*| z`jEci_lhW6sd!4_>|sOPTmzpgJS8!7%^_~C!IXV>yg`&ycuHdV_lEl_%{A~b@RY>< z?;ldnH7Lu0rzCb*e~6oF;A7w^iSx$~splH#33u~xP1_kyNqlLeA@y8?GFNy?;#<>) zxVZ)ge__p3-^EiBFK#}ho@-D(ckz_OEwhI7?RQ1nU4o}1mV9hT-;B#4#_oT2YMD%&Bh^rSqmk2y1@t4mHadQn`d~iW}*WxLOn|2-2H{@bs_$!E~BnIXT>3iU! zHUdvcJiXtLdai-4;7TtHPr1TV5)%#^;^rEJT&0rZDT)3gh72;-08dFQIX3)026p7*P}Dy{q13zF87`o$Ixh>WyxX;Z>fF zGwTA~{q!L%<;v6Qdv9Mk=?PS#Rr_eq6&|TPq1svddQR0?oA0pLd~?w{-psRH^~lSc zcT}j0GS9N4n>mo#^#}xK*AuE=wU+}AIU$Ft^$&KgEG;X!sbs5e*B%2;NpSb51bMAb zH5pbx*!{{X2)%1Hi&ZP!`p-ByjktT2r}Zn){Cyj7-}$e5r4e^L%9SVdOS4(`Z-f~8 zy}fmcfu|(&Yi?%U`|E+HB=p3vS@-4d15ZilsnpE6_c8F4gr0oOtb0%3DG5DYn_2gs zz*7=>f;Y47J%Ohr^pOXxb?;-~DG9x` zZPvZ6;AZ!ooBG@Fl!R&qXZ?UV+dc-Kl2Gkq+A$*3r+@pLpQPS%JS7opI7f*nOOB@` zREv74zm33C5~``K|D84hPf4gYxanbS1fG&mjdSCJ+Xy@*p<30J305%tOiyAsDAz0$%Ve?Hv433#m4qx6M0U)RFUiBd%^OvkZ} zc;||(J5OI^d#wAmfp1xG+=zpp-@0@D=k43LsFW@$*&H|Gv9}KDycl*elgGE!d`pkx zMl1=$OZDDos5~v3<3`xO{qY;7@fy^93-lm}z|M(ur2-+9r?GQFD&JocRiS4h(RF_b zRDb-2saJU#8@2xLkJp@W`Iz^(I@4BK_%V8@{`ieXJSvl?u~GXN)}Npl+!>;=bD~ty zYoO!UM)dbg@9eSC^jHr1;UZo4x5gN*@3p7rh(OE#f#O%JqI?wGgH~t3s<%sb8GaNVKyzLL`oWGat zUyDk)LM5ByMr;$l5kGzQ@^N2e-?!v@zc_BhM{C0FhVX<7J#CsoUn;~Uz8TTRK7m|+lb9yzJK7@S@wNVJc{RO zY$Fc-?QWgDzPL1&!}k>VekP6^aZpVtT~x{yD%l)2f?AmfdYYw@&G;~OPPC~sg2{14 zk$ZYpUv7HmPs>k_&s{%$PPz~_8m=hylc6G4@<`=rY|GVMD^Kr?dS_bvec&NozPPA( z%tGqv*?h(6olBOrX9*s~^E9@_=$v}Zz$cE|H^!h(MlrZ*qOpw_`SoiCK6}c(@i&M^ zDobtR52&DN;b!hSpJ1m2G0J+LGgO^C!WSO!v3{uPTg5C z;#I4A)v$A-RCyZPh#6n~eCPL5R*bpwec?ReltYdiv3X6%gG%vG$>z8blWw2idHm7a z<2C0>iT159jvMjF&GS1~KYB;J=BSh|D%l)2!v3{$rM^jx2}yG2L2)&G>nuDm*Dhop*BOW5k@<8^^2a7&^OouEN{7qTbF} zv(n}66M=0x3ibAidOMz&Ze6>Nxyoz$H!mI7>yq8#Gm+X-RDI0q@R6=22^jplX^+jeoRUr{R(;Ya>BZbWY&z8MIwQm#W@45`X-=jJX6zuHQ_+EV3dY>QF<&f|SW zYgF-6b7I~a$BlR?q`!1ItI42JJXEqdZiN3u`5KvQ=2LS#C&-CZq^p`9Hsc0iC0)qX zv-Pc^W(ADt;A61n)cLklIVK>;5ZI{gFtXy0!$JQgXE= zd-{k_?M{75Qpu){f}L^|S3uZB;#8oHF>m2vim|hXQ>2-e8&Qve3Y>pdobxnAcr)5JMalW;-V+=f^)!J6yv`@*1 zPg#q;*Q83dcW3nbyDJ8+h3i(&-BfY+EY-i{cK~aaQD8$ya{$^f=C05~y^X75U0be>Ly4 zF>w}BNubhk{T>hcWxZA=`_-1^pvQ|<_}$k7kJ6>IvRQ@S)AMX7`5SvKP9?`v60E|v za_C?ENrk5*ScNZL{yWE060E}SE(e~HU=@Bhfu|%`h2Kr!DG65Lcb5ZCNhl>-t6!EJ zPe~}ZX{}6l&GD23tMI#Xg{LG~h2LFrJSD*@{O%ZdN`h7R-2|SJU=@Bhfu|%`h2Kr! zDG65LcN2I@f>rq4=L%0runON|EZAUjdNSZC30C2E=L%0runNDMz*7>e!tW;Vlmx5r zjR@a*NzW@hCBZ8E?ihGVf>rq41fG&$6@E8?rzBW~-%a2t30C2E6L?C3RruWmo|0e{ zem8-qBv^&teJA263B5nk&JOvrB=o9iet`()*~wN9OPT>uh5gmyyo@%Lr_=sw)tLRR zP4!*o*^w>;GwZD6tGs^v^|FYev}B`_oz1zc^7^jLvnz>g23=Ni(h`A6wr@MB?@_ZI^EYJSD*j@b0?=Pf4)KyqmyN60BtJCh(L5E3%Ea?xJJTHOEsD zI&U`S)m^`8uAo0}tTMN|J+EIi1S-X2mAU0AuU|C;DiON=?e(j&9Q5L_vb_6T;i2RZ ztSs*)@RS5A%ex6YCBe$_ZURq9u(G_Hz*7>eEH`3}zs*W-H9RH3%5uAc+ugTOYUAK3 z309VO=L%0ru(G`6nK*WM{AyK6u(G^62A+~&Ww{Z*KjhfB(n2acCBe#aBj)U4`>RQX zrzBWeZp1f^S~mTn@RS5A%Z&*8t0e+YNwBiq2>q)+sqmD9A9v25iJm|unswqzIVbQ) z@0 zf|eI6%ezaChZqp7Ebk`plmsiwy9qoc!OHS(0#8Y>vb>wXQxdE!?eg2D6;LLP(F9@C`Lwv*iB7e<=0Ezdm^dobR&_qCSZJ8UL~8hh_ubhmy$rG<64FNpL2!E;<-Jfv$M;}7pZKH zs9g`6VXEt)cNBYClqyeabRg|%QN4L%PwG{}Bia+Jp^0l6svCY}`!2=&)@jK`C7U%g z@my7VeEVamUgBe*5}~;`X-|u)+UAMWqW1(U5t{FlR@YS953!Y#@^}K3j%$8dT3u6p z=H3scTAwFSiO^_xT3u7^v)$s>a-fQ_!-#uYT~j@<)+Mb3D{Vw*hG|+|Q$4ljrL84L zB|>wG((0P(i?1zcje$x8YiR5)Ibp;Ztpq9&tf8?h_}R7dim8`W1teD znF?ujO||V?iYnh1S5@h1wZkT zf3{vhR3aGvv|Qc!zo)k53Y7>y`r2QOneyrD#meKaASxYa_Lk-9g$HJ}#y}NQsz=`~ zSI=JhrPdgX%SR&2LgXo0)OTx-PZygp`v03?RG(P{mMi_MKObE-DvqnyNV@)tJuSLa zp|n|ydUisdtC(&*X3i+PQu5>HIUyDEUK#sOL_H5cxq80oBhwcs>aqVWx}FD+$B60H zGY32&JADHpdqQDK_Bb#)i9j+{Mar&zT_tDiM0Fr0+~rJ3sTI zRsxj>J-h5X6FR$>Tz5()Aymf|;O}EB&iKd3>%=>3B2WNB5QKy9rbxm@Oo2e|5$l z8>Z*3kAX@A^OKDjECwnO&CF%xD(q>|dOc8y@M~rIt8IsF(n_Eb!7Rl8J6EVg`1y(b z)f(45mwto3c55zwgLq1UeV;7`ds;|^rzF^0+K4c- zCY>uhCBgpH-Q~bj66}%PP2edB_Tla(@RS65eRmUhN`n2wy9qoc!Jg&a1fG&$Kk4qf z1W!q@pLBN&JSD+?(%muelteR*^NoKTUcKk-TeeU%RP?v{-wJz6_w@WbJa?bEV9(S( z=eH&rm2CEwHe&DZfBL4j7^pB~8K~f$c1C@@mx3rbx%O^E6wmgAK1ba(cj6Y8}B)!i)fr=PS zpZ;<4#;0GcC)j~nM6>I(o<4KV+M%`Ns6;foPV4FO?4=)R%@ryU>@98OSmrMqw8lUs zg1x1U2w#Y8je$x8drKRkfAuGiFF7h5Z+4wlIleXh^Q|#ZiC}MOrQBbIJuNnEi-Af+ zw(E5D&=Z%WT87URDiQ20ZFk9QKk9GI6)F+zEp5a<4tcOOSExj=x3rbx>xW*MYL-4% zs6?>0v=RDOfAV+&m5#Hwv~>N|f8DrwYdKJfU~g$7j@t9!Rsxj>_Ler{k{i!#Ee9$Q z>@97?ev=+c^%7qWR3frnr?dL5Cs2vVcAc*7?e+5$t^VOvva?;Mt10_`vbE%>L}a^8 zS6ghlRx5!@M7Ha6b?6G4ZmM%2k1q!*9dCA>))lr`R60KR z_@K`fDiMAiOCAG{PggeWcIBnN`r0=ZwU)!v%3=CKY{j=feRQ9$Y}V#j4E?LW=n4J! zskL3N!Q!~}0hDz(R%fAtR&RZKuK}Kt$iA$aT@O4Zk$qV;Bk*()X>X45nrp-)^-TD) z5RO~VL>obAHO7L?x@4Wx{F<}sPq{)R+piz&uhzfl-R_#(H`=7SY~;karPxcmI82 zz2BXP`D0IOB~Xbt?%xyZ{qD-&pf3k15ldH?RPT2uV%(%pwq6fZBF3&UsoC$Yn(}Ge z(?T8}1C@@izxJeNzq{-==m}IJmaIFe+3#*p0+omzMo+5uyHh#7`}`Hz^NKles6-rj z)8uAPi!25npRVjfKRD_CgFq!h^Qf;^!dHtmnW2vmxpv(U`b4|9sLk`n_J zxoUcG@)pbF*uUe`m91-Ids=k2SQ-MA2wnfQr$v>wSQ-MA2;F08Pm3yVu`~oK5xS4l zo)*~^)On}1jY@=mE4NP8o)+CLmWDtjLchnfr$y0XX$Vvz^qWt6S`;mohCn4kPoK1> zMYY_IeT$_bP>Im9%l5R;-TsAd_!dh;pc0|yW7^ZA%3CZAfl7p)!D&y6LC-EK5qi$= zaZmkC@}kAk#6Tq?zDvT)A$um~EtZBrB|`73w5LUtw^$kil?c@(PP&>Hd5fhXP>E1o zV)kVaG0j3HG!o zS}YBLN`&eXX-|uy#nKR{L<~N&-~R?tiD1o_UGu@tE-Df1j$lNXr=Q+~czn9DRXa~R zI}|OJrW~GD4x1Lsx7Ii&Jw?5WbQOag7`n@W$L9pQz5P)Vsn+lJX{h`P1>d^kdm@UV zmP}Lfu!llAS6=1myshT1hbK@ehX0~me`ww1D=idVs*Dcpwq}Ia#~{BV)NYfCa`{ zKUY3oR4NBMaCDc0=u%~LSn1t1TZz*7=S?wH!_X^|0lN@CtEQ=2_4G6GLY{Q0J-&7Kw+fu|&vyLxJ~r$t8KDT$s- zr#5?9WCWg)c<{Wb&7Kw+fu|%+Ib*7uYY={e=?RCYBzjMp+U#kO#lTY%OO6e{5B9Xk z2)$pmAA<C`R|vgcbQe6e9cIN-skNxyvoyY z)?55ekz)Ag6=^A5Ppj`;{g=|_eXpKCC0btuYtI!PsXW0s?2e%tD=S%5%Vc)EjyLlx z!=4t+JE~B5x|stR*4L)HMCo#NeLU5#nsSu&c6n3|PpH;E*txQ_M4+;B<#s;Ft_ORf zl!R(dY5$LmP)&wa5O%+^3Sz@%Pm78@EtIZTd0M}Mw5LVIo)#kTMB2sEFD>n9QL(3m zRCr24zvi^3MOF?xC7~xq+S4K<@RWp}O3kc$f4Ac)2|f9mS@)j6QxbZ*HnZ+Mfu|(& z1aD^Ddjd~M=q=IAy7vU0lF*x|nRV|8JSCyGUE0$kJG*#FLT}Wxr$t8KDG9x`n_2fh zS9nT7HG^i>{S%AMN`2vYNOUG6GLYsK%N0w5aZ!xk?)Uz*7>c)uufyswE>=NoN;NNvP(W z_O!@yg{LG`J5PIBWCWg)h%Es2w5V43?gpt308bYY+BnVI;H%5rn72PdT9K$#(GIy9 zY}UP{)fFQ=?V1?=nk!e#n^)T@y`yG^wqgBE!2He0&Qe{u3Uu?1@-a$+_Z8nilQzzw z&(0OO@^rLYXZHJYpi&NF>$RN-Gs!8fUv;4x2j|LirhoOVImXGYm3$j4*l%-+BV{dyKh@~#P8^GyW8T9Ih*Y1e?VKo8p2jvpPX}4Cgmn!$(skVzd$3<^Q$zN(aB9xP(Es-RcD|XY zblJ&Hv9WWaRCyZPh(CPwcQdDU=Ev{WQnM88>!sL6{OZTQn|b2E{Hj!W8rz7z73L0{ zu+3pHhJI_RrHc0JIkAnHRTHJk)7VCY-3qF(TS1IL>qoS2Az>S_MNO0{Ph%TVe_K7q zV9lUtRvgOac%3Wzwt75QsC3m($>z8b^&Sc_2CG+3SO5i27Ui zF$U{I6+=%P)mTMi8&QAjKE}W!m8Y?d$es+LSDyDP-*Hkr?3_@#cu;wo_qizh4MtUX zv!vg4{TAhT_ir%9C{&)7O|C4C#L+cZSDn zj!H35$>z8bYY#nT;P}-JjxqQ>D_!nB5!gnIs)23v?}f+j@3KNxH0x_+bKHpf zd*Si>yQq{CRI)j4M0mn2)Dun~)h5((SGs!Zt4*%s*hYk>=t4b3OO>awjj(_1+0JuG zwC@AL&WTdxX>23HT~g^TQGQ8FwC}&dHX_`KRrvaMEC-&FCM9y^>I~tXs^40SQNLfY zv)^E>W#CD_yP8%!z6W73!u!0^o-ff;e*;3a|KUyl{S{6h~Y|Jt2~X}oU2d+=ncCl#oq_L zYD(Al$zfZrLM@{=?9>#0=XjK^r?HJVb-j;tu6*C<7=x$2V(>)=*&H`w<`Y|Y-q>q& zjDboqP|4=F5s!Bk_ntF+Zj3=+pVB2KK8Hpe|F6ZpKU`^UjNw(D#x^3<`n0Q6j6u(@ zVo;Bk&2b~@eXwE-RLTh|*&H__Z+}={aZIfgBQU%lr%x0{`-x{p=qaz+&o+lUFvF75r;qr1g(g(v39 z(e%k05q1--!v2FX27RwF?=|6RBf^e_ktkK3#x|nfCoa|*_;QD6YT>duZbZFLT&y#o zQch6G=C~0Hb{tWy@%*P^Ip`5qy5vLzwh`kG98s?p15MRCyZPh`A4KSncuVj93mv8botO6$9IdIW(@$J23aBf@?xRoIWEs~n7lh{$sl_G78Sek}1^p;Asz$>zAlsCPfLYhM5E zlrDF;2y7$j9aduuJW}yX6^(5~UJGw}ia0+au#L!T`Zh8e({&@UdEZjFcV}|%(!XPb zwM=6UkM*roh*ITgY|B->e^h+#(!vtWQ&cv`ji~pJiqBnC$_Xmj95;fuvpmcYh&gn# z2=ZPWY5=9m)7Tcn{^eb3^;$bWHhvycs`~(QqDxiRedF=0h8)_?y|kUFkttn%sUol~ zMrb=nqEvYrJIhtPcdhT<+O<4!EVtqNKB0}96IMd=Nabm4BSNjOQms!aemSBUU6jpn zBSOuxQq9tU?&M(=Ydo8v~*J7>jnMG2J?RNW;H@ACoP=k&cOU3!5LTLt+BPEWQ(du7 zHS;VLj~SG*Ic`MQ2P+a@rF2orhBl(E!^Lu_Zg9*sw(GQNXOI8V_E^U@qOQYrlolSv z^E9>*GhV*GS35#WrPjojms$+9^p5^-i-B##-5V_K)vnWufv2QN$%wMoKx3vN)E}Uc zQS59iwdudARf;Df&EKt$Ta5a8#P=XG2b3;z0%UXCi28cO_aG{+fo3Gg=C~1I46%z?1exCrJ8%jUQdVXxmvcvU=CVT7OW z!$BKy@bg<&=YM{5yn=e_U%Aj?=$&!UO=ff4hbGJ*SxBife?Ob6SQTO}Avx`UZJdJI{@kg&TbI6|$k1K02pyQq{dD%l*b%Mt&p z`>E@-5=uADFR8!qh@BIqiZv8Ej%~yr-Zi3ne%$PsE1uNKiFzsayTa}(Y$FaHJ)(Mh zXc#XlRG!8rS505IR=a3js&c~07i?QCYfLlRhf49Fv02I5)3fx=Y1J!3Y&65K;f3gq zQSZYWf3;raX>7|=m|xP%{1UavpS;k1AL>ES_u3Q#yDs@($M%joc3wPJc%=0I^qH3L^MbVits z8+VG;SWzqo9;rNyZ81K!@1DI|?s`~^p|;Ee7umU@w4$+%*nZVKD|CsXUEs z#DX(#o2eN>QgL=w4xTtVj%`H$-M7uuETmH9X>23d{ZwgLuWbEH49_U7+R<@VLFI&E z;3;WRGJ<-EPYXKLQHp1x8~><1Z8YnO6sH+!@blB69p>4I#?Eu4oZv~SFrzIUuV=R< zs!E=)QcFaH@3C(6HW3;b*Sb5!!?qat9_x*YTAyfa zBaZpOyz1mj#tz8CQ(x&)Lzc~PBewh5ylS)Sjcvs8FPzeQ z_CF4a&k|}&qIu#d26j%ADos(#+g z(z9AP$Fq5T&3J8HS4ZXP_IZ8eH=c#C=7Vym&r&wI(*HIdg-0+V?P0#ey7k+cdB}>v9WI;WM%)}`S&Rw$xOfkq65pJ$WpbD>StXeYr(Bq!uPy zwGX~D)zee=^~D&dlrAdS9Jd(th+-tD*Gk38z<930c;t-BkE-w8dekzO+^al|Z85Un zVCXAuW?ioz+c+^sIG*)0G{3>xgUZvg^B6Jjp?5je6M~)UCH3)~i0RfUPh&TAhA@^| z?e)c_@!sW*6U`Nr&2ftn#!@5URZ16?Y-l6G9_!VMN1qbwyR6L+O&^JDjvEp7Sg&3R zgjXqDRI;J-lFQ?3uiPa{iQ_qehi?d>BBka|Tomrz_pe}c4dO4Setz%_R!SVV7{3p{ z!8Pl7eW;W!D%l(-SNfkhEE=z|x+t|t#lX%9rG-Z-TJbSP9QomH5B00+EA_L)KdCjM zL?0Q)Ek>wcRhI<9(rxZ`R2IXIXSs^?M80zeo%#TZ--k%6Cn_gNRowZ_FRCs_j6uy( zF?0p_iVL>o3Zhhb8rz8a_Yv>icvl}~^&Q>qTH&OWIBrD!`-t~0DxDuxvN>+VFBdHB zz3+zI?CjRhC8_AyR19n*`fpy^yVoVV#pe|ssd#q9>ybU-UYH6ef?hS* z9Jd%@zGxNZi^g1`Qo5*QbKHpfcOIW5`gLlL0i{c?nrx06QUA{4dk~eK|KO6R(GVexM=-Ysq?gCfz>2di>GbXUan@Rq3ifNh`Hv zbKGJ~48)Q^c$KGRLmN?Fk9hCuENTs(Xq{cH&Xdh?BkJo>d6m*dB^%m^x_>v8gXp65 z#JOm9i@|Xt>i*qW4pctxvN>)9??LY&hE`W$D_&0EVGS1Pl9G-aang?044nKEn-9l# zWJU8GSrOPdQK~$RZNy63AJ+NTL3850%U7&L^9^j-95>>;PaM|S<%&7+-bJOHppwmT zBj)Zqx^u>(TgP9N|EfISi;pq3Uo(Aiv8U&iLqb3JpSF&_TCegnw#E4RZ+GjQ{Kcj5 z_rZ6Tl`datmd$Y^_6o#_f$%Ej9hGcoBi1>8g_%Eo#QKmm7O$OcrDDfhrG#z7@@K9v z^UOe$DofQ= zcacb`&eiBeGd~l0o+-J$zNK{iu7B7@tU7Yh%z1$*RqXnw<#)zxb=o z@xsHkfhHv*!g}O166e1fz_$z(58H@vJtCoW@u1?n2Bc)f?GJC=dH4XE&%hVIMex0F z*&H`wQB8Q2;-QiaZN%H5))#tG<2C1Q5beLpg>A&NP`~6Lr8;mjVNabm4BkH;5@pE9MjWvF=R1G? zkd3SHm3I+5ePnaohy!cFt5gnDvZ0N*2gM~n-LRog-5;p zN*5Zt83p+8s|R)FUuA7IN+_DW2V`^Ha`l5Z4(fdT$JSOu<m{g^E-Kj^H{!8d=XYNC$)Xs8y%~JEvN>+VF8?#X z^S?vyh%tP+sC+ylj@)kPzyWtyz1{D}!cHrSfo;UK)zX1S?y`D29;rNyZN%Ge9n@Lx z=u=|7gxZ7%U4vEMu)Y(H8*$_72X#Ju-YKzOf{JUf>9fbi>(6l`t{y$RvtY=G_^Z{g z=*`U*#QRE5wQaXCo8v}YQxnPwD#bu0o8v~TGIG&Ez18I58~URC*YUB9c=zZ<3-#tK zRi4H+!v3|kvwk_urqPp=xj5K4pi?Zy)qPoH>Yfl8}Zv`W^{J{=Y}x`D#bu0o8xti z4d-^w_>}d%>gjycd+hwE#=79WW^>$#$EVKithTZBy`oaOsA8FF+KAp~#tfW%vdulG zwxqms_ldwZV(bfJ1||lgRCyZPh|!-qtaHYxbK*OSr=@6iiIL55BaYqSu+FqE&WZJQ zRLTh|*&H{**IrfsXvTqU*A2zscuwGHdR2^8jJziElknWV_zL?m91KzXpVQ61C^(-MH>;WV6U#AJk-yX zuHWAq+lX+N^y)4tRi4H+;-Qn~b?$oI#?`n|qIu)U=C~0%oI0=b$Ax3!HAkf!qLR&V zBZh`I=XuvIAI~mtNTtgemCbP@P7H77b1z+Cp;swgRI;IssM~7sT=7d4P3>L;c21Nk zPh%T#-$xe@JQzkzl$M@k`r@-_TJbuLZN&XGQK~$RZNzu&eI8@*3>S^c$2Q_Rd!NT^ z?p2<~He&4`&+B~f(lPOU?(cS8!L=T0`+fZE>Hf!#W{A86wSJVlkRYTiR8=Feaw zUaSePQo7Kxp^bQ8t=XOJM~#TrgBF%(YWlJ{Zp0q~u|pudO6j7K4Q)i-x6~2AJ5?%n zveR+woG4YE#x~-Dn@$;c_bUg*a?nqubZKELC2S)`Ty@I8j;|gR%Ylb@`VKj{;+y0> zJ)i#GDFg3++s3xZFX?W3v0V?PB->)#KJS!)z1}&fQ>r|TZA56-c4*hqf>2Iqr6?tA zBSO1Y?ZH?MJW_cY+las4H)r7NkK3Fg@+(4bOYOm;c-Th#aLJs3`?j??MR+*7Dy=V{ z5q~>m%)nMZv2O@LNEP4VVb>PX*hc)Wf6Tx`r`a4YJU%BrhellZ=Awl^4{tV~mQ<=C zX`dGz$2Q{fci*wFKM}DsL_j1 zE$qpitQ;ISqV6w=B}b*aqms>WBkDeY7=tH(V$hn9&2b~@K7belmC{8eo8v}I3Vn&s zzPVwHL3E|7w~Th5@nte%{^A*(b(h~L#z5usE}P><+_ce%&bL|Yg6~(g)p%{8w?svS!z;1}p@`_gw zkI#wEp%HZ(C&u8nCY4$*>a!M&ZA9J1i81g<plr%I(EsO?~I3 zVX1AvaU())sZwo8=`N{No|esVBks9#Mm2ktjbh1vb^N&W+y2GD-q&(M+9iG~mQ`R1y+MgUZV#J1XE45PNS*%r_mJMyhZX2&y zExVijK8C(E&Rvgj?s}MQgsxz7JsOp#v5g47+DgCLn5+6aD<@~%GCcm~bsXD>@MNg; zWGGc!|5%PXB_qPPLB+U%($fAhN_WoBhsQAl5!g9VsyvNtM5x2{GCsJ*&LiSZEuz=o zVnm23HyS57b?Xet>Z#ypa^=-H5xKwZFxDnx98ws5&REmd6 zHph(!?T?D~$CS0lrQgKeL&l{(OO6}yW=$vtDy54`Hph(!W2qHmsobMd>0Z+Qb4m$2 zCrXv4v5lzjtNMD3aMxpmyB=oegktE9qqk1?(udBsr#7|`p?*~{9<}o>!{a_t%De6i z?Eod4<3@z~RV2Jh@leTzHX_tAD%CRNiNDmaBa>);MLLdcM5xJBs>zfpPh%VL{_%4w zz13oj@Py;tr{^H=L_Oiy&#R~B+3-yKS9o(O1}aa>=D5WOqcW97W#qYg$ndzEm}t_K z&2b~b$WPc`*2ZyAdD_P_Vy7p!u6{n()~oTr5Z1+jU(?G|u zjR-BsUbP@gm8Y?dsNXp8zS5gs`*tZ^?hK`b-4OJJ)7(M#+@c*8dt7<__AuwD;0sanC`OgX2bo zk+|ylFcK#ZDo@MixDoaHBbH;kO~Y?+U5oMfw!`DDcuI-mM%3?*SPoQ57nN*|8=uHX{Fh*c(T*?u?sGwf7*l5&7?23%XNjF%rK?{s?OJRjzMDNu z8WmTKT*4_T#4y-ha9jR-SRD$PjoDo@LXHX_WKsF*WBtHIJ87k4(cl&mdc zM3^&CF=yhmWld%2n#$tYaU;TbRHzLfLh=f-uT~xB6jR-SLtDVCP zQy*RQ8UG%e`cBBL5n&c<^+K4%>Q$bW4Q)i;C)1?6jbN23)v5G0h`Gw% z2Kn=GzIc|h%WXv_-N-5os{A;Xhi`bQI29@^z6t)r9SsgCkiFlL~dbvbn8*xK;tL+eG0?I>eTZEoCnh7YI<3{Ms`GGLo(5pNx z8`_Bc9o3|(=OFVLaw306naZat8`@$lSYvi)-ulb~u)WlkL-tsg&F<+&th?Uq&ibn} z55V?oSGuTVLmRQ|hKpu?D9zI!A9u-Cx>x_t_`We=k8KgyM&$GK8`X7BH#D{p`PvNI zcV02rk6t!A%^Q)g&9J@gl@nC5p^eDrkxfeVtM%8Ol=_y&u3^WG$mfxnO6j7K4Q)jJ z9vqv}Rb6EGE_Pq3&Y-@mlq>fhG?mgtB^%m^uzH}<>Vc>V_2_2YV4NE_Fxv=58gv#_ zOVt{Kl2%=m9qfC0@;Rv!;&qPKW3ug%E}Fg2Ek-^kwNbIhx@c@8^0iC0@4QrguXya7 zC{^r7ujAN8R9h?_IBW`Yqb8)jB~XWGjcqZgg)1$t zlyai_^_HKsYtC^asOfu^r)5JMkzZvuK6kKD?J&Bbv5jDso}%-6 zRu13(+4$JT)p6{cC{>=uHX?7=j*We9N>?=*`g*aA$lJAzO7Fp;C)@Ziwh{SywMpq& zt6we8cKvGg3^pQPuVyOc3YBbVBl5ZDO}a~0n3Vc`aw4C5ZYrOyY-o#-uU(puYLhn~ zFdI>&rBm&!reD0wA?xebGWJ6;c!7K~iiR*7a(ap=4n8t*Un`X8V z%;ZqIcuJa-jL7F@SX$(Y{ww85c0(}kj7Kqu=VKe;`>CnjiQo>G&GCj{{Rb+gi%K@f zjmX;ue2LBtA?zxDI@Z>fvJ=(D%sFRUZOFfX3Q(}+=X$~cy`r`7i=TynKiNP9Q*WYm8Y?d*z2Jgojc!V-NeM$ zr>mT-e$K=+Cj73W?YI$s-2^J-1eI)#8AuQqmifFTQz>0kvY{PIlTOou$(J0?j-Vjcr7}zIIY-JJH$}p&GKOWKaE=lUgMk+6b-sWj+H> zeWlBjS~kZUf_fq<1{TuT1ASXTs7lr`Fb2{VUc&KWJ6nwd_7LncH$SM z7ZWi?@?i%K@M5o#NRntptL#M*s5 zkBnA|2<(Pnz7L+5cePS#nv{$P^RGH#{#A@YjYWB<=T0`qji}cf#HSA`#Xu#S<3{A) z18C|y{Gt>iugT=!1F&CbEJs~ik_~M!@^uqUJ5#x03?Xkp?ifmbQJ8r~38f`j_*IosWC&!Jb>xuE+MWq<1WOLkzd@iT8GZcfKO%d2RQL1Q* z=s30!`S_rU%eyD_tqoai!wyipDmgzIWrf!XuTZ zv5m;*);4W&Y8Hx@x3ATb$2NjhLZ!;n*hb{v znXtYWrK|oV=6GQnk$-2RQPDpm8rz7vpE~}c)FZ5!%TlQ}shP{lEp|?nDo@Ne#9U`8tmF|*zQkj`$9`U#mLw8 znMb8nyI-qoL}Ocwd|qFeTU)D`9V;5!hM&#=UEmz8kdOVu-gJv6% zuODnwl-!>MBkHzVyyj|QHQ({Fv#T8DXSZ&vb(9t!sXUEsG4eH7mMhVyJe_i-?@YuP zUPa0MSui48^SIhcX>tEZ#TnIcY$NjZQFaYVnv{$VxS6u;RwFzn4)7p?#E_$ykn(yTsgj+cb)3{;-}W;$-fYCoG%y|}rp z$N9+16Z#e`IzPlXFzgF3q3`!6%hnzNW|u^+@-(&)Z@l$T@A&ig40qyzeRu9Qsc+gA z7sPa*dTe6focEc{aU-^R@B;yrTd-3 zCiktgtJxeciT(Q;m8TC($BkHN;s>j@XXz_~2lfr@KC$nDSM2;yTAeG7mqh4ecV`!s zQsTG~d}+$A`3tiyy1?>2FiiG$!+F!yG`l21^e&aBFR0%J#_0>=+ztKldf2^Ww%tAb zU4&xjPL#^i++z@5o_0>}i-#T<&(&9+o78v04we(Hv(6RAEk6frd`|C~kqG->rMu+7 zr1E!9A_j~&uNt>8czY zHzM5a19rEE9br?hJl(_-Vc(#ar87GDs5SbwTkqU>b~iX~jlTOAogMA@x2@6l+S=#F z>yZ;)RnqhN&u$?|OYuDY(R0@5J7x8A0--O%jQs7GP05ufP>J5^mNoh=_>2gZzY zGqmrf36%Wp%P-zUtoM|}M_wM~gB4clViDT$RH8rC;|<+d1jN@CP`Q?pEi8)$qPUf83TUJW_dLm)D2)t#c%~TK-#?rC$`DlK9SHBl^~PoLu>GcmkE^ zQ6CQL-47y$C-6w+i5E^B(YM215X;TJce*I4@RWqUigD3XZMpIUD$!RwF`{pquMxxN z3XfEtSZ&J4n$R^rWUKqGC0BS#VyiPo4sxzMflBmUM~rkO_qoC&l_xH^XQVs3v#oOC+^;L%|Y%&JSFksFV_rDYOdhii&npp zv+D^|q8FdLX8nsQe}j0W^2FRn)^xwxV;)*J-R*cv;^Ap)h4&!2TJ4jQ({Iods6=0| z+FI`EvI>6 zRGzr?;I-;!``h7e|Hc(P>8*yRBo-gF)*$Z>JSDN@*tO#ON@uBjN13N2l*5bfKeOez zi>D+GU3cxiTYJu`-v;m7bE{3cukf@H3%23x`YY%O*;0w_KVt2^`O_6ccjB}A?4RB^ zc%&+c-w$hx;R)GNiC*x>wfmOak8&&+_Qezf4>|F~whvjKWq)!hQAHcAL!L-c>tO(WSCBrx9vRQgR~Lo71aGdS1VB z^;U>+?cuAW-#KZu#b`fQp0IYUoh!9in`^##^`%WI2Oh;JiS}#m32O;k47G8adw0k6 zHc!_Bk7AUB-Mi)c!xPqawis&THow6ge!hIVuka{FNi@Gfu835gu(q?sP#f2tC3+_Q zXz8x$T;YM{H)yS5Jxj`RcmkDZwOE^H;wQiS%@hNVR3*{=O!S1cgzb5y_J=*GRgRDT z_txoL;UOnHMF(%OcmkDZS~A@w_XH{tYP~#tsoo#2hr4~(r*}(tJ072|Y_)xExr-Ld zwkJ$Z_mwA5iBQ{Ti? z$SF6s5~xI|B{Q%q#D4!gHeC-N1Co`k)%#9bCcSa+l!V$of4qtqcN}nZD!C_6iB?Ny z%54yqC(D&5P>E3MWy)OYB`2P@MYB?5yXSt`^Vt4|T2(@I4D4#x_KqW%07duzFuXcLh8`qI5 zJU(67YWp-L59cbKT~DAAp_WW@cKx~X1S%0~y)^gL$W=B?*8`7FSGL+d&0P}itCTBG zpc0{$OmiptTzLYO2(@19H>k6F>DjNPT;cKQ%2wN_`9+O5_L20f^#m#rYRTBIw!DI# zKqW%07ki583U2iL@bnwR3ZPt>B?5yr+Mx!y>PvBt~`NCgxWsMv;F=zZb)wfPoNT^wvW9()Q-CBfMru1&J(Ca zG_9iYdffT?YJJOnR(r67XYJC}Vjm**G1I?SKdJq>@+wcuwmwUptABs@^yW!jdz7vx zPF;ERzU#i(7K5}zpu)DERK@VQl1d&_N>}!NA6(t_@7{jmxO89PX(L9RMy}4>9g_tKNWk2`w8 z+HKZ??61bWeM5Sm;~`z;M7Bl&cic$1dM?EH%o%s5`mT@RY1)SRW#rext4LQdtkp-Z z{4WZR&xven!)Yaweo>q6wrhHd;wcGhk=fd%{%XZPZI*r?cuGQJlL!45*W=KITcu}- zCs2vD78$wv{tKT-*Bp;jp3vB&on4))+FE3kWAFbSnV!3Nr1FGDGn@Nr z`$eBmCHDj>(HfgA9_Dn3_oSr}>!rDIM>R+3kopOc8rz=~dna#8PFN^L@ zx$*=m5gN^G-Z&5LFeKfHotR3fZ>MLCXM_robyczn9DHO|?*&z~Ri z(UdDspc0|cOw~T>U+s$Tq+hKkP>IlJW_!KlqvvdpdeSyHZiBw2FKdI?`_=aJX;hw; zO^;W975e(p6~v>Qcw(ztHi$ii-7!3YO0;b2ztZ&>_|%0d1|C%OCm#9g2C>J}&ef@F z9+S?MCs2u&ZT(kzmTcd@QMw*@P|+_sZRVKRb8F=|>CZc*7@j~ST6WWa75b1jgBF|h}_`&@Yfm1x;nUwDdv2NnI)A9;C9>`CvA;R#ftWjFm-p-=w?vEGB-^ev68 zM@-6J6lsYV*xgjvP5+hB*Pr)bYa~YYl4JEfA^Ls3xyQAsUV^72o_cJo8(p#p7Q+*$ zL_c@J*g?iv@JQu}f1f>e&@p=Rl*GN)jU8mH2v13@^w3y0g5}GBrzA!#H_nZcyczD_*_Y}>?=opas8A%Cv$NacxZXH0TWxO|M>JSEX{#iT*U=oh z2;%&!?lF4vl*HnrCJplbz*7=Sj@8!-82`BW@!yZ{zMYm%j5R&cI&V*3 zN?p{SU9T$X+lHxT`Oi?ldhvx$YNe8v()IM6uZQog#k#0UzUbZ)Q{BfCs6?N-@}#=H zs~W)L8{C@eSDrv6V!!a+hNf>R)Z1HQpc3&)-y~Pl_a*l+P>Imhy!d|3)$FUENM{$1 zPgnMZU!UaK9~V7zVXFIh0+onIPM_p@ib6Z8H3ljXPuxAJZh7fkJ@bXLT4SIRap<~} zLye4f?Z{Psonqke>B@d`g~@dbvaFGL0+oo@`X&$3uJr^e5&cI@4s}s-723|J9C&=X zvL_!k*|oO)74!ru5exn}In=3%(SOiNsn&1C>1VGo*9n2~;Aq(xU0h zxMks1=}z2~;A!dGLmzb=TIngvX~V`}FT`7+RBU1fDj6c^P?+mk8!!_*_{^ znwN3wzVoZ2-hN`H&Q}xN=4F(G&E!}buKAyqy)yOnT{!-QS?g}^SE6WTht_|vDn-N= zS6!B#iRLktr)7WWHCvU^UwwP%A?d!tqjWv-`d%;0TK1hILOII1s3%Z~mc8A!7uLj& zXPueuc08z*uI#h^_`f(t@+9CL{FfCm@=0bcdYa4^gEYI9#l$K_UyM_p7qSd#MonxKc}}zze*5oP>rGIM@;&GYR1lNiPmGn1Uprk7spLVWbY-)~OeN^AR`|!y z(z)^ks)iuO%fFbB<~p0oVtB&F^p2`a?#~sTCSA*wjkmQCcuK-X&mb0_d`l_^o|3S! zFbJP3JSAZxTWtiMlCW{AHUdu<5l5XMMz8ekbOmh$>!|FiiMBB$2wx67WegkNX(RBI zgsm8BBk+_&v#Rlc7Z0yq+UaLoC})kz?h=3fZLC-^G~009oyNPj8Y^;b+@3&_ zw%P{eJId#ZoG7-fN^2_z9#d&Ouic5Z#;lFNQxdkuOhoys#ZwZtVhrN3U$2txT|6aW z>%ZD^g{O;%E5lle+EWs?nyZb#QxdkC3u4N48>f30Pf6HnE(l#m{YizVBy4R~8-b@J zY}Hm9fu|&FZ5G6%%Z*9pz*7>oHj6uP#j)el6~xmvohdt4opdft7@sxzk zPJ)eK0cj;ADS<`9IBfu|&Fjt<1VH!n=@b37$sYXsCP(v#s|&)%5s5$z zeCXqxt2HjTFO|a+s1#4VE!XS{@zD_%r~Aqis6?noXZB$buMhiLYO#0%l?WR>iLjAI2!AK~T%i(S0ZhHB3qU7-eDjl~`*}<+L?Q>Kj zY(!Z^`F8fD_2uj@~o%u;5X;p3qpK_1wK0?vi=ipEQGV;3*09`<-(NSJ0m; zPoNU5alH1PR6J67LgQcRlU3?@3ldLBXr$@pLqz-~lw-q{Uryz~QxfX&oOYGUQJ!5- zpc1W-rYUn3Lo=PuTzh`{Md6Xk6Y7Wk@qKOQ$`hzW$5Ei&+e(f{Do<#H#&UI6$kq4e zeDGIXK|Cd){$$llt>mv={>$`)^8_l<8lkbX`^OODm1l>h7OMu)ABoV_82;^?y7^HC^(2TY;VAF^#BA3hM5((j=2(|)^%mj%{ z0t$iy(hkaT$@CU6Y>yVQ8>B>c} zH=sTVg_OjMTNb(AAdG}lkE4*1c=(Y;eOe!dl*Bup3unN@dR~@9g_OkH%@+5mwF)VT z4Ko(kH3~M~^R92DbSR`G-n;!`S3j0M{h#R#Dx{6*=Y=m$t5&|W^OxFATTn>5jW)v1 zmvGl4PB~KTx;eBZW$t<{Pje^e4K0L1@VlPC+`y%?+6aY|1m+)>Ol%_*(jej<;kJ}x z_G8v7*Son4&Ie!~<;rK<2!)h3Fjw=+BO>-a+va@~QWBUCy8TWOzD6meB)CVsjZjEQ zU|!>{(KbRMCBgmlBGw%LtyFduQWBW`Xg~KuA#H^E4=Y>H@`Pqp>^aA^$|<%!C4pKb z!p<+*^8UVJs~X++yg7(&-ZPU z#)F=a76|Tv1p!ayHTPW58Y^jm;Eq<=xagdlT5U)x5^;a3-uZXm|HI@{`&d0$Yk}bY zR1r^gZfzx`1%kUxMI82x|87l(v_NpTsfe$heqL)jqy>VzO+g^920pZDDN1k*-+_4h|gVV;W=hSE_}4@L?DIu--V1B7CS>| z#jcOGmUd5L9%Z{9%f_#!Je$rh@v)K?V~g`kM9f=%O`31_M4W92S|BiwLK}D=cf9$j z*1VDy2+X6jr`+3+76{CvSjzAF;@PcrP+A}`kHT}K(5qc=e0#Z)76{Cv*!frA+U@5vu(o}-|=TDQgBt?xrxAm9hHA4Fa~)Y~b|&D2XFrizQH7L*=24pC z^CqEFBd{AE?;NW#kM1xdjnBDner;@V^t-T!85ZtmD7{yOSgdG+&)eo?6w*d$Cx_l2 z{St4((~#{e|6R!3HQSaBPe@BP z%x^#I&-2qPr}qGSf5n|{@^>$Nd%I69E!g0`HTl#p+_HJfD{n(uAh>T$HV!@R8>tob zgtS0#7n+E7{p;VQ{@fGN0>QmlBF_5x%GB<9LRug&A7o?aqc(cEHCECBf%zco&%38> z*P3!^MIy`xVT6pgJyuOv^>?kY!mN?T(U=divGad^ZBZ*BE!e<(koAMx|IP3^SVM?U zxwP;c^FcOt{`F&9x28i{ATS>^^9rTow!i&kYpkRN0`oyOb{^mAs8&K+ATS@a@!_&D z;};jVrbAjFFjvz)cJ?Wk76?AqexL16A8559Ef6n!e%~&4@09(Zw;?SN+`WT#_wT>> zi&88b~JiITA-txc1`Z}Pba2#u8^cv@0vXMmi@Zz zyFWc4Ezpp;`x9mNtCw7v@=77n((ccFpW3h6zKhip(gF?HcCns+)lf=@LZqc#tiO6? zzb=R+WSg6s8)74=Cdq$Ic}00c_=+;?u5 zN}@ta0^d5=h-Kqb>{MV+NDDMZ;dWkzkCj58{rfi({Pd`p6S4c_V>j;|z@agb`v_NzHQz>8d#m!T>QV6s> zf$u3e2T-QN6Vd|BuOl$;^I|BwH=KE8nl&6Vd_= z*;>(W?6Y;Up%7{5WFw9&U;}NUPlqR@1sby5B=Geuzn=0+A=1(bO&p7~rNa}_0u9;j z9tdYsrItY<($Yy&9KE#J@PxELL$(vMw)~$pyCL;HM6yoI;&`XchJFi#v?TN7FZd-t z8Ts5EvH>lGNJ}S;afHcVOqk<>zu5AuSL%@4!y2%g^OBLRuhjdV!sc zm!HdNgtS0#Cznoj%+KY-?l0z*Cve_DzjHZ_kQQvx{o@4!-?pUY{4v|t0L7g+B4ypnaV1)00v6s!DPPVB8?tn|Ae zaNdEHlKfmwBcufaCm~o#^s$n4uLYTV?i8zYuJh+|;;VSZO1}#N=N(v$3TNY{Hc`Lj zwIJgpgns98nhj}z;8*5~RemlfzR72-Jc08Lto6yyVrxDTuk)MR%Q?3+x zEyx@j>XiR*26pmGJRvO*9EFMKXG2;d>@1{*ju}n<6|@i{EuDqLF;&}n;hvBdXvlUZ z`Ch*|CfQJkv~;EuM@Vhw>3c$2pds7YRN-v(lvfIomd>W)mQiQ{G*SRK4-TDT9=?h{2`Em;x^N(-`R65&qPp6+BlebyW6 z`)loYVMEVL!fOpDEpLy+zK0!C?QqkJv3{tGLhHkSnA?432FtEw5??+1nCh-;LF8JV zmP}&z-;V|xtD}v5?w{Me@rSH~szpeLj=S`?Hx4bsWdR`J<%hS9s6?7tSQ*5+>n_~65s711; z=OpUeXam7ING;wcOqz8N&q+Lc?drjcem@%OppBP6+c;_{8%K3IMtChx^VB+xCOVza zGN2B|bfD(!@(bpb@+ZEJ`Z;4|1Z$_#VYKC2O2@d;VPlS=u8nbqvN29fM@@Jw8wnvt zMAJrHt_EX#L)pFM6wJx6yIoTIappn0q&hE|#7?g{sW?%icRekc#NfSS>yHbmhgR&p;tpK4 z+A3puUJ_o*(`?&8leq3*?j3(-!b!1y*vQn%5^`G4NxW+Hz2i$l>Jefk(MG>`PkK&b z!k)`}cPyD5ZP*wv(DfKF5^g-$=^WWz-n()hh+NCll4;}T+aJ;UROqMtZ-MrsJIN&O z+v$kj#q&VqS{5s_O=7#yf82i4i?M#7wPc;3SF`bRELZ3aAd^^o$T8Kd+d$-6o|a7F zqo<$IJN>~bwCy&wL=63SP%?=>o_0oW@BaajYuT7{$c<9L)I^9CN298DI@M3MdBPuv zI#z+;Zy}_l5i8x|+UcDAsrU5G-SY8h!%h)oPUBWp(0CubVHGyEyy-o?FF*gIXhR{; z^0Z{=cRKYOto&~whIoTGWf9LMlc-BcAaX6UXE7wP@BGcG6+0af2zp*>OW?OXGoSAq z9vPmO1id?Id7Azlo|6cEdyjtma2R3jQv2;gVV!H2t~`CoC6Q}+S~7{?m-K>P5^|R| z)~#cEj+RI*wd9frp0Lxx?~0a8;!S%ls=jvZ(omyp9v3-n^SeXY{BEZ+R4uB$@ktO~ z%hO>Ofty3_bRPT6i-Xmn$3z=8dpZ+5{vg<-h2N-5V@90AD&Al5mMd@DUUYnL{d)=WoMXnIw5y^ zA$J=#j4osK?AX17*KW+V-TOP1a`SK)tM7gI-oY&+VY!IZ8g2PTV%o~#-sx{zI}RfmJQ>9oHq>$|eb$NwZ>cA5$!mF9GHpDz z?Sa+rPoEY`iTWbcd5o}Ef0^x-JS~~TXRm*8e7D0{2W_U=`~;*)&ubf>d2yVz z)@#}PH&UK^8M}lw@%=}11`&6(eVT_+i{sld+Av}$wxVpKa$3JcVm#EpRiOn!e3d8o z-Ti()FZqd*OCs0uwB$NgOFH9+|M|=wQYdd5_G~r7ymJy;@6s86Pb9pSr~MiWn7U<% zHslq-hGzaD>p5-Itxq7lmd*SlwxUVYwKlvD)@OPEtRJ}F7tc`(bk}dEQ@0F($hFMN zFkgZ;>OLyes4%ON{Aj*S&1JRrYJteLJS~|v!q}kF*g)?VwEA$!dR`J<%fEl?+ey@( zen>gf!Txn9diwGi;pu1ND2ygzUMZxc)d#1%!aPGHFrT2(uF)3KA-N5qGUML)LQ=%f_Zv=T8ISwaiaIX%|f*w7WgFyTf5c;f-+&0DA1~ zH`eX$aFRuv~M8R~@QCiTw0 za|z}X`OYDi1mC%|JS~|-7(wewR0#27C(ZA{hMtpn`7b{joEwRuu=7N-gPyi|KN2YE zkYGdOCH$^>eLc_CacZKerL_?K5^em)4o6g1?aWyNl~I%!l?>REOd^a@E6y|ITAr3n zB6zQryjRsV*w8E&Y)B>%Jmg9qvO=KcX~`sZS<)GlU!oQOg!Ys`)^ifUFBz0yVp`UI zAclHQVz<@PdK+)Uc30j6epkLBWIZnluVuanY=|Zi)}wk{kFvUk-$l#G^(fX4$R&|$ zp`~Vhw7N+mtQ&-}GgkrZciEqF-N0t?N+Q?tv}6*Yw2!m2+blWKVKvHT)k%aJHO?C4 zwLHx=7Mo`X{%(){uJuK*Ve_KpET<8C9*YwNo}wxA*@i+R$?ne}8;u@T-wv3qUQ_ZPNMuIGs*CYY=T}C7T$+w5>}&B2R|I&GwUE^)xi(f<;n=vL29uMl9pWO zF4w%6a`z7Oo{s@OPe>L0U3xG}nsC_aP5Q@56}vebC=& zdxOn&oDaoxaJ7#zTR!b!F+%G&&{8`{Sv1qpoTp|w=u=VV7+2{qLY^1nE-ly-o${&} zJLkWPH_NfJY}ja9V`tis7Hr5KZ3LgXqEF4=`q;yGYuX{gH;5UQ?_9#~CORD>axK^p zEtxj>?^vuKz8%DvN^PQ^8-cxENTF$2JBYHY=OjW~f*G%912bD{6V+$nm-L)OJ*yUN zm=@>7)UN0`iO{x>t8JHc{I2>8A6pWkZ68Lk2*Fy;2+LFC! z!w8Q0@SH?Ff((RqO@Z*V#g;^KE}8lkyxzH`ohla@>yVXxXU?Ny6ycsL0b zzYA}2yJINpc}aM!x^0g%eNoUP!rrJ#d!zh2P^$)edR`KFD=IDIo9Gm)V$WS3ci2FW zW3jSbdbQtP$6Z>mk*B=gQxxC%hA)J#n(BAXooBSC=ZuvR+QkMfj&Vq9-KzcFr8aLH`J?t6a_)uKyDS3XwLER@JZ;poQL){{ zJeB6y<+0+IB$KFTykfhn5NLT?GKuD#3`@JUqUITpXwJ#7PRLI{UWq2roI_@-#(875 zSCUIYbI8=PR@B-`63y`-`wWigDCfOFb3DlYLt03OXxeD*du0oU*5H66S;i!ng!a8s zOWq4?NG8$Tlgc`QSY3E9Wwk3=%43^oTGoERhMp&)*e}Z8wOVU6tt6}k!0%eE<(?vI z8S0sdSkF~+P!d(QA?rD9)UzKk9j0aV4)*k%M7;_S>xcXg)JK(YU-C)RD-E%Jcr8y$ zCehq4%6HD4l6;$zNi_G1<|PB^$V*A>$;7NNiRQW* zy$r6Uu|7&J39YM9%SK+I?}{sQ@=Ka~SZIT@r=%s*h7sDslE(zOkjKhac(tla8_-&} zj-HHU+AxB@B`wYfTMSoql#b>;8MZ!LeWMM@Szg7Gs1UpZ#YE|VZ4%A(LE7M~JZ(rO zQICY94TZpl+2i}T zMrf{&?XI*CE77#kTw`I4LfkP1R64TpV7)4%d0c97U4^t{+IZKSmskHdm%DdtrieR_ zxZj7nlOU7WZ{OwBv%xDvi-UD1X?a>QiRRuxzGr!p$ScVtntKQN4!B>Cv}6*Y>=t{^ zS)g!bu|??c}Oh-j|kFjiJ; zt^U)75n9J#+|}YBcO_>jk2OmE2g;I0LLelUM6Ts&$t3FCZH-c5GhSu63OhNlgDwy@ zdzP0mn=hk{dUQ7qLVc0a!8gcsKrRWULt37eOrp8Q!gtOU48BdtC80GIYFVwdx=EtB z#zGsKtwWk5mxR_>@|Yk;@>n(3QrYgRRf7%5v|$8)i|rs|a{MCFYL7|Sh+f}Xu_W@l zGL~b>B|*QIB?x&F{R-2DFfJ*k~hYLt1JLkaEe4)g^Pc?)_}b6`>@KbkAQh zzq`}dJ{o^_hlA#KkAH-+o|nW>*R(u6lAe=Tarvs=E1%vel-&?AV?lSDAK}E-&@;?h z(7pHHA&(@P#2+tN)w}5_5V@A8C6jpP^oQ4<_R#8>j!k!-*FEV<#(nb@^SV2&p{(a5 zZr}dl^@l`asB2myU1=d!dQM`uPj0e)%@dd%4DsD;Uia}U^52cIt)G*4@`g>;Ulxg> z?01bed&$PKV527+r+(pMF|Y1=W^VV#pQj8O&y$U1!A2m4x~9b#k{(IVNxXc(_s6$i z^xlw;q3)W;!Wz_VNXJO`(|?%Pz4%K^lVlRF-TV9FpL`>TT+7pvNv!zLrQ?^pa%xP+ z=kA)%MzR_i29CZt2Juiu&u4#>Qr3Kr1PU7MN?;QW|RUe44g4V2?7C$WtyY*bq(P>L-@>u047Cn2w2S=XZa4DC2(Yo%6c~><@XQE1AUje=qO- z`aK|qQV6s>Et$mc-m$XxohwfWeH81*|2diUW6q=n-Kj^jen=)U_u!SiD~<&*)Ky4H zqkiC*NWA5Y?~gCu;k_{(c(-?7#&jUHuY8iSo|8EAzx2ct*OXhdZ2Zx{>KPc>4w2$(Jx4l1pN!tB{h`FOit{^1|MCpJ2~<*opJI z7e3CiyV1GxyO%!0_b-{m`zI{wP52>*P=1`2rzMjJ^&E9D5Uf#bOY%Ce8cZV8bJW3T zLm?%Nx`|&RG2z*r1~0#4RkZQSwc+fIYnYBNJuo-5SCUB_{rpaYZ;Hf7S0S+BX~`r$ zd)iLp-78o1pmpCVq2Arb@)}#UJNV8e*RdMgY5XTwfT-KPTFcXtNrV{n5Hk>H&o4Tg z?_8x1&n1)i_+_hlUt9+w^dEH@EouD{iRQi~ddRjCr=1a6H!#9h_0acWHsYE29Pfyx zjWzFhe*C8o9~<-PwrTUbCttw4Qk_6-C6gH2_xbVHe+z`K6GL53OD1u|w5@xe+jd1H z&~rY!lJ6k)ujf$K^O6{1?;N$*zml%|-SC{m$9G)O`^2VOM;mIF5cj7Zp5OiR9!!&D z61U7+(OWbbM6Ts&$t1o$bw%&RH*8%Y<@l`?Tk)MkYvWh3o=YZyREN|Df^DL-JS~|- zXsHL;Qis&;74{dzK5D2t>8QD>o!4^`p*I+0Z{W2&J(6e=p&uM%KRD8zvEAI%_vv>L zTRkTc`oTf=gQ4uESb5s)kqG5#FqEs9^2vW0=ss}|>$!fnX(N=Y!BDPZ?s_dxOQwy( z7Qd!?;J70rvCGo~$%m5`Z0LDO40TOwBx&Kz>N$yT9J773<`?+Za-@60%>#A28+wNO z2a=zt=Oy8_JRSOvnkI2o@7Ufuhn^pYjZ^+>es_!ctP`95YJT@)+p_FRE{Wh@IW131 zCNX-_34{N9(8`#OdsffwPPmSJhFVVKm7bG8KO6enK;&($v=Cd-Bqly|Y;T7npO0-K zV)fw8tRINU-m_RgB$vccOu4i?Et$l%|90v4suxd<>3~qX1+kS}5+f-DT7KLnnZ$vA zI<>der!S3V*F4LxlP9EU?{_dAl1n1j^0Z_UVXU@{W3?gY$#9gSaa-;!g|XT)j@5E4 z^MlMMqKz=FtvIgDTOYN9$OXwI;oHHS&fBZdmW;D4p?@VG&T3Ry2SZyj&bGwYyPSr9 zg6*;VR==LCK|cxY00$lvnNg%f9Zggk-ERfqwQMYl z7>Xu=_7LqNLgcG~R!@fKl1n1j^0Z_U^@@81ubAgoa8BRepiZpNUNs}EG~~4QB&(FX z^MTd9JEwjh&S(If;;l^+-#ul!^&{NzX~t_CfjWek^OF2^+oA zh7mS0LEMcVDMl>yyl4;cwfQ|ilgbeQ=45H3o)-;7uH|XTBW+Sw4 z73bSSDLHx|&9Nh=Irl!2o-8yU2(?$VAuZStO&eiusTkLiP->A^l1oD4TE>K9S<;e8g!PX>u78BlM3}kL zY6fQ5v=$9QB(xzd#7Z=6G}lr|(957b$t0R< zsnkOMy5cs{l1bDpT~O{WKEL@>jo9q4a_=n^v4Gb)N2TqCK92fS6nyn zTAm(CGzqNqajwr={n+A!zMb=a)=Q8GbA1)(`a*e4TApU#ZgYLjb?5R8YKB$is=4mW z_srSaws+nftFeT0dTYy+L!&1mi9(#7Z=6 zG}lr|SdYUwHh96-f604oi!fgV8X26-t7a{v|R z0KAr`X%94Q)b*pMx5o8B_6%Cv)@Z3Dyq1lf@JpyGph<+jqr!R-;*Rx9&A0oWLC;A9 zPrnK~Qev!3%hT4cq*!5oH`H^@EwOdx3OHMB$t9t=C2Da#iL_)AVJ}X_y*NYN6Q7@x z_TTLH+?;w}&PaM*5+hyH@^tvdtfonXy#^Kc8dxqOO*ZnfTqhCs8dThC;I%w$qdpRK z?#8^*I2>l@_0zIxTW-leA!j@*qatsXzl|bA@4qx#JFox@1wa7fU)8}0Me3a zBkX6WxSzqi3B*LcI%N4MCE>L^Z9Y7Su;#UlYhIz|qkEl*1(@%wOw*H}DHf3*9P zZ%^zlek<=7`N<}e;?2hRB|R^R5R$Y!9pw5siT5sEJAOqtB^L3u+nR^d4b8Bj=Omt9 zvUdEb`X(BG_p-F`OL|V?kRy)iU9%Q9JK%=iDe;D0{H{`q=aNez*YdPv5}z2a2EP~X zgTQaCerQtnkVQAdvb6I#lfpgKl=Ym%%j>GasVhMYhkMSY8zr8_tt#CJWxDlFf)8Fq5CNEdKF&VUKD$*yJHu7?%mci~@ zW=`AP%i)xp2`5z__!pd@Z1n)Yi#mwglkr?KZG1G`qIA$I5V@9W5uQsX5p48mV>I2E zjNkRQDoai_dbE*i*&WHl>6b`^vO5^cZhYr@Q?T*J?xgOev-0;(B9z_1PlSZ4*+o(w#5^i;1 zX&>!Aan;1S@3S@vIilwzLXE0eqr8@KjOD0k0Rj`3PncBT;lHN<7PA6}7c{4g}_}kMZ(}oebmTD?!$s}^0fj5dn zOC?;G?}HqjQu{vaAK?d;M6QM2QnX|e zb?+S8tA`$$oZ3O<4{}$}Nz@)dY_CiU-+D9wwp4qpB}w!x^6kV_)hLfkb9lT0F% z#EQKEM?WgBszqo~G4Ep~F_iX-Jx*S0rG+$!rVTrLhpn^Tfm&zZYL^7ZQEbnfw7tPF zny5JMWAh1!iFz5>kW3p!%mEiI$BWL^>CuK6U$xwjNNvSswhyq2eJo{2V|&*n>5e(<}RW6lAZ3&-~$lDTWA%8@p zp7S}0e0;vpjn5aRc@4}5Vg8atK0cQg=Y2TK$+0tLxk=&PX|&<0#1`fjVef zm%Y|#$r&+-JORNT86(yOZmo!NN#t6dmQ13#Zom@Gbpy(*wW=RsCbd{MVEvF5O1o&< z2(9QcwxU+zkS5;-=Or<;)XUgXdo52}8%!I`c^}4|^FEZ>f-4=(c^{@jT1baz+Q{d3 z^#6(vnHo=uUHbW@F>SA#)BHa!F`BNG*;BNlPY?kDW1}m}|jC zPUK@}j8bWXvk{~v(}thF`spS+r!`vSsOGQqyd=;IODojvMDu;v{8e+lB##Nwk;lpi zc#}%G=1WMUuf6?FO&UgX<|C^ zH5O@E-0^NilgQ_g!!4C@PM^J~%^|a=CXvq}s}IL$(rC#fYz2$;fbF?fvzYSSvos>t zLR}FpnKtq{0JVdhfns06wghrX zWD<2rjAH}!!iWh<;@$ID#`K&-UE1T=z_hFn$2-?^68YK$N(tx1RPSJqr9?F^ zRapXU^^rF6xeR##^cifHVt$-~E{Ud=&4lomNaXYF3(|}^dSsh#r%WQBZ#OOU`ZnKA znM8A*n(th#Gg2;@M01{+@7zX3+&S{fBWl~5?}K%l?}Kt)Yn$(b?Ul6beW<-^w!8dY zw!67KrlZ;J(uT!K?XGO(`+d+-^LOd*0j}8=^^FzXrt+0 z(T2rJ{*`RxYb-3I$We_TP(LKsd6iaWaxHkpw#MR1d+-3rJF}`!tVmi{EyV}1dVY7o)J5efG zj`KQS5?;&GD#xnlwf7p+p&k-8%p@9~lr%M!F;LvNNgnq`;$AWI)*mP(cOX4z#e zk``=;rj2~hHg-+Y-_fi}OnKbbDIc!6pPKK(W;wM>Q$(|m;`?B4Kv`oE#;Vyz@qI`O zu@X%p%w@Q}oSL&@t8IHZvl^A{zK>@A z!Fp$JP$g6~s@Z=qR#t1(cBzy!=VVB*Cu0mHGab!28EPrDNQYz+)^oD$!>Afs>}yF& zE{R-AF##=^M7~}t&(hZ@w)0j8^YvP*wTQb`dnMCGbF9X6aQ2kxkW8XER?AcCbAd#2 zewQ{lb4OZoNoYNLz;x$Gddb>8lKWU;hK*}8{@}K>E3u6 zWj!y6k#OUsv^+hUo|CZKnn$~xJGSZG@+i}B`m7n<2Rl4VPtQvtoEDh0JUyD8ld${M zM#HUNGrN~gRk*bf3AEzpHnE80vXRjJP-GX?r&$Z0tM|?!lSVee_|RXE_?>RbxC~ z6we`-L{rPtkV)9xnJj%uhoyWZmT5dEVRvVaWch;AMnKK0H< zXw<;|9Q_Ap*fdTMVdwRYh7!8gU$hwp&2wJRj*lt%(7zwlAm zV9K}qG3_C*AeTh0Qljyo-g$F;ZhaKjKQumX66~X- z#ql|5$&6KV&jjO+QR5$HP{vHiyd;L6bNz8?e~I<4s&}xF_nbzIxLRxd zt4bw$?G&r=tK%1LRy*;#8@@0-wezaYCE>L^9agYvnuOg&Hxllmo78>gD)fCJckiE+ z`a#Jhk!yKcG6}npZ8Y4~Hlw@o$?U`T+HPj|_&X@;c}a|f8|0+r>CyC@gxvwkUig+5 z_`B%C*X_>!1HChzm&8c)0I20@_U(91qUrClv~!%v`XQM_)8C~QeO%I#N!abDW*zVR zs`F;Xz7Mj}R1#jx)1!$d(OlcM)+q zyEZgakb??763=c1Vo zyJwWW{>S!bdk#NQV*_~ScwQ3p6RG8C`iXc>BJ>8!9;?4G@qGryJL=E%yd*gKp_cU- zNQY<;V->kh2k-VRYbT}l!~9bEsPaW~!fSaNGDaD+arq{%*#nYnX#C*`UlMa0`Yq7X zl8n&{ZQx)0`4Gu!AASAEZQyq`5|S2Z-?ooc7ry)V|0Wv>k(TPl)BLLnvb^zWv`GYC5! zysmY7l;SnaMMx|3Mq+iZ!tBVs|UTjTq&d^b_sj-bx%W1D5NCrnlrUN2lCG$Rv%im zFr`BwCGoc1L#)CLSDnr)fw=s%87UnKDTyB+Fg2e2+DwN+O5&)a!#5P+mboUOkdnA# zWNJLiy-6sfBs9nI|4m2>^gS0$jc3O<357t*6DQmpMj4O8%RpXzci?|h>!Xm8Sabi> zc-LCfhC)hWm#3%3+u&H*!Ql^D3Mq-nf0-KZh#+y<%JWkFP)JE=){yCV@@-G1KFSl) z0zG59t>gU-B%ZkG`zhrLftDwB*lX)>HZnc3yzDBZBqklTb-X7K>CFj+l*B!&w~n`{ zk+|&fkEC{2Atm9*YPk(hNDK5U*KVEecFGBbK+6+fdSL5#A80cj3Mq-Zp4qy-XB6e? z!vpuH+*L?Pz#i^0=KBaldV>lniA{H&mhLhgtFD^&(NszlQW6^D*6(~t8;QQm&Aa*yyrp?wuo#@dqu1l*H%mn&!&Y;m@3(N{K>B z!jHD|ckT&kfnM|2v_7R>A<*)~r~fdmu2E%aS4c_RHf_4A=S(+Ku8@*Af64T^Eh%j% zq$K>TL7s9?NDK512TiYAIF#MPHvW%P5)}e1PaJk)n4gQSXc;Sol*C5oPVduFE2Jd0 zT06Z@|DlkQIQGuzu8+FnuhUZfP)JGmx$r!%JRvR6Pdz-nPtU0kXnEq4|C(O+&ShRH zq$D=|)%4l}!25W|?`Ed{Tp=ZK{!7zqF9SZq4QDP+K7&F^;`vRs>Ep>Lq$K7{+9sW| zo#&N8N@9l@+teP}^C4D?*M2soLm?&c^sH@aKe5a!g_Oj>+i%my7gb0}tem}#^LM}T zyK_@1@g6d~Or2Wi=M(dkdo54H57s$%IiV25$`kUnJDu^6R}24X_vG)&ItXtMUM*MX@P)Oi<{;dtDl@Zt2O1)0s*g9x83CL+}n^A2tTu(6AJOa3mIOmZbTTX-nHGI zQ(k#OS|H%n>eSP*>Ju+bPU-N3v_QbC#cd@_d1vWUtu~|uB6_v)JY;wPFMW7H%3W_m zS|H$~>dfW-DVG+AeBS4&f7~dgLm~cmA;YW1?J-QpId`AhN=OR?yjt8)Q>PsNg+FiI zYe9xr%iC2@+MgJBFs0nbN?IV`qvCEB{BoXhPe=F|WKK)|cj-GF1&>sOrLYC~Ee@JpwDK`9SJ zs|{&^fRAc6E;@C6Ys#es0)DC12gj8wH9ulH@rH%b5BSM1iV^nMfczS=~f%k0s*hqT57}ye+cn5 zq=o13YOVhWJx*(^qy+*#s`XK{(6k{f5b#TFcJRQl$`X|g(>BpkQNAdwe&JTOg`)Lsa$zNS|H%n z(vtx(|A_-zZAc3Qyjt^?uHR>@HRaL*0k4)G8EjnGwQ-b>m9#*>tJOUwW7WBH9&AmA zv_QbCrDyqEuyO> zPa9$7C%q3(NDDM%>?k0CfAQx-Bx|k6uhHjurQZS}Ey-N-Lj8FCeK(|7X*Zs}@+6U!~+Lqh(!DyW8m)!F_hz84(|iy0zE^kV09Saq>zZrAl1oBo4p0kg|N07B zGKs0-oV!UXs_aA{X$!+ZyHvD?6w2Kk6WD;)+=U@HDGMw0JD~Hgslv^H> z*y`G))rLKJDzMkGwLWP-V>ge1lMJiKSo==k=QAmFFN;Bo@nh`PT#`mIf=0ArMLeFLHKsi_Cp~Z zqDh23kb|>Fc_z6Z5BhPmo|lBpC&b@PyDV&P90~iPN?%d2Ezyo0>|v2y68ch$Z3(}- zA}yIj@B(^}5RsNXqYtxvu?q0=!UZ{dtC+p7?(is@iI=RO&>oQONpq#ZYml@YlX>b7XfB)D4I5!=ljrx?fBI>RkG1M--kBvEg5$e zV=tE9RUGz>@BT8atsN^(tPX9D8eVCI#jT;B{UubSt0F|TYVxz0rr5j=pNJOJ>} zCORD>Y%GJg8*TgVn2x%yjiudog|WBv`_||ogE1o4^0Z{ysOv{;6HzDh9g80i>N$zJ ze#AFuTDHF#Y0`5Nwv#+~0Bh#C{ettlH>JJjd|ncmX_S_yQFi&9MBbk-O#7S9JZNFP zKNT$opOeV@b7`Ud5RG<)&q-Jdhc&p z40BUnz59O$(ti3gSMoUt^D;)driFe<^k{lcB6#6F`t3|D_nu>9x^o%bD9Iv^OEpdRwvlblO|yv8Ac{^(mw6|e!o-Pxe9xFUJ~%(q~&S&aC}Z8 z|NdiV_x*=jIM(K@Kkvx{@a-T{tDaiVX~Xt~tEK)_{EmgK4`g`GXo)^mmn$RGMp29H zIcdqXQJ3A=53;VUjW$sFZafS!c4Jd635+>S%hQrcY!~J-Zof&skLtu|tn*Ac>wlJ4 zwYQXOsTQgJTa60eG*rJooxTrR0Ojc5#XF^M`y?|~MvQh9g4B9iG6@?^uvE)eM`@SO zfYRP?{2?t*v#ywz(R?5Jb_qGnZ+MyOoPi8CPK7fE!q_>si3&kF_zp-*W;*gYfSueN zz?}45GD>^DIRI&~PH+Z+bw#_pleaX8n4lNdmq>`A&1Fz#tZep!=caC;fV}sLY@p(zG-K7@%XwmSmNs|a| zd&RbWB-SX->9Yo7E>yM4=0%OjwNM{LOQwz7zv4_hez%;hw^6DQUdzU^c$=bWqb?;q zm4*u+Wh+W=i89_Go|CYzGqG$ZP`7%lmCZbYu-Y00z^O8dCx;pE-nefY76o|lBzGT#vC5KW@lpEG~hBU5I7 zuJ>Vt`g7)$v|vLtZRBS_z!T1Y7ir3K*9dtNv>`3nkUiS4ne9AQEa9{#xg^*}eP;@_ z6!-r>>EODW{2faN_W{H;mP)HKrlqn3TImoGa<`{BGL#?tCT>CUwe&o_!J1%6v~S`> zk=V9Ly(bT*H!~@4WKX$DiV% z5Tw@Al9LU$RwPe`b=%g8_`D>%miaqK2kN}`0dzXec?Q;6>kUf3y*baol8E;K?;bWp zBUbq;vb-Xs+|PtS?)N=sK3}30Ui^}L(XlH3o>Ox&-k;;x0A-;)R`QBVuTQhic{;rJ z>Iu{jdHVecX<3behm5uDrN{g4IrF&%jl8|5pW9&VH1EZaSm?>X#>ro{?>SjJn*>@0 z&b@-@9A@8hdO})A2ip?u*!uF9?R!pzNJ~DP_uKPyctTpB*_XfuVwHc-sgW?XY^~7h zM{YyEh2KSAqFSqdg{36_p3}zXp71p)x1ryH4QWZ%&Vig@kIa716Z<_k$L()N-0&Ck zqz=*Vs%5~f?2|9izHsW3P)JGOPWOw>27%nozvpB~Nx+}uh^6^GrxDTuz2>DkeZS{q z2(&zL#e{*r-*YmgB)+}HK%cK56jBnq%oynVJtsp-;;uOZeZS{qNJ+eH_YkW--*Ymg zBz}CrK%cKt6jBmL9X;T_mGSRfAtiD9$UvX(aTHP#XxlLs#jodO*AvnLea{60eZCS> z2(&zL!p&jClD_90o9DmhWJpP@xqqPV_nZtViCvx^==(h%#IgOAO=o#D1?fX3^L!jk}9rl{r=LHeWHXPs$Zi68D`lukZJq3@M3? zE}Q4xxi2LODT&YBHP4l+{CiG@l!RZK$n#3S1wvYo*E}|_Pia?3NqqVb^ZI_z$&iw` zZQ6WS&wa`jQWEDcncw$&PKK0(U(LulNR*-o|7RZvBQi7 zeZS{qNJ%_BYeC=dIT=zC2XDWik1wi_k~lq_{%z-%|vyQ>)W?tl;nV`<~MXX~7=+UHd{I|DMwbX@P)O+wXf$ zBcufa{%*hTIgOAO2>84GzUMSTS|H%>_WPdG2x)=%soSWvzOIjc}m!Wa3Clum;7c#tB`%1`v&*=$ifq=hjUm|_(&-Oj1 zC!_@e{;qxPRPABkb9zErAfmt9`aP#7qy+;0u6^g#FXhq#!8su1RsKDvcA?nsf`Gqk zU!UdQa~dHn5b$d43pXDtS@&9y;ngm_0W&Pk?>Wtev_QZ|?e{&W5z+z?J=s3rb86p` z{VoXjyZyfBG(uV+qF0-~YRtdqG(uV+;P2YEmihObMo3HPuUW-76|yL zELRvCjmp30G(uV+;MH0^4_|tx z?{R#rqy-}SsC~ZYG#kUW-76^E? z)>8Y@uK0Q_$na{d{|G%!`Vz?#(gFb=)%vJ@Hlzgto~+Fd=HGKN#Q!d2c(vAZ=HGJ~ zAuSN_cl&+MX@s;uz~AlnJ*N@U0s()w-}jtGNDBnK+J4`28X+wZ@ORBy%D?9{LRui; z@Amti(+FvSfWO=Cdrl*y1p;0zJ{Q%~3$eOx!F6XJghva}@Y`>67JPOZ4+gx|@Lx1w6f z#qUZ>vUXsPRr&XvwwKQn+Udr;%D?9{LRzrlcLI)8`S+Z*pVkw82VFeLGkrO!-@@-o zOR{#0vuue%4qX@P9vlxf@^oM zk$=yrooDvDAZ%x5^LtJsq$R?3xB0suY}Lx|3bS=1=8_S)mZv3?@LzzUPH^XdwdaVH zo|lBzvi${EOI7^`k-u}UrCt;FDse5<{32ekRv9Xp)LRzo^8T)6LSIxCluF-pftE6q|&~M>)r6u`e`^(0A zv$JurmP#9*;F{;vEpL!(sU)NY8(jaCjpkZvli-?Xn+^RIepgzOu>-1Et~hf;8=l}S zPFwv@h<^8(Td$69kSnHbghEP!YpEdc&YNqgtf@X$T=PWA+t*S_NDKD3mI@oqvvIMO z+9WV*H1%i@&9iYCg5UKvxMJFta)p!x*HYUEg_H!>QbC|?zv+YiY+S6RHq*hiR1oNK z^0RTVmf9q^V%iofg_N=4ifJ36kdol~XImXqNJ(Jk<-XI}O1med1)3|SZ8j7FEl+SQ z6$J9Cxt7W{$`f2mZL^_}(gxR3+X#h}1lLkQpnf#hQk${jnkVuK>1eK{l8_ecaV=FT z&(FriT56NvifLOq6oTLNHn?KiMku5txc(`kxt7|DRh)S_uC0{lw_rnBkhzvB8)zBv z=R-<@E2eFPLP~;bsUYw^^0RTVmdbSaSV4aL3P+@|vqDN6Tp3lY{&BuP8y731O&eS# zRVnFC_h;i8AuZVBim7ZcrVjq!DF}D~{%l-NNDBm4Nk#a)@`SWNa5YnP zu(_7Xba;ZRq)JC~EtQ0{V1sL^B7Cf5-D^SSDk%umkNj+0tc=ozv_No`^#5icDpt+4RN9ah2(FTfXs)G_ke1SM>K7c5 z`MXL7QVT5*T=NvM-H1OM*U}*^5b!efP4!r{*GB$qT!#4Hh0Ik_*=Vk%G9A(a!BtWb z`PsN;Ls}rXN(!PbC22)b@%37exk@S<&9zjKiC32A}gDk%t*lKgC3Bcug_tE3|GvvG}(76`7A z!jplG{A^q!qy>Vjr1F-UYpG0!v_No`R5tRnam|LbKyZ~*HuAG^jgS@yuBC!#UrS}I zqy-}PcYP^QY4BQ*HL`$i+gd7ZNDBnlJT;DLuBDQYmWUfqQ%TIv#>HAuli(_8+jx+x zNF<~c(-gmOm5uytT&$%w39fmz+2C3#32DIwWLukPuBA2!u6fEvb1jvGv|xklpQ=&K zwN&<&p5U6NY~*L-V)d1Tv|xiPrn2Eni9)1x{2iPR;F_mw^dqDNnro@5wav9u#>x|1 zB}HjR&zYZ%i?vh|(t-`hmrj(8=2~i#;3_F>w6CR-kQQt}e)M71T7QBWPgUUQ2VA4q z_th*V+zIFjujOfe!>@e+@k|bU!yCV;W(xU@B6F0op7TxA-|z-P`3@~Rvjnne63w#{ zxcif%7s~X`m5%1w3DDB_u9QX7Mtv4iJfDHB4}X_^B4s@%QJ;kr2=(;*U1`CdXcAf% z24UaS@}x0*Q>*9tz7`ZmU-&J3c`GfR6l3R<(MEluLpWQ+z90sH)aq<1u4d_Ms`}K3 zKzJ=r^PCAg@g%?N*UtK2J?DMWY>9L>l@V++bdrv=5L?kqM|}oFOb2IZ&x`rPc~Q!G zUJ{x;g_b|dgy%u%o48oo>r;X4i&YR@iRC+&OdEFELaxPiRla}8BTM z-&sE-mjuoPv@fJREt!Nrp^0NM#+_qB%6eWB8ox5`(n2nXCJ{=aJ5yGta;e2(+10L& zlJHt~b{A~0z2dj8olbssG`};47IMLVO%9nhjL5aDu2{Vxk)IXDligAB?NmoQ(WNB3 zmYwf{7>Xv*JQs)k5=%Q}c>^V({ZP=-c`1}dldzKzban!N*Y`N;uS!BYb})zNX`P** z{-b$z8)qGTk0X1uVT5)9(T22OPc#XCI*j+ils|YkdR`LRZN~hOmd`g5>gF$@np@ zMtvn=BX|6+v>=Nn(LBeCdBwiZdTQ&PjWFLp`2#J;qG`j<<;-KnTFW#^E(x8#S*E-t z9mP4qh&yW0r07}TeMn9zuZdiXX9ts(Ou}j{e+zq{U;|p~c4xjxE{R-==fabgOv3hf zX)hO2u3cKp1@_eR!pnOBY>Z<*y!LxJqCVvYz2%fNg5)X9w4vuIR_Mc! z&q>s$c*K4XJ`Q#v;2ofK-sQcN^_+x1UCgv}1{nyp?Vw5c6HkyQ+D&6MDj#`;^F`gM zDyGHUC9M-yWTScBE88ozQAm@#e#WXkttXrgLqGAB7g*1w71I$_j=8D8)WQBW%@=XRhK%xb2KzwzW1Yrccd1kg$^bJ~rBhXQ5NTWRI~j z!sZhYcWFTuO~OWZ)_bW2`%y7R!eEThc#!E(-v=8U4=UxgPaRtZ^%KzIJr*pLl2fcI zoiwEo#LCl>N%;Dqx&|A(p@KFflXz*(((0&v7R8oYA+X_T$t3FYkR!oy4eN*M1ZX`k z3BQLy;~Lfv(IoP*!L+n0Vi zaZzGKN9~HK;l3r6IJ{^1RFY*QUw!pjo`$R%Ri3fM5d5wuR14Z;h2H`pEy?}%g-=Q| zUY_7h0&Vkf&{At4E!cpp7A}5ik?uZIh_p1<=Xwds*|#+E0f1sbx=y?*XXcE*-Mq@{AK7Nhw-JRvR6ko)ZmmnTE52Rp1E@M>;( zRCD3JBDyV8-nOyL10xT-xto1lCbuwxi8!ZX@SP=(AaC#wlAC^(DK9;;STA3`@$Jg z61W|D?{~DNTp=Za+o7>9t635iQWCfw8hgLm_JuQ~Byc-4c7JpBJl_}2kdnad&?~lT zi=dXU-&o( ztTcRgz@M?jkdnad(AXQve&QYws2`WD^k-}_q$J==aLkEx zqO-H z!WmK$(R1pvFWd-efyV97*q_{dg9?F`C*tkUYuX5flmu>v#?EZ!ZoV&^AteEO{q}`3 zq$F@VG;LrdBi|R!kdnZi%vMVBec?t(3v|34x;5nrftDw5J2Z0_WjEg!&XAJ8?a=nl zeb1?olECfIR<81W;S4DW+}qdwjfs8>gtQ>zcIfufu8@+z?a-`Icpp9;3MmQP4$XRA z5(+7acsq1!TcVJX;C)4Ht*9rY1sb9 zC4t+a+xriNlmu>vwmvG~7tWB9;7v_!d8OY1AuY(b9lE{eR7gqSc4+p_WnL+yByc-4 zJpjCqd|x<2N&>e-)5~b?3uj14;CASCPevgnf!m?!EtTm|NJ-#!XnJJLec=o#3EU1% zKe4o-kdnad(CxmcLP~A0n)`*qU^8Pja;JxmW4c{^- z1hMjjeC@V<;j|9I#|r-LHb0V$d|$W`(gF>CclTe4$oGXCAuSN_YG3y<2$aNpU$_y{ z0s*h~oXs(})Z7Z@ za8F1J1pM9clSF*tB|Brw6Vd_!ulCuMBK*E^Pe=81vUyy9n zNk@n$q=o02JA>+2mG2AJteX8U2za%3UnU#*zHlR?1p;2}E1wkM--oPwEy(a{7vBH^ z^&{UGZZ@O^0{-p+xBTC1NDD;tOZ)5#*Bqk#E(mzF2iyi5cpv$`a3iDzB6_uVC|3Et za3iDz0{-rgKQAKR7jA^Kl#YJ;!i_*`ZD05_XCvPiZUnqy!~{0rm-gEi&JbvMB6_tc z<@vsFBcufy{w{MDB{AO@ZiKWzz^mmuuS-d4OB7$P1sOgn%N18wbGvN3lH91eWQ-FK)|cD8kO%0H$qw<;MKC8*DXUzxsR2!Ktvxkwk2g> z>j`OrfM42gUpPbj??Q&ZYb{*9FWd-efq++Qt!Tb4+z4rbfLCiRwSOOquh)VMuh#mH z(Btd@3L&157M{aLwLYq!4QYXZCu^rhtw5z+zy zf0rH^Y~=gGjgS@yc(w2{@$SZ|d|$W`(gFdmmY(Hv!NxakUgyr(GD2D)a(~yC5|sw8 z1zF=A#_IYRze(!`o{$!Z&K=vhx$t~nxW!6ZB5W=^-xt1(+ZWE?1%bPTG55|``E=lS zwUb<0B5Y1S-xof^?F;Acg22u*t+?kSdfsfz)oE#ou(gSNU-*o)4(tisWQMg6rX$}M zZiKX8gLj{)ug&*`W6vG?K2P8dajfakM!qlH2x-9vZylEnpSuc?mez`J>o|6i&_+K( zTA+DPIc%VQPbs`qpmt{X1Id~ zHk$jwjgS^-$hPy$c1PPT1Za7$UtTS9$q29IY3vc^xP(N#M(_5$a#f!@TKWDZmjw56 z+8U(p1H}rzzctiuoU$EFNJrcQ7v@_bYX=l<7~!=%tvjkX!_w*0YxF(*7FO2zy|dp5 z$TfO>E$fL~%hQs}lyk+EE2G@$rd;qVyy+&)kh{5-t*df3gw|_ehphwBVXMg8vB&*) zwil1FGNP%a{fYV|63zRz`Of`mW|B(+HgJCw=Py(;m_F=*W<3Yx(;a^CK zwQ5}wxt6V;b!*H;r>i@WKta*T9{CXw&`z>Q_h zAAWB@Ip5uu@BP463Hn{p`rbfw&~Br(9Re{&-7W%^e8$QMs|QHA?FnFBX|F-7wS!m3 zTU^&FObK^*-dd-$$hZwD$Nw)^pl0!fRPs zLN16V5x!99ZP;^BXs>K%7Jk=ux7kjvlJHudF89MV?_S3Kg3-q5d-54N9V_j*mYwjY zJImQScRKan!PxF%#~;7W)E71MYVuaJ-a8mmt`MZ$(~_BTe~+T=EdZ?A4xRtac4Sg=d$fcD+${LjkxohDCV?i5_KyYOS?QT#NE%(>p6+K zrH(bqw9IdVJv}EeHN5jzeQ;VNY!?!HANlZkX*VL*^0Z{y2&KKala;=q?P7%&&MzuS zH1A}kmmw{rLo|uEtzBCE$1=2uwrdJniV2=eCgH#HQbmfmC|375)yCj--le2zE3%MYgM83Bc-(9gaP)vLb zO9FkZ;;tJ#NvkCy@w%A@_TG2Kv5_?WO00{$sd1E71jn&5Gmta0ozKCDj)^of&qybp0Gg#BQMYihWiTz? z6)&$}&q;)`Te0j8yOfW1FMI98y6g@oxg>He%QwqI68ZNAxbvRvu4ZnKCe5Rigw5|D zf20LjGzt4&4IZnl0%&~*HuStCY!wN=D=o;PNql0w8vNerXY>%V`k_hPLl&JI+mfBn znbe&ym$IIdczInlICUk6;jU?UdNe&Jk$=zGoO?q$G>cafHbaLPN(-`P*hqY2LpAuf zr=1bYE@JhzzhQfYxc_kmWj!ac?VqZ_S4Uzvrkq-gJ87l~&q*AzaCWud-piwnC$5^< zz4I9U?oYlwvAg)Kl=Ym%Rr6+7M|MFBcTH=wD=nl$&q<7pj4k`!>a(H^ANQv>o7{bT zdY&c{cMgp$`%5H-!@HH1#T_>EoWy$aS};>l0eCdj1nO{0yX?mxR~yG`{T7EGL-!TT9Jsvp3MGI_Md+ zj^l}3%jU(|e`vnF(+Tff%JMq>R#}TU+ zyA!*&-$~!+>Um|h&Yfh@38@e~zFoNE|U8A%C{{b?Izixa| zwdGkLaxG6wCb2{C;RfH?i8kO_Y5 ztbK71sfG0=UqpL88uLx#1f(2tN#t6dmQ2D{0nEF@JCB}4S~t*cbudPFEl<~eNxjRv z(+OjoientUbH;tN`|0;htj9RRNoK6V7^mVGC)ZMHeJ+p)9>6#~fYI*WZ=am}1nbp? z({mER%NVDZF`V^%Mq8gqBGmKoP|qt^R}YDI^W+v&x-<7+U#sUNLOmZ3^*j(>%hRKY zCShkl=xY)8XU(5>M>4iOVlnQCTa~}PjX4* zTAr3nqV93xJ4er=@``>*exja}sC%{eK1_@K5^45Vph-MG;iT#V|AKiR8Xk>>wo4}Q+sl_$w=U;OgF;Fg;{@w#YmY3x56fMS!ZhB|bK0oAzW6>g`a#^K z1zFEY4KN>b9lL#$C721-JSLU%G9Cq_%Hg{GMxt6CTlc>v8d>@(-LjKq+j?EyEsLNF#yq3);AxA`$ zsPih?&`44Fqxz`lB|$$?^-fyKbv!2#>R^v`aMaD*4ZD1^JR}k7V2^b$*Rpv(n*$_a zr}fwj9dbdtHy~@?uOz&dr#X(YwQbvLkk@VV^vil~L_V6Z{deWq;PYWlfBs6$>C^vU z-KOV6ztntGrsJ(|II!CFR1mqA)p`0W_$3mdAFS99nvVn8W)0ZJVE%zb=m#tIgSi%L zXhv8v3EKz2`9yk_^fEcOX!DFE(bV!ZWD<6QfX&w6J!?Dw86$7)zv^_1@LHa>aRP1F ziCH$PR$0=1hJ3Vb1WO#XJZ(f{kWg0#To|6b8;q@E|+lUu2lon*s zB=WrCtO0)Kbn70G|K9e7$#^URAaKKNkT(LnxUP0!9rjm4wKpCi6fZ zny3&kK}3)$U1SKufP^qelPV=Zs1gVS$m)TkO-dCUV2h37ZG=?CP-VpkqE21mR5Jz8R2?xdh?Ls z?d5u~JIW-&3bLgYq}TGaWD=$4uIPQR&XBLiVnvT0o|7oOgGCQ#T3mmSwlt9l>+=@Z z=Nwbj4=P8I3zBn!;|I$irLiA{H<2h;6Gb{O^Oi3IYYzEK^gJiHj-nQ4{qkjqCK0?J zEqXsVqnD3F??wB-Oy6c?!Nby`hlQ&Ky;oXDxoFxb_tlDaZuNC~u}da@Kw5%Eq*|Vq zOdDY?+TvU^O$Sy&8m}ai2y@XE=c3#nl$NCQbbwJ<`Sl(@$(XyX4eKS3KF-eCvztn&Us7 zTljqzue^P8-dxC?q2HyP6X?TD%hQrc%z9yJqq%wi2Hv&Te{I*CJZfHHW4|A77w$#6 zuCO6FC&E6t)AF=r5Zn)j1RIM^AJ9ClAMV5LZ1SEF+>_eboYDy2#J$7&cT>V^d79r^ z^48OoP)KfX@fia`zFipV?&ANP*qZr`0f|9KFF7b+M8b2;Q~=;y;0Cym?p5U2j8LAb8t~V)fFQAJxW6S|E523ka0QhpVhm zOGpa@?_p7_esb)6iP3$}#1hkQRu0ihEc@?EBLVV#+-sEfBniMMRP8 zGUc9-76{(9BI4zqVK=AGq5q-rb7#f!P>6poWZt#{8_3=H+pZsT*AvnL!FyN~ zt6?)vjk)UyX@S7X;_sJ;xZrE2*4mI32;Re@SoxHD8`1)?@AY9l*k37sa;p_$tQ6wk z3z@gAC|3Oj9vaKT6Vd{~dssy5`mJTPgtS2LwiTu0zgGHwEDvu(S|E6Lifs6ldqP?u z9vC{fIqH6{CepE1A^yFPdE1I?e7v|b#>x}Y0>Rr>L>&72D`Uz%AuSNRZAHZNufJSt zLs}qscZvv~a&JRgAa3p++?;oqQhwUl@5Oqh5dU7tyoW_LcHiaBSW7%1EfBnIMZ~go z&aAZ|EfBnIMTAd>w;?SMxAqQhE?XVxKpUKP@0QVqLi~Fn^L`fDSloVjEDuje3j}Xl z(HM2t5x0A6r>|36oOcJg7>A=5emr(-j`BGC?qF%UrHUJkeuLsDIid<#=rJj?0poH z6VoEZRzT#rtB{=F4J#rxIPAul z4u#~zTb=FAK{wW=!xPd1%{y6O19^qG;m?Oa_5^Qk5piYjO|eBOBqw+$i_&raM)P7i z6p|C~-P+zf_Tsv9ctTpBG55W5KgH_fe_jz|r4VR&f_JirxMbk0*v=J_6TFi}=@>is zr?KBvNKWkiNqckclk3vq32A}mEiSUb(qMTg1X`ZpEiNK%`Fv=Ml|pi2=r-Zr!K3S9 zqW78c%_-KJQR`>yv0Stec!n$))Ix}#QWzDZ0>q!T{=7= zEzrF8MK+c^b4-ktLZIad-r^$Sg7?>pu~JA*-1N%8<_&Cic`;TB$%(zg+Mti#r?{I2zvmSCl2QvY@0O8` zFI{y?jFm!if_KY^@MW%$oZ#IuB1Ye|PfUkGa^i`72D{PVqJN$pW912Hf#%&Zuz^u6 z^zC;cWxA&%) za)smsZ=;comA<)QOou{p;*dpy%ehaupP}{2^_$0;j3=Z8nzzx&hEIn=pydhPMpH*9 zBqw+qjZ%K!dE;Zs6_OKkR}FU?hIugJlg^MmAuZ6nzosr$3W1gP4w~R6K`01r!7Tb%^@vM)02+76P5+y z=xg?fo^4M^3-;(q2k~hjuDEUcSlc}zEfDmim-m;n)>?1fS{u>=K~FjejJ1>3_T=dJuWt^@OxQU}dq%ZWheGxNG>!`IM zEfDnYi@2oqY)pr@AuSMCS$y`A((&2!m7)!W`1eBQj(}`@K4-O99-fdE2<`}oKug4* zx9+tdV`Z`YYl_wE=bJIF6p|C%5s-~BJ?$|ao{$!3?g)rroER%lNDBm378a}Pd;T1A zS0VnrkhzB-8upF21XdQ-q7K^RA2A&Y@$ZGqT?g3+?IY%uC!_^} zdk7*%|6*~i4QYYET7x}Y0>NDe5x&elAuSMCS=d-R zZpJmyhC=*%A#C_c7(3kQNB;I)Fe4hOxH1+t93gEy&z;(0K0C;cZ9@1XdQD z`@qJ7yZd?perrsJC!_^}yAC44+$Yv{Pe=;{cO69dba+BqAh5E) ztQNXGt;2@Sh~=RW|6a)4r%+zKzQ@)v<(`lh2<}aQDCeSa_UZ{~fxs#w-b0_veLNv8 z5Lj7o-i{UI<+Im{^Ie7b_d>Rt>p@&LZHpKyPe=;{)+M~T9%op-I)9s58`1)SbqQ~- z|4Sg2o<205tnoIa1tPi0Gf8>-di|Qcv*r}5lsEeIEB1##Kt5vWoU*oWF!O;}9$w4S zkZqT2@R`4hHBljWuP6FV>(`vRDQx6(YEMWDG-U25g4m!nE7mK8NDJ?U-2aMx&3P|g zU1P%&(uzdfecfQU|B3Cq&|0Smw||h_vut$VdEb)#k-}$i^Czdt%BxAuSPh+VD@m{WO+2 zv=AaKychDTXRX$JbfRo9rdQ;Nu>qaP)JVTeCp9dHOugXLUO|VaCv$7lq zUq>h;C!PzZSnK?3LUMw;EpQm zPzbaj;J91b4|roH%>`m{$tP3GR7|nE7ivouH7Mz!^`QU-@)+ zLRz4?OAZ^zs}F9vJH|>O(DDTLyhXfzr=0{;NKSCi8w6^5$HsR?8w$w@?s+TaKl|P9 zIcEOSpt3pDq3~~e`%p+u;EZSe+Q1Xi0?j>d+3@L52(&!G9qhVvC?qGigIz}`Bqz8Ztyq1$;%{P^ zDe%x1MYq)&h!TEzsP-R;+G$VwIS?3W1gLY5%GlScJFQwzSQEEVJknsK_5HS zUdz*mzqdj7brtOiBaiV1>k5JFiN#Ad2*2P`M<^sGE?c%i_?4JCLLoVE$#NsYFVWNy z3dxBl`i%&`b^`*VL3+ZJAvrN^(-D21Ff~G2peL+3BK!sqPA61Pm@))fo>;iSi10f< zb>|rrk`v$EY()4iAra{bQ-K&M}*&9 z5^?4u{)8z*a^l9W5#hI;ln#HwR3SO>-mN3tnIhIh);DdJfgY&DYD^Hu8^Eq zWSH?u7CrlZV6GOKd*~fV}y$gi2Ag{Uh$ne`|$}1l$h2+G#6Gw*MS5vIg6Q&Hw ziPiTS8GiLmM0&!MAvy8>`6K%{ZK!vFkQU^7W{wQMMJF5S2~&pT#1~hG=QoHr=Usoo zlp#5B^D86!JYi~tv_RkX;K=6sH_3+2U4=l)6AND-8GiMzj!;NW^q(-woiIHxIbq6o zfshtt{N9M2FdhD;KViy{oLFh>s6Jw)kevAHlu<6_6ZY~aOc|0BkDoNEk22T0Ku8Pn z{YQ;*C77NtWk^nZ>7wvF){^vuDMNB%?o*@sXi<6>2x&q7pM|4bZBI{_G9)K1dv=s- zQRxX&hUCQFLr3@3`;_kjAuY(){d-i|&M_}ZPna?!CvF%t+VwuZ?kXfF&fa*m>*3N9 zrVPo6C-xcbMuYT(sS(lwz3wif%bpseT6)5iA<*)~ZikO9M+2mMr*Zy-DMNDNuX9HC zG1lr`AfyHPOQ(%?W0cP;h2+F)SB)-5PNd`fN9=^DLULl?1*6N+8R_`SFn_|7Avtl# zqS1YxFf~G2pkI1)bUA0pXRiu@mM4ySVYHjc_>?OoCsulEbU9l>%F`3349SVPtB&dO zgsBnI0)6(f(d8U2PlrOF<%#!J98=CLb3!3GvBBzN-0U?yVakx4xP6N;eazeSE)dd! zyzZJ~`j}HIBqtUR8`Iaky$s2TU5Ah9V{M?2oH%x!F~wR0rJb(TI11yA_|EW4T_c+_ z+O8>NjA;A3i0oS%o%`Uwd(lyW6Bkh6B|z&)m;AFx*c9mNDDM)2D0Jv zN+Hnl1jl(1SHE*(^j|3?Cps<|)tq^|Vs+}m17lu!LRz3XXOImaD}_MI6CCG7EV}ob zF;)u6iS0fd)qJQ&vGO)NAuZ6HGsuP~6apB8uZQV6s>!8t=+Iuw!{SsC8&^`ciFfuK)5qSnLUQ7vt}x4p`{xHnFY^#ahAdJWt^Avw1#Z+yV#d_El=|# z*R^F|vg3>Mq78*0R-WLwED$JIjA81WzZ`5emr(o;3oIm$^c6f+vTrt4X;+a)Rf8>IjA8#Nw4FhciXLsj=Y+ zX@TZBAlS&$p%7~Ey^wjTr!H0s$qAn7sUsAU6TGdft~?Zy6F8|b|KU19AvwXDo9YOK zKW9W6 z3dsrH&!XPPw_1hd1n*7(k=HAQ)Dc`q<)Z-zgwzrBdtQE@%hz`F!RPK;S00{_7VKec z-*}>kcg}t}=B_8C1p;%egTDp>DL?W4o#Tl{Pe=(DDSoC9O+`LUJNK zvwhRE6XI$@AvuB7%bAa=MP0MWMVl$*o{$!3tiqnWP$@rX_t#>XdqP?uu$tWQha!CY z@PxEL=uA3vQ(uNc{Cgq4v*(aL=ROR{iHEv|lyjfFmMA1Ao<3zrIg`m_rI4Ihd`4)S z#Y_fYmKALrEGhC*`U&kHx`qwXps zCveuFer@2(z?UHR?(6bOA+X^I?&{YO3dsrX(PKUMcF3!}&V3~M`V^8A+=;JSK`JCC zxUUW(Z?y`^3GS=c*-%JMaL2ulP)JU2m%NTpNKSD7ypB*vPROf@8kP2mo{$!3?zq?4 zPzba^$E;5wIq|_Q@--4W|^^ohIe|Bu-FctTpBAusozlS&)SzkfN}P>8hfUdUHG^Zw)uE|m}9%X3bT zHasCM5%=CC8^1sFm^g2T7DA+j_d>q&&<`f#ru=FNdO})}I6yY0uK4>nhby!~NYpBC z;D2DJ4}H0( zjMc+Ot{>N&&_al`@LtGMKL2p?fmh4Mfd{@2bJr8n60u~yY#k0-zLfe6NlvGRnpMErP~Vs*)JhsC^t z7DA+j_d*_Z!Y7lT>tE+p^MtfS9J7UN_*g*;A=1KoAiwbv8WVeaQTh`INFI9l%RU2*TuwKk*$0^aE1XNZ__`1fmVNDBnK(Q9uB0^`Tz z_VKlOB`pyA0$Ba-ey`ngJ6MGHbVv)&;f6y4jFJt;sTwP3f#8^^n&=5%Gkm?` zm-nhA$1lJACQ7+N@ZOwwdFnMq3EB)6TAt9pianoG5Lje z6)T@|Pe=;{yy{jHw|wjVS{u>=!Ee`OPr z6kC)}hqOTOiy`$4XO5Xyo4e8i!7puOW7Jt!*V>R42!7L|y8HG&XVlt|76^VlBI34_ zPN=mZEfDlAi`e;sqiStP3k3HgmAk&o72@9unfu&IxhE8o6FhfNM<^sGcr%H<%@{Lw zK%7~6LRz4CGl__YrrMbzPe=;{?->!{)8Pqef#AszrDLZzPq`D65ApAX%$rGMzh<+UL5W)cy%+n2B{ULjWAhC*@zUheZwsv{JV6Yz4cabaEERY*?g8#BZwUC}EfCl*Iv z_)8%j`wh2W8A}QCi^CUQ|0`pjkQVI0<8Ae->3(I*6Vd_!kGIub|0`pjkQNC0?(Vga zj!}EP8~0dz3Hq{u$Gd%RYoFF{X83k06S2Pj?kSqeefN|vV(1b-z4?PK_{ z&%`mx&tCoP3|{pKZ)y%V?wKQFIy@mQ*eks1uYrJ#?S>8B6!BvS&iHVBE-gHVSKVw3 zn}1O)AuSN_s^9;SVx{!wHl&5;@Tw18MRSI^%|FzpLs}rcf-(;+Po@TxEWu85tQLuv_W zfq+;2z;T*0Y|#2nZ91d{0$%m`M`;Fd^z4PTHlzgtUUi!@%xUaVyPA*|2>8OSzv`>Z zr3HdDRKBI)jjFXFEfDYDJh@r#@$$7@S|Sp!TC@Qzgh)#suaVQ5&3a#-C!_@$GJSn$ zQ6GKl&}c&;(vq)l!3WJ|z0cAU(gF?He3q}CG%}XCLZl_1<>E88X__b1mxm{$1sZbV zt+n2#43U<6uY(3|+cY1tx1o1|kd|cgA+LA#x-qYyg%D}Uhy3vc+lF6$mw)&1f4vxE zAy3+H_q;IQU3%i%aR#6eX=#s5zsX!J4^K!7 zH08Qc4c}lbe=w z$%*1?uFL9XGMK+6;O{_BX@vT^n9JIA`~32A}G*If3i zp%1p~rdv-)3j|i-JN^){LQUN5i=S);$%pv&LdN%B7ORW4zN?my7Kq|&uG+kkb*}}P zrveqL&E{<$^GYE(f$zUidzg;d>-|3Fl_#VH8eenO&qX~UEf752s94Q@VO&hPLi~Fn zyM`{v~`pxqy?h*{;OEyAXdFE4vFdTgtS25`!8EZ-MarbYGWlW5crzQ)@saK z^C!;z=(J)SlokkhCJ+AF>18cB?fz@y98Mwry^!(!m#sN>yX2&p4o^r61it^`x)v#) ze$MN6s?0qhEfDzr%ht{#5C20P2R$Jz5cvL!>vPz6`|UkyZAc3QzW<^R0K~t)d1-Ar zqy++BbJ5QL!so7!m9#+c{I+uU-H8X@rIahgzZWvT|1$5#A5I!xOGpa@zW<_!1>@j1 zHaw-4kQNAh|3xnjd>Lo0`@QJP@UfB>2z>uV&mDT|T@QXU)^;pPcxiCB9drTmG5u8O@6 zv=Ab#32*9l<8ZF;wK^M~pr64J2dE96d(Bm`FX2f*+VBK@4s|yudqP@>A!Mcl_3Ev& z_l@fhg-A>3pqHY~h9{&28uGcjDzC1aYd!#lNK55GzsA*N-|oxY6Vd_=dE<%7tEIP| z8OuW<(!%$ykm(7jv*8J8iLeo8y-kmZ{Vuc+A}xHe44J-@IvbvlmI#b?NOMo?gG<(o zHlU?(&=d5w)Yk0xATzcpOKAQXa6zA$`jHO@#KZF@yz=- z$2JHpgh&gw20*4qM>c$!dqP?wINwF@v(0B4#6A&P2$2@hIkdAuYs;`)weqzjtSZv_Np*2n1#s>F?bc zAuSNxHv)mYN`LRp2x)=fz7dGLCgSc#<&U&L;GV<2e(#PU{=Ja7(U|Q~I4B-!mw_UJEkrIkaCmI&>ZXdv^@U3GQa;mx0pXyE8&spt(1tSf#&rXN0ss zaBoUP`g?aqNDBmRM(peN?ik|V3z@rFvXTDYoe|Ok!QCto>F?bcAuSNN8PR^7EB(DY zhWPhF=Khy#q`!A(gtS0#|4T&rdv``i3k3JSM5MoWXN0ss;ATYo?X&dv?ik|V3zFLRuhj zGor=H|K6QK{CgqO`z0HzyWhL>gtS1=mn9;kBaUjGkQNAfyhIFo-+u4T6Vd{Kn-Q(d z)8D&eh<`6+`m$sr{k=OQqy>V$ED=6;W!-B*#?6SB^rt^d6{h2#XiU$QZKf&Jc{ zC!__M-Y*ehtc@!#Pe=;{y3LbnldhMfN19d9u5?}bbc8*Eg6@6HHmfuM&CMD_RXjF1)xde}hV_wG*m z%>Uk<5z+#odzhH!^_HD_-&NC3Y+UhVck%U!cEJ4^dVM{T6aJ*Vr@P|`d=l^6wSDij zfyWm%{P!_>FJh(VIl*sY7_086iix9|FRx z?ESkjB?yVX-KR%)$Y_GYy*ay}Qul9#?BGvM=WD@6GIk)2nWjg%%0)Gxb&tp0| zln&GCE>0xytU-5iazJMd+Si2RY3&o>fJY}UW^ z`U_JF8~*z-Bhs(W+S-gT>v*rxW{)?CE8~!^uBkcRQGOr#V(P|H+h!mPu zxBH6D?2$O(p6xp(mvz^lDNz~VO?pn^$9HbuaY#Y%REWwzT1b;<67L@NYR8W*XL(o& z!VApP8?d40Bo036)s6=)1>v=gprHM8|`)IL!_#EZ8k8B^^#dna9b0XF9r74-jtQV%Xnw$48%G`fnY2R~pCtrZJ zwHaaGh9d5smR#o5?4PtgKK9iPXxV%1>s370H>xB)2*gcYAW|()OD3_|p+~h&yAAskhn|5l zi3bAl?2=Ohk!pEbGKm*9?cX?U5&J8(9MJyUlAe?34YhFFqKETZ*6t81(IjSv(PqrW zD07~<;c1#~m%EnJIgx7F>7DN4^p4K^w6%qr*icQhb3~@)ZPSJksg|cDlei>|f$T*s zg?O(d{g*jFv*y~Hn(~@aprAhr; z1D>B+*uc1ib8m<{Mh2Zi)AOA0S{#>1bNtZhws1G+Q`>h;YCpcPfnHx<{i5g8$wNJ- zjTN5WzGF~9u-~N?#|+Z!cX^@_%)ck~Zyfm?)8Ws$18T6PMpJ2~Cf)>gKUUf8fRUaXb+(qHGxXv2t9 z%hQrcggz0yPq4wh1n0$I&+Z>!Po#Sd+SiD_yTbw07J&4^UX(~@JXT1iP{sU>! za}vKkXKru5!;UI!V1=bV(P|=BWIRs|X6Siyd#?^NCSR-ZUZc5g)9L88wqT<}He?;N z`dXhR#_HlQ8~g9lhG|*cVNcIVl(VIxeb{+Xj@0NsV58FeU`AHdc7;I8(~@c9n7?e_ zJF*-ySsh0I!*4vTj_wdZd z{4*adX2`Y=+*RC8xWH=}vW98_EJXjCa8c{MqJ=JN&!-Mzd@rM;j$U zU$L}2EjbcMN0D;7sgQA}J;oMq$_cNN5~SwL93BOrmG)9t*n`~h2Bt&LNwod>;NH8x1HyjW1@@!`Su}~=2Muif&stLo8`$Ssava~QUJY;3 z^PDL6=*nJHTCgFS#2%riUeNwnG2)gi(cgVQvpe3fO6b24YHMOn{tqN_M_LoJ@zA3Btc8(~}#kcb;4?WKbujOff(h1DBE}YTW`@QuG8+J;| z#&D!b&uQbVi)J)#y%U7j3b|0+`@r#BV>^k#p}+d_4J#D&O1%td)g{P!o)ccn`Y7ax zXc8CfyrARcOMh0BAkLJGzm_Gao)d(glNj~G1s%6v0wV2erG;3DCUI$N-_{X)ttJ}59Z=P9jh3)2nKq{UVpi{kUmRVe!~cqs^$h9nF1588!IKU< z&Swob+WHmR2yL*%HfZrhOt3Sm_9!_gQY}llrH{mFkL=r6_lNHl^-Aa7kZ-E5ko7z# zyq3*H5JS-4vR8F9Ok3oI>b5f;G|8l1Yp^YItMn3)>bp&;zh<=Nv^e<|UAG zBGvM=WD;RKZ*e^DDo!D2bjHa6jqQ?2gz>z^@tmg+q=nN7q9v1f;M1cUug#hj+6Pa0 zZuT$sQ8<~||5M61*NNvO{uqdB3Zknxxi4{X4Ook_GgE^=MZ zNrX|e5k}8Icr8!c+?PZs^9IX2&0UQEu$`7iDDwu(+{OvmlNMyrv=Qbd9h{e>vp$^b z!@34G(s^Q-mvnGm!ZU)@@^n{mcF5L3#)i|HSx}Ebmraa8yCUFiI+H=(MbZGzOa}wWQ`LX+E zJ~*>ThyR5<&GZmkJtq;?oA-rvXORxm>WW$@4?QP=^5&c&^p>%m^TZBoyR{nMgEQ{GoNlPXX+IfrZysJ1tqgIPkFKY9WNrZOZVms#v8fp1oHIq!@`YFe? zrX7E9G1lr`h&xWb40)b?iDVL;-#e~#-mM@~El*1(fps(e4Ayc$E47f-9&^HLdAgk2 zg?u9sW&jP&88~`r2H@AY7}b(FLrK_*7cr3*WYM${W&jz@5R|Dt#Kri`1ryZt$8njNVPmInMA0&4c1-G zidA1V_93S+TgGz|q3$+Vce{%3BiKGXZDS&dA1>OWF+Yqth!sYbS+B!?!FA2yA5hkF z5?B6Xi^h@|uc8f+i7a#v2P9;Yk%&^{V$ zA6BbjLt2p2+8*X5y_}b%-Vcr8AS5$ZVP4Y9d5IsxQ#$pRggJGKbLw;!Zr%@`5l-gR zC1IWvq+GLm$f6mmP_J67SHY7K*G@cDs`+j@s-dr9y-Kw_EtxigPo_nmOqe0XK8hY_ z`Dfs>hD;*(WLoseq*|VqOd`xn8l0Dy#}uhG&z*T#NrZVxgYy!v}S#D11)B`{8ctYA;uf=;7MqI$F+C5RD@L^=*ii{)?QAfJ<1Zpr!`7l%;?x%kD^1H=6{ zobTNB;K1hkm(hk~67X=s(}^BHAvvu#kw|^v1Dr2>K%6I{ohSXS^My-`?OeUx;-!2} z8)bPEv0A+Hpm2i`kqYBtSs8&-d);ijqqC5 zwpEX9CoWx|4{EM|6a5UT86dtoh0htQbbW4hNm?i;(Im{viJAVO=->U)MT4TRPtS7# zeo<+88h%keCy}l{2E{h0_aYsVNu=u!i`8Y%8ZDW`9)lm9bj%|&ixRY&2#?3WSmu&R z+&KKvNmC0V)$+7t66LzKs8Q^+n00B5&)dUoMwInDC$Qp`7S^(&vBu?d5~+`@ zz3@#Uf7CleMw_?!Rq7+N5kOifbJ4UBRue6*Kf2;~H+ZkU+5sUsCsHk}`?<16zu;+W zOMS2H&i86*QVeOs2>AC*>#_%omP{huA5=}m>@~=7f6&*&bbnAI@I){@M=5V4h_u+FA;p|6?XFu$01j+-m$@5O)m?)V9*8e>Fk!sl~ z3p-0eB0V!PD2{zzxkX*dS=4fowSfwqDiEC!h=hHD|UO$o@5f~p0H`%Fvw`h zB+SDSYW2*4v5#7PuYs}e(({~vPexjvhEImiOCnjTX~e-QY(Vspr6W$dR+ARiYND}L z<8#_b{fVJBi2g*?_CS<1KPN&=Vw-@!%xK9ZKHc%@j^X1DDf%nScP_Y%eH3OdQ*NNF z=On`JRR?CUs12qCU$|)O-H|4duAMdO!>TyU+lp1O%?3%NYiDWM+z_@!lSubc2ZXz{ z$~F;lSM3A2Yo3X8FI8GB1JW!T(6nJ*9QL)EAz_BB^-em!GNP-PM^nqwoL}QPZKQtD z_P8IRQbWoy8rV*Q5otL~3vEy|ZItJhT6mYAi&*btvyYs>YSj8Dqpj~Ek?yhB4B29Z zJr+NwPWM=pa@H%J-r+cCDepew;EqFgIj*R?XwS>dVSUwX66w=(#tObG_^=RST5RW} zvB$z$Es1oWGxR0JnBjW{+URSa(|RAgSF~i>Nd3D5uysCXxDH<(Xh#tFs2FXCn2znr}f`upyrVZKV60Rufgj zL8Nsz-RHD6AuXg_G;NgooJFhE{2W@g@(Mk5xe6mu?sFDBgF+A!PfI2d*0sG{*TTyg z)=TAD7BfAram#g7cupd$YkRq_B#57h|ZK;2hOd|A&z3dY?$CZ|)JWog2w->R}$^ZVxx8a$aKID2}Ljo)a8}>G9(DO4@u`B+_#L z<|)z$fHa{M;9Mt(vVF7=Vp?obJpIY_F2)iPp{BQZR*k-J&Z)TDtGQO1yJ3FS;#sv+ zORJP3R^{r2Hq!GY?csh}<`rff$~TN3cupccUm`7zAEYhcNL+o#td1EU9bME!wH(Am z^90Cxo)ccn+8t`5XcFmpIISi)Tjr@^TV;?adxoMs&@<@lF=E2gbZql@P9ojMu~n*h zadN*;x{qU?BCTbS4#~8U?xkwQ!r6dM5u_`YbT8HX-_kfGmyg5d0hGUq=0-KDm+ z>f8rfn)^@|O&jSxCsx0FFKY>9u8L)&x_0J!r3HJU`zjBo?n+Nk<>p(W2PpZyJE5Iq=!Et|3a!#aLo|a4^^ocEgkHb2u z9&We82gki4$vJ_2dDBAO6)l-W=-cDD*Hy0?98a$9yI^qii%QN3oO?AbPfI3|o&y+M z?xnKk+c|(C#ojH6^c(;~igp)jyS`~aZHG)Eor?}BeM^{Ssy$*Z>RVJg7d0*ZGAY}j zWZDS(oGqT&4ztNn&e{z{scFwsa!%kJyJ>k^GKsQ0irS9c)eH$aD*u(_oak&S1bO9Y z$t2RVAA{rGg!OPZ`@!cqVZ9}6NDH!P62Yt1(rGG-6@E8ia6F48IVVyrPfI2d{Gz?| zi-wUU>?qL}>U$sh!flOHoa!(9qN$drCDTTFzGO(bw+XNOkhte5nM8WN#I*36wfg=? zGKtV%;d{ujVD`bsPRew9*E3Kk^6#jM*=~`__>HiL`YfbfCSW{DGtkSib zY4Nv^*;l1Zd{UZ#b* zBw8|w>e_&@;_RL>XZ=ct5n3BC<7kgJngTHNM|zAD%wXmM`1duYfh$vYfi2W(%dydYfi2Qq=i_Crj6>kCBBy@ zk0{dzq}7BGI=4g{(kgnN4RGp7MAf&Hz85K{@1#n|w?rG#f(_YYI;wjtEJ1i^^~-7W zeyGf=do0XdX(3jkX(Ob=ed9jZedDgVug!yVf^#2!4amM-U&y0xhfJaz2V1fJlzXWd z$@n!7R~fduWCX`MX%+RVq$SfvI1kt2H={U{sFP-4&M9MY)K>2F~z;nqY>}HBo%hQrcq~GIcHNmxkd}LS~ zKqm3W3ASPHZ>uVm#B+9cD zO|YHQ7fM-klo%^~^;_65E&3_(YjQ}Fo|iWGrCyN^Ka$zVY2zb_>iNX7FL9%&XcATb zF5_;!kNmspuZ)m?H;p^eA(}R-eroo+){ELGL89uXX1}X310^V$MD=VfZSd4AWsM~{ z!5u#Q#u?r#Ey$utq~G0X)aOc1`?XjVLC%R(OY;QSkW3=|mQ1ysb5VWMfVpV$J&ya9 zj3FokwIbM%OdFvDd*##D-WIgfCW=^<`(HWXwfz2CYMy{xkW8Ywf6n}Y7Z|^z=ktw3b^n~@VYy2mGJk~+O!Z6= z-%CG!YL7OmXNqXUVkQ5+%A=h76n&z3aX8j$&nsP}8j)&wS~6o*{ceJBmmeQ_CBHa{ z>UR@NhqO?FqDfTGY}1B$=yiTVDNpY&(Jp|_Nzk5X+Nk=L&MbO3dWR@;y>n*SUm3x* z!II;kCEpTd(X>(Z!!ahzQKm_9PRI{OEza~vOD0k6cNur~wTzYIoKU|@E%vpfC6lm| zYnXM~wQm;vm#1LZX3 z)ic5@4{5=MXvV6#kHd6u1;H3fCQ;qTp%(XUNJ}PBJ$uerVLo@~ev~mI>pepCs(SXE zsg)LLjA+`Z`gb`RpoZgjaY0DV39WvpMV~Hd$t0@#28=sr-j)mfKUIHK-8ZltJ>{#U zxnfbutKVi&i(gkz=6=11>bDutD$kVML|HV`QQgO3%DJLr$|dK7_Hn314-09@By1&I z`d&_9Ot^MtIwa?W*3Q)8dYQCj64f&-BzQW7GS9Fmuc~KQ_+Dut-$c_!b^n7kTr~rP z)Pi6M$(Iz;m$?u~QtbUI}8$5YL znO}y9sD6(_8`47E70p;x&%Lrm@#HFLo@jM_ySsA$=Uy2TX`wVl(?<2%48B*j4}|2L z(6<@1!L#|KC6lP0zhXLgf{Jo_>ZN-Aiv5SQ5G&ENQJyI(=5QKWkfYX%^3251x2QbI zGev<&wLC4EHmctbGUZl+`nFFtj0od-@tq*^hhG3v)^pmZe(y{z%`6aGcG`8knld0H}ws?U-oNIxaZTr!EO&yrg7Q<9cU zqWXQu4aRl&l6kGM>gxB(P+2@BD4vFf%8q=Y5CSoO-M0H<{wM6SP)I`Z7s{7|@sewpK zu)2TF5=70IxRA7D+NkcOQj7biq$QK6?xmWIH7+z8kV#bcovEeS3(_H(M0MXejR|r$ zjaBtq8J0)kPby}}`rbe#Sp8Op<)OJDVkMces`@M~9YdaH43Q4VB+~n@7=riGPf1!b z3ETP6UJ652o+@RX)Jg-UsKKZ>&# ztvkZE6wgnWB8wm(LTcXNs6t+`AzynKr6>ML8jlx8|bNy&}Gs-t#&e z<=KxScQxlkYH@nw$a7d8dd^stXFrM(G%bDG#}=&TB+4E4f{>R3WniN-_gIp#w!Agl zYnhJ(F%(T3)$fEEcb>YZoUU<<&1`}`1#=7 zMu=(y-m6(LWIfLbujT3T+({hI%l1*!E3}+1u3)TeW|_}L%l1*k%4>OAGGkRezstNr ze=a|)@0#aMr++m@RrkDT!$viH)5H;uHmZAGw4qTS zDVI#bPA72O*6dXtL8L=+PH^1jnlq)-S~7mabz1vxg}aKUH+NfaP_t($en&6Niq9L^ zTy{QXJ*N#Lyq2e@N1DVdU4vQ!hV9(I@0C2U&*0{<7hh1=czVv@=AauX>v>LeHciXZ z-SIhz>NkoUWw4@KZVtyQ$t0@ZC{hc36i*@P8%2$3Yk%0?c-B4%x8Ry0O_FKDh*Zndl1YTzZKym}I=O!=gM;5$C6%VvNVPmInMC--<_09xr8oNZYrZ@c`7^zck61dV z$SXXDoD)?oPeUd#@Y54oOMcWA%ERIdd(VbbFCrw9I4lrdyMRcwEajFy5;tG5MdQrI zxKMY)sDJ1x&9%3@x=06d^vR{aF47^H#FwtxqVdfR5X^UJd0H}wHKy&;nEBg}!mW;- z&Hh*PYtDO-Ha`2fUvu~wkUN`_b7Fc7$!Wcb#IP|dHy&DV_aauP8B_0I++SaB)#kjD zDeHMobT&`Z$3BS?}3F$x`owqLg56EmEd~WT-2-aP%g?^rFm< z_}i+@i}zqTzk1ec%||Cv*7Ka`Y?{{ernC@SJttANs8Dw;zQ`Z6sNPv<=WLshNtCU& zsO?_MQf}!ZvFoI9tv`fTh4I5igU;q5iv~AmKbDRqIpMWD-5qHXWg9Gd2DG(N_p@&= zTG3&U%eEQhoS4p5TWWb)GKsQpFUmuG2HvZ72U*W^!fW|{#o8l@WuHIaG4k4jiuQq0 zyYn5kLEj$rJSVJmqST}XSu}}If(`b&oo?)7ug!kf`g{_hmNeM!rdk>;VM8*BTV81N z{3T46K@M5^U!$s|G>>0M8np6vYwL&{VsaZK(IWh z4HkKYQd7VC+}rJOtkv_J=xmx6%bfJ|_?$%bd?IJB=3(J32j;#x zVcr_7AT%q6ESkjeD<07}v-{qnr$(Mk-IV>gW){dR$vIKxNimaQj*8ZsNL263U^)ul zLh-dz==qBKGL(+$eHkFa8mH8PESfepe7Dgt{g~s6^3dpoxMMb;x~u0o;k9h+LyZwl zqU?7I8#Y_&bR(zDqH@A(*_;YCH13l4>Cl}UZ~S~vuwnB-XlXWy=aNa>yw=W*QOAKu zwKSW=bIBx5{o2lrYmXV!(!10TY9y0wjE^LmYwz6H_gD~o7e`KOsj_XYww#v~1oB;d zyNx)Uec(B57{R<^FUs;DZQ~V*a>Oa>uGSfd2}T*tOE`8V^Ae0|fk?GHEtxjLoVpd} z)I~b{dKoQPb6-8r3AS@;*?JkaMU$xBA(XFDb!&{;NA(UNwhy%lv=6OuX(P;iT4DWB zj2{mS9bC?RI^9@e<4R7XTAr3nqU;lkyiy8LmuytC9LWit;;6RDP`C6fq!VvBtu$5g(z%!P8@R*alM&WTh@F+na!CK1|si|u@R6S=50 zAm$}ne@Z41+IfrZobwWCd0H}wFu&^1{K{5E*6t81JawQxHuVv#BY>1|fFb?)=9Q5-xi7!G_ZrRFIdX)=2Vtc>@R*)(Yh74voie2Pz~dJdYp2C$gf;G5$oNHY$|MdA!~=JM z2455zGuK%`n`&uo);wtISOgDtNLeMxuo zp|0?y?=+_4ojr#%|Gpt@NG37pxaqB9zXhVRsgRu3n@FrP=b+a4EB?K(VMJ&1_AQ1q zXMTk?B$IgLnuA(b{^$9^hC*P&(~?Pq@w~w-}$hnm>!;@;VuyK4AadI{F&-BBj-#_-)+za9@F)v`2ME|B>6nB!Yp{j*Wz zmC6>ha@6NEiC-RjeCybUK%`opmQ3QP?Y3>bxc)jtIxOy~2SGju65CDQwzXt5h*Znd zl1Y>v;UZQx7vai6V@WzgHX_yXv}D={zSqRJq&2zunat;u6ZE~%pF}NBLncwq8A3YB zxj{M8*C?ZUg|RCqSg$y$rF1%SmaFZMyR5q$)zXncqXcb~EBc~56q3{F$QkNYgY~Mj z`G4mQi2cX1E5j{WWt*2w8~1k~-&piF)r>A$p+&V&YP^ZD^@~luV+GRUo>H z_e#stl1cpUy1O?n9lLT1Hij-A&dTpIt7vyCKR=-P=MKo7P03}f*5ADmT5TY@V@OWx zO(edx<+#SfSL2s3yPI!ywl_DqobR2sX?t_QiInx6L}&1v|1tPX@LtpMba#ACV#3C4 z9Y6T&gu=#6uY~WxU*mhX{TjprWdY%)Z-;G+H4n1}GoWz=wwrz}> zuuhS3UxKO`zQ&Lk*Vwi(cN~arR}<6n*PBS}xy`nX{YSDF#d|eoKui8z$s|I*+hD)T z`Xen*OC}MC1 z8mFy-c}ZvU&kF~{`HoWS^N>WCmozvpVPC@hNol<)iB(Zc5UUA~unnr+!G@magtboO zg0z$)Xw6BiihfspAG8pYqleO-WD;e{i+)!jN-cX)>nllwnPo#W%f)BlH>0d?=UmiA z1`=WR+R*G(;{mv}AC05x7=wgj0(bL(we!^X1rQ3y&< zF+rLnlPLSdA|2?-zW5u<8U3Kf4?WL`&Y~Bk7W+Zc>>u%*L^-o8au@SYj^|uiaHO`i z4~cU2T9hE>oYL~NWD?bVwNr}mgWd?p+E+WJj8%1CjauASBQ2RWs&lxL3mcrnL6-mF zaX;i#9gP|+k4!XKzJ=1mx?xD z(j=<$M8r;py&bERd1XCyn9s%0zaopVOeB+4GH1Mfu- z$GJNDcCOED^dV99qJc=YJS~|-@Jux1nb7l?s&tH)ab*!XG zY&vsLYxyCZQ~NPP??o=?c}|4yJYuYD%s`IlIf>H4QuMp!wC6a8Fy(RR%yz^>aLfoI~#@Z zUbP9x8rvDGffL$#4=UG#rsZjCDThS6+sJ9-BW;wUTG0m8au9dT zMIh@riE`u&gx9imhk7iUM0MYp4?m>;q!;T-UTTjgy zxz-|jPGZsYL5;J%4#I1B+SVc@s(xywgMMnt^gt^eM#xXixJwIZ5=|Rbe>>kxk2z)f z;bo)hZ>J4u!G>tsD802se+AE`{4nZqd{0E8^avOImDlpLWD?bL8H~H7Jd9Dri8Q67 zdM<<#wt5I$aL_W1ZAF1P`xVm=tC{h z*+JGTX(1h=X`^~(B7HC3#IqE#VT8_1(1x^NL-uGRj5yi3SK2T_C+lRx2(ym&@|0d` zk2cC#cu}uZ8xVK%Ojzw9QO@*>x@%fimrx#hPNI5tkm;~k>Fl7=VT7d+>EH=Nrb9Gs zRL{xKhV^h(vN@r1GJLPf8TLezsP56HGb9k{Y{>}ilY_9;FLGL|V%jKAg%vfC=V3TH zTgvmiDo>sT!sm}p(~#DiXrp=-C)Gl%Qlfem2ZT=Ykmgw&x7yCmg{NAcW~{>cyd-q4 zhcP79qD zb79o|rnA~`4Y-Gpgz-#}+>mGZJ@D9Ri?fXZ1hK|1uD zHjL0WCXBnZ)NZVnl)Y$S1AXoMhnaFCblO;XWrSJBdyUq&03ym6Sz&{-7oLqmk28B1 zWj$v)%2{7gcTG$4HV`_`qSI8>Gmz|k)QXT-l4-*Toq=Q<nqZs6e8}@f~@BxLhfc~)mR=_8>np5nsY)YvsmWRf(_9m%F($f51!?t4J$#N z-ct!0VYLD8HQLIbHmc{snOBx_&aY1Er@S)4auGJL9)K2P(X>%|IYVEfvk~lligo{C z>{le`gwDfJizh2cOD0jy6N|jU?C#EYm{%4noqAJV8DS|z42`xl(MCCP7U{s4x@>jE z1f%773)rtn&Ix@7MJ-QDCQ&_S$r_Hnws#hLBFQAmuLn91cZHyat5?Hw$&tvu^J0Gv zUxs=($uU;hcV1~~VJ}U2IeRV2gQwV7udF8O)SK#+5mu`accZNyx3zuxpA#Eryt4h> zh#$1JziMRj&O3RYdcCtpmf!zOZ$h5Yc1_XF`30Q_ua(n(-Jvf6A-O%!v(6K7@rqyG zTs9Pv6I(wpvN``Ko|;T!ucg1 za`0U>wm9&^J7fdzLWs2RUdS6y8r59>U7kou)8PqeiP-UnvT@|?Kif<;poI`=;k}SM zE*RCEc{^+%R&Bejcvl@EEfG&%2pbsvZ@>NZg(9GZ5NYAPkhlAARP&*px^#F#S|ZMT zR5lJd@|c(oXdy&ecrWDM14cLJ?^@n9 z7U(~HGP=3L`>4BU=imEi&)CitQfQU$g?!Oh#xyVfOI>YONKPEN&Y0%Lw}L=AZu#iu z*lHD$6CX9lG_NYYy92T2^mAiPR7g%-ci5Qbl;i4RrI4K1@BhX$@BfIWKYJSYbe$Vx z&rImBd>iK!rq7(uxPpmnAoNMP>Pq$X9keqn*sc~grf)ZTge^-w! zN+CJ%_l?K*(YJd-TA+7&cU;-SX%(zCs1Rs*V&ux>`{+d#k`o`SIlkmV+piCV=UQtV%@0bwQ|}j6}=-K;z*3 z=YL#FNDDMZqJ`Z`$0N_&8C#UMAuSLXiH2SxV*E2hH&+RILRug&65SZ?&VXJ|W9#Yt zYhxuX5Exg!cuE8~{2|2KkQSa}EID^q(lPUHueBj95Ex6=-bd+Rx|wo?`1eA_NHlAhY`psB zzhVh`LRug&t}HiFL|-;B4p6MN>-j}8e#{FY{=JYf5=|W!ZLIURm~y?#YstpZ z8#yAT!xNC91p?!Wvr#5Q?^3L!h36Q3EO$5j?g?>pR)~KuWQ;_XS0Q&}Iy@mQ5Exfj z9vGuuIs5LI4o^r61jZ7pyS_XW;@=AyBazjsH{Se8Y*C(&RzZZ3$m(uiHZb}?3k1dz z>#t7Q@}-y#h4}YE#zYU8mMD^ExZ1V$oj=b>kaEy@$p0)cVG`VyZGPe=;{#u8gi z{Jv>DgF^g!A!8)69`3r^PKjmi32A}ANMya}zkd6JSRS5`76^<)?5WWwp7ZgZF?T&7 zEf5%q>PH+;NDBm>+sf;jHQ$M~-4oIR(RR~#w;p_C?+a^VB`p!Q9^9z^k7HgzOY1>T z96M~IKGwCKkQQt}wsq|}_dd1>%H4-Z*1ERmq>ak;c|M-&T_B_-+1BTm^n5#}16o?2 zd*aMzHtNIA;0bBL24wmf5UamUx**z6h_vKqn7H-?=Px;TzYk-1ctTpBA=6)yr(7Y@ zlE37HT_*J5_wj_ZKtrbA2R+=^?!Pw1N+Hsc->184Lg5K(Yx^P)$F6XCY#*MG7HG)y zU%|%Z@1Gib28BpV9=1zQpHO<$J`2S4i_8z_32A|bOs^VjthngqXv2J#wyy%>jp8<| zQ_7i)?|l#=Kc%N3!w(DH)R&vuC! z8=jCB=t2&DaoV_S<(*@hDYcycj*_HoVp2lHA_mAmNh_u$;k~XxXTrELQNDH*~*htLVa<>>Og-GkkrQA!$ zj@i^Zeo<3PJRvR6+GC@Qul?z|=ucFLwD4ZYIt@|!ECGf;X>othv_xRvh{T@%+dt-& z?e?UEKbMh~xhJFr8}hv)E-9f9XLZIb|i@vg2Sf$nx3dxBh*I6yBgzE@}BqtVKx?1ovC|0laKPS!^6p|DE>_=LHo{$#kSDsic_)CuAS@vbr?Cq8bj9y~>LghFy+>?x}UZxuphazX*tM|@DkLY?oIjv!gRpVQe}6O1 zUKNrPb`lWn{Ktn{tM!DmKtKA_fU;-E)1eS(d19w`2b8@JY+U#4_hLE}k`p6W4!2wt zJsb#M<_gJ)57un&qZd_3P8>44z3khc`257igzv9-FYG`|A$7zr{~M!09xFe7pr3~p zX!P1VIZ)b|C>vfYr#a&68&dxNEj;%g5qcNi>uHP<%l|;J+WQZ`i@ECwX@SNlv9Mdj zJNrKt`$SJj3j{`qp_gbJoVM=Mv7LKDS|Bh=+*r&-kyp>Hd|qv=qy^%-Fn)aTlw$R* z-A=5Hm9#*h&!4?Su|huK4_d>=fG3*Q3n1AFRwS=?^ zB8(CnuZEdrUQ4`>T=Ew5zgtS0llwj|Jad3~Ve-+c=32A}AC}BO^Yfp95#!6Zs zFiNl&#ftu@t%h%*GWRy51p=c4M}s`CJRvO*c#f3?YsrOItr$zt6Vd{qFKw8+d;aga zwRt5i5w?zcW7SLJ3_xe=q&4qku5obwu6{k}32A}Wi9M!cpYM-~u~LY%v>x$X>8pQsRN zX??Emv6%8d{qeS#4o^r6v_GZS)0lS3x-nJ?k(T@n{%gRrFY$!5K-<|tq+{yOPmi%u zNYpC*CH_QwYQq!K0_{)frG!GHCBKh9L*F+cEztf1T}miKT09BJFA@30AyOW^YO!bV zME;GU-FSj>#2?HG9jAS_J04=UwDC;@j-P6@`-_nBc zTAuEXG>Nr7Y4om8+%IY&u)+0CYLCRJA2fQuUEWA)TAuEXG>H$xO+7u~4iltOe z_FmW%O`>{tG-uxCBh}r}oWr%XRqu}G>CfCpDo<)#TR2sW`*&N2mGy~so))J+^_;OX z!fScjkDOqtcP{g6ZQi=%d-VjrW8rCB>kSYqwPwbu{6Zm|l+|6Otl{S0)y=x}0kpLl zp}WFBq_q6Wv{AhenKM1}_3A!k&J&Atls71wcNsRk=T#j+itu?|< z-J&%8{8}_^RPVXtd1~JWOD0jh=Z-12kwN#|$;(;Y1z?+C-MyyhSGWtH(^Ry?{>p2y z3`nycUsKL9JfRSz+!HMSIvbvl7HF2H_Rp)k0NgY8L{Wm}9j0mDu6NI_37v3u^$++DdrQOr0?gG$;C+Od=v%y^e64HVV`ub&~x(iSxxC;Oq$SYqH z^)9?uT9Wx|9w4f_0JPx=_)c`|Xawrmw%Q4Jsrj=<5fO=dMC>g1-Jb8w$w@`ub&~x(mP_$EV}EViy1e z)@u7zb^)pcJ@<-Lbr+yYpx4&DwQ26^T}X$tAk){cbX0c%Xd@wlf5uMy`dR|d4MK7o z^z|zpo=`|m&~q=Mx(iUXK|hLGZFLubgtTCfzJA&8u~G=MJmF`rJ&o!vK-C7l^@>$> z7l4GcU{AAU#3wC5g+R*_n$=bbh2#W1_eyzn7oZv|ctz@4t=;hB?j1qRXwz>;I zLRzrFT>!<(m!PcwKgP~H%&w|R``3sd3PJ_~i5P4MNo9^9C<3VixiW|-gG|~YgEW(f zP!^#g5H5nK2&jMpQDTsQhzt%GX@QaD87kdZj~Jh!y%r^j+)|>$?E-!ac$Dec7n*0+5gvY;b*F#2;(B z03@UZg6sPtp142X1t1|U5M18}(Yy;lLRuhfG{`*}<%!pVtg!_7+9~S00JI@35LjEn zHx-$?^<4lG(h_0wsQNBIo#6Vud^lg`T-hQaE!g17z2;H%U4S~l^?li>?*fpJ7Hn|k zUN-8x0CfVZEqJdxbGN<=Ktfuu!Sxy0IQ7mZIC(4z(#`O|C3(u8Sl*{!JjGXmd0NU^b*Y}&eC9WHikQQukHB#yDwL~G(()V$= zzTafS6Vd|Bm3y^XZ$lx{;&+#{3m`wSz6-!!jk^H!GP%}I8?xYc0h$SZ3A6d;{duKF z#yj<&j`EqUPggZjRuFfu#hdp=uim>Cfe_H1;B9#k^_%x~f_LiAYlxMe1sl?myy5}b z@af<^dfM;=Z{9cA@PxErgSX|eB8<9Qzj@DctR6Xv}{z8%IBye*HKi1Mi4yk|}H z1a9z6+_WiHdKO|Ltx_&;-lOg|-@Io_^#t$NH`R89T|p2H}7d9AHcPcO@F-g6xEH1E`F9IW5GCm}7QiFfLi^7_qt64C;}JM|*!H}6SE z3k2`fi>TkcCm}5myi+g2*AnHT*MiL3^2*)%&3oF=b3yPHP-jk3P2#iE_&T{G6 z{N_CgX@TIKdU;FFUz^{&Cm}5mye+SE_>?QeKNm9Z)XTrBrJ4OBGJ#9z}1aHV|Jb$`&^PYsXM67s0 zHL-s4p7TLZ@J>B!jZDeD;++s^ejAAT9WU-R5t22?`gvm zyi?y~gE#LC^*cos3{Eg%iIEc;eS>rg8NQ*4_r#0UhYTf{cx>T^~I_3Osbu4w-bhVl1?7dM)g&zK%`opmQ130 z`*(QXE8i-P_i5v~JWU7LPHE;us+HfVw>NW-8THWc4&iHmNUhHwe||#0)5c#mdT4m{ zau9a@BBkv_GYS6h6vw@7U}SjgKNns%`J3(I-ZnI{X5)q7J*kxSdro*QPY*DC>6;yT9^a z|NSK~G-6twUKD>P@jvHw7W^)J-5NINk@30oODXI3oERE0El)3szmwQFeBpR~_|h?K zaCMORqtqg=^m|UExhpL^Ni>Pj(#vlav&^4ec-;!deRwS7PlbF#X;RLKV7;d0=@p^( zvA<48hiXHoEDzQt%B*9Z8UY)qiO}-2>X?WR&tKNRZs-$bUUBxrn5dkQSNffC8hHD% z{;!tAkgFw&qL!~ckr*biXoUV1ZO~_=tlx8DXvDNUy(s=pBGklT*2G04^kmZKA|3jj zM5yiMse6RTI^r%Z$od^br}*^xvE}^_qM-I>pfCOJnXTBqxTC8QWg5sL6&Wq*dBz zJUi$^AbY~j4x%RBJ&tcxftEsY;_*kvwvWFGu>$e&TXu*o$`jH8ot`%Q{ZHN-+lNA+ z<%#CAgV0h)PT1K&2&J?CI79RrH6FO7KGRJ@X zK}#VyVW$m|4(gLoNE2aiVmtQl=f>L39Q{1UkLpXopjrN(ulf>iLtl`DmZ$aAVCbf? zQbpsD^|WHdO}*D{nu#ISSbWrp0ID9A$R|>%0@MX&cIdOR3mObi~C!_`1e}ylNl|rE934Ozl zt#;jS#>JE?Bq!E=cgxUIHfL36apz1v8 z&!AZS;maS3y^klP1sY#{Z0>gz0xeJAySDiHalNNjNKW7jZPCmG}bGHC?=k`f2?fm_O$s|o`4K3&=))~ zp}oN=O2=W_@x32DL^1KiJ`Y|{rQD}O&k_wS$h&Smv3=|1Y_$qeOgyoA)#u9cP-)QX^8{pQ$p&Vu_4a|eEUZI| z^I8&^O)BN74X>5cXLcB?PVvLDFN%4kXEoVq&MQxFUdz0~jMd8gqgR|C^GYGGkrT~j z?g`F>X#;aytGma%WqNFb3W1HBVBJNlRc=Ac6P!EK2Ijcd2LJiVRk7|WM6_xF@;S&g@GtW3@hU`JD&FGFOOVqP~Q4T=iEz zuRI|w(3pR)r$##7{DbK+9SVU~PS~jCZFoZS8qk`_u;1-PNDBn!J8Qp<@dNt?uNJ$O zU)1p-{<)Ab_qpfi8VC2ecvhU(>RDb3GUh(JKBw{A$I27Z0)e>?zB2|c_+v(dG^L{MjHz8&xNcn`Z9O-|M{X@MwbFUKgamY?vZXhR|XxsWmU+2C>Il`juZNDBmJG9>ce#}m>5f!Pc53iYb9 z+orLnR)~KtWXyg3`KV$Q@~V-L76|_Z`%ZD|kNMReZ{2G_#_YxF)y@aLE0&-_asqRo zdG{$+p?g?pu#!SX);_t`U`mQIW1p>1dwn60XBio)8OHd*HxsWj{vKICEFP{?A z;R$Jhz)Xg%7B(jDa8XQ$C!_@evlsTFD8VJ~c`Djah<`3*|HbsOzgmg9<)7uXAp5Vf zr?uVNkQNA=8z5E(+{H62KEyv4GUh(k@A}%VXL&8inEP1YKJLex$C;NWqy++VAC4c` z4gcv0561q=6Vd{qxlesmH0%f@kb=Lu}gv@)%O*T9sEfM@e9?JZtx%?J{50Q+wMMBp5OzU}t=i*sjOR{}aZ^;|>j_J_5 zH>8ELm8D$Xkk%QNjSij`b2lL>EfMxkj-8HuF7}CfCx^7~W=+VvEiD_q%snA35jthj zDb79V=-6LD3n9|N8$u!Tesz-#Pe@AyzuSlMIO)#EW6$9C9X-K$o91etUOzUbTp@Zc z-gF9?H?k3{zXltJEd53FcfAcyYi>vndGoQmM8a$7xv;@mpJL^6S0O$okU59bTWCF@ zkeuL*OvEEk6|r6^Bqy-X=}wqdMxf;hY2kOy$Y2BIvF-P5R-_PUd4hM*Rpu8Re{+nL zC!__MGcu)P>}IFN{z@Ux@&tA>?Y*_%|Mt$&h9{&28oQbG_ttvrUJEkka7y_v?m8gG zN+CIcy-B{e7Cp5uK~G2vH0N+SnR&t8Yi|SPLm+#Ccih#(-MOdvS9(@Sly}_Om+VHSS7-OXnXnBIS*A=T94p|z@!xPd1&D-lD-a6rqMnYO3czeAm z9o~ktKybFCbeuow-k1)B_~%0AeRsv`SJMxV{jMjZ1%mh86{}q~`d93)JRvO*ycI7S zzC89?wtZYl+y27s-CEZ6ecXm+sF2y5NT;W@!S`;59czl?vvL5?Zd}Rt#(XM9%0`g))G%h3p8X~ze3#b z=R+iGr(wNy_DI_Nze{^b(-6c;*3-n(vo?7j(#>)rXMvCwSHxrQ^n3IS$%(TTPjmau=^nii(gHp4UDMk856XrwL4`oe6VHBWTKm8g zMWlQ549ST#8&B`KM{k6*K!4{C)7pFghiv#*DFj-cc+1mI1X`Y0@yqEhchfz3hUCQIeKUI0D?JN@v>+cbafYiUK2{3J ziC-K!qpFF>t8|Z^Avv+`yEA&UK|KqEv>>m(dWLIJ{YTjzy+U&0gokIiR-5k8GbAS- znm@BgFREvOkQU?>o6U5+kIyTGXTdiD;TKUn1(R=lTv_R`tE8^2B-gNJa(F5>=v_R-qD~aH@ zN58}q(gLAdtt9Xte+cn}wD3Dh^ZM1wt26ifRbiz-%O?i^FD5dU1ry48v&r}Ga_NDIUT56lWawQOAZ_kWM+ zP>6pnWZi>h%ELNC%qvew3j}UjG_PfNLRuhp-FkMIO(<4jy(FewA^y3LoA1~9XL&8i zXB{v*%!*{=iQDHzFI*uxp_{Yy-1UUCK%aiv>@d5-+7ecs=YC{V>=_gSEl*tenb~1B z*|Zv^kS2oXGO$MWjSGJjZGg~OjJl1ca~ZV3a~V0olN>l3^}A8uiK}YYPJ4FYqyzj- z6x@gi^N)Bd1;no3yD`R!A=L6T^U7#MGl-6YH)*q=n}~{@Mf2F1+)WCL5lRmWWHPl#OLuJsIm2v=AaKJQwn9 zC$3v~-7!rzJRz+}JT4mtZTO?OzFTUAkf;@&3;CYO&n?_!8`;=?>Q-^Y@r1NQES!E_ zl~+gaJul`Jv=AaKJQwmsuX%pq#K(B&C+&SaAuSQ}PLPfBK5Qptp@k4>;kl6afA#r= zPh8(*!xPdHaqM#0_~p@i#=L?SLZpS~LLMIb;=*G-DH{izb8k$!C!{6fiThy#zUbmF z{3w<=v=AaKJQwoV-CkPw;e%xZH5h-=5+N-SPpwlr&KUi`4@5u z*|Bej7DA+j=R(#UGo&}ISDuiT5wh{U5B??Q6}4!?6Wr~~Zx-WO3bE%hR@`rEA{3Gn z+&ya|6p|C%3u_`2k`vt7Y9bVp6Wph2A{0_1%6G>%5>-e}a1W`8P)JU2f2WC1NKWt` zTN9y>oUmJs+q`miasP9BmEW~AE!GlW{@g2u4UFf1d+xcop6Kh9wD2VEU^lHH`&cO^ zAb7*ADIE%-7H<8rCh}HV6QPit;2kp%Xtiip_=A>0a)Nivnh1sD1n++}#Y!PHqP!W_ zNK_#?!P{I-ghFzHx4D`Kh2#Wpb2SkP$qC-gY9bVp6TG!0V#f0AoZ#Io5iCEJ zph9wjce9#mqC%R8`nLh0rJa$S;Q2Dm2akW|zuvBTq77m|x4bS4bW!p5$sG6p|A>$tB`{Z}_)Z9tz0`o`4c@{1LBzfFLG!dK+ zz8doC|4x`4XI}nnzE1~MLilxg>J)Pe=>)u-anZyx(h!zUc3ILRuiOqGNCP z^JVS{X@TJGnR55-{WBYFNDBn_^hB(>ddo&aS|GU7DB{`ozu_H-8A5!lq=nzP|0&|y zooKB2X@THgF^Iek`qcWo;x3?K^`Y~Ri++hh@LW%De-J&xKi8jK z^!<5d`Gsz1DI_Pb?zikRjX1CAn-pz$LRz4)k7p~X-#ubotXB$wmM5_Pg*91}LfUE- zk`vgQx_c3bUxwO#$)4Nnq7qa{PGH4z{`ZiMJa;`IEzsCEns)+hyc}%&YVdur_fZJ6 zJb`sse)&C5hbN>3y4(edZ>>Wb@aIDydjdN&jMbANRzH30!5Axrf9a<0 zx>1eK0wFEP*r8$W{yErq_0hG_hC*@ztK3`*&r|LRX@S;CI?|h#xgP<%2Y~gzV0;`cPO=uz%k`q{sw71aGg35y-Ig!3o))NZJ39PU+r$Zq*q4&Vz>1kdm zBq!20#QIn%q((HpAr@MCLu^jyt*-T0DI_QGmb~WCKp{DyceK`RC?qHJj@CM%ketvv zT1kvqZ0kM>$qBuqwQfTpIiYv7)(M3)5xu|xyeG9Op?f)+GIl^Ie|5&iIVjBC;{_)Gx+$Y9A|UfxxQB z#jBg%2&54IT*z2qv3Cev__3E7W94bAqip?{Yz%HPx-qY$1sml$%Hxrk`Qt_#(gJ~X z6xu*}Y z7%ORkz&eV(|LW$0E^f3TEf9S3g7WINO>S@OeWV2felW*DbBPe=;{Rz;fMlI96%fxrrajkQCk-WJPTA^y3Lv5vyGy&-pxUNR=uD^ExZ z1mB9FcehR4=kP`w(gMME9Eeys?Se)^S|B)Y$8PwaLSEgzd|mXGe5|Aef+t7RYBlEg z5dU1rJe|@+C?qE^S2v&GQ_p=cmbpT50&4^I4!R#4^>D1a3dsqqgjku+eaE|EUMVCe zuoBYzzCMNI1Xe=qoq#^C6p|BKN2$-x>xAAKfz$XZb8my^=9iT|oSqANSYhe)W(tN_ ztZ0Ko)0&Jznh2fbP@L#3$-2eFY}h+FCfzb6uCVwr_oa!|9ecyy9ar8I`w~w`3-+*9 z!~W`^uxvvyyc46&OIS55IpxRV#cLE zi~W@+qy>U!l0l${Q~n~v6Vk%(Jn5!%ym61MVmcJ!p9>jlH8u`<8=jCB2%f)_jSc_v z)|d{3_~%0A>0hOM)N{Hiq*Cs-aM9vLi}?f^JFe;Ob)sG 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 b%6p*e49UK=9{Q?%WT%|XND^KDrcUR7;Z8EB literal 0 HcmV?d00001 diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg index e46fb38e57..ee77117a6b 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_draft.inst.cfg @@ -28,7 +28,7 @@ jerk_travel = 13 layer_height = 0.4 layer_height_0 = 0.4 material_bed_temperature = 60 -material_diameter = 1.7 +material_diameter = 1.75 material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg index 0dcedf664e..884ed5b3f9 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_high.inst.cfg @@ -28,7 +28,7 @@ jerk_travel = 13 layer_height = 0.1 layer_height_0 = 0.1 material_bed_temperature = 60 -material_diameter = 1.7 +material_diameter = 1.75 material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False diff --git a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg index d528e5f86f..1ecfe49c71 100644 --- a/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg +++ b/resources/quality/anycubic_i3_mega/anycubic_i3_mega_normal.inst.cfg @@ -28,7 +28,7 @@ jerk_travel = 13 layer_height = 0.2 layer_height_0 = 0.2 material_bed_temperature = 60 -material_diameter = 1.7 +material_diameter = 1.75 material_print_temperature = 200 material_print_temperature_layer_0 = 0 retract_at_layer_change = False diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg index 21169e428b..88805021eb 100644 --- a/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_draft.inst.cfg @@ -13,7 +13,7 @@ setting_version = 4 brim_width = 4.0 infill_pattern = zigzag layer_height = 0.4 -material_diameter = 1.7 +material_diameter = 1.75 speed_infill = 50 speed_print = 50 speed_support = 30 diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg index 60f51b6826..79d020463f 100644 --- a/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_high.inst.cfg @@ -13,7 +13,7 @@ setting_version = 4 brim_width = 4.0 infill_pattern = zigzag layer_height = 0.1 -material_diameter = 1.7 +material_diameter = 1.75 speed_infill = 50 speed_print = 50 speed_support = 30 diff --git a/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg b/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg index 51f5894885..2982c44d3d 100644 --- a/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg +++ b/resources/quality/tevo_blackwidow/tevo_blackwidow_normal.inst.cfg @@ -13,7 +13,7 @@ setting_version = 4 brim_width = 4.0 infill_pattern = zigzag layer_height = 0.2 -material_diameter = 1.7 +material_diameter = 1.75 speed_infill = 60 speed_print = 50 speed_support = 30 From a87465186e6ac4622d373112422ccc4bff368b12 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Jan 2018 08:19:31 +0100 Subject: [PATCH 732/764] Fix off-by-one bug when importing profiles with extruder stacks Since machine_extruders contains only the extruder stacks (not the global stack) but profile_index counts through all stacks including the global stack, we need to increase the length of machine_extruders by 1 when comparing. I also swapped the comparison around since I think it's more logical this way around. Contributes to issue CURA-4738. --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 089d513071..97391bfa0f 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -224,7 +224,7 @@ class CuraContainerRegistry(ContainerRegistry): # This is assumed to be the global profile profile_id = (global_container_stack.getBottom().getId() + "_" + name_seed).lower().replace(" ", "_") - elif len(machine_extruders) > profile_index: + elif profile_index < len(machine_extruders) + 1: # This is assumed to be an extruder profile extruder_id = Application.getInstance().getMachineManager().getQualityDefinitionId(machine_extruders[profile_index - 1].getBottom()) if not profile.getMetaDataEntry("extruder"): From 2e197f0f3480b7ee0ed82ff24d83d8f3803591a2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Jan 2018 08:36:46 +0100 Subject: [PATCH 733/764] Move all per-extruder settings Also move things that we didn't think of previously, such as extruder offsets. You can't enter them as a user in the interface if it was single-extrusion, but you could've edited the files. Contributes to issue CURA-4708. --- cura/Settings/CuraContainerRegistry.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7b21332ee4..008f3aa680 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -443,18 +443,19 @@ class CuraContainerRegistry(ContainerRegistry): definition_changes.addMetaDataEntry("definition", extruder_definition.getId()) # move definition_changes settings if exist - for setting_key in ("machine_nozzle_size", "material_diameter"): - setting_value = machine.definitionChanges.getProperty(setting_key, "value") - if setting_value is not None: - # move it to the extruder stack's definition_changes - setting_definition = machine.getSettingDefinition(setting_key) - new_instance = SettingInstance(setting_definition, definition_changes) - new_instance.setProperty("value", setting_value) - new_instance.resetState() # Ensure that the state is not seen as a user state. - definition_changes.addInstance(new_instance) - definition_changes.setDirty(True) + for setting_key in definition_changes.getAllKeys(): + if machine.definition.getProperty(setting_key, "settable_per_extruder"): + setting_value = machine.definitionChanges.getProperty(setting_key, "value") + if setting_value is not None: + # move it to the extruder stack's definition_changes + setting_definition = machine.getSettingDefinition(setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + definition_changes.addInstance(new_instance) + definition_changes.setDirty(True) - machine.definitionChanges.removeInstance(setting_key, postpone_emit = True) + machine.definitionChanges.removeInstance(setting_key, postpone_emit = True) self.addContainer(definition_changes) extruder_stack.setDefinitionChanges(definition_changes) From 16dfc094ebd4990fd392e45f3675e4705bd1136c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 2 Jan 2018 10:47:19 +0100 Subject: [PATCH 734/764] Fix version upgrade 30 to 31 CURA-4708 A merge mistake. No need to be there. --- .../VersionUpgrade30to31.py | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py index c87ce91545..8c5a160ff4 100644 --- a/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py +++ b/plugins/VersionUpgrade/VersionUpgrade30to31/VersionUpgrade30to31.py @@ -122,26 +122,6 @@ class VersionUpgrade30to31(VersionUpgrade): if len(all_quality_changes) <= 1 and not parser.has_option("metadata", "extruder"): self._createExtruderQualityChangesForSingleExtrusionMachine(filename, parser) - if parser["metadata"]["type"] == "definition_changes": - if parser["general"]["definition"] == "custom": - - # We are only interested in machine_nozzle_size - if parser.has_option("values", "machine_nozzle_size"): - machine_nozzle_size = parser["values"]["machine_nozzle_size"] - - machine_extruder_count = '1' # by default it is 1 and the value cannot be stored in the global stack - if parser.has_option("values", "machine_extruder_count"): - machine_extruder_count = parser["values"]["machine_extruder_count"] - - if machine_extruder_count == '1': - definition_name = parser["general"]["name"] - machine_extruders = self._getSingleExtrusionMachineExtruders(definition_name) - - # For single extruder machine we need only first extruder - if len(machine_extruders) != 0: - self._updateSingleExtruderDefinitionFile(machine_extruders, machine_nozzle_size) - parser.remove_option("values", "machine_nozzle_size") - # Update version numbers parser["general"]["version"] = "2" parser["metadata"]["setting_version"] = "4" From 2e4ffc83b53ee5275e25c0e0dbe457a8dfcec688 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 2 Jan 2018 10:50:06 +0100 Subject: [PATCH 735/764] Add material_diameter to fdmextruder definition CURA-4708 --- resources/definitions/fdmextruder.def.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json index 2b314cd6a5..3a59e7df1e 100644 --- a/resources/definitions/fdmextruder.def.json +++ b/resources/definitions/fdmextruder.def.json @@ -181,6 +181,27 @@ } } }, + "material": { + "label": "Material", + "icon": "category_material", + "description": "Material", + "type": "category", + "children": { + "material_diameter": { + "label": "Diameter", + "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", + "unit": "mm", + "type": "float", + "default_value": 2.85, + "minimum_value": "0.0001", + "minimum_value_warning": "0.4", + "maximum_value_warning": "3.5", + "enabled": "machine_gcode_flavor != \"UltiGCode\"", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, "platform_adhesion": { "label": "Build Plate Adhesion", From b246a102ed1332afc52eacadda0f34f610428f05 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 2 Jan 2018 12:40:43 +0100 Subject: [PATCH 736/764] Fix MachineSettings dialog CURA-4708 - Move material diameter and nozzle size to extruder tabs - Fix value bindings --- .../MachineSettingsAction.py | 108 ++++++++---------- .../MachineSettingsAction.qml | 58 +++++----- 2 files changed, 77 insertions(+), 89 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 7b407519e5..aacedbfbdf 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -7,14 +7,11 @@ from UM.FlameProfiler import pyqtSlot from cura.MachineAction import MachineAction from UM.Application import Application -from UM.Preferences import Preferences -from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Logger import Logger -from cura.CuraApplication import CuraApplication from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.CuraStackBuilder import CuraStackBuilder @@ -36,7 +33,6 @@ class MachineSettingsAction(MachineAction): self._container_registry.containerAdded.connect(self._onContainerAdded) self._container_registry.containerRemoved.connect(self._onContainerRemoved) Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) - ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderStackChanged) self._empty_container = self._container_registry.getEmptyInstanceContainer() @@ -67,7 +63,9 @@ class MachineSettingsAction(MachineAction): self._global_container_stack, self._global_container_stack.getName() + "_settings") # Notify the UI in which container to store the machine settings data - container_index = self._global_container_stack.getContainerIndex(definition_changes_container) + from cura.Settings.CuraContainerStack import CuraContainerStack, _ContainerIndexes + + container_index = _ContainerIndexes.DefinitionChanges if container_index != self._container_index: self._container_index = container_index self.containerIndexChanged.emit() @@ -82,17 +80,6 @@ class MachineSettingsAction(MachineAction): if self._backend and self._backend.determineAutoSlicing(): self._backend.tickle() - def _onActiveExtruderStackChanged(self): - extruder_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if not self._global_container_stack or not extruder_container_stack: - return - - # Make sure there is a definition_changes container to store the machine settings - definition_changes_container = extruder_container_stack.definitionChanges - if definition_changes_container == self._empty_container: - definition_changes_container = CuraStackBuilder.createDefinitionChangesContainer( - extruder_container_stack, extruder_container_stack.getId() + "_settings") - containerIndexChanged = pyqtSignal() @pyqtProperty(int, notify = containerIndexChanged) @@ -217,8 +204,8 @@ class MachineSettingsAction(MachineAction): Application.getInstance().globalContainerStackChanged.emit() - @pyqtSlot() - def updateMaterialForDiameter(self): + @pyqtSlot(int) + def updateMaterialForDiameter(self, extruder_position: int): # Updates the material container to a material that matches the material diameter set for the printer if not self._global_container_stack: return @@ -226,24 +213,22 @@ class MachineSettingsAction(MachineAction): if not self._global_container_stack.getMetaDataEntry("has_materials", False): return - material = ExtruderManager.getInstance().getActiveExtruderStack().material - material_diameter = material.getProperty("material_diameter", "value") + extruder_stack = self._global_container_stack.extruders[str(extruder_position)] + + material_diameter = extruder_stack.material.getProperty("material_diameter", "value") if not material_diameter: # in case of "empty" material material_diameter = 0 material_approximate_diameter = str(round(material_diameter)) - definition_changes = self._global_container_stack.definitionChanges - machine_diameter = definition_changes.getProperty("material_diameter", "value") + machine_diameter = extruder_stack.definitionChanges.getProperty("material_diameter", "value") if not machine_diameter: - machine_diameter = self._global_container_stack.definition.getProperty("material_diameter", "value") + machine_diameter = extruder_stack.definition.getProperty("material_diameter", "value") machine_approximate_diameter = str(round(machine_diameter)) if material_approximate_diameter != machine_approximate_diameter: Logger.log("i", "The the currently active material(s) do not match the diameter set for the printer. Finding alternatives.") - stacks = ExtruderManager.getInstance().getExtruderStacks() - if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): materials_definition = self._global_container_stack.definition.getId() has_material_variants = self._global_container_stack.getMetaDataEntry("has_variants", False) @@ -251,45 +236,44 @@ class MachineSettingsAction(MachineAction): materials_definition = "fdmprinter" has_material_variants = False - for stack in stacks: - old_material = stack.material - search_criteria = { - "type": "material", - "approximate_diameter": machine_approximate_diameter, - "material": old_material.getMetaDataEntry("material", "value"), - "supplier": old_material.getMetaDataEntry("supplier", "value"), - "color_name": old_material.getMetaDataEntry("color_name", "value"), - "definition": materials_definition - } - if has_material_variants: - search_criteria["variant"] = stack.variant.getId() + old_material = extruder_stack.material + search_criteria = { + "type": "material", + "approximate_diameter": machine_approximate_diameter, + "material": old_material.getMetaDataEntry("material", "value"), + "supplier": old_material.getMetaDataEntry("supplier", "value"), + "color_name": old_material.getMetaDataEntry("color_name", "value"), + "definition": materials_definition + } + if has_material_variants: + search_criteria["variant"] = extruder_stack.variant.getId() - if old_material == self._empty_container: - search_criteria.pop("material", None) - search_criteria.pop("supplier", None) - search_criteria.pop("definition", None) - search_criteria["id"] = stack.getMetaDataEntry("preferred_material") + if old_material == self._empty_container: + search_criteria.pop("material", None) + search_criteria.pop("supplier", None) + search_criteria.pop("definition", None) + search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Same material with new diameter is not found, search for generic version of the same material type + search_criteria.pop("supplier", None) + search_criteria["color_name"] = "Generic" materials = self._container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Same material with new diameter is not found, search for generic version of the same material type - search_criteria.pop("supplier", None) - search_criteria["color_name"] = "Generic" - materials = self._container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Generic material with new diameter is not found, search for preferred material - search_criteria.pop("color_name", None) - search_criteria.pop("material", None) - search_criteria["id"] = stack.getMetaDataEntry("preferred_material") - materials = self._container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Preferred material with new diameter is not found, search for any material - search_criteria.pop("id", None) - materials = self._container_registry.findInstanceContainers(**search_criteria) - if not materials: - # Just use empty material as a final fallback - materials = [self._empty_container] + if not materials: + # Generic material with new diameter is not found, search for preferred material + search_criteria.pop("color_name", None) + search_criteria.pop("material", None) + search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Preferred material with new diameter is not found, search for any material + search_criteria.pop("id", None) + materials = self._container_registry.findInstanceContainers(**search_criteria) + if not materials: + # Just use empty material as a final fallback + materials = [self._empty_container] - Logger.log("i", "Selecting new material: %s" % materials[0].getId()) + Logger.log("i", "Selecting new material: %s" % materials[0].getId()) - stack.material = materials[0] + extruder_stack.material = materials[0] diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 6ff70a1503..f89ca8473c 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -292,18 +292,6 @@ Cura.MachineAction } } } - - Loader - { - id: materialDiameterField - visible: Cura.MachineManager.hasMaterials - sourceComponent: numericTextFieldWithUnit - property string settingKey: "material_diameter" - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") - property var afterOnEditingFinished: manager.updateMaterialForDiameter - property string label: catalog.i18nc("@label", "Material diameter") - } } } @@ -360,7 +348,6 @@ Cura.MachineAction if(currentIndex > 0) { contentItem.forceActiveFocus(); - Cura.ExtruderManager.setActiveExtruderIndex(currentIndex - 1); } } @@ -397,6 +384,25 @@ Cura.MachineAction property bool isExtruderSetting: true } + Loader + { + id: materialDiameterField + visible: Cura.MachineManager.hasMaterials + sourceComponent: numericTextFieldWithUnit + property string settingKey: "material_diameter" + property string label: catalog.i18nc("@label", "Material diameter") + property string unit: catalog.i18nc("@label", "mm") + property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") + property var afterOnEditingFinished: + { + if (settingsTabs.currentIndex > 0) + { + manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1); + } + } + property bool isExtruderSetting: true + } + Loader { id: extruderOffsetXField @@ -495,7 +501,7 @@ Cura.MachineAction { if(settingsTabs.currentIndex > 0) { - return Cura.MachineManager.activeStackId; + return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; } return ""; } @@ -513,11 +519,11 @@ Cura.MachineAction checked: String(propertyProvider.properties.value).toLowerCase() != 'false' onClicked: { - propertyProvider.setPropertyValue("value", checked); - if(_forceUpdateOnChange) - { - manager.forceUpdate(); - } + propertyProvider.setPropertyValue("value", checked); + if(_forceUpdateOnChange) + { + manager.forceUpdate(); + } } } } @@ -548,7 +554,7 @@ Cura.MachineAction { if(settingsTabs.currentIndex > 0) { - return Cura.MachineManager.activeStackId; + return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; } return ""; } @@ -581,7 +587,10 @@ Cura.MachineAction TextField { id: textField - text: (propertyProvider.properties.value) ? propertyProvider.properties.value : "" + text: { + const value = propertyProvider.properties.value; + return value ? value : ""; + } validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.]{0,6}/ : /[0-9\.]{0,6}/ } onEditingFinished: { @@ -590,12 +599,7 @@ Cura.MachineAction propertyProvider.setPropertyValue("value", text); if(_forceUpdateOnChange) { - var extruderIndex = Cura.ExtruderManager.activeExtruderIndex; manager.forceUpdate(); - if(Cura.ExtruderManager.activeExtruderIndex != extruderIndex) - { - Cura.ExtruderManager.setActiveExtruderIndex(extruderIndex) - } } if(_afterOnEditingFinished) { @@ -641,7 +645,7 @@ Cura.MachineAction { if(settingsTabs.currentIndex > 0) { - return Cura.MachineManager.activeStackId; + return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; } return ""; } From 1aebe32ba6cf94d7a5df650a1845d103ee57e832 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Jan 2018 16:16:33 +0100 Subject: [PATCH 737/764] Fix winding order of left endpoint triangles Otherwise the left side is invisible due to backface culling. --- plugins/SimulationView/layers3d.shader | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader index 86a88fab83..95dc604389 100644 --- a/plugins/SimulationView/layers3d.shader +++ b/plugins/SimulationView/layers3d.shader @@ -187,7 +187,7 @@ geometry41core = myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert)); - //And reverse so that the line is also visible from the back side. + //And reverse so that the line is also visible from the back side. myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert)); @@ -212,17 +212,17 @@ geometry41core = EndPrimitive(); // left side - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); EndPrimitive(); - myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert)); myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head)); - myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz)); + myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz)); EndPrimitive(); From 43db2ee2f91242f7801521695ca1537413640dc7 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 3 Jan 2018 10:34:23 +0100 Subject: [PATCH 738/764] Added ElideRight for the text which is out of boundaries CURA-4692 --- resources/qml/SidebarSimple.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 62cf6f9d34..7aca25160a 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -340,6 +340,8 @@ Item text: catalog.i18nc("@label", "Print Speed") font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") + width: parseInt(UM.Theme.getSize("sidebar").width * 0.35) + elide: Text.ElideRight } Label From f6168c07f09a8d76e290b3616de15d077c9b1ef7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 11:26:57 +0100 Subject: [PATCH 739/764] Fix material_diameter bindings for metarial menu and page CURA-4708 --- resources/qml/Menus/MaterialMenu.qml | 9 +++++---- resources/qml/Preferences/MaterialsPage.qml | 3 ++- resources/qml/Settings/SettingView.qml | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index c1a1eea7a7..983d2f1b92 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -33,9 +33,10 @@ Menu { id: materialDiameterProvider - containerStackId: Cura.MachineManager.activeMachineId + containerStackId: Cura.ExtruderManager.activeExtruderStackId key: "material_diameter" watchedProperties: [ "value" ] + storeIndex: 5 } MenuItem @@ -207,8 +208,8 @@ Menu // Add to top section var materialId = items[i].id; genericMaterialsModel.append({ - id:materialId, - name:items[i].name + id: materialId, + name: items[i].name }); } else diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index c33cdbfc89..81c1bd711a 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -387,9 +387,10 @@ UM.ManagementPage { id: materialDiameterProvider - containerStackId: Cura.MachineManager.activeMachineId + containerStackId: Cura.ExtruderManager.activeExtruderStackId key: "material_diameter" watchedProperties: [ "value" ] + storeIndex: 5 } UM.I18nCatalog { id: catalog; name: "cura"; } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 5d39572647..1d4e1016bc 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -372,7 +372,7 @@ Item { id: provider - containerStackId: Cura.MachineManager.activeMachineId + containerStackId: Cura.ExtruderManager.activeExtruderStackId key: model.key ? model.key : "" watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder", "resolve" ] storeIndex: 0 From 6997c2d2dce03f0b85f17e1a3ef18ce319047ecd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 11:58:14 +0100 Subject: [PATCH 740/764] Add timeout for Jenkinsfile --- Jenkinsfile | 70 +++++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6408cbf9b2..20c7303719 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,45 +1,47 @@ -parallel_nodes(['linux && cura', 'windows && cura']) { - // Prepare building - stage('Prepare') { - // Ensure we start with a clean build directory. - step([$class: 'WsCleanup']) +timeout(time: 2, unit: "HOURS") { + parallel_nodes(['linux && cura', 'windows && cura']) { + // Prepare building + stage('Prepare') { + // Ensure we start with a clean build directory. + step([$class: 'WsCleanup']) - // Checkout whatever sources are linked to this pipeline. - checkout scm - } + // Checkout whatever sources are linked to this pipeline. + checkout scm + } - // If any error occurs during building, we want to catch it and continue with the "finale" stage. - catchError { - // Building and testing should happen in a subdirectory. - dir('build') { - // Perform the "build". Since Uranium is Python code, this basically only ensures CMake is setup. - stage('Build') { - def branch = env.BRANCH_NAME - if(!fileExists("${env.CURA_ENVIRONMENT_PATH}/${branch}")) { - branch = "master" + // If any error occurs during building, we want to catch it and continue with the "finale" stage. + catchError { + // Building and testing should happen in a subdirectory. + dir('build') { + // Perform the "build". Since Uranium is Python code, this basically only ensures CMake is setup. + stage('Build') { + def branch = env.BRANCH_NAME + if(!fileExists("${env.CURA_ENVIRONMENT_PATH}/${branch}")) { + branch = "master" + } + + // Ensure CMake is setup. Note that since this is Python code we do not really "build" it. + def uranium_dir = get_workspace_dir("Ultimaker/Uranium/${branch}") + cmake("..", "-DCMAKE_PREFIX_PATH=\"${env.CURA_ENVIRONMENT_PATH}/${branch}\" -DCMAKE_BUILD_TYPE=Release -DURANIUM_DIR=\"${uranium_dir}\"") } - // Ensure CMake is setup. Note that since this is Python code we do not really "build" it. - def uranium_dir = get_workspace_dir("Ultimaker/Uranium/${branch}") - cmake("..", "-DCMAKE_PREFIX_PATH=\"${env.CURA_ENVIRONMENT_PATH}/${branch}\" -DCMAKE_BUILD_TYPE=Release -DURANIUM_DIR=\"${uranium_dir}\"") - } - - // Try and run the unit tests. If this stage fails, we consider the build to be "unstable". - stage('Unit Test') { - try { - make('test') - } catch(e) { - currentBuild.result = "UNSTABLE" + // Try and run the unit tests. If this stage fails, we consider the build to be "unstable". + stage('Unit Test') { + try { + make('test') + } catch(e) { + currentBuild.result = "UNSTABLE" + } } } } - } - // Perform any post-build actions like notification and publishing of unit tests. - stage('Finalize') { - // Publish the test results to Jenkins. - junit allowEmptyResults: true, testResults: 'build/junit*.xml' + // Perform any post-build actions like notification and publishing of unit tests. + stage('Finalize') { + // Publish the test results to Jenkins. + junit allowEmptyResults: true, testResults: 'build/junit*.xml' - notify_build_result(env.CURA_EMAIL_RECIPIENTS, '#cura-dev', ['master', '2.']) + notify_build_result(env.CURA_EMAIL_RECIPIENTS, '#cura-dev', ['master', '2.']) + } } } From c8243a0dddd1fdc07edea8240c0de990a979fb26 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 12:47:09 +0100 Subject: [PATCH 741/764] CURA-4525 fix convex hull, changed size of object list --- cura/ConvexHullNode.py | 4 ++-- resources/themes/cura-light/theme.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py index cec9d3d698..02d8ed833c 100644 --- a/cura/ConvexHullNode.py +++ b/cura/ConvexHullNode.py @@ -64,8 +64,8 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_diffuseColor", self._color) ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) - if self.getParent() and self.getParent().callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: - if self.getMeshData(): + if self.getParent(): + if self.getMeshData() and issubclass(type(self._node), SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8) diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 18f2650e77..5b3e2f019a 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -394,7 +394,7 @@ "jobspecs_line": [2.0, 2.0], "objects_menu_size": [20, 40], - "objects_menu_size_collapsed": [15, 15], + "objects_menu_size_collapsed": [15, 17], "build_plate_selection_size": [15, 5], "objects_menu_button": [0.3, 2.7] } From cb1484ee63f9cba6f2210bdc3232b7af5e31f9bd Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 12:52:32 +0100 Subject: [PATCH 742/764] CURA-4525 update size and margins of objects list --- resources/qml/Cura.qml | 4 ---- resources/themes/cura-light/theme.json | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index ec9773679a..39834b88b3 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -383,10 +383,6 @@ UM.MainWindow { bottom: parent.bottom; left: parent.left; - leftMargin: UM.Theme.getSize("default_margin").width; - rightMargin: UM.Theme.getSize("default_margin").width; - topMargin: UM.Theme.getSize("default_margin").height; - bottomMargin: UM.Theme.getSize("default_margin").height; } } diff --git a/resources/themes/cura-light/theme.json b/resources/themes/cura-light/theme.json index 5b3e2f019a..53bef1e7d9 100644 --- a/resources/themes/cura-light/theme.json +++ b/resources/themes/cura-light/theme.json @@ -394,7 +394,7 @@ "jobspecs_line": [2.0, 2.0], "objects_menu_size": [20, 40], - "objects_menu_size_collapsed": [15, 17], + "objects_menu_size_collapsed": [20, 17], "build_plate_selection_size": [15, 5], "objects_menu_button": [0.3, 2.7] } From dd989a1a51be0854a47515500d016c13bda39ae6 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 13:43:09 +0100 Subject: [PATCH 743/764] CURA-4525 refresh objects list of all items after changing build plate --- cura/Scene/BuildPlateDecorator.py | 9 +++------ cura/Scene/CuraSceneNode.py | 3 +++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 36b89c5e5d..44372976f0 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -1,5 +1,5 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator -from UM.Scene.SceneNode import SceneNode +from cura.Scene.CuraSceneNode import CuraSceneNode ## Make a SceneNode build plate aware CuraSceneNode objects all have this decorator. @@ -13,14 +13,11 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr - # if issubclass(type(self._node), SceneNode): # TODO: Crashes on ArrangeObjectsAllBuildPlatesJob - # self._node.transformationChanged.emit() - #self._node.transformationChanged.emit() + if issubclass(type(self._node), CuraSceneNode): + self._node.transformChanged() # trigger refresh node without introducing a new signal if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): child.callDecoration("setBuildPlateNumber", nr) - # if issubclass(type(child), SceneNode): - # child.transformationChanged.emit() def getBuildPlateNumber(self): return self._build_plate_number diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index e68405daf6..9df2931f0b 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -38,3 +38,6 @@ class CuraSceneNode(SceneNode): copy.addChild(deepcopy(child, memo)) self.calculateBoundingBoxMesh() return copy + + def transformChanged(self) -> None: + self._transformChanged() From 7eb507484b326f23cb4e81d10e1313ac75d37b66 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 3 Jan 2018 14:12:45 +0100 Subject: [PATCH 744/764] hide sidebar header when in monitoring mode --- resources/qml/Sidebar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index db7851a101..c18bc072a3 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -97,7 +97,7 @@ Rectangle SidebarHeader { id: header width: parent.width - visible: machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants + visible: (machineExtruderCount.properties.value > 1 || Cura.MachineManager.hasMaterials || Cura.MachineManager.hasVariants) && !monitoringPrint anchors.top: machineSelection.bottom onShowTooltip: base.showTooltip(item, location, text) From 2f965cc05338625cfbd4326d2bfb5978e9d3e3db Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 14:18:40 +0100 Subject: [PATCH 745/764] CURA-4525 switch locations of build plates and objects list --- resources/qml/ObjectsList.qml | 128 +++++++++++++++++----------------- 1 file changed, 65 insertions(+), 63 deletions(-) diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index 761ff6d3f5..a924959581 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -62,6 +62,70 @@ Rectangle } } + Component { + id: buildPlateDelegate + Rectangle + { + height: childrenRect.height + color: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate ? palette.highlight : index % 2 ? palette.base : palette.alternateBase + width: parent.width + Label + { + id: buildPlateNameLabel + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 + text: Cura.BuildPlateModel.getItem(index) ? Cura.BuildPlateModel.getItem(index).name : ""; + color: Cura.BuildPlateModel.activeBuildPlate == index ? palette.highlightedText : palette.text + elide: Text.ElideRight + } + + MouseArea + { + anchors.fill: parent; + onClicked: + { + Cura.BuildPlateModel.setActiveBuildPlate(index); + } + } + } + } + + ScrollView + { + id: buildPlateSelection + frameVisible: true + height: UM.Theme.getSize("build_plate_selection_size").height + width: parent.width - 2 * UM.Theme.getSize("default_margin").height + style: UM.Theme.styles.scrollview + + anchors + { + top: collapseButton.bottom; + topMargin: UM.Theme.getSize("default_margin").height; + left: parent.left; + leftMargin: UM.Theme.getSize("default_margin").height; + //bottom: objectsList.top; + bottomMargin: UM.Theme.getSize("default_margin").height; + } + + Rectangle + { + parent: viewport + anchors.fill: parent + color: palette.light + } + + ListView + { + id: buildPlateListView + model: Cura.BuildPlateModel + width: parent.width + delegate: buildPlateDelegate + } + } + + Component { id: objectDelegate Rectangle @@ -113,7 +177,7 @@ Rectangle anchors { - top: collapseButton.bottom; + top: buildPlateSelection.bottom; topMargin: UM.Theme.getSize("default_margin").height; left: parent.left; leftMargin: UM.Theme.getSize("default_margin").height; @@ -154,69 +218,7 @@ Rectangle topMargin: UM.Theme.getSize("default_margin").height; bottomMargin: UM.Theme.getSize("default_margin").height; leftMargin: UM.Theme.getSize("default_margin").height; - bottom: buildPlateSelection.top; - } - } - - Component { - id: buildPlateDelegate - Rectangle - { - height: childrenRect.height - color: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate ? palette.highlight : index % 2 ? palette.base : palette.alternateBase - width: parent.width - Label - { - id: buildPlateNameLabel - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 - text: Cura.BuildPlateModel.getItem(index) ? Cura.BuildPlateModel.getItem(index).name : ""; - color: Cura.BuildPlateModel.activeBuildPlate == index ? palette.highlightedText : palette.text - elide: Text.ElideRight - } - - MouseArea - { - anchors.fill: parent; - onClicked: - { - Cura.BuildPlateModel.setActiveBuildPlate(index); - } - } - } - } - - ScrollView - { - id: buildPlateSelection - frameVisible: true - height: UM.Theme.getSize("build_plate_selection_size").height - width: parent.width - 2 * UM.Theme.getSize("default_margin").height - style: UM.Theme.styles.scrollview - - anchors - { - topMargin: UM.Theme.getSize("default_margin").height; - left: parent.left; - leftMargin: UM.Theme.getSize("default_margin").height; bottom: arrangeAllBuildPlatesButton.top; - bottomMargin: UM.Theme.getSize("default_margin").height; - } - - Rectangle - { - parent: viewport - anchors.fill: parent - color: palette.light - } - - ListView - { - id: buildPlateListView - model: Cura.BuildPlateModel - width: parent.width - delegate: buildPlateDelegate } } From a5630e5c54ef65e5dcd47d9a99cd1bb92da1acc6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 3 Jan 2018 15:05:06 +0100 Subject: [PATCH 746/764] Move all arranging related code into a subfolder --- cura/{ => Arranging}/Arrange.py | 0 .../ArrangeObjectsAllBuildPlatesJob.py | 4 +--- cura/{ => Arranging}/ArrangeObjectsJob.py | 3 +-- cura/Arranging/__init__.py | 0 cura/CuraApplication.py | 10 +++------- cura/MultiplyObjectsJob.py | 12 +----------- tests/TestArrange.py | 4 +--- 7 files changed, 7 insertions(+), 26 deletions(-) rename cura/{ => Arranging}/Arrange.py (100%) mode change 100755 => 100644 rename cura/{ => Arranging}/ArrangeObjectsAllBuildPlatesJob.py (97%) rename cura/{ => Arranging}/ArrangeObjectsJob.py (97%) mode change 100755 => 100644 create mode 100644 cura/Arranging/__init__.py diff --git a/cura/Arrange.py b/cura/Arranging/Arrange.py old mode 100755 new mode 100644 similarity index 100% rename from cura/Arrange.py rename to cura/Arranging/Arrange.py diff --git a/cura/ArrangeObjectsAllBuildPlatesJob.py b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py similarity index 97% rename from cura/ArrangeObjectsAllBuildPlatesJob.py rename to cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py index f062c2b23b..6409146ca8 100644 --- a/cura/ArrangeObjectsAllBuildPlatesJob.py +++ b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py @@ -4,16 +4,14 @@ from UM.Job import Job from UM.Scene.SceneNode import SceneNode from UM.Math.Vector import Vector -from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Operations.TranslateOperation import TranslateOperation from UM.Operations.GroupedOperation import GroupedOperation -from UM.Logger import Logger from UM.Message import Message from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") from cura.ZOffsetDecorator import ZOffsetDecorator -from cura.Arrange import Arrange +from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray from typing import List diff --git a/cura/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py old mode 100755 new mode 100644 similarity index 97% rename from cura/ArrangeObjectsJob.py rename to cura/Arranging/ArrangeObjectsJob.py index d650fd7f57..24db529fc1 --- a/cura/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -4,7 +4,6 @@ from UM.Job import Job from UM.Scene.SceneNode import SceneNode from UM.Math.Vector import Vector -from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Operations.TranslateOperation import TranslateOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Logger import Logger @@ -13,7 +12,7 @@ from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") from cura.ZOffsetDecorator import ZOffsetDecorator -from cura.Arrange import Arrange +from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray from typing import List diff --git a/cura/Arranging/__init__.py b/cura/Arranging/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 68213cfdca..51ec131b4a 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -17,7 +17,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Mesh.ReadMeshJob import ReadMeshJob from UM.Logger import Logger from UM.Preferences import Preferences -from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator from UM.Settings.ContainerStack import ContainerStack @@ -33,7 +32,7 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation -from cura.Arrange import Arrange +from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation @@ -42,8 +41,8 @@ from cura.BlockSlicingDecorator import BlockSlicingDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.CuraSceneNode import CuraSceneNode -from cura.ArrangeObjectsJob import ArrangeObjectsJob -from cura.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob +from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob +from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob from cura.MultiplyObjectsJob import MultiplyObjectsJob from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType @@ -77,8 +76,6 @@ from cura.Settings.ContainerSettingsModel import ContainerSettingsModel from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler from cura.Settings.QualitySettingsModel import QualitySettingsModel from cura.Settings.ContainerManager import ContainerManager -from cura.Settings.GlobalStack import GlobalStack -from cura.Settings.ExtruderStack import ExtruderStack from cura.ObjectManager import ObjectManager from cura.BuildPlateModel import BuildPlateModel @@ -93,7 +90,6 @@ import sys import os.path import numpy import copy -import urllib.parse import os import argparse import json diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 63a38993a2..f724c90c62 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -2,25 +2,15 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Job import Job -from UM.Scene.SceneNode import SceneNode -from UM.Math.Vector import Vector -from UM.Operations.SetTransformOperation import SetTransformOperation -from UM.Operations.TranslateOperation import TranslateOperation from UM.Operations.GroupedOperation import GroupedOperation -from UM.Logger import Logger from UM.Message import Message from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -from cura.ZOffsetDecorator import ZOffsetDecorator -from cura.Scene.BuildPlateDecorator import BuildPlateDecorator -from cura.Arrange import Arrange +from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray -from typing import List - from UM.Application import Application -from UM.Scene.Selection import Selection from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation diff --git a/tests/TestArrange.py b/tests/TestArrange.py index f3612c1ac7..1da8ff7ba8 100755 --- a/tests/TestArrange.py +++ b/tests/TestArrange.py @@ -1,8 +1,6 @@ -import pytest import numpy -import time -from cura.Arrange import Arrange +from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray From 62b06b063b8e0228d4b2ce28fe7823400c1bd101 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 3 Jan 2018 15:06:20 +0100 Subject: [PATCH 747/764] Also move other operations into operations subfolder --- cura/CuraActions.py | 2 +- cura/CuraApplication.py | 2 +- cura/{ => Operations}/PlatformPhysicsOperation.py | 0 cura/{ => Operations}/SetParentOperation.py | 0 cura/Operations/__init__.py | 0 cura/PlatformPhysics.py | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) rename cura/{ => Operations}/PlatformPhysicsOperation.py (100%) rename cura/{ => Operations}/SetParentOperation.py (100%) create mode 100644 cura/Operations/__init__.py diff --git a/cura/CuraActions.py b/cura/CuraActions.py index dbcd31f646..28e13e96b7 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -14,7 +14,7 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.SetTransformOperation import SetTransformOperation -from cura.SetParentOperation import SetParentOperation +from cura.Operations.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation from cura.Settings.ExtruderManager import ExtruderManager diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 51ec131b4a..4790f655f7 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -35,7 +35,7 @@ from UM.Operations.SetTransformOperation import SetTransformOperation from cura.Arranging.Arrange import Arrange from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator -from cura.SetParentOperation import SetParentOperation +from cura.Operations.SetParentOperation import SetParentOperation from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator diff --git a/cura/PlatformPhysicsOperation.py b/cura/Operations/PlatformPhysicsOperation.py similarity index 100% rename from cura/PlatformPhysicsOperation.py rename to cura/Operations/PlatformPhysicsOperation.py diff --git a/cura/SetParentOperation.py b/cura/Operations/SetParentOperation.py similarity index 100% rename from cura/SetParentOperation.py rename to cura/Operations/SetParentOperation.py diff --git a/cura/Operations/__init__.py b/cura/Operations/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 7aec519e6f..933d7c8608 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -12,7 +12,7 @@ from UM.Preferences import Preferences from cura.ConvexHullDecorator import ConvexHullDecorator -from . import PlatformPhysicsOperation +from cura.Operations import PlatformPhysicsOperation from . import ZOffsetDecorator import random # used for list shuffling From 08322d0a5ead26cfdc57d4ba168adf30b252b8aa Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 3 Jan 2018 15:09:19 +0100 Subject: [PATCH 748/764] Move all decorators in the scene subfolder --- cura/Arranging/Arrange.py | 4 ++-- cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py | 4 ++-- cura/Arranging/ArrangeObjectsJob.py | 4 ++-- cura/{ => Arranging}/ShapeArray.py | 0 cura/CuraApplication.py | 10 +++++----- cura/MultiplyObjectsJob.py | 2 +- cura/PlatformPhysics.py | 4 ++-- cura/{ => Scene}/BlockSlicingDecorator.py | 0 cura/{ => Scene}/ConvexHullDecorator.py | 2 +- cura/{ => Scene}/ConvexHullNode.py | 0 cura/{ => Scene}/GCodeListDecorator.py | 0 cura/{ => Scene}/SliceableObjectDecorator.py | 0 cura/{ => Scene}/ZOffsetDecorator.py | 0 cura/Scene/__init__.py | 0 plugins/3MFReader/ThreeMFReader.py | 5 ++--- plugins/GCodeReader/FlavorParser.py | 2 +- plugins/SimulationView/SimulationView.py | 2 +- tests/TestArrange.py | 2 +- 18 files changed, 20 insertions(+), 21 deletions(-) rename cura/{ => Arranging}/ShapeArray.py (100%) mode change 100755 => 100644 rename cura/{ => Scene}/BlockSlicingDecorator.py (100%) rename cura/{ => Scene}/ConvexHullDecorator.py (99%) rename cura/{ => Scene}/ConvexHullNode.py (100%) rename cura/{ => Scene}/GCodeListDecorator.py (100%) rename cura/{ => Scene}/SliceableObjectDecorator.py (100%) rename cura/{ => Scene}/ZOffsetDecorator.py (100%) create mode 100644 cura/Scene/__init__.py diff --git a/cura/Arranging/Arrange.py b/cura/Arranging/Arrange.py index 7691853f95..5ac0c09dc4 100644 --- a/cura/Arranging/Arrange.py +++ b/cura/Arranging/Arrange.py @@ -1,8 +1,8 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Logger import Logger from UM.Math.Vector import Vector -from cura.ShapeArray import ShapeArray -from cura import ZOffsetDecorator +from cura.Arranging.ShapeArray import ShapeArray +from cura.Scene import ZOffsetDecorator from collections import namedtuple diff --git a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py index 6409146ca8..859ad481d6 100644 --- a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py +++ b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py @@ -10,9 +10,9 @@ from UM.Message import Message from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -from cura.ZOffsetDecorator import ZOffsetDecorator +from cura.Scene.ZOffsetDecorator import ZOffsetDecorator from cura.Arranging.Arrange import Arrange -from cura.ShapeArray import ShapeArray +from cura.Arranging.ShapeArray import ShapeArray from typing import List diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 24db529fc1..f529543779 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -11,9 +11,9 @@ from UM.Message import Message from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") -from cura.ZOffsetDecorator import ZOffsetDecorator +from cura.Scene.ZOffsetDecorator import ZOffsetDecorator from cura.Arranging.Arrange import Arrange -from cura.ShapeArray import ShapeArray +from cura.Arranging.ShapeArray import ShapeArray from typing import List diff --git a/cura/ShapeArray.py b/cura/Arranging/ShapeArray.py old mode 100755 new mode 100644 similarity index 100% rename from cura/ShapeArray.py rename to cura/Arranging/ShapeArray.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4790f655f7..42bd70fdc8 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -33,11 +33,11 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation from cura.Arranging.Arrange import Arrange -from cura.ShapeArray import ShapeArray -from cura.ConvexHullDecorator import ConvexHullDecorator +from cura.Arranging.ShapeArray import ShapeArray +from cura.Scene.ConvexHullDecorator import ConvexHullDecorator from cura.Operations.SetParentOperation import SetParentOperation -from cura.SliceableObjectDecorator import SliceableObjectDecorator -from cura.BlockSlicingDecorator import BlockSlicingDecorator +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.CuraSceneNode import CuraSceneNode @@ -62,7 +62,7 @@ from . import BuildVolume from . import CameraAnimation from . import PrintInformation from . import CuraActions -from . import ZOffsetDecorator +from cura.Scene import ZOffsetDecorator from . import CuraSplashScreen from . import CameraImageProvider from . import MachineActionManager diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index f724c90c62..441d4c96c3 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -8,7 +8,7 @@ from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") from cura.Arranging.Arrange import Arrange -from cura.ShapeArray import ShapeArray +from cura.Arranging.ShapeArray import ShapeArray from UM.Application import Application from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 933d7c8608..06d796eed5 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -10,10 +10,10 @@ from UM.Math.Vector import Vector from UM.Scene.Selection import Selection from UM.Preferences import Preferences -from cura.ConvexHullDecorator import ConvexHullDecorator +from cura.Scene.ConvexHullDecorator import ConvexHullDecorator from cura.Operations import PlatformPhysicsOperation -from . import ZOffsetDecorator +from cura.Scene import ZOffsetDecorator import random # used for list shuffling diff --git a/cura/BlockSlicingDecorator.py b/cura/Scene/BlockSlicingDecorator.py similarity index 100% rename from cura/BlockSlicingDecorator.py rename to cura/Scene/BlockSlicingDecorator.py diff --git a/cura/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py similarity index 99% rename from cura/ConvexHullDecorator.py rename to cura/Scene/ConvexHullDecorator.py index 50fa8ce7f6..3a563c2764 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -7,7 +7,7 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.ExtruderManager import ExtruderManager -from . import ConvexHullNode +from cura.Scene import ConvexHullNode import numpy diff --git a/cura/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py similarity index 100% rename from cura/ConvexHullNode.py rename to cura/Scene/ConvexHullNode.py diff --git a/cura/GCodeListDecorator.py b/cura/Scene/GCodeListDecorator.py similarity index 100% rename from cura/GCodeListDecorator.py rename to cura/Scene/GCodeListDecorator.py diff --git a/cura/SliceableObjectDecorator.py b/cura/Scene/SliceableObjectDecorator.py similarity index 100% rename from cura/SliceableObjectDecorator.py rename to cura/Scene/SliceableObjectDecorator.py diff --git a/cura/ZOffsetDecorator.py b/cura/Scene/ZOffsetDecorator.py similarity index 100% rename from cura/ZOffsetDecorator.py rename to cura/Scene/ZOffsetDecorator.py diff --git a/cura/Scene/__init__.py b/cura/Scene/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 30b62b59aa..727bce2112 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -4,7 +4,6 @@ import os.path import zipfile -from UM.Job import Job from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector @@ -17,8 +16,8 @@ from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Scene.BuildPlateDecorator import BuildPlateDecorator -from cura.SliceableObjectDecorator import SliceableObjectDecorator -from cura.ZOffsetDecorator import ZOffsetDecorator +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.Scene.ZOffsetDecorator import ZOffsetDecorator MYPY = False diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index cd317027ee..fa5d6da243 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -17,7 +17,7 @@ catalog = i18nCatalog("cura") from cura import LayerDataBuilder from cura import LayerDataDecorator from cura.LayerPolygon import LayerPolygon -from cura.GCodeListDecorator import GCodeListDecorator +from cura.Scene.GCodeListDecorator import GCodeListDecorator from cura.Settings.ExtruderManager import ExtruderManager import numpy diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 6fc362725e..7a716d3b2b 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -25,7 +25,7 @@ from UM.View.GL.OpenGL import OpenGL from UM.View.GL.OpenGLContext import OpenGLContext from UM.View.View import View from UM.i18n import i18nCatalog -from cura.ConvexHullNode import ConvexHullNode +from cura.Scene.ConvexHullNode import ConvexHullNode from cura.CuraApplication import CuraApplication from .NozzleNode import NozzleNode diff --git a/tests/TestArrange.py b/tests/TestArrange.py index 1da8ff7ba8..737305f638 100755 --- a/tests/TestArrange.py +++ b/tests/TestArrange.py @@ -1,7 +1,7 @@ import numpy from cura.Arranging.Arrange import Arrange -from cura.ShapeArray import ShapeArray +from cura.Arranging.ShapeArray import ShapeArray def gimmeShapeArray(): From e0c2a9e4c7780addc043859369edad400b63a1b0 Mon Sep 17 00:00:00 2001 From: Ian Date: Wed, 3 Jan 2018 15:13:56 +0100 Subject: [PATCH 749/764] Fix for CURA-4111 When centering a scene node, TranslateOperation is used in lieu of SetTransformOperation, to avoid combinations of mirror operations behaving like rotation operations. Instead, any given node is simply translated to 0,0,0. --- cura/CuraActions.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index b51728f028..7343eef156 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -13,6 +13,7 @@ from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from UM.Operations.TranslateOperation import TranslateOperation from cura.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob @@ -54,7 +55,11 @@ class CuraActions(QObject): while current_node.getParent() and current_node.getParent().callDecoration("isGroup"): current_node = current_node.getParent() - center_operation = SetTransformOperation(current_node, Vector()) + # This was formerly done with SetTransformOperation but because of + # unpredictable matrix deconstruction it was possible that mirrors + # could manifest as rotations. Centering is therefore done by + # moving the node to negative whatever its position is: + center_operation = TranslateOperation(current_node, -current_node._position) operation.addOperation(center_operation) operation.push() From e7e5729006c244a3cc1fec88bb1f659eeeabc8e9 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 15:21:56 +0100 Subject: [PATCH 750/764] CURA-4525 deselect after move to build plate and build plate change --- cura/BuildPlateModel.py | 1 + cura/CuraActions.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index 118a5ce271..2d558a91b9 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -28,6 +28,7 @@ class BuildPlateModel(ListModel): return Logger.log("d", "Select build plate: %s" % nr) self._active_build_plate = nr + Selection.clear() self.activeBuildPlateChanged.emit() diff --git a/cura/CuraActions.py b/cura/CuraActions.py index dbcd31f646..a55ef66e01 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -153,5 +153,7 @@ class CuraActions(QObject): operation.addOperation(SetBuildPlateNumberOperation(node, build_plate_nr)) operation.push() + Selection.clear() + def _openUrl(self, url): QDesktopServices.openUrl(url) From 62487e8ea2dc3603bffaa76989b79179342d46ee Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 15:41:08 +0100 Subject: [PATCH 751/764] CURA-4525 cleanups and change comment and added new-lines --- cura/Operations/SetBuildPlateNumberOperation.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 13 ------------- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 2 -- plugins/CuraEngineBackend/StartSliceJob.py | 1 - plugins/ImageReader/ImageReader.py | 1 - plugins/X3DReader/X3DReader.py | 1 - resources/qml/Menus/ContextMenu.qml | 2 ++ 7 files changed, 3 insertions(+), 19 deletions(-) diff --git a/cura/Operations/SetBuildPlateNumberOperation.py b/cura/Operations/SetBuildPlateNumberOperation.py index bbef4caf84..c14d737f93 100644 --- a/cura/Operations/SetBuildPlateNumberOperation.py +++ b/cura/Operations/SetBuildPlateNumberOperation.py @@ -6,7 +6,7 @@ from UM.Operations.Operation import Operation from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator -## Simple operation to set the extruder a certain object should be printed with. +## Simple operation to set the buildplate number of a scenenode. class SetBuildPlateNumberOperation(Operation): def __init__(self, node: SceneNode, build_plate_nr: int) -> None: self._node = node diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 473dbee31a..74dd515951 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -357,19 +357,6 @@ class CuraEngineBackend(QObject, Backend): else: self.backendStateChange.emit(BackendState.NotStarted) - # Doesn't occur anymore, is handled in slice() - # if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: - # if Application.getInstance().platformActivity: - # self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."), - # title = catalog.i18nc("@info:title", "Unable to slice")) - # self._error_message.show() - # #self.backendStateChange.emit(BackendState.Error) - # else: - # #self.backendStateChange.emit(BackendState.NotStarted) - # pass - # self._invokeSlice() - # return - # Preparation completed, send it to the backend. self._socket.sendMessage(job.getSliceMessage()) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 5f632768ec..be9c3f73f0 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -4,7 +4,6 @@ import gc from UM.Job import Job -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Application import Application from UM.Mesh.MeshData import MeshData @@ -22,7 +21,6 @@ from cura.Settings.ExtruderManager import ExtruderManager from cura import LayerDataBuilder from cura import LayerDataDecorator from cura import LayerPolygon -# from cura.Scene.CuraSceneNode import CuraSceneNode import numpy from time import time diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 9a61c4c8a2..a9618c5472 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -10,7 +10,6 @@ from UM.Job import Job from UM.Application import Application from UM.Logger import Logger -#from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Settings.Validator import ValidatorState diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py index 2529abf2d8..3a98abccf5 100644 --- a/plugins/ImageReader/ImageReader.py +++ b/plugins/ImageReader/ImageReader.py @@ -8,7 +8,6 @@ from PyQt5.QtCore import Qt from UM.Mesh.MeshReader import MeshReader from UM.Mesh.MeshBuilder import MeshBuilder -#from UM.Scene.SceneNode import SceneNode from UM.Math.Vector import Vector from UM.Job import Job from UM.Logger import Logger diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py index 883ed7b0b6..b0b9e00a5b 100644 --- a/plugins/X3DReader/X3DReader.py +++ b/plugins/X3DReader/X3DReader.py @@ -11,7 +11,6 @@ from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector from UM.Mesh.MeshBuilder import MeshBuilder from UM.Mesh.MeshReader import MeshReader -#from UM.Scene.SceneNode import SceneNode from cura.Scene.CuraSceneNode import CuraSceneNode as SceneNode MYPY = False diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 910f0a951a..1a4b421572 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -42,6 +42,7 @@ Menu MenuSeparator { visible: UM.Preferences.getValue("cura/use_multi_build_plate") } + Instantiator { model: Cura.BuildPlateModel @@ -55,6 +56,7 @@ Menu onObjectAdded: base.insertItem(index, object); onObjectRemoved: base.removeItem(object); } + MenuItem { text: "New build plate"; onTriggered: { From 9e5f0e10b968daedfc2ec2e96e9292c55f095cd2 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 3 Jan 2018 15:49:31 +0100 Subject: [PATCH 752/764] CURA-4525 add comment and type hint --- cura/Arranging/Arrange.py | 1 + cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Arranging/Arrange.py b/cura/Arranging/Arrange.py index 5ac0c09dc4..a90a97c3c2 100644 --- a/cura/Arranging/Arrange.py +++ b/cura/Arranging/Arrange.py @@ -169,6 +169,7 @@ class Arrange: # \param x x-coordinate # \param y y-coordinate # \param shape_arr ShapeArray object + # \param update_empty updates the _is_empty, used when adding disallowed areas def place(self, x, y, shape_arr, update_empty = True): x = int(self._scale * x) y = int(self._scale * y) diff --git a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py index 859ad481d6..3f23b0dbe7 100644 --- a/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py +++ b/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py @@ -18,7 +18,7 @@ from typing import List class ArrangeArray: - def __init__(self, x, y, fixed_nodes): + def __init__(self, x: int, y: int, fixed_nodes: List[SceneNode]): self._x = x self._y = y self._fixed_nodes = fixed_nodes From 392be23281c03406a37de0addc09cc8359e15246 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 15:58:30 +0100 Subject: [PATCH 753/764] Fix SettingView stakc ID binding CURA-4708 --- resources/qml/Settings/SettingView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 1d4e1016bc..5d39572647 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -372,7 +372,7 @@ Item { id: provider - containerStackId: Cura.ExtruderManager.activeExtruderStackId + containerStackId: Cura.MachineManager.activeMachineId key: model.key ? model.key : "" watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder", "resolve" ] storeIndex: 0 From 5a9e3a8efd0a9e1a69fbcd0c8e4873906bcbcca2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 3 Jan 2018 16:18:31 +0100 Subject: [PATCH 754/764] Fix front view button rotation, cleanup view buttons onClicked --- resources/qml/Topbar.qml | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index c016c155a5..bea0a7d2e3 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -115,10 +115,8 @@ Rectangle iconSource: UM.Theme.getIcon("view_3d") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked:{ - UM.Controller.rotateView("3d", 0); - } - visible: base.width - allItemsWidth - 4 * this.width > 0; + onClicked:UM.Controller.rotateView("3d", 0) + visible: base.width - allItemsWidth - 4 * this.width > 0 } // #2 Front view @@ -127,10 +125,11 @@ Rectangle iconSource: UM.Theme.getIcon("view_front") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked:{ - UM.Controller.rotateView("home", 0); + onClicked: { + UM.Controller.rotateView("x", 0) + UM.Controller.rotateView("y", 0) } - visible: base.width - allItemsWidth - 3 * this.width > 0; + visible: base.width - allItemsWidth - 3 * this.width > 0 } // #3 Top view @@ -139,10 +138,8 @@ Rectangle iconSource: UM.Theme.getIcon("view_top") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked:{ - UM.Controller.rotateView("y", 90); - } - visible: base.width - allItemsWidth - 2 * this.width > 0; + onClicked: UM.Controller.rotateView("y", 90) + visible: base.width - allItemsWidth - 2 * this.width > 0 } // #4 Left view @@ -151,10 +148,8 @@ Rectangle iconSource: UM.Theme.getIcon("view_left") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked:{ - UM.Controller.rotateView("x", 90); - } - visible: base.width - allItemsWidth - 1 * this.width > 0; + onClicked: UM.Controller.rotateView("x", 90) + visible: base.width - allItemsWidth - 1 * this.width > 0 } // #5 Left view @@ -163,10 +158,8 @@ Rectangle iconSource: UM.Theme.getIcon("view_right") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked:{ - UM.Controller.rotateView("x", -90); - } - visible: base.width - allItemsWidth > 0; + onClicked: UM.Controller.rotateView("x", -90) + visible: base.width - allItemsWidth > 0 } } From b181860f1c108ac6b9a3e6c677c6811a50e4820e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 16:27:21 +0100 Subject: [PATCH 755/764] Fix afterOnEditingFinished() CURA-4708 --- plugins/MachineSettingsAction/MachineSettingsAction.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index f89ca8473c..b815d71acc 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -393,7 +393,7 @@ Cura.MachineAction property string label: catalog.i18nc("@label", "Material diameter") property string unit: catalog.i18nc("@label", "mm") property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") - property var afterOnEditingFinished: + function afterOnEditingFinished() { if (settingsTabs.currentIndex > 0) { From 47a12b4128c297715d8ed06644dc1a6486115766 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 16:28:36 +0100 Subject: [PATCH 756/764] Prefer materials from the same brand in auto-update CURA-4708 --- plugins/MachineSettingsAction/MachineSettingsAction.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index aacedbfbdf..17bb4e5161 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -241,6 +241,7 @@ class MachineSettingsAction(MachineAction): "type": "material", "approximate_diameter": machine_approximate_diameter, "material": old_material.getMetaDataEntry("material", "value"), + "brand": old_material.getMetaDataEntry("brand", "value"), "supplier": old_material.getMetaDataEntry("supplier", "value"), "color_name": old_material.getMetaDataEntry("color_name", "value"), "definition": materials_definition @@ -251,6 +252,7 @@ class MachineSettingsAction(MachineAction): if old_material == self._empty_container: search_criteria.pop("material", None) search_criteria.pop("supplier", None) + search_criteria.pop("brand", None) search_criteria.pop("definition", None) search_criteria["id"] = extruder_stack.getMetaDataEntry("preferred_material") From cbf6f55fd85156e6f1e0f8f579ad7bee48fd0c61 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 16:42:00 +0100 Subject: [PATCH 757/764] Fix perfered material search in auto-update CURA-4708 --- plugins/MachineSettingsAction/MachineSettingsAction.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 17bb4e5161..ad5957e625 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -260,6 +260,7 @@ class MachineSettingsAction(MachineAction): if not materials: # Same material with new diameter is not found, search for generic version of the same material type search_criteria.pop("supplier", None) + search_criteria.pop("brand", None) search_criteria["color_name"] = "Generic" materials = self._container_registry.findInstanceContainers(**search_criteria) if not materials: @@ -276,6 +277,6 @@ class MachineSettingsAction(MachineAction): # Just use empty material as a final fallback materials = [self._empty_container] - Logger.log("i", "Selecting new material: %s" % materials[0].getId()) + Logger.log("i", "Selecting new material: %s", materials[0].getId()) extruder_stack.material = materials[0] From 49ae0783966e388ca3af0d55853169bf201464c6 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 3 Jan 2018 16:45:26 +0100 Subject: [PATCH 758/764] Adjust 3d view and add Camera View to the menu bar CURA-4642 --- resources/qml/Actions.qml | 41 ++++++++++++++++++++++++++++---- resources/qml/Menus/ViewMenu.qml | 10 +++++++- resources/qml/Topbar.qml | 5 +--- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index aa185f8615..53900da4a7 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -17,7 +17,12 @@ Item property alias undo: undoAction; property alias redo: redoAction; - property alias homeCamera: homeCameraAction; + property alias view3DCamera: view3DCameraAction; + property alias viewFrontCamera: viewFrontCameraAction; + property alias viewTopCamera: viewTopCameraAction; + property alias viewLeftSideCamera: viewLeftSideCameraAction; + property alias viewRightSideCamera: viewRightSideCameraAction; + property alias expandSidebar: expandSidebarAction; property alias deleteSelection: deleteSelectionAction; @@ -104,9 +109,37 @@ Item Action { - id: homeCameraAction; - text: catalog.i18nc("@action:inmenu menubar:view","&Reset camera position"); - onTriggered: CuraActions.homeCamera(); + id: view3DCameraAction; + text: catalog.i18nc("@action:inmenu menubar:view","&3D View"); + onTriggered: UM.Controller.rotateView("3d", 0); + } + + Action + { + id: viewFrontCameraAction; + text: catalog.i18nc("@action:inmenu menubar:view","&Front View"); + onTriggered: UM.Controller.rotateView("home", 0); + } + + Action + { + id: viewTopCameraAction; + text: catalog.i18nc("@action:inmenu menubar:view","&Top View"); + onTriggered: UM.Controller.rotateView("y", 90); + } + + Action + { + id: viewLeftSideCameraAction; + text: catalog.i18nc("@action:inmenu menubar:view","&Left Side View"); + onTriggered: UM.Controller.rotateView("x", 90); + } + + Action + { + id: viewRightSideCameraAction; + text: catalog.i18nc("@action:inmenu menubar:view","&Right Side View"); + onTriggered: UM.Controller.rotateView("x", -90); } Action diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index c8243ad2ed..eca8abd68f 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -31,6 +31,14 @@ Menu ExclusiveGroup { id: group } MenuSeparator {} - MenuItem { action: Cura.Actions.homeCamera; } + Menu + { + title: catalog.i18nc("@action:inmenu menubar:view","&Camera position"); + MenuItem { action: Cura.Actions.view3DCamera; } + MenuItem { action: Cura.Actions.viewFrontCamera; } + MenuItem { action: Cura.Actions.viewTopCamera; } + MenuItem { action: Cura.Actions.viewLeftSideCamera; } + MenuItem { action: Cura.Actions.viewRightSideCamera; } + } MenuItem { action: Cura.Actions.expandSidebar; } } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index bea0a7d2e3..e3dfb85c49 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -125,10 +125,7 @@ Rectangle iconSource: UM.Theme.getIcon("view_front") style: UM.Theme.styles.small_tool_button anchors.verticalCenter: viewOrientationControl.verticalCenter - onClicked: { - UM.Controller.rotateView("x", 0) - UM.Controller.rotateView("y", 0) - } + onClicked: UM.Controller.rotateView("home", 0); visible: base.width - allItemsWidth - 3 * this.width > 0 } From 7c4a122767ffa08dc037d35f706c699fd108421a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 3 Jan 2018 17:04:07 +0100 Subject: [PATCH 759/764] Fix container_index for MachineSettingsAction CURA-4708 --- plugins/MachineSettingsAction/MachineSettingsAction.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index ad5957e625..a939d033fc 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -27,7 +27,9 @@ class MachineSettingsAction(MachineAction): self._qml_url = "MachineSettingsAction.qml" self._global_container_stack = None - self._container_index = 0 + + from cura.Settings.CuraContainerStack import _ContainerIndexes + self._container_index = _ContainerIndexes.DefinitionChanges self._container_registry = ContainerRegistry.getInstance() self._container_registry.containerAdded.connect(self._onContainerAdded) From 8c7a0d4a8e70ddb722943b709c2d2fc9d0dccc2d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 09:26:15 +0100 Subject: [PATCH 760/764] CURA-4525 created CuraSceneController and took out logic from ObjectsModel and BuildPlateModel --- cura/BuildPlateModel.py | 52 ++++------------- cura/CuraApplication.py | 27 ++++++--- cura/CuraSceneController.py | 101 ++++++++++++++++++++++++++++++++++ cura/ObjectManager.py | 87 ----------------------------- cura/ObjectsModel.py | 49 +++++++++++++++++ resources/qml/ObjectsList.qml | 16 +++--- 6 files changed, 187 insertions(+), 145 deletions(-) create mode 100644 cura/CuraSceneController.py delete mode 100644 cura/ObjectManager.py create mode 100644 cura/ObjectsModel.py diff --git a/cura/BuildPlateModel.py b/cura/BuildPlateModel.py index 2d558a91b9..73f61202c6 100644 --- a/cura/BuildPlateModel.py +++ b/cura/BuildPlateModel.py @@ -1,7 +1,6 @@ -from UM.Qt.ListModel import ListModel from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Scene.SceneNode import SceneNode + +from UM.Qt.ListModel import ListModel from UM.Scene.Selection import Selection from UM.Logger import Logger from UM.Application import Application @@ -14,7 +13,6 @@ class BuildPlateModel(ListModel): def __init__(self): super().__init__() - Application.getInstance().getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSelectedObjectBuildPlateNumbers) Selection.selectionChanged.connect(self._updateSelectedObjectBuildPlateNumbers) @@ -22,50 +20,22 @@ class BuildPlateModel(ListModel): self._active_build_plate = -1 self._selection_build_plates = [] - @pyqtSlot(int) - def setActiveBuildPlate(self, nr): - if nr == self._active_build_plate: - return - Logger.log("d", "Select build plate: %s" % nr) - self._active_build_plate = nr - Selection.clear() - - self.activeBuildPlateChanged.emit() - - @pyqtProperty(int, notify = activeBuildPlateChanged) - def activeBuildPlate(self): - return self._active_build_plate + def setMaxBuildPlate(self, max_build_plate): + self._max_build_plate = max_build_plate + self.maxBuildPlateChanged.emit() ## Return the highest build plate number @pyqtProperty(int, notify = maxBuildPlateChanged) def maxBuildPlate(self): return self._max_build_plate - def updateMaxBuildPlate(self, *args): - if args: - source = args[0] - else: - source = None - if not issubclass(type(source), SceneNode): - return - max_build_plate = self._calcMaxBuildPlate() - changed = False - if max_build_plate != self._max_build_plate: - self._max_build_plate = max_build_plate - changed = True - if changed: - self.maxBuildPlateChanged.emit() - build_plates = [{"name": "Build Plate %d" % (i + 1), "buildPlateNumber": i} for i in range(self._max_build_plate + 1)] - self.setItems(build_plates) - self.itemsChanged.emit() + def setActiveBuildPlate(self, nr): + self._active_build_plate = nr + self.activeBuildPlateChanged.emit() - def _calcMaxBuildPlate(self): - max_build_plate = 0 - for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if node.callDecoration("isSliceable"): - build_plate_number = node.callDecoration("getBuildPlateNumber") - max_build_plate = max(build_plate_number, max_build_plate) - return max_build_plate + @pyqtProperty(int, notify = activeBuildPlateChanged) + def activeBuildPlate(self): + return self._active_build_plate @staticmethod def createBuildPlateModel(): diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 42bd70fdc8..1e10b6a40c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -33,7 +33,10 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation from cura.Arranging.Arrange import Arrange +from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob +from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob from cura.Arranging.ShapeArray import ShapeArray +from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Scene.ConvexHullDecorator import ConvexHullDecorator from cura.Operations.SetParentOperation import SetParentOperation from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator @@ -41,9 +44,7 @@ from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.CuraSceneNode import CuraSceneNode -from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob -from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob -from cura.MultiplyObjectsJob import MultiplyObjectsJob +from cura.CuraSceneController import CuraSceneController from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry @@ -77,7 +78,7 @@ from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisi from cura.Settings.QualitySettingsModel import QualitySettingsModel from cura.Settings.ContainerManager import ContainerManager -from cura.ObjectManager import ObjectManager +from cura.ObjectsModel import ObjectsModel from cura.BuildPlateModel import BuildPlateModel from PyQt5.QtCore import QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS @@ -211,6 +212,7 @@ class CuraApplication(QtApplication): self._build_plate_model = None self._setting_inheritance_manager = None self._simple_mode_settings_manager = None + self._cura_scene_controller = None self._additional_components = {} # Components to add to certain areas in the interface @@ -398,6 +400,8 @@ class CuraApplication(QtApplication): self._plugin_registry.addSupportedPluginExtension("curaplugin", "Cura Plugin") + self.getCuraSceneController().setActiveBuildPlate(0) # Initialize + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -699,8 +703,9 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 2, "SimpleModeSettingsManager", self.getSimpleModeSettingsManager) - qmlRegisterSingletonType(ObjectManager, "Cura", 1, 2, "ObjectManager", self.getObjectManager) + qmlRegisterSingletonType(ObjectsModel, "Cura", 1, 2, "ObjectsModel", self.getObjectsModel) qmlRegisterSingletonType(BuildPlateModel, "Cura", 1, 2, "BuildPlateModel", self.getBuildPlateModel) + qmlRegisterSingletonType(CuraSceneController, "Cura", 1, 2, "SceneController", self.getCuraSceneController) qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, "MachineActionManager", self.getMachineActionManager) @@ -739,18 +744,22 @@ class CuraApplication(QtApplication): self._material_manager = MaterialManager.createMaterialManager() return self._material_manager - def getObjectManager(self, *args): + def getObjectsModel(self, *args): if self._object_manager is None: - self._object_manager = ObjectManager.createObjectManager() + self._object_manager = ObjectsModel.createObjectsModel() return self._object_manager def getBuildPlateModel(self, *args): if self._build_plate_model is None: self._build_plate_model = BuildPlateModel.createBuildPlateModel() - self._build_plate_model.setActiveBuildPlate(0) # default value return self._build_plate_model + def getCuraSceneController(self, *args): + if self._cura_scene_controller is None: + self._cura_scene_controller = CuraSceneController.createCuraSceneController() + return self._cura_scene_controller + def getSettingInheritanceManager(self, *args): if self._setting_inheritance_manager is None: self._setting_inheritance_manager = SettingInheritanceManager.createSettingInheritanceManager() @@ -1115,7 +1124,7 @@ class CuraApplication(QtApplication): nodes.append(node) job = ArrangeObjectsAllBuildPlatesJob(nodes) job.start() - self.getBuildPlateModel().setActiveBuildPlate(0) + self.getCuraSceneController().setActiveBuildPlate(0) # Initialize # Single build plate @pyqtSlot() diff --git a/cura/CuraSceneController.py b/cura/CuraSceneController.py new file mode 100644 index 0000000000..65723db52c --- /dev/null +++ b/cura/CuraSceneController.py @@ -0,0 +1,101 @@ +from UM.Logger import Logger + +from PyQt5.QtCore import Qt, pyqtSlot, QObject +from PyQt5.QtWidgets import QApplication + +from cura.ObjectsModel import ObjectsModel +from cura.BuildPlateModel import BuildPlateModel + +from UM.Application import Application +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection + + +class CuraSceneController(QObject): + def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel): + super().__init__() + + self._objects_model = objects_model + self._build_plate_model = build_plate_model + self._active_build_plate = -1 + + self._last_selected_index = 0 + self._max_build_plate = 1 # default + + Application.getInstance().getController().getScene().sceneChanged.connect(self.updateMaxBuildPlate) # it may be a bit inefficient when changing a lot simultaneously + + def updateMaxBuildPlate(self, *args): + if args: + source = args[0] + else: + source = None + if not issubclass(type(source), SceneNode): + return + max_build_plate = self._calcMaxBuildPlate() + changed = False + if max_build_plate != self._max_build_plate: + self._max_build_plate = max_build_plate + changed = True + if changed: + self._build_plate_model.setMaxBuildPlate(self._max_build_plate) + build_plates = [{"name": "Build Plate %d" % (i + 1), "buildPlateNumber": i} for i in range(self._max_build_plate + 1)] + self._build_plate_model.setItems(build_plates) + # self.buildPlateItemsChanged.emit() # TODO: necessary after setItems? + + def _calcMaxBuildPlate(self): + max_build_plate = 0 + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if node.callDecoration("isSliceable"): + build_plate_number = node.callDecoration("getBuildPlateNumber") + max_build_plate = max(build_plate_number, max_build_plate) + return max_build_plate + + ## Either select or deselect an item + @pyqtSlot(int) + def changeSelection(self, index): + modifiers = QApplication.keyboardModifiers() + ctrl_is_active = modifiers & Qt.ControlModifier + shift_is_active = modifiers & Qt.ShiftModifier + + if ctrl_is_active: + item = self._objects_model.getItem(index) + node = item["node"] + if Selection.isSelected(node): + Selection.remove(node) + else: + Selection.add(node) + elif shift_is_active: + polarity = 1 if index + 1 > self._last_selected_index else -1 + for i in range(self._last_selected_index, index + polarity, polarity): + item = self._objects_model.getItem(i) + node = item["node"] + Selection.add(node) + else: + # Single select + item = self._objects_model.getItem(index) + node = item["node"] + Selection.clear() + Selection.add(node) + build_plate_number = node.callDecoration("getBuildPlateNumber") + if build_plate_number is not None and build_plate_number != -1: + self._build_plate_model.setActiveBuildPlate(build_plate_number) + + self._last_selected_index = index + + @pyqtSlot(int) + def setActiveBuildPlate(self, nr): + if nr == self._active_build_plate: + return + Logger.log("d", "Select build plate: %s" % nr) + self._active_build_plate = nr + Selection.clear() + + self._build_plate_model.setActiveBuildPlate(nr) + self._objects_model.setActiveBuildPlate(nr) + + @staticmethod + def createCuraSceneController(): + objects_model = Application.getInstance().getObjectsModel() + build_plate_model = Application.getInstance().getBuildPlateModel() + return CuraSceneController(objects_model = objects_model, build_plate_model = build_plate_model) diff --git a/cura/ObjectManager.py b/cura/ObjectManager.py deleted file mode 100644 index 413f43ed73..0000000000 --- a/cura/ObjectManager.py +++ /dev/null @@ -1,87 +0,0 @@ -from UM.Logger import Logger -from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot -from UM.Application import Application -from UM.Qt.ListModel import ListModel -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Scene.SceneNode import SceneNode -from UM.Scene.Selection import Selection -from PyQt5.QtCore import Qt -from PyQt5.QtWidgets import QApplication -#from cura.Scene.CuraSceneNode import CuraSceneNode -from UM.Preferences import Preferences - - -## Keep track of all objects in the project -class ObjectManager(ListModel): - def __init__(self): - super().__init__() - self._last_selected_index = 0 - self._build_plate_model = Application.getInstance().getBuildPlateModel() - Application.getInstance().getController().getScene().sceneChanged.connect(self._update) - Preferences.getInstance().preferenceChanged.connect(self._update) - self._build_plate_model.activeBuildPlateChanged.connect(self._update) - - def _update(self, *args): - nodes = [] - filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") - active_build_plate_number = self._build_plate_model.activeBuildPlate - for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): - continue - if not node.callDecoration("isSliceable"): - continue - node_build_plate_number = node.callDecoration("getBuildPlateNumber") - if filter_current_build_plate and node_build_plate_number != active_build_plate_number: - continue - nodes.append({ - "name": node.getName(), - "isSelected": Selection.isSelected(node), - "isOutsideBuildArea": node.isOutsideBuildArea(), - "buildPlateNumber": node_build_plate_number, - "node": node - }) - nodes = sorted(nodes, key=lambda n: n["name"]) - self.setItems(nodes) - - self.itemsChanged.emit() - - ## Either select or deselect an item - @pyqtSlot(int) - def changeSelection(self, index): - modifiers = QApplication.keyboardModifiers() - ctrl_is_active = modifiers & Qt.ControlModifier - shift_is_active = modifiers & Qt.ShiftModifier - - if ctrl_is_active: - item = self.getItem(index) - node = item["node"] - if Selection.isSelected(node): - Selection.remove(node) - else: - Selection.add(node) - elif shift_is_active: - polarity = 1 if index + 1 > self._last_selected_index else -1 - for i in range(self._last_selected_index, index + polarity, polarity): - item = self.getItem(i) - node = item["node"] - Selection.add(node) - else: - # Single select - item = self.getItem(index) - node = item["node"] - Selection.clear() - Selection.add(node) - build_plate_number = node.callDecoration("getBuildPlateNumber") - if build_plate_number is not None and build_plate_number != -1: - self._build_plate_model.setActiveBuildPlate(build_plate_number) - - self._last_selected_index = index - - # testing - for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if node.callDecoration("getLayerData"): - Logger.log("d", " ##### NODE: %s", node) - - @staticmethod - def createObjectManager(): - return ObjectManager() diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py new file mode 100644 index 0000000000..2e83ee9033 --- /dev/null +++ b/cura/ObjectsModel.py @@ -0,0 +1,49 @@ +from UM.Application import Application +from UM.Qt.ListModel import ListModel +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator +from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection +from UM.Preferences import Preferences + + +## Keep track of all objects in the project +class ObjectsModel(ListModel): + def __init__(self): + super().__init__() + + Application.getInstance().getController().getScene().sceneChanged.connect(self._update) + Preferences.getInstance().preferenceChanged.connect(self._update) + + self._build_plate_number = -1 + + def setActiveBuildPlate(self, nr): + self._build_plate_number = nr + self._update() + + def _update(self, *args): + nodes = [] + filter_current_build_plate = Preferences.getInstance().getValue("view/filter_current_build_plate") + active_build_plate_number = self._build_plate_number + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + continue + if not node.callDecoration("isSliceable"): + continue + node_build_plate_number = node.callDecoration("getBuildPlateNumber") + if filter_current_build_plate and node_build_plate_number != active_build_plate_number: + continue + nodes.append({ + "name": node.getName(), + "isSelected": Selection.isSelected(node), + "isOutsideBuildArea": node.isOutsideBuildArea(), + "buildPlateNumber": node_build_plate_number, + "node": node + }) + nodes = sorted(nodes, key=lambda n: n["name"]) + self.setItems(nodes) + + self.itemsChanged.emit() + + @staticmethod + def createObjectsModel(): + return ObjectsModel() diff --git a/resources/qml/ObjectsList.qml b/resources/qml/ObjectsList.qml index a924959581..04afbe2fb0 100644 --- a/resources/qml/ObjectsList.qml +++ b/resources/qml/ObjectsList.qml @@ -85,7 +85,7 @@ Rectangle anchors.fill: parent; onClicked: { - Cura.BuildPlateModel.setActiveBuildPlate(index); + Cura.SceneController.setActiveBuildPlate(index); } } } @@ -131,7 +131,7 @@ Rectangle Rectangle { height: childrenRect.height - color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlight : index % 2 ? palette.base : palette.alternateBase + color: Cura.ObjectsModel.getItem(index).isSelected ? palette.highlight : index % 2 ? palette.base : palette.alternateBase width: parent.width Label { @@ -139,8 +139,8 @@ Rectangle anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width width: parent.width - 2 * UM.Theme.getSize("default_margin").width - 30 - text: Cura.ObjectManager.getItem(index) ? Cura.ObjectManager.getItem(index).name : ""; - color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectManager.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) + text: Cura.ObjectsModel.getItem(index) ? Cura.ObjectsModel.getItem(index).name : ""; + color: Cura.ObjectsModel.getItem(index).isSelected ? palette.highlightedText : (Cura.ObjectsModel.getItem(index).isOutsideBuildArea ? palette.mid : palette.text) elide: Text.ElideRight } @@ -151,8 +151,8 @@ Rectangle anchors.left: nodeNameLabel.right anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right - text: Cura.ObjectManager.getItem(index).buildPlateNumber != -1 ? Cura.ObjectManager.getItem(index).buildPlateNumber + 1 : ""; - color: Cura.ObjectManager.getItem(index).isSelected ? palette.highlightedText : palette.text + text: Cura.ObjectsModel.getItem(index).buildPlateNumber != -1 ? Cura.ObjectsModel.getItem(index).buildPlateNumber + 1 : ""; + color: Cura.ObjectsModel.getItem(index).isSelected ? palette.highlightedText : palette.text elide: Text.ElideRight } @@ -161,7 +161,7 @@ Rectangle anchors.fill: parent; onClicked: { - Cura.ObjectManager.changeSelection(index); + Cura.SceneController.changeSelection(index); } } } @@ -195,7 +195,7 @@ Rectangle ListView { id: listview - model: Cura.ObjectManager + model: Cura.ObjectsModel width: parent.width delegate: objectDelegate } From 840eedbb3dfe46836f8bc2b711be0fe2f17bd046 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 09:35:23 +0100 Subject: [PATCH 761/764] CURA-4525 switch back to build plate 0 when deleting all objects --- cura/CuraApplication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 1e10b6a40c..bf9e0016cb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1050,6 +1050,8 @@ class CuraApplication(QtApplication): op.push() Selection.clear() + self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate + ## Reset all translation on nodes with mesh data. @pyqtSlot() def resetAllTranslation(self): @@ -1124,7 +1126,7 @@ class CuraApplication(QtApplication): nodes.append(node) job = ArrangeObjectsAllBuildPlatesJob(nodes) job.start() - self.getCuraSceneController().setActiveBuildPlate(0) # Initialize + self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate # Single build plate @pyqtSlot() From 46827b9295594725d6b5218e4ce1dbe25a19b8fb Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 4 Jan 2018 10:14:55 +0100 Subject: [PATCH 762/764] Fix tevo blackwidow json file --- plugins/CuraEngineBackend/StartSliceJob.py | 6 ++++-- resources/definitions/tevo_blackwidow.def.json | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index c5182cc753..746a23dc84 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -271,13 +271,15 @@ class StartSliceJob(Job): if not self._all_extruders_settings: global_stack = Application.getInstance().getGlobalContainerStack() - self._all_extruders_settings = {} # NB: keys must be strings for the string formatter - self._all_extruders_settings["-1"] = self._buildReplacementTokens(global_stack) + self._all_extruders_settings = { + "-1": self._buildReplacementTokens(global_stack) + } for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): extruder_nr = extruder_stack.getProperty("extruder_nr", "value") self._all_extruders_settings[str(extruder_nr)] = self._buildReplacementTokens(extruder_stack) + try: # any setting can be used as a token fmt = GcodeStartEndFormatter() diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index 19ef2a45e2..9d7166f4a2 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -45,10 +45,10 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\M420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\G28 ; home all\G29 ; probe bed\G92 E0 ;zero the extruded length\G1 X0.0 Y50.0 Z10.0 F3600\; perform wipe and prime\G1 Z0.0 F1000\G1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\G1 Y100.0 E12.5 F1000.0 ; prime\G92 E0 ; zero extruder again\M117 Printing..." + "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\nM420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\nG28 ; home all\nG29 ; probe bed\nG92 E0 ;zero the extruded length\nG1 X0.0 Y50.0 Z10.0 F3600\n; perform wipe and prime\nG1 Z0.0 F1000\nG1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\nG1 Y100.0 E12.5 F1000.0 ; prime\nG92 E0 ; zero extruder again\nM117 Printing..." }, "machine_end_gcode": { - "default_value": "G92 E0 ; zero the extruded length again\G1 E-1.5 F500 ; retract the filament to release some of the pressure\M104 S0 ; turn off extruder\M140 S0 ; turn off bed\G28 X0 ; home X axis\G1 Y245 ; move Y axis to end position\M84 ; disable motors\M107 ; turn off fan" + "default_value": "G92 E0 ; zero the extruded length again\nG1 E-1.5 F500 ; retract the filament to release some of the pressure\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG28 X0 ; home X axis\nG1 Y245 ; move Y axis to end position\nM84 ; disable motors\nM107 ; turn off fan" } } } From a5d9aac91bee910d4b6ef13c57b5916b723e7bbb Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Jan 2018 10:32:54 +0100 Subject: [PATCH 763/764] CURA-4525 placed view menu items in Build Plate submenu --- resources/qml/Menus/ViewMenu.qml | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 84722e81bf..72bc42bfb0 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -46,21 +46,26 @@ Menu visible: UM.Preferences.getValue("cura/use_multi_build_plate") } - Instantiator + Menu { - model: Cura.BuildPlateModel - MenuItem { - text: Cura.BuildPlateModel.getItem(index).name; - onTriggered: Cura.BuildPlateModel.setActiveBuildPlate(Cura.BuildPlateModel.getItem(index).buildPlateNumber); - checkable: true; - checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate; - exclusiveGroup: buildPlateGroup; - visible: UM.Preferences.getValue("cura/use_multi_build_plate") + id: buildPlateMenu; + title: catalog.i18nc("@action:inmenu menubar:view","&Build plate"); + Instantiator + { + model: Cura.BuildPlateModel + MenuItem { + text: Cura.BuildPlateModel.getItem(index).name; + onTriggered: Cura.SceneController.setActiveBuildPlate(Cura.BuildPlateModel.getItem(index).buildPlateNumber); + checkable: true; + checked: Cura.BuildPlateModel.getItem(index).buildPlateNumber == Cura.BuildPlateModel.activeBuildPlate; + exclusiveGroup: buildPlateGroup; + visible: UM.Preferences.getValue("cura/use_multi_build_plate") + } + onObjectAdded: buildPlateMenu.insertItem(index, object); + onObjectRemoved: buildPlateMenu.removeItem(object) } - onObjectAdded: base.insertItem(index, object); - onObjectRemoved: base.removeItem(object) + ExclusiveGroup { id: buildPlateGroup; } } - ExclusiveGroup { id: buildPlateGroup; } MenuSeparator {} From 11a484593157819f44170803640de826f499fb1f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 4 Jan 2018 10:41:25 +0100 Subject: [PATCH 764/764] Move CuraSceneController together with rest of scene related code --- cura/CuraApplication.py | 2 +- cura/{ => Scene}/CuraSceneController.py | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename cura/{ => Scene}/CuraSceneController.py (100%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bf9e0016cb..476b5d3708 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -44,7 +44,7 @@ from cura.Scene.BlockSlicingDecorator import BlockSlicingDecorator from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.CuraSceneNode import CuraSceneNode -from cura.CuraSceneController import CuraSceneController +from cura.Scene.CuraSceneController import CuraSceneController from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry diff --git a/cura/CuraSceneController.py b/cura/Scene/CuraSceneController.py similarity index 100% rename from cura/CuraSceneController.py rename to cura/Scene/CuraSceneController.py

    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 qJRynJUBL0Al=Gumj))$}1% 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 UUdK{kDjs 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

    Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues