From c132300fd553d28e10f1a6b9a361dd78688cac70 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 23 Oct 2017 13:56:26 +0200 Subject: [PATCH 01/66] 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 f0ed3bc588632837921795de5cc74f79a60c9568 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:05:35 +0200 Subject: [PATCH 02/66] 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 de34464e47a822887c6e8b4d9ddedbd2c3f5cb54 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 11:38:21 +0200 Subject: [PATCH 03/66] 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 04/66] 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 05/66] 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 06/66] 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 79754209015e7fce11a66cbc7870a6946245c86f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 13:34:59 +0200 Subject: [PATCH 07/66] 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 08/66] 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 09/66] 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 10/66] 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 11/66] 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 38fdb5e56f72aa96ffc04f87e9877196fce05dd6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 14:45:24 +0200 Subject: [PATCH 12/66] 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 13/66] 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 b91824aab1bad7391ab5b16623297e823b77e445 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 26 Oct 2017 17:54:36 +0200 Subject: [PATCH 14/66] 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 d718e6e36c3b44c9a4e81618a031bc7f727bfc18 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 09:08:20 +0100 Subject: [PATCH 15/66] 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 f36c9ffbc0d7100ba11cbd56b9aeb0a5ee4854bc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 09:49:24 +0100 Subject: [PATCH 16/66] 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 4701518404a5243a28b9f342d6613c15ab8e705d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 10:23:30 +0100 Subject: [PATCH 17/66] 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 bc6984a0edacf5948c73c23ce2f694ac1c6c031a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 13:19:28 +0100 Subject: [PATCH 18/66] 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 19/66] 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 20/66] 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 21/66] 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 22/66] 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 23/66] 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 24/66] 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 25/66] 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 26/66] 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 27/66] 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 28/66] 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 29/66] 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 30/66] 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 31/66] 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 32/66] 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 33/66] 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 c59e4bb3e161179ab991beb3ac6c5941ecacfd96 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 31 Oct 2017 16:20:25 +0100 Subject: [PATCH 34/66] 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 35/66] 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 36/66] 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 37/66] 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 38/66] 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 39/66] 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 97421ecf5812cc055f7fbfff45f6bd271de7a462 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 1 Nov 2017 13:31:25 +0100 Subject: [PATCH 40/66] 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 41/66] 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 42/66] 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 28ce2b1dc6d3382a5d146fa2aa928af18541ce68 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 6 Nov 2017 09:49:13 +0100 Subject: [PATCH 43/66] 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 06045f036e06fdb05ad38fd00a14e09a8715535f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 8 Nov 2017 15:27:50 +0100 Subject: [PATCH 44/66] 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 637d1a1da30ec312efcdd69696ed0b41910b18fe Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 9 Nov 2017 10:37:24 +0100 Subject: [PATCH 45/66] 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 477e295e707609b8505a1c3d599c4f3b8d6942d8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Thu, 9 Nov 2017 12:02:01 +0100 Subject: [PATCH 46/66] 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 f2e7fef747d4424ab6c1fdc73cadcc47f3eb55cb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Nov 2017 13:51:47 +0100 Subject: [PATCH 47/66] 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 6d05c320a83e77dc559db2bd2d32dc4beadaa28c Mon Sep 17 00:00:00 2001 From: Ruben D Date: Sat, 11 Nov 2017 17:51:33 +0100 Subject: [PATCH 48/66] 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 720b9ebdfab1e0e0df185a262b9b36f735dec23c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 13 Nov 2017 11:06:27 +0100 Subject: [PATCH 49/66] 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 913bcf45b184fe01392e41803a260d37b333a30c Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 14 Nov 2017 11:53:24 +0100 Subject: [PATCH 50/66] 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 8dd91519a67983b913c4d18d7ccb4dcbf3cdef82 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Wed, 15 Nov 2017 00:52:37 +0100 Subject: [PATCH 51/66] 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 52/66] 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 7aeaf661ae4a604a583de911dabd5876748686e8 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Wed, 15 Nov 2017 13:40:46 +0100 Subject: [PATCH 53/66] 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 b868f913c42486c8b45d1864c5ce1327da597f75 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 16 Nov 2017 10:27:52 +0100 Subject: [PATCH 54/66] 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 15a50511b728a61d9aca9247f88133cc4835d91a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 3 Nov 2017 16:03:28 +0100 Subject: [PATCH 55/66] 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 56/66] 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 57/66] 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 58/66] 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 aa92d4d0f97bcd36ccd1a7cfff30fd5fc68d843e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 11:46:55 +0100 Subject: [PATCH 59/66] 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 60/66] 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 61/66] 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 a0304255d1f9bf9a6b1e220fcef2643df819fd95 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 17 Nov 2017 15:05:08 +0100 Subject: [PATCH 62/66] 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 63/66] 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 fb2ffb7270076877b7dd6403948965df6dd8a755 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 17 Nov 2017 16:31:16 +0100 Subject: [PATCH 64/66] 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 568e18f664bdaf8640013400ec9b6b21a2e93955 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Nov 2017 16:30:57 +0100 Subject: [PATCH 65/66] 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 66/66] 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"