diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index eeb283a72b..655df59c56 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -9,7 +9,7 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura" DEFAULT_CURA_VERSION = "master" DEFAULT_CURA_BUILD_TYPE = "" DEFAULT_CURA_DEBUG_MODE = False -DEFAULT_CURA_SDK_VERSION = "6.2.0" +DEFAULT_CURA_SDK_VERSION = "6.3.0" try: from cura.CuraVersion import CuraAppName # type: ignore @@ -45,4 +45,4 @@ except ImportError: # Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for # example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the # CuraVersion.py.in template. -CuraSDKVersion = "6.2.0" +CuraSDKVersion = "6.3.0" diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 17b28c12c8..42bf1b693a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -269,10 +269,11 @@ class BuildVolume(SceneNode): continue # Mark the node as outside build volume if the set extruder is disabled extruder_position = node.callDecoration("getActiveExtruderPosition") - if extruder_position not in self._global_container_stack.extruders: - continue - if not self._global_container_stack.extruders[extruder_position].isEnabled: - node.setOutsideBuildArea(True) + try: + if not self._global_container_stack.extruderList[int(extruder_position)].isEnabled: + node.setOutsideBuildArea(True) + continue + except IndexError: continue node.setOutsideBuildArea(False) @@ -319,7 +320,7 @@ class BuildVolume(SceneNode): # Mark the node as outside build volume if the set extruder is disabled extruder_position = node.callDecoration("getActiveExtruderPosition") - if not self._global_container_stack.extruders[extruder_position].isEnabled: + if not self._global_container_stack.extruderList[int(extruder_position)].isEnabled: node.setOutsideBuildArea(True) return @@ -549,7 +550,7 @@ class BuildVolume(SceneNode): return old_raft_thickness = self._raft_thickness - if self._global_container_stack.extruders: + if self._global_container_stack.extruderList: # This might be called before the extruder stacks have initialised, in which case getting the adhesion_type fails self._adhesion_type = self._global_container_stack.getProperty("adhesion_type", "value") self._raft_thickness = 0.0 @@ -1098,7 +1099,7 @@ class BuildVolume(SceneNode): # not part of the collision radius, such as bed adhesion (skirt/brim/raft) # and travel avoid distance. def getEdgeDisallowedSize(self): - if not self._global_container_stack or not self._global_container_stack.extruders: + if not self._global_container_stack or not self._global_container_stack.extruderList: return 0 container_stack = self._global_container_stack diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 218fcedc34..6f146368e6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -673,14 +673,14 @@ class CuraApplication(QtApplication): def discardOrKeepProfileChangesClosed(self, option: str) -> None: global_stack = self.getGlobalContainerStack() if option == "discard": - for extruder in global_stack.extruders.values(): + for extruder in global_stack.extruderList: extruder.userChanges.clear() global_stack.userChanges.clear() # if the user decided to keep settings then the user settings should be re-calculated and validated for errors # before slicing. To ensure that slicer uses right settings values elif option == "keep": - for extruder in global_stack.extruders.values(): + for extruder in global_stack.extruderList: extruder.userChanges.update() global_stack.userChanges.update() @@ -1688,7 +1688,7 @@ class CuraApplication(QtApplication): arranger = Arrange.create(x = machine_width, y = machine_depth, fixed_nodes = fixed_nodes) min_offset = 8 default_extruder_position = self.getMachineManager().defaultExtruderPosition - default_extruder_id = self._global_container_stack.extruders[default_extruder_position].getId() + default_extruder_id = self._global_container_stack.extruderList[int(default_extruder_position)].getId() select_models_on_load = self.getPreferences().getValue("cura/select_models_on_load") diff --git a/cura/Machines/MachineErrorChecker.py b/cura/Machines/MachineErrorChecker.py index 964331909c..cfeeb630df 100644 --- a/cura/Machines/MachineErrorChecker.py +++ b/cura/Machines/MachineErrorChecker.py @@ -67,7 +67,7 @@ class MachineErrorChecker(QObject): self._global_stack.propertyChanged.disconnect(self.startErrorCheckPropertyChanged) self._global_stack.containersChanged.disconnect(self.startErrorCheck) - for extruder in self._global_stack.extruders.values(): + for extruder in self._global_stack.extruderList: extruder.propertyChanged.disconnect(self.startErrorCheckPropertyChanged) extruder.containersChanged.disconnect(self.startErrorCheck) @@ -77,7 +77,7 @@ class MachineErrorChecker(QObject): self._global_stack.propertyChanged.connect(self.startErrorCheckPropertyChanged) self._global_stack.containersChanged.connect(self.startErrorCheck) - for extruder in self._global_stack.extruders.values(): + for extruder in self._global_stack.extruderList: extruder.propertyChanged.connect(self.startErrorCheckPropertyChanged) extruder.containersChanged.connect(self.startErrorCheck) @@ -127,7 +127,7 @@ class MachineErrorChecker(QObject): # Populate the (stack, key) tuples to check self._stacks_and_keys_to_check = deque() - for stack in global_stack.extruders.values(): + for stack in global_stack.extruderList: for key in stack.getAllKeys(): self._stacks_and_keys_to_check.append((stack, key)) diff --git a/cura/Machines/Models/BaseMaterialsModel.py b/cura/Machines/Models/BaseMaterialsModel.py index 89a50ba39d..fc2f90f1e4 100644 --- a/cura/Machines/Models/BaseMaterialsModel.py +++ b/cura/Machines/Models/BaseMaterialsModel.py @@ -72,7 +72,12 @@ class BaseMaterialsModel(ListModel): if self._extruder_stack is not None: self._extruder_stack.pyqtContainersChanged.disconnect(self._update) self._extruder_stack.approximateMaterialDiameterChanged.disconnect(self._update) - self._extruder_stack = global_stack.extruders.get(str(self._extruder_position)) + + try: + self._extruder_stack = global_stack.extruderList[self._extruder_position] + except IndexError: + self._extruder_stack = None + if self._extruder_stack is not None: self._extruder_stack.pyqtContainersChanged.connect(self._update) self._extruder_stack.approximateMaterialDiameterChanged.connect(self._update) diff --git a/cura/Machines/Models/UserChangesModel.py b/cura/Machines/Models/UserChangesModel.py index e629295397..ec623f0f38 100644 --- a/cura/Machines/Models/UserChangesModel.py +++ b/cura/Machines/Models/UserChangesModel.py @@ -50,7 +50,7 @@ class UserChangesModel(ListModel): return stacks = [global_stack] - stacks.extend(global_stack.extruders.values()) + stacks.extend(global_stack.extruderList) # Check if the definition container has a translation file and ensure it's loaded. definition = global_stack.getBottom() diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 95ea47112e..68756f8df6 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -199,8 +199,6 @@ class AuthorizationService: self._unable_to_get_data_message.hide() self._unable_to_get_data_message = Message(i18n_catalog.i18nc("@info", "Unable to reach the Ultimaker account server."), title = i18n_catalog.i18nc("@info:title", "Warning")) - self._unable_to_get_data_message.addAction("retry", i18n_catalog.i18nc("@action:button", "Retry"), "[no_icon]", "[no_description]") - self._unable_to_get_data_message.actionTriggered.connect(self._onMessageActionTriggered) self._unable_to_get_data_message.show() except ValueError: Logger.logException("w", "Could not load auth data from preferences") @@ -222,6 +220,3 @@ class AuthorizationService: self.accessTokenChanged.emit() - def _onMessageActionTriggered(self, _, action): - if action == "retry": - self.loadAuthDataFromPreferences() diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index a8b416eeb5..b35069da6f 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -40,8 +40,8 @@ class CuraFormulaFunctions: global_stack = machine_manager.activeMachine try: - extruder_stack = global_stack.extruders[str(extruder_position)] - except KeyError: + extruder_stack = global_stack.extruderList[int(extruder_position)] + except IndexError: if extruder_position != 0: Logger.log("w", "Value for %s of extruder %s was requested, but that extruder is not available. Returning the result form extruder 0 instead" % (property_key, extruder_position)) # This fixes a very specific fringe case; If a profile was created for a custom printer and one of the @@ -104,11 +104,14 @@ class CuraFormulaFunctions: machine_manager = self._application.getMachineManager() global_stack = machine_manager.activeMachine - extruder_stack = global_stack.extruders[str(extruder_position)] + try: + extruder_stack = global_stack.extruderList[extruder_position] + except IndexError: + Logger.log("w", "Unable to find extruder on in index %s", extruder_position) + else: + context = self.createContextForDefaultValueEvaluation(extruder_stack) - context = self.createContextForDefaultValueEvaluation(extruder_stack) - - return self.getValueInExtruder(extruder_position, property_key, context = context) + return self.getValueInExtruder(extruder_position, property_key, context = context) # Gets all default setting values as a list from all extruders of the currently active machine. # The default values are those excluding the values in the user_changes container. diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 2fa90f9636..417f7b01ff 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -74,7 +74,7 @@ class ExtruderManager(QObject): global_container_stack = self._application.getGlobalContainerStack() if global_container_stack: - extruder_stack_ids = {position: extruder.id for position, extruder in global_container_stack.extruders.items()} + extruder_stack_ids = {extruder.getMetaDataEntry("position", ""): extruder.id for extruder in global_container_stack.extruderList} return extruder_stack_ids @@ -360,10 +360,14 @@ class ExtruderManager(QObject): def fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None: container_registry = ContainerRegistry.getInstance() expected_extruder_definition_0_id = global_stack.getMetaDataEntry("machine_extruder_trains")["0"] - extruder_stack_0 = global_stack.extruders.get("0") + try: + extruder_stack_0 = global_stack.extruderList[0] + except IndexError: + extruder_stack_0 = None + # At this point, extruder stacks for this machine may not have been loaded yet. In this case, need to look in # the container registry as well. - if not global_stack.extruders: + if not global_stack.extruderList: extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = global_stack.getId()) if extruder_trains: diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index edb0e7d41f..9983ab6c98 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -135,12 +135,15 @@ class ExtruderStack(CuraContainerStack): if limit_to_extruder == -1: limit_to_extruder = int(cura.CuraApplication.CuraApplication.getInstance().getMachineManager().defaultExtruderPosition) limit_to_extruder = str(limit_to_extruder) + if (limit_to_extruder is not None and limit_to_extruder != "-1") and self.getMetaDataEntry("position") != str(limit_to_extruder): - if str(limit_to_extruder) in self.getNextStack().extruders: - result = self.getNextStack().extruders[str(limit_to_extruder)].getProperty(key, property_name, context) + try: + result = self.getNextStack().extruderList[int(limit_to_extruder)].getProperty(key, property_name, context) if result is not None: context.popContainer() return result + except IndexError: + pass result = super().getProperty(key, property_name, context) context.popContainer() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 512570198c..cb5b25c9ee 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -174,7 +174,7 @@ class MachineManager(QObject): # Create the configuration model with the current data in Cura self._current_printer_configuration.printerType = self._global_container_stack.definition.getName() self._current_printer_configuration.extruderConfigurations = [] - for extruder in self._global_container_stack.extruders.values(): + for extruder in self._global_container_stack.extruderList: extruder_configuration = ExtruderConfigurationModel() # For compare just the GUID is needed at this moment mat_type = extruder.material.getMetaDataEntry("material") if extruder.material != empty_material_container else None @@ -191,7 +191,8 @@ class MachineManager(QObject): # An empty build plate configuration from the network printer is presented as an empty string, so use "" for an # empty build plate. - self._current_printer_configuration.buildplateConfiguration = self._global_container_stack.getProperty("machine_buildplate_type", "value") if self._global_container_stack.variant != empty_variant_container else "" + self._current_printer_configuration.buildplateConfiguration = self._global_container_stack.getProperty("machine_buildplate_type", "value")\ + if self._global_container_stack.variant != empty_variant_container else self._global_container_stack.getProperty("machine_buildplate_type", "default_value") self.currentConfigurationChanged.emit() @pyqtSlot(QObject, result = bool) @@ -635,7 +636,7 @@ class MachineManager(QObject): def isCurrentSetupSupported(self) -> bool: if not self._global_container_stack: return False - for stack in [self._global_container_stack] + list(self._global_container_stack.extruders.values()): + for stack in [self._global_container_stack] + self._global_container_stack.extruderList: for container in stack.getContainers(): if not container: return False @@ -661,8 +662,8 @@ class MachineManager(QObject): def copyAllValuesToExtruders(self) -> None: if self._active_container_stack is None or self._global_container_stack is None: return - extruder_stacks = list(self._global_container_stack.extruders.values()) - for extruder_stack in extruder_stacks: + + for extruder_stack in self._global_container_stack.extruderList: if extruder_stack != self._active_container_stack: for key in self._active_container_stack.userChanges.getAllKeys(): new_value = self._active_container_stack.getProperty(key, "value") @@ -793,8 +794,7 @@ class MachineManager(QObject): return True buildplate_compatible = True # It is compatible by default - extruder_stacks = self._global_container_stack.extruders.values() - for stack in extruder_stacks: + for stack in self._global_container_stack.extruderList: if not stack.isEnabled: continue material_container = stack.material @@ -817,8 +817,8 @@ class MachineManager(QObject): # (material_left_compatible or material_left_usable) and # (material_right_compatible or material_right_usable) result = not self.variantBuildplateCompatible - extruder_stacks = self._global_container_stack.extruders.values() - for stack in extruder_stacks: + + for stack in self._global_container_stack.extruderList: material_container = stack.material if material_container == empty_material_container: continue @@ -854,7 +854,7 @@ class MachineManager(QObject): old_value = old_value(self._global_container_stack) if int(old_value) < 0: continue - if int(old_value) >= extruder_count or not self._global_container_stack.extruders[str(old_value)].isEnabled: + if int(old_value) >= extruder_count or not self._global_container_stack.extruderList[int(old_value)].isEnabled: result.append(setting_key) Logger.log("d", "Reset setting [%s] in [%s] because its old value [%s] is no longer valid", setting_key, container, old_value) return result @@ -943,18 +943,21 @@ class MachineManager(QObject): @deprecated("use Cura.MachineManager.activeMachine.extruders instead", "4.2") def _getExtruder(self, position) -> Optional[ExtruderStack]: if self._global_container_stack: - return self._global_container_stack.extruders.get(str(position)) + try: + return self._global_container_stack.extruderList[int(position)] + except IndexError: + return None return None def updateDefaultExtruder(self) -> None: if self._global_container_stack is None: return - extruder_items = sorted(self._global_container_stack.extruders.items()) + old_position = self._default_extruder_position new_default_position = "0" - for position, extruder in extruder_items: + for extruder in self._global_container_stack.extruderList: if extruder.isEnabled: - new_default_position = position + new_default_position = extruder.getMetaDataEntry("position", "0") break if new_default_position != old_position: self._default_extruder_position = new_default_position @@ -966,7 +969,7 @@ class MachineManager(QObject): definition_changes_container = self._global_container_stack.definitionChanges machine_extruder_count = self._global_container_stack.getProperty("machine_extruder_count", "value") extruder_count = 0 - for position, extruder in self._global_container_stack.extruders.items(): + for position, extruder in enumerate(self._global_container_stack.extruderList): if extruder.isEnabled and int(position) < machine_extruder_count: extruder_count += 1 if self.numberExtrudersEnabled != extruder_count: @@ -990,7 +993,7 @@ class MachineManager(QObject): return with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): property_names = ["value", "resolve", "validationState"] - for container in [self._global_container_stack] + list(self._global_container_stack.extruders.values()): + for container in [self._global_container_stack] + self._global_container_stack.extruderList: for setting_key in container.getAllKeys(): container.propertiesChanged.emit(setting_key, property_names) @@ -1041,7 +1044,7 @@ class MachineManager(QObject): def setSettingForAllExtruders(self, setting_name: str, property_name: str, property_value: str) -> None: if self._global_container_stack is None: return - for key, extruder in self._global_container_stack.extruders.items(): + for extruder in self._global_container_stack.extruderList: container = extruder.userChanges container.setProperty(setting_name, property_name, property_value) @@ -1051,7 +1054,7 @@ class MachineManager(QObject): def resetSettingForAllExtruders(self, setting_name: str) -> None: if self._global_container_stack is None: return - for key, extruder in self._global_container_stack.extruders.items(): + for extruder in self._global_container_stack.extruderList: container = extruder.userChanges container.removeInstance(setting_name) @@ -1069,8 +1072,9 @@ class MachineManager(QObject): changed = False if self._global_container_stack: - for position in self._global_container_stack.extruders: - material_id = self._global_container_stack.extruders[position].material.getMetaDataEntry("base_file") + for extruder in self._global_container_stack.extruderList: + material_id = extruder.material.getMetaDataEntry("base_file") + position = extruder.getMetaDataEntry("position") if position not in self._current_root_material_id or material_id != self._current_root_material_id[position]: changed = True self._current_root_material_id[position] = material_id @@ -1105,7 +1109,7 @@ class MachineManager(QObject): return self._global_container_stack.quality = empty_quality_container self._global_container_stack.qualityChanges = empty_quality_changes_container - for extruder in self._global_container_stack.extruders.values(): + for extruder in self._global_container_stack.extruderList: extruder.quality = empty_quality_container extruder.qualityChanges = empty_quality_changes_container @@ -1221,7 +1225,7 @@ class MachineManager(QObject): self._global_container_stack.extruders[position].material = material_container root_material_id = material_container.getMetaDataEntry("base_file", None) else: - self._global_container_stack.extruders[position].material = empty_material_container + self._global_container_stack.extruderList[int(position)].material = empty_material_container root_material_id = None # The _current_root_material_id is used in the MaterialMenu to see which material is selected if root_material_id != self._current_root_material_id[position]: @@ -1232,7 +1236,7 @@ class MachineManager(QObject): # Check material - variant compatibility if self._global_container_stack is not None: if Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False)): - for position, extruder in self._global_container_stack.extruders.items(): + for extruder in self._global_container_stack.extruderList: if not extruder.isEnabled: continue if not extruder.material.getMetaDataEntry("compatible"): @@ -1311,7 +1315,10 @@ class MachineManager(QObject): position_list = [position] for position_item in position_list: - extruder = self._global_container_stack.extruders[position_item] + try: + extruder = self._global_container_stack.extruderList[int(position_item)] + except IndexError: + continue current_material_base_name = extruder.material.getMetaDataEntry("base_file") current_nozzle_name = None @@ -1389,7 +1396,7 @@ class MachineManager(QObject): extruders_to_disable.add(extruder_configuration.position) # If there's no material and/or nozzle on the printer, enable the first extruder and disable the rest. - if len(extruders_to_disable) == len(self._global_container_stack.extruders): + if len(extruders_to_disable) == len(self._global_container_stack.extruderList): extruders_to_disable.remove(min(extruders_to_disable)) for extruder_configuration in configuration.extruderConfigurations: @@ -1397,7 +1404,7 @@ class MachineManager(QObject): # If the machine doesn't have a hotend or material, disable this extruder if int(position) in extruders_to_disable: - self._global_container_stack.extruders[position].setEnabled(False) + self._global_container_stack.extruderList[int(position)].setEnabled(False) need_to_show_message = True disabled_used_extruder_position_set.add(int(position)) @@ -1430,7 +1437,7 @@ class MachineManager(QObject): # Show human-readable extruder names such as "Extruder Left", "Extruder Front" instead of "Extruder 1, 2, 3". extruder_names = [] for extruder_position in sorted(disabled_used_extruder_position_set): - extruder_stack = self._global_container_stack.extruders[str(extruder_position)] + extruder_stack = self._global_container_stack.extruderList[int(extruder_position)] extruder_name = extruder_stack.definition.getName() extruder_names.append(extruder_name) extruders_str = ", ".join(extruder_names) @@ -1458,7 +1465,7 @@ class MachineManager(QObject): machine_definition_id = self._global_container_stack.definition.id position = str(position) - extruder_stack = self._global_container_stack.extruders[position] + extruder_stack = self._global_container_stack.extruderList[int(position)] nozzle_name = extruder_stack.variant.getName() material_node = ContainerTree.getInstance().machines[machine_definition_id].variants[nozzle_name].materials[root_material_id] self.setMaterial(position, material_node) diff --git a/cura/Settings/SimpleModeSettingsManager.py b/cura/Settings/SimpleModeSettingsManager.py index b1896a9205..3923435e63 100644 --- a/cura/Settings/SimpleModeSettingsManager.py +++ b/cura/Settings/SimpleModeSettingsManager.py @@ -39,8 +39,8 @@ class SimpleModeSettingsManager(QObject): user_setting_keys.update(global_stack.userChanges.getAllKeys()) # check user settings in the extruder stacks - if global_stack.extruders: - for extruder_stack in global_stack.extruders.values(): + if global_stack.extruderList: + for extruder_stack in global_stack.extruderList: user_setting_keys.update(extruder_stack.userChanges.getAllKeys()) # remove settings that are visible in recommended (we don't show the reset button for those) diff --git a/cura/Snapshot.py b/cura/Snapshot.py index 033b453684..353b5ae17c 100644 --- a/cura/Snapshot.py +++ b/cura/Snapshot.py @@ -85,8 +85,10 @@ class Snapshot: preview_pass.setCamera(camera) preview_pass.render() pixel_output = preview_pass.getOutput() - - min_x, max_x, min_y, max_y = Snapshot.getImageBoundaries(pixel_output) + try: + min_x, max_x, min_y, max_y = Snapshot.getImageBoundaries(pixel_output) + except ValueError: + return None size = max((max_x - min_x) / render_width, (max_y - min_y) / render_height) if size > 0.5 or satisfied: diff --git a/cura/UI/PrintInformation.py b/cura/UI/PrintInformation.py index 3fafaaba12..abf1083836 100644 --- a/cura/UI/PrintInformation.py +++ b/cura/UI/PrintInformation.py @@ -197,11 +197,7 @@ class PrintInformation(QObject): material_preference_values = json.loads(self._application.getInstance().getPreferences().getValue("cura/material_settings")) - extruder_stacks = global_stack.extruders - - for position in extruder_stacks: - extruder_stack = extruder_stacks[position] - index = int(position) + for index, extruder_stack in enumerate(global_stack.extruderList): if index >= len(self._material_amounts): continue amount = self._material_amounts[index] diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index 2b881b0fae..a38c53457c 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -55,8 +55,8 @@ UM.Dialog // See http://stackoverflow.com/questions/7659442/listelement-fields-as-properties Component.onCompleted: { - append({"key": "override", "label": catalog.i18nc("@action:ComboBox option", "Update existing")}); - append({"key": "new", "label": catalog.i18nc("@action:ComboBox option", "Create new")}); + append({"key": "override", "label": catalog.i18nc("@action:ComboBox Update/override existing profile", "Update existing")}); + append({"key": "new", "label": catalog.i18nc("@action:ComboBox Save settings in a new profile", "Create new")}); } } diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index ddf7864bb3..9d2e4d1506 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -834,9 +834,8 @@ class CuraEngineBackend(QObject, Backend): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) self._global_container_stack.containersChanged.disconnect(self._onChanged) - extruders = list(self._global_container_stack.extruders.values()) - for extruder in extruders: + for extruder in self._global_container_stack.extruderList: extruder.propertyChanged.disconnect(self._onSettingChanged) extruder.containersChanged.disconnect(self._onChanged) @@ -845,8 +844,8 @@ class CuraEngineBackend(QObject, Backend): if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. self._global_container_stack.containersChanged.connect(self._onChanged) - extruders = list(self._global_container_stack.extruders.values()) - for extruder in extruders: + + for extruder in self._global_container_stack.extruderList: extruder.propertyChanged.connect(self._onSettingChanged) extruder.containersChanged.connect(self._onChanged) self._onChanged() diff --git a/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml index d817450f41..b8c6b78004 100644 --- a/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml +++ b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml @@ -3,6 +3,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 import UM 1.3 as UM import Cura 1.1 as Cura @@ -16,10 +17,6 @@ Item id: base UM.I18nCatalog { id: catalog; name: "cura" } - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - property int columnWidth: ((parent.width - 2 * UM.Theme.getSize("default_margin").width) / 2) | 0 property int columnSpacing: 3 * screenScaleFactor property int propertyStoreIndex: manager ? manager.storeContainerIndex : 1 // definition_changes @@ -32,24 +29,25 @@ Item property var forceUpdateFunction: manager.forceUpdate - Item + RowLayout { id: upperBlock - anchors.top: parent.top - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: UM.Theme.getSize("default_margin").width - - height: childrenRect.height - + anchors + { + top: parent.top + left: parent.left + right: parent.right + margins: UM.Theme.getSize("default_margin").width + } + spacing: UM.Theme.getSize("default_margin").width + // ======================================= // Left-side column for "Printer Settings" // ======================================= Column { - anchors.top: parent.top - anchors.left: parent.left - width: base.columnWidth + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop spacing: base.columnSpacing @@ -177,9 +175,8 @@ Item // ======================================= Column { - anchors.top: parent.top - anchors.right: parent.right - width: base.columnWidth + Layout.fillWidth: true + Layout.alignment: Qt.AlignTop spacing: base.columnSpacing @@ -208,6 +205,7 @@ Item axisName: "x" axisMinOrMax: "min" allowNegativeValue: true + allowPositiveValue: false forceUpdateOnChangeFunction: forceUpdateFunction } @@ -227,6 +225,7 @@ Item axisName: "y" axisMinOrMax: "min" allowNegativeValue: true + allowPositiveValue: false forceUpdateOnChangeFunction: forceUpdateFunction } @@ -245,7 +244,8 @@ Item axisName: "x" axisMinOrMax: "max" - allowNegativeValue: true + allowNegativeValue: false + allowPositiveValue: true forceUpdateOnChangeFunction: forceUpdateFunction } @@ -266,7 +266,8 @@ Item axisName: "y" axisMinOrMax: "max" - allowNegativeValue: true + allowNegativeValue: false + allowPositiveValue: true forceUpdateOnChangeFunction: forceUpdateFunction } @@ -333,22 +334,23 @@ Item } } - Item // Start and End G-code + RowLayout // Start and End G-code { id: lowerBlock - anchors.top: upperBlock.bottom - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").width + anchors + { + top: upperBlock.bottom + bottom: parent.bottom + left: parent.left + right: parent.right + margins: UM.Theme.getSize("default_margin").width + } Cura.GcodeTextArea // "Start G-code" { - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left - width: base.columnWidth - UM.Theme.getSize("default_margin").width + Layout.fillWidth: true + Layout.fillHeight: true labelText: catalog.i18nc("@title:label", "Start G-code") containerStackId: machineStackId @@ -358,11 +360,8 @@ Item Cura.GcodeTextArea // "End G-code" { - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - anchors.right: parent.right - width: base.columnWidth - UM.Theme.getSize("default_margin").width + Layout.fillWidth: true + Layout.fillHeight: true labelText: catalog.i18nc("@title:label", "End G-code") containerStackId: machineStackId diff --git a/plugins/ModelChecker/ModelChecker.py b/plugins/ModelChecker/ModelChecker.py index 0619c95d67..0afed28f19 100644 --- a/plugins/ModelChecker/ModelChecker.py +++ b/plugins/ModelChecker/ModelChecker.py @@ -76,7 +76,9 @@ class ModelChecker(QObject, Extension): # This function can be triggered in the middle of a machine change, so do not proceed if the machine change # has not done yet. - if str(node_extruder_position) not in global_container_stack.extruders: + try: + extruder = global_container_stack.extruderList[int(node_extruder_position)] + except IndexError: Application.getInstance().callLater(lambda: self.onChanged.emit()) return False @@ -131,9 +133,9 @@ class ModelChecker(QObject, Extension): material_shrinkage = {} # Get all shrinkage values of materials used - for extruder_position, extruder in global_container_stack.extruders.items(): + for extruder_position, extruder in enumerate(global_container_stack.extruderList): shrinkage = extruder.material.getProperty("material_shrinkage_percentage", "value") if shrinkage is None: shrinkage = 0 - material_shrinkage[extruder_position] = shrinkage + material_shrinkage[str(extruder_position)] = shrinkage return material_shrinkage diff --git a/plugins/MonitorStage/__init__.py b/plugins/MonitorStage/__init__.py index 0468e6319b..a755268c79 100644 --- a/plugins/MonitorStage/__init__.py +++ b/plugins/MonitorStage/__init__.py @@ -12,7 +12,7 @@ def getMetaData(): return { "stage": { "name": i18n_catalog.i18nc("@item:inmenu", "Monitor"), - "weight": 2 + "weight": 30 } } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 035d2e5299..bb342d5045 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -4,22 +4,68 @@ import QtQuick 2.2 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 -import QtQuick.Window 2.2 import UM 1.2 as UM import Cura 1.0 as Cura import ".." -Item { - id: base; - UM.I18nCatalog { id: catalog; name: "cura"; } - - width: childrenRect.width; - height: childrenRect.height; - property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", +Item +{ + id: base + width: childrenRect.width + height: childrenRect.height + property var allCategoriesExceptSupport: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"] + readonly property string normalMeshType: "" + readonly property string supportMeshType: "support_mesh" + readonly property string cuttingMeshType: "cutting_mesh" + readonly property string infillMeshType: "infill_mesh" + readonly property string antiOverhangMeshType: "anti_overhang_mesh" + + property var currentMeshType: UM.ActiveTool.properties.getValue("MeshType") + + // Update the view every time the currentMeshType changes + onCurrentMeshTypeChanged: + { + var type = currentMeshType + + // set checked state of mesh type buttons + normalButton.checked = type === normalMeshType + supportMeshButton.checked = type === supportMeshType + overhangMeshButton.checked = type === infillMeshType || type === cuttingMeshType + antiOverhangMeshButton.checked = type === antiOverhangMeshType + + // update active type label + for (var button in meshTypeButtons.children) + { + if (meshTypeButtons.children[button].checked){ + meshTypeLabel.text = catalog.i18nc("@label", "Mesh Type") + ": " + meshTypeButtons.children[button].text + break + } + } + } + + function setOverhangsMeshType() + { + if (infillOnlyCheckbox.checked) + { + setMeshType(infillMeshType) + } + else + { + setMeshType(cuttingMeshType) + } + } + + function setMeshType(type) + { + UM.ActiveTool.setProperty("MeshType", type) + } + + UM.I18nCatalog { id: catalog; name: "uranium"} + Column { id: items @@ -28,123 +74,97 @@ Item { spacing: UM.Theme.getSize("default_margin").height - Row + Row // Mesh type buttons { + id: meshTypeButtons spacing: UM.Theme.getSize("default_margin").width - Label + Button { - text: catalog.i18nc("@label","Mesh Type") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - height: UM.Theme.getSize("setting").height - verticalAlignment: Text.AlignVCenter + id: normalButton + text: catalog.i18nc("@label", "Normal model") + iconSource: UM.Theme.getIcon("pos_normal"); + property bool needBorder: true + checkable: true + onClicked: setMeshType(normalMeshType); + style: UM.Theme.styles.tool_button; + z: 4 } - UM.SettingPropertyProvider + Button { - id: meshTypePropertyProvider - containerStack: Cura.MachineManager.activeMachine - watchedProperties: [ "enabled" ] + id: supportMeshButton + text: catalog.i18nc("@label", "Print as support") + iconSource: UM.Theme.getIcon("pos_print_as_support"); + property bool needBorder: true + checkable:true + onClicked: setMeshType(supportMeshType) + style: UM.Theme.styles.tool_button; + z: 3 } - ComboBox + Button { - id: meshTypeSelection - style: UM.Theme.styles.combobox - onActivated: { - UM.ActiveTool.setProperty("MeshType", model.get(index).type) - } - model: ListModel - { - id: meshTypeModel - Component.onCompleted: meshTypeSelection.populateModel() - } - - function populateModel() - { - meshTypeModel.append({ - type: "", - text: catalog.i18nc("@label", "Normal model") - }); - meshTypePropertyProvider.key = "support_mesh"; - if(meshTypePropertyProvider.properties.enabled == "True") - { - meshTypeModel.append({ - type: "support_mesh", - text: catalog.i18nc("@label", "Print as support") - }); - } - meshTypePropertyProvider.key = "anti_overhang_mesh"; - if(meshTypePropertyProvider.properties.enabled == "True") - { - meshTypeModel.append({ - type: "anti_overhang_mesh", - text: catalog.i18nc("@label", "Don't support overlap with other models") - }); - } - meshTypePropertyProvider.key = "cutting_mesh"; - if(meshTypePropertyProvider.properties.enabled == "True") - { - meshTypeModel.append({ - type: "cutting_mesh", - text: catalog.i18nc("@label", "Modify settings for overlap with other models") - }); - } - meshTypePropertyProvider.key = "infill_mesh"; - if(meshTypePropertyProvider.properties.enabled == "True") - { - meshTypeModel.append({ - type: "infill_mesh", - text: catalog.i18nc("@label", "Modify settings for infill of other models") - }); - } - - meshTypeSelection.updateCurrentIndex(); - } - - function updateCurrentIndex() - { - var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); - meshTypeSelection.currentIndex = -1; - for(var index=0; index < meshTypeSelection.model.count; index++) - { - if(meshTypeSelection.model.get(index).type == mesh_type) - { - meshTypeSelection.currentIndex = index; - return; - } - } - meshTypeSelection.currentIndex = 0; - } + id: overhangMeshButton + text: catalog.i18nc("@label", "Modify settings for overlaps") + iconSource: UM.Theme.getIcon("pos_modify_overlaps"); + property bool needBorder: true + checkable:true + onClicked: setMeshType(infillMeshType) + style: UM.Theme.styles.tool_button; + z: 2 } - Connections + Button { - target: Cura.MachineManager - onGlobalContainerChanged: - { - meshTypeSelection.model.clear(); - meshTypeSelection.populateModel(); - } - } - - Connections - { - target: UM.Selection - onSelectionChanged: meshTypeSelection.updateCurrentIndex() + id: antiOverhangMeshButton + text: catalog.i18nc("@label", "Don't support overlaps") + iconSource: UM.Theme.getIcon("pos_modify_dont_support_overlap"); + property bool needBorder: true + checkable: true + onClicked: setMeshType(antiOverhangMeshType) + style: UM.Theme.styles.tool_button; + z: 1 } } - Column + Label + { + id: meshTypeLabel + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + height: UM.Theme.getSize("setting").height + verticalAlignment: Text.AlignVCenter + } + + CheckBox + { + id: infillOnlyCheckbox + + text: catalog.i18nc("@action:checkbox", "Infill only"); + + style: UM.Theme.styles.checkbox; + + visible: currentMeshType === infillMeshType || currentMeshType === cuttingMeshType + onClicked: setOverhangsMeshType() + + Binding + { + target: infillOnlyCheckbox + property: "checked" + value: currentMeshType === infillMeshType + } + } + + Column // Settings Dialog { // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar. // It kinda looks ugly otherwise (big panel, no content on it) id: currentSettings property int maximumHeight: 200 * screenScaleFactor height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) - visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh" + visible: currentMeshType != "anti_overhang_mesh" ScrollView { @@ -159,26 +179,26 @@ Item { model: UM.SettingDefinitionsModel { - id: addedSettingsModel; + id: addedSettingsModel containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: "" expanded: [ "*" ] filter: { if (printSequencePropertyProvider.properties.value == "one_at_a_time") { - return {"settable_per_meshgroup": true}; + return {"settable_per_meshgroup": true} } - return {"settable_per_mesh": true}; + return {"settable_per_mesh": true} } exclude: { - var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] - if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + if (currentMeshType == "support_mesh") { - excluded_settings = excluded_settings.concat(base.all_categories_except_support); + excluded_settings = excluded_settings.concat(base.allCategoriesExceptSupport) } - return excluded_settings; + return excluded_settings } visibilityHandler: Cura.PerObjectSettingVisibilityHandler @@ -188,8 +208,9 @@ Item { // For some reason the model object is updated after removing him from the memory and // it happens only on Windows. For this reason, set the destroyed value manually. - Component.onDestruction: { - setDestroyed(true); + Component.onDestruction: + { + setDestroyed(true) } } @@ -213,7 +234,8 @@ Item { //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely. asynchronous: model.type != "enum" && model.type != "extruder" - onLoaded: { + onLoaded: + { settingLoader.item.showRevertButton = false settingLoader.item.showInheritButton = false settingLoader.item.showLinkedSettingIcon = false @@ -299,7 +321,7 @@ Item { target: inheritStackProvider onPropertiesChanged: { - provider.forcePropertiesChanged(); + provider.forcePropertiesChanged() } } @@ -312,22 +334,22 @@ Item { // so here we connect to the signal and update the those values. if (typeof UM.ActiveTool.properties.getValue("SelectedObjectId") !== "undefined") { - const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId"); + const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId") if (addedSettingsModel.visibilityHandler.selectedObjectId != selectedObjectId) { - addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId; + addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId } } if (typeof UM.ActiveTool.properties.getValue("ContainerID") !== "undefined") { - const containerId = UM.ActiveTool.properties.getValue("ContainerID"); + const containerId = UM.ActiveTool.properties.getValue("ContainerID") if (provider.containerStackId != containerId) { - provider.containerStackId = containerId; + provider.containerStackId = containerId } if (inheritStackProvider.containerStackId != containerId) { - inheritStackProvider.containerStackId = containerId; + inheritStackProvider.containerStackId = containerId } } } @@ -337,7 +359,7 @@ Item { } } - Button + Cura.SecondaryButton { id: customiseSettingsButton; height: UM.Theme.getSize("setting_control").height; @@ -345,33 +367,12 @@ Item { text: catalog.i18nc("@action:button", "Select settings"); - style: ButtonStyle - { - background: Rectangle - { - width: control.width; - height: control.height; - border.width: UM.Theme.getSize("default_lining").width; - border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border") - color: control.pressed ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") - } - label: Label - { - text: control.text; - color: UM.Theme.getColor("setting_control_text"); - font: UM.Theme.getFont("default") - anchors.centerIn: parent - } - } - onClicked: { settingPickDialog.visible = true; - if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + if (currentMeshType == "support_mesh") { - settingPickDialog.additional_excluded_settings = base.all_categories_except_support; + settingPickDialog.additional_excluded_settings = base.allCategoriesExceptSupport; } else { @@ -379,138 +380,12 @@ Item { } } } + } - - UM.Dialog { + SettingPickDialog + { id: settingPickDialog - - title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") - width: screenScaleFactor * 360 - - property var additional_excluded_settings - - onVisibilityChanged: - { - // force updating the model to sync it with addedSettingsModel - if(visible) - { - // Set skip setting, it will prevent from resetting selected mesh_type - contents.model.visibilityHandler.addSkipResetSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) - listview.model.forceUpdate() - - updateFilter() - } - } - - function updateFilter() - { - var new_filter = {}; - new_filter["settable_per_mesh"] = true; - // Don't filter on "settable_per_meshgroup" any more when `printSequencePropertyProvider.properties.value` - // is set to "one_at_a_time", because the current backend architecture isn't ready for that. - - if(filterInput.text != "") - { - new_filter["i18n_label"] = "*" + filterInput.text; - } - - listview.model.filter = new_filter; - } - - TextField { - id: filterInput - - anchors { - top: parent.top - left: parent.left - right: toggleShowAll.left - rightMargin: UM.Theme.getSize("default_margin").width - } - - placeholderText: catalog.i18nc("@label:textbox", "Filter..."); - - onTextChanged: settingPickDialog.updateFilter() - } - - CheckBox - { - id: toggleShowAll - - anchors { - top: parent.top - right: parent.right - } - - text: catalog.i18nc("@label:checkbox", "Show all") - checked: listview.model.showAll - onClicked: - { - listview.model.showAll = checked; - } - } - - ScrollView - { - id: scrollView - - anchors - { - top: filterInput.bottom; - left: parent.left; - right: parent.right; - bottom: parent.bottom; - } - ListView - { - id:listview - model: UM.SettingDefinitionsModel - { - id: definitionsModel; - containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: "" - visibilityHandler: UM.SettingPreferenceVisibilityHandler {} - expanded: [ "*" ] - exclude: - { - var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; - excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings); - return excluded_settings; - } - } - delegate:Loader - { - id: loader - - width: parent.width - height: model.type != undefined ? UM.Theme.getSize("section").height : 0; - - property var definition: model - property var settingDefinitionsModel: definitionsModel - - asynchronous: true - source: - { - switch(model.type) - { - case "category": - return "PerObjectCategory.qml" - default: - return "PerObjectItem.qml" - } - } - } - Component.onCompleted: settingPickDialog.updateFilter() - } - } - - rightButtons: [ - Button { - text: catalog.i18nc("@action:button", "Close"); - onClicked: { - settingPickDialog.visible = false; - } - } - ] } UM.SettingPropertyProvider @@ -533,25 +408,25 @@ Item { storeIndex: 0 } - SystemPalette { id: palette; } + SystemPalette { id: palette } Component { - id: settingTextField; + id: settingTextField Cura.SettingTextField { } } Component { - id: settingComboBox; + id: settingComboBox Cura.SettingComboBox { } } Component { - id: settingExtruder; + id: settingExtruder Cura.SettingExtruder { } } @@ -565,22 +440,23 @@ Item { Component { - id: settingCheckBox; + id: settingCheckBox Cura.SettingCheckBox { } } Component { - id: settingCategory; + id: settingCategory Cura.SettingCategory { } } Component { - id: settingUnknown; + id: settingUnknown Cura.SettingUnknown { } } + } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index baa700165c..b2eb925a6d 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -1,6 +1,6 @@ # Copyright (c) 2016 Ultimaker B.V. # Uranium is released under the terms of the LGPLv3 or higher. - +from UM.Logger import Logger from UM.Tool import Tool from UM.Scene.Selection import Selection from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator @@ -20,15 +20,11 @@ class PerObjectSettingsTool(Tool): self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder", "MeshType") - self._advanced_mode = False self._multi_extrusion = False self._single_model_selected = False Selection.selectionChanged.connect(self.propertyChanged) - Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferenceChanged) - self._onPreferenceChanged("cura/active_mode") - Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) self._onGlobalContainerChanged() Selection.selectionChanged.connect(self._updateEnabled) @@ -70,8 +66,16 @@ class PerObjectSettingsTool(Tool): selected_object.addDecorator(SettingOverrideDecorator()) selected_object.callDecoration("setActiveExtruder", extruder_stack_id) - def setMeshType(self, mesh_type): + ## Returns True when the mesh_type was changed, False when current mesh_type == mesh_type + def setMeshType(self, mesh_type: str) -> bool: + if self.getMeshType() == mesh_type: + return False + selected_object = Selection.getSelectedObject(0) + if selected_object is None: + Logger.log("w", "Tried setting the mesh type of the selected object, but no object was selected") + return False + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. if not stack: selected_object.addDecorator(SettingOverrideDecorator()) @@ -90,6 +94,9 @@ class PerObjectSettingsTool(Tool): new_instance.resetState() # Ensure that the state is not seen as a user state. settings.addInstance(new_instance) + self.propertyChanged.emit() + return True + def getMeshType(self): selected_object = Selection.getSelectedObject(0) stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. @@ -103,11 +110,6 @@ class PerObjectSettingsTool(Tool): return "" - def _onPreferenceChanged(self, preference): - if preference == "cura/active_mode": - self._advanced_mode = Application.getInstance().getPreferences().getValue(preference) == 1 - self._updateEnabled() - def _onGlobalContainerChanged(self): global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: @@ -140,4 +142,4 @@ class PerObjectSettingsTool(Tool): self._single_model_selected = False # Group is selected, so tool needs to be disabled else: self._single_model_selected = True - Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode and self._single_model_selected) + Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._single_model_selected) diff --git a/plugins/PerObjectSettingsTool/SettingPickDialog.qml b/plugins/PerObjectSettingsTool/SettingPickDialog.qml new file mode 100644 index 0000000000..92e22f26bc --- /dev/null +++ b/plugins/PerObjectSettingsTool/SettingPickDialog.qml @@ -0,0 +1,139 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Controls.Styles 1.2 + +import UM 1.2 as UM +import Cura 1.0 as Cura +import ".." + +UM.Dialog + { + id: settingPickDialog + + title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") + width: screenScaleFactor * 360 + + property var additional_excluded_settings + + onVisibilityChanged: + { + // force updating the model to sync it with addedSettingsModel + if (visible) + { + // Set skip setting, it will prevent from resetting selected mesh_type + contents.model.visibilityHandler.addSkipResetSetting(currentMeshType) + listview.model.forceUpdate() + + updateFilter() + } + } + + function updateFilter() + { + var new_filter = {} + new_filter["settable_per_mesh"] = true + // Don't filter on "settable_per_meshgroup" any more when `printSequencePropertyProvider.properties.value` + // is set to "one_at_a_time", because the current backend architecture isn't ready for that. + + if (filterInput.text != "") + { + new_filter["i18n_label"] = "*" + filterInput.text + } + + listview.model.filter = new_filter + } + + TextField { + id: filterInput + + anchors { + top: parent.top + left: parent.left + right: toggleShowAll.left + rightMargin: UM.Theme.getSize("default_margin").width + } + + placeholderText: catalog.i18nc("@label:textbox", "Filter...") + + onTextChanged: settingPickDialog.updateFilter() + } + + CheckBox + { + id: toggleShowAll + + anchors { + top: parent.top + right: parent.right + } + + text: catalog.i18nc("@label:checkbox", "Show all") + checked: listview.model.showAll + onClicked: + { + listview.model.showAll = checked + } + } + + ScrollView + { + id: scrollView + + anchors + { + top: filterInput.bottom + left: parent.left + right: parent.right + bottom: parent.bottom + } + ListView + { + id:listview + model: UM.SettingDefinitionsModel + { + id: definitionsModel + containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: "" + visibilityHandler: UM.SettingPreferenceVisibilityHandler {} + expanded: [ "*" ] + exclude: + { + var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings) + return excluded_settings + } + } + delegate:Loader + { + id: loader + + width: parent.width + height: model.type != undefined ? UM.Theme.getSize("section").height : 0 + + property var definition: model + property var settingDefinitionsModel: definitionsModel + + asynchronous: true + source: + { + switch(model.type) + { + case "category": + return "PerObjectCategory.qml" + default: + return "PerObjectItem.qml" + } + } + } + Component.onCompleted: settingPickDialog.updateFilter() + } + } + + rightButtons: [ + Button { + text: catalog.i18nc("@action:button", "Close") + onClicked: { + settingPickDialog.visible = false + } + } + ] + } \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/tool_icon.svg b/plugins/PerObjectSettingsTool/tool_icon.svg index 4b15eb453f..41e49cae07 100644 --- a/plugins/PerObjectSettingsTool/tool_icon.svg +++ b/plugins/PerObjectSettingsTool/tool_icon.svg @@ -1,3 +1,22 @@ - - - + + + + per_model_settings + Created with Sketch. + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index ba7b06bb1b..cdbb4a79ef 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -367,6 +367,8 @@ class ChangeAtZ(Script): modified_gcode = "" lines = active_layer.split("\n") for line in lines: + if line.strip() == "": + continue if ";Generated with Cura_SteamEngine" in line: TWinstances += 1 modified_gcode += ";ChangeAtZ instances: %d\n" % TWinstances diff --git a/plugins/PrepareStage/__init__.py b/plugins/PrepareStage/__init__.py index f085d788f9..8e86ff303d 100644 --- a/plugins/PrepareStage/__init__.py +++ b/plugins/PrepareStage/__init__.py @@ -10,7 +10,7 @@ def getMetaData(): return { "stage": { "name": i18n_catalog.i18nc("@item:inmenu", "Prepare"), - "weight": 0 + "weight": 10 } } diff --git a/plugins/PreviewStage/__init__.py b/plugins/PreviewStage/__init__.py index 424f573e4a..cb32f583ee 100644 --- a/plugins/PreviewStage/__init__.py +++ b/plugins/PreviewStage/__init__.py @@ -11,7 +11,7 @@ def getMetaData(): return { "stage": { "name": i18n_catalog.i18nc("@item:inmenu", "Preview"), - "weight": 1 + "weight": 20 } } diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 536006ffaa..61954f5bca 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -57,9 +57,12 @@ class SolidView(View): # As the rendering is called a *lot* we really, dont want to re-evaluate the property every time. So we store em! global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: - support_extruder_nr = global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr") - support_angle_stack = global_container_stack.extruders.get(str(support_extruder_nr)) - if support_angle_stack: + support_extruder_nr = int(global_container_stack.getExtruderPositionValueWithDefault("support_extruder_nr")) + try: + support_angle_stack = global_container_stack.extruderList[support_extruder_nr] + except IndexError: + pass + else: self._support_angle = support_angle_stack.getProperty("support_angle", "value") def beginRendering(self): diff --git a/plugins/SupportEraser/tool_icon.svg b/plugins/SupportEraser/tool_icon.svg index a0f8a3e3c3..fee69e0715 100644 --- a/plugins/SupportEraser/tool_icon.svg +++ b/plugins/SupportEraser/tool_icon.svg @@ -1,11 +1,14 @@ - - + + + + support_blocker Created with Sketch. - - - - - + + + + + + - + \ No newline at end of file diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml index 1d1344fa9a..ae9241f0ab 100644 --- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml +++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml @@ -128,7 +128,7 @@ Item TableViewColumn { role: "print_core" - title: catalog.i18nc("@label:table_header", "Print Core") + title: "Print Core" //This term should not be translated. width: Math.floor(table.width * 0.2) } TableViewColumn diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index 5e2885238f..8a267a7bc0 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -12,7 +12,7 @@ def getMetaData(): "mesh_reader": [ { "extension": "ctm", - "description": i18n_catalog.i18nc("@item:inlistbox", "Open Compressed Triangle Mesh") + "description": i18n_catalog.i18nc("@item:inlistbox 'Open' is part of the name of this file format.", "Open Compressed Triangle Mesh") }, { "extension": "dae", diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d698cbfab7..e085adfd47 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -38,7 +38,11 @@ class UFPWriter(MeshWriter): def _createSnapshot(self, *args): # must be called from the main thread because of OpenGL Logger.log("d", "Creating thumbnail image...") - self._snapshot = Snapshot.snapshot(width = 300, height = 300) + try: + self._snapshot = Snapshot.snapshot(width = 300, height = 300) + except Exception: + Logger.logException("w", "Failed to create snapshot image") + self._snapshot = None # Failing to create thumbnail should not fail creation of UFP # This needs to be called on the main thread (Qt thread) because the serialization of material containers can # trigger loading other containers. Because those loaded containers are QtObjects, they must be created on the diff --git a/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py b/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py index 4f2f7a71a2..311356de8e 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py @@ -28,7 +28,7 @@ class CloudFlowMessage(Message): lifetime=0, dismissable=True, option_state=False, - image_source=image_path, + image_source=QUrl.fromLocalFile(image_path), image_caption=I18N_CATALOG.i18nc("@info:status Ultimaker Cloud should not be translated.", "Connect to Ultimaker Cloud"), ) diff --git a/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py index 0acb6c5066..3a1a9f0e0f 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/CloudPrinterDetectedMessage.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM import i18nCatalog from UM.Message import Message - +from cura.CuraApplication import CuraApplication I18N_CATALOG = i18nCatalog("cura") @@ -13,16 +13,25 @@ class CloudPrinterDetectedMessage(Message): # Singleton used to prevent duplicate messages of this type at the same time. __is_visible = False + # Store in preferences to hide this message in the future. + _preference_key = "cloud/block_new_printers_popup" + def __init__(self) -> None: super().__init__( title=I18N_CATALOG.i18nc("@info:title", "New cloud printers found"), text=I18N_CATALOG.i18nc("@info:message", "New printers have been found connected to your account, " "you can find them in your list of discovered printers."), - lifetime=10, - dismissable=True + lifetime=0, + dismissable=True, + option_state=False, + option_text=I18N_CATALOG.i18nc("@info:option_text", "Do not show this message again") ) + self.optionToggled.connect(self._onDontAskMeAgain) + CuraApplication.getInstance().getPreferences().addPreference(self._preference_key, False) def show(self) -> None: + if CuraApplication.getInstance().getPreferences().getValue(self._preference_key): + return if CloudPrinterDetectedMessage.__is_visible: return super().show() @@ -31,3 +40,6 @@ class CloudPrinterDetectedMessage(Message): def hide(self, send_signal = True) -> None: super().hide(send_signal) CloudPrinterDetectedMessage.__is_visible = False + + def _onDontAskMeAgain(self, checked: bool) -> None: + CuraApplication.getInstance().getPreferences().setValue(self._preference_key, checked) diff --git a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py index 678066c3e8..195bc70016 100644 --- a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py +++ b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py @@ -12,6 +12,15 @@ _renamed_container_id_map = { "ultimaker2_extended_0.4": "ultimaker2_extended_olsson_0.4", "ultimaker2_extended_0.6": "ultimaker2_extended_olsson_0.6", "ultimaker2_extended_0.8": "ultimaker2_extended_olsson_0.8", + # HMS434 "extra coarse", "super coarse", and "ultra coarse" are removed. + "hms434_global_Extra_Coarse_Quality": "hms434_global_Normal_Quality", + "hms434_global_Super_Coarse_Quality": "hms434_global_Normal_Quality", + "hms434_global_Ultra_Coarse_Quality": "hms434_global_Normal_Quality", + # HMS434 "0.25", "0.6", "1.2", and "1.5" nozzles are removed. + "hms434_0.25tpnozzle": "hms434_0.4tpnozzle", + "hms434_0.6tpnozzle": "hms434_0.4tpnozzle", + "hms434_1.2tpnozzle": "hms434_0.4tpnozzle", + "hms434_1.5tpnozzle": "hms434_0.4tpnozzle", } @@ -42,7 +51,7 @@ class VersionUpgrade43to44(VersionUpgrade): # # This renames the renamed settings in the containers. def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) # Update version number. @@ -58,12 +67,13 @@ class VersionUpgrade43to44(VersionUpgrade): ## Upgrades stacks to have the new version number. def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - parser = configparser.ConfigParser(interpolation=None) + parser = configparser.ConfigParser(interpolation = None) parser.read_string(serialized) # Update version number. - if "metadata" in parser: - parser["metadata"]["setting_version"] = "10" + if "metadata" not in parser: + parser["metadata"] = {} + parser["metadata"]["setting_version"] = "10" if "containers" in parser: # With the ContainerTree refactor, UM2 with Olsson block got moved to a separate definition. diff --git a/plugins/VersionUpgrade/VersionUpgrade43to44/__init__.py b/plugins/VersionUpgrade/VersionUpgrade43to44/__init__.py index 411a75d385..506ec6c03d 100644 --- a/plugins/VersionUpgrade/VersionUpgrade43to44/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade43to44/__init__.py @@ -59,4 +59,3 @@ def getMetaData() -> Dict[str, Any]: def register(app: "Application") -> Dict[str, Any]: return {"version_upgrade": upgrade} - diff --git a/resources/bundled_packages/cura.json b/resources/bundled_packages/cura.json index 92a1936d70..0c74276912 100644 --- a/resources/bundled_packages/cura.json +++ b/resources/bundled_packages/cura.json @@ -475,6 +475,23 @@ } } }, + "TrimeshReader": { + "package_info": { + "package_id": "TrimeshReader", + "package_type": "plugin", + "display_name": "Trimesh Reader", + "description": "Provides support for reading model files.", + "package_version": "1.0.0", + "sdk_version": "6.0.0", + "website": "https://ultimaker.com", + "author": { + "author_id": "UltimakerPackages", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, "Toolbox": { "package_info": { "package_id": "Toolbox", diff --git a/resources/definitions/Mark2_for_Ultimaker2.def.json b/resources/definitions/Mark2_for_Ultimaker2.def.json index 6a385c4b8b..5aada425fd 100644 --- a/resources/definitions/Mark2_for_Ultimaker2.def.json +++ b/resources/definitions/Mark2_for_Ultimaker2.def.json @@ -1,5 +1,4 @@ { - "id": "Mark2_for_Ultimaker2", "version": 2, "name": "Mark2 for Ultimaker2", "inherits": "ultimaker2_plus", diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 37ab4256ec..b5a28a311b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -7565,7 +7565,7 @@ "small_feature_speed_factor": { "label": "Small Feature Speed", - "description": "Small features will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy.", + "description": "Small features will be printed at this percentage of their normal print speed. Slower printing can help with adhesion and accuracy.", "unit": "%", "type": "float", "default_value": 50, @@ -7577,7 +7577,7 @@ "small_feature_speed_factor_0": { "label": "First Layer Speed", - "description": "Small features on the first layer will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy.", + "description": "Small features on the first layer will be printed at this percentage of their normal print speed. Slower printing can help with adhesion and accuracy.", "unit": "%", "type": "float", "default_value": 50, diff --git a/resources/definitions/flsun_qq.def.json b/resources/definitions/flsun_qq.def.json index ce69317b33..02b3849c12 100644 --- a/resources/definitions/flsun_qq.def.json +++ b/resources/definitions/flsun_qq.def.json @@ -19,13 +19,13 @@ "default_value": true }, "machine_width": { - "default_value": 240 + "default_value": 260 }, "machine_height": { "default_value": 285 }, "machine_depth": { - "default_value": 240 + "default_value": 260 }, "machine_center_is_zero": { "default_value": true diff --git a/resources/definitions/hms434.def.json b/resources/definitions/hms434.def.json index 9956462071..e54b518a89 100644 --- a/resources/definitions/hms434.def.json +++ b/resources/definitions/hms434.def.json @@ -5,12 +5,29 @@ "metadata": { "visible": true, "author": "Scheepers", - "manufacturer": "MaukCC", + "manufacturer": "Hybrid AM Systems", "file_formats": "text/x-gcode", "has_materials": true, + "has_machine_materials": true, "preferred_material": "generic_pla", - "exclude_materials": [ "chromatik_pla", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "imade3d_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "tizyx_abs", "tizyx_pla", "tizyx_pla_bois", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla", "generic_cpe_175", "generic_nylon_175", "dsm_arnitel2045_175", "dsm_novamid1070_175", "generic_tpu_175", "generic_pc_175" ], + "exclude_materials": [ + "chromatik_pla", + "dsm_arnitel2045_175", "dsm_novamid1070_175", + "emotiontech_abs", "emotiontech_petg", "emotiontech_pla", "emotiontech_pva-m", "emotiontech_pva-oks", "emotiontech_pva-s", "emotiontech_tpu98a", + "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", + "fiberlogy_hd_pla", + "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", + "generic_abs_175", "generic_cpe_175", "generic_hips_175", "generic_nylon_175", "generic_pc_175", "generic_petg_175", "generic_pva_175", "generic_tpu_175", + "imade3d_generic_petg_175", "imade3d_generic_pla_175", + "innofill_innoflex60_175", + "octofiber_pla", + "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", + "verbatim_bvoh_175", + "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_PLA_Glitter", "Vertex_Delta_PLA_Mat", "Vertex_Delta_PLA_Satin", "Vertex_Delta_PLA_Wood", "Vertex_Delta_TPU", + "tizyx_abs", "tizyx_flex", "tizyx_petg", "tizyx_pla", "tizyx_pla_bois", "tizyx_pva", + "zyyx_pro_flex", "zyyx_pro_pla" + ], "has_variants": true, "variants_name": "Tool", @@ -41,16 +58,17 @@ "machine_extruder_count": {"default_value": 2 }, "material_diameter": {"default_value": 1.75 }, "machine_heated_bed": {"default_value": true }, + "machine_heated_build_volume":{"default_value": true }, "machine_center_is_zero": {"default_value": false }, "gantry_height": {"value": "35" }, "machine_height": {"default_value": 400 }, "machine_depth": {"default_value": 325 }, "machine_width": {"default_value": 450 }, "machine_gcode_flavor": {"default_value": "RepRap (RepRap)" }, - "material_print_temp_wait": {"default_value": true}, - "material_bed_temp_wait": {"default_value": true }, + "material_print_temp_wait": {"default_value": false }, + "material_bed_temp_wait": {"default_value": false }, "machine_max_feedrate_z": {"default_value": 1200 }, - "machine_start_gcode": {"default_value": "\n;Neither MaukCC nor any of MaukCC representatives has any liabilities or gives any warranties on this .gcode file, or on any or all objects made with this .gcode file.\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\n\nG1 X-44 Y-100 F9000;go to wipe point\nG1 Z0 F900\nG1 Z0.2 F900\nM117 HMS434 Printing ...\n\n" }, + "machine_start_gcode": {"default_value": "\n;Neither Hybrid AM Systems nor any of Hybrid AM Systems representatives has any liabilities or gives any warranties on this .gcode file, or on any or all objects made with this .gcode file.\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\n\nG1 X-44 Y-100 F9000;go to wipe point\nG1 Z0 F900\nG1 Z0.2 F900\nM117 HMS434 Printing ...\n\n" }, "machine_end_gcode": {"default_value": "" }, "retraction_extra_prime_amount": {"minimum_value_warning": "-2.0" }, @@ -71,10 +89,16 @@ "top_layers": {"value": "4" }, "bottom_layers": {"value": "(top_layers)" }, "wall_0_inset": {"value": "0" }, + "outer_inset_first": {"value": true }, "alternate_extra_perimeter": {"value": false }, "filter_out_tiny_gaps": {"value": false }, "fill_outline_gaps": {"value": true }, "skin_outline_count": {"value": "0"}, + "ironing_enabled": {"value": true }, + "ironing_line_spacing": {"value": "line_width"}, + "ironing_flow": {"value": "0"}, + "ironing_inset": {"value": "line_width"}, + "speed_ironing": {"value": "150"}, "infill_sparse_density": {"value": 30}, "infill_pattern": {"value": "'lines'"}, @@ -103,7 +127,7 @@ "speed_wall_x": {"value": "speed_wall"}, "speed_layer_0": {"value": "(speed_print/5*4) if speed_print < 51 else speed_print"}, "speed_topbottom": {"value": "speed_layer_0"}, - "speed_travel": {"value": "100"}, + "speed_travel": {"value": "150"}, "speed_travel_layer_0": {"value": "speed_travel"}, "speed_support_interface": {"value": "speed_topbottom"}, "speed_slowdown_layers": {"value": 1}, @@ -130,7 +154,7 @@ "support_interface_height": {"value": 0.5}, "support_interface_pattern": {"value": "'lines'"}, - "adhesion_type": {"value": "'skirt'"}, + "adhesion_type": {"value": "'none'"}, "skirt_gap": {"value": 1}, "skirt_brim_minimal_length": {"value": 50}, diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index dcaa663a6c..5ad01169ce 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -2178,7 +2178,7 @@ msgstr "プリンター %1 が割り当てられましたが、ジョブには #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99 msgctxt "@label" msgid "Change material %1 from %2 to %3." -msgstr "材料 %1 を %2 から %3 に変更します。" +msgstr "材料 %1 を %2 から %3 に変更します。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102 msgctxt "@label" @@ -2188,7 +2188,7 @@ msgstr "%3 を 材料 %1 にロードします(これは上書きできませ #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105 msgctxt "@label" msgid "Change print core %1 from %2 to %3." -msgstr "プリントコア %1 を %2 から %3 に変更します。" +msgstr "プリントコア %1 を %2 から %3 に変更します。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108 msgctxt "@label" @@ -6078,7 +6078,7 @@ msgstr "Curaプロファイルリーダー" #~ msgctxt "@label" #~ msgid "Starting a print job with an incompatible configuration could damage your 3D printer. Are you sure you want to override the configuration and print %1?" -#~ msgstr "互換性のない構成で印刷ジョブを開始すると3Dプリンターを損傷することがあります。構成と印刷 %1 を上書きしますか?" +#~ msgstr "互換性のない構成で印刷ジョブを開始すると3Dプリンターを損傷することがあります。構成と印刷 %1 を上書きしますか?" #~ msgctxt "@window:title" #~ msgid "Override configuration configuration and start print" diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 9931a9c25b..1a9ca5fc90 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 4.3\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2019-09-10 16:55+0200\n" -"PO-Revision-Date: 2019-07-28 06:51-0300\n" +"PO-Revision-Date: 2019-09-17 06:50-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" "Language: pt_BR\n" @@ -118,12 +118,12 @@ msgstr "Uma impressão USB está em progresso, fechar o Cura interromperá esta #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:127 msgctxt "@message" msgid "A print is still in progress. Cura cannot start another print via USB until the previous print has completed." -msgstr "" +msgstr "Uma impressão ainda está em progresso. O Cura não pode iniciar outra impressão via USB até que a impressão anterior tenha completado." #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:127 msgctxt "@message" msgid "Print in Progress" -msgstr "" +msgstr "Impressão em Progresso" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16 msgctxt "X3g Writer Plugin Description" @@ -294,28 +294,28 @@ msgstr "Conectado pela rede" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py:15 msgctxt "@info:status" msgid "Please wait until the current job has been sent." -msgstr "" +msgstr "Por favor espere até que o trabalho atual tenha sido enviado." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py:16 msgctxt "@info:title" msgid "Print error" -msgstr "" +msgstr "Erro de impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:27 #, python-brace-format msgctxt "@info:status" msgid "You are attempting to connect to {0} but it is not the host of a group. You can visit the web page to configure it as a group host." -msgstr "" +msgstr "Você está tentando conectar a {0} mas ele não é host de um grupo. Você pode visitar a página web para configurá-lo como host de grupo." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:30 msgctxt "@info:title" msgid "Not a group host" -msgstr "" +msgstr "Não é host de grupo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:35 msgctxt "@action" msgid "Configure group" -msgstr "" +msgstr "Configurar grupo" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27 msgctxt "@info:status" @@ -325,7 +325,7 @@ msgstr "Envia e monitora trabalhos de impressão de qualquer lugar usando sua co #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33 msgctxt "@info:status Ultimaker Cloud should not be translated." msgid "Connect to Ultimaker Cloud" -msgstr "" +msgstr "Conectar à Nuvem Ultimaker" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36 msgctxt "@action" @@ -340,7 +340,7 @@ msgstr "Enviando Trabalho de Impressão" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.py:15 msgctxt "@info:status" msgid "Uploading print job to printer." -msgstr "" +msgstr "Transferindo trabalho de impressão para a impressora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py:15 msgctxt "@info:status" @@ -355,23 +355,23 @@ msgstr "Dados Enviados" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py:18 msgctxt "@info:status" msgid "You are attempting to connect to a printer that is not running Ultimaker Connect. Please update the printer to the latest firmware." -msgstr "" +msgstr "Você está tentando conectar a uma impressora que não está rodando Ultimaker Connect. Por favor atualiza a impressora para o firmware mais recente." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py:21 msgctxt "@info:title" msgid "Update your printer" -msgstr "" +msgstr "Atualize sua impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py:24 #, python-brace-format msgctxt "@info:status" msgid "Cura has detected material profiles that were not yet installed on the host printer of group {0}." -msgstr "" +msgstr "O Cura detectou perfis de material que não estão instalados ainda na impressora host do grupo {0}." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py:26 msgctxt "@info:title" msgid "Sending materials to printer" -msgstr "" +msgstr "Enviando material para a impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py:15 msgctxt "@info:text" @@ -381,7 +381,7 @@ msgstr "Não foi possível transferir os dados para a impressora." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py:16 msgctxt "@info:title" msgid "Network error" -msgstr "" +msgstr "Erro de rede" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Utils.py:27 msgctxt "@info:status" @@ -503,32 +503,32 @@ msgstr "Imagem GIF" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:15 msgctxt "@item:inlistbox" msgid "Open Compressed Triangle Mesh" -msgstr "" +msgstr "Malha Comprimida de Triângulos Aberta" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:19 msgctxt "@item:inlistbox" msgid "COLLADA Digital Asset Exchange" -msgstr "" +msgstr "Câmbio de Ativos Digitais COLLADA" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:23 msgctxt "@item:inlistbox" msgid "glTF Binary" -msgstr "" +msgstr "Binário glTF" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:27 msgctxt "@item:inlistbox" msgid "glTF Embedded JSON" -msgstr "" +msgstr "JSON Embutido glTF" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:36 msgctxt "@item:inlistbox" msgid "Stanford Triangle Format" -msgstr "" +msgstr "Formato de Triângulos de Stanford" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:40 msgctxt "@item:inlistbox" msgid "Compressed COLLADA Digital Asset Exchange" -msgstr "" +msgstr "Câmbio de Ativos Digitais COLLADA Comprimido" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331 msgctxt "@info:status" @@ -845,7 +845,7 @@ msgstr "Este perfil {0} contém dados incorretos, não foi #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to import profile from {0}:" -msgstr "" +msgstr "Erro ao importar perfil de {0}:" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:320 #, python-brace-format @@ -1351,7 +1351,7 @@ msgstr "Mesa aquecida" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151 msgctxt "@label" msgid "Heated build volume" -msgstr "" +msgstr "Volume de construção aquecido" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:163 msgctxt "@label" @@ -1670,27 +1670,27 @@ msgstr "Compatibilidade" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:124 msgctxt "@label:table_header" msgid "Machine" -msgstr "" +msgstr "Máquina" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:131 msgctxt "@label:table_header" msgid "Print Core" -msgstr "" +msgstr "Núcleo de Impressão" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:137 msgctxt "@label:table_header" msgid "Build Plate" -msgstr "" +msgstr "Plataforma de Impressão" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:143 msgctxt "@label:table_header" msgid "Support" -msgstr "" +msgstr "Suporte" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:149 msgctxt "@label:table_header" msgid "Quality" -msgstr "" +msgstr "Qualidade" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:170 msgctxt "@action:label" @@ -1810,7 +1810,7 @@ msgstr "A atualização de firmware falhou devido a firmware não encontrado." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:155 msgctxt "@label link to Connect and Cloud interfaces" msgid "Manage printer" -msgstr "" +msgstr "Gerir Impressora" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:192 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:183 @@ -2007,7 +2007,7 @@ msgstr "Endereço da Impressora" #: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102 msgctxt "@label" msgid "Enter the IP address of your printer on the network." -msgstr "" +msgstr "Entre o endereço IP da sua impressora na rede." #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:364 #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138 @@ -3134,7 +3134,7 @@ msgstr "A ampliação (zoom) deve se mover na direção do mouse?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371 msgctxt "@info:tooltip" msgid "Zooming towards the mouse is not supported in the orthographic perspective." -msgstr "" +msgstr "Ampliar com o mouse não é suportado na perspectiva ortográfica." #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376 msgctxt "@action:button" @@ -3197,7 +3197,7 @@ msgstr "Perspectiva" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484 msgid "Orthographic" -msgstr "" +msgstr "Ortográfica" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515 msgctxt "@label" @@ -5086,12 +5086,12 @@ msgstr "Complemento de Dispositivo de Escrita Removível" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker networked printers." -msgstr "" +msgstr "Administra conexões de rede a impressora Ultimaker conectadas." #: UM3NetworkPrinting/plugin.json msgctxt "name" msgid "Ultimaker Network Connection" -msgstr "" +msgstr "Conexão de Rede Ultimaker" #: MonitorStage/plugin.json msgctxt "description" @@ -5326,12 +5326,12 @@ msgstr "Atualização de Versão de 2.2 para 2.4" #: VersionUpgrade/VersionUpgrade42to43/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 4.2 to Cura 4.3." -msgstr "" +msgstr "Atualiza configurações do Cura 4.2 para o Cura 4.3." #: VersionUpgrade/VersionUpgrade42to43/plugin.json msgctxt "name" msgid "Version Upgrade 4.2 to 4.3" -msgstr "" +msgstr "Atualização de Versão de 4.2 para 4.3" #: ImageReader/plugin.json msgctxt "description" @@ -5346,12 +5346,12 @@ msgstr "Leitor de Imagens" #: TrimeshReader/plugin.json msgctxt "description" msgid "Provides support for reading model files." -msgstr "" +msgstr "Provê suporta a ler arquivos de modelo." #: TrimeshReader/plugin.json msgctxt "name" msgid "Trimesh Reader" -msgstr "" +msgstr "Leitor Trimesh" #: CuraEngineBackend/plugin.json msgctxt "description" diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index b3069b105c..8faf6be4a9 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 4.3\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2019-09-10 16:55+0000\n" -"PO-Revision-Date: 2019-07-28 07:41-0300\n" +"PO-Revision-Date: 2019-09-22 21:19-0300\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" "Language: pt_BR\n" @@ -219,12 +219,12 @@ msgstr "Indica se a plataforma de impressão pode ser aquecida." #: fdmprinter.def.json msgctxt "machine_heated_build_volume label" msgid "Has Build Volume Temperature Stabilization" -msgstr "" +msgstr "Tem Estabilização de Temperatura do Volume de Impressão" #: fdmprinter.def.json msgctxt "machine_heated_build_volume description" msgid "Whether the machine is able to stabilize the build volume temperature." -msgstr "" +msgstr "Indica se a máquina consegue estabilizar a temperatura do volume de construção." #: fdmprinter.def.json msgctxt "machine_center_is_zero label" @@ -1284,52 +1284,52 @@ msgstr "Canto Mais Agudo" #: fdmprinter.def.json msgctxt "z_seam_position label" msgid "Z Seam Position" -msgstr "" +msgstr "Posição da Costura Z" #: fdmprinter.def.json msgctxt "z_seam_position description" msgid "The position near where to start printing each part in a layer." -msgstr "" +msgstr "A posição perto da qual se inicia a impressão de cada parte em uma camada." #: fdmprinter.def.json msgctxt "z_seam_position option backleft" msgid "Back Left" -msgstr "" +msgstr "Atrás à Esquerda" #: fdmprinter.def.json msgctxt "z_seam_position option back" msgid "Back" -msgstr "" +msgstr "Atrás" #: fdmprinter.def.json msgctxt "z_seam_position option backright" msgid "Back Right" -msgstr "" +msgstr "Atrás à Direita" #: fdmprinter.def.json msgctxt "z_seam_position option right" msgid "Right" -msgstr "" +msgstr "Direita" #: fdmprinter.def.json msgctxt "z_seam_position option frontright" msgid "Front Right" -msgstr "" +msgstr "Frente à Direita" #: fdmprinter.def.json msgctxt "z_seam_position option front" msgid "Front" -msgstr "" +msgstr "Frente" #: fdmprinter.def.json msgctxt "z_seam_position option frontleft" msgid "Front Left" -msgstr "" +msgstr "Frente à Esquerda" #: fdmprinter.def.json msgctxt "z_seam_position option left" msgid "Left" -msgstr "" +msgstr "Esquerda" #: fdmprinter.def.json msgctxt "z_seam_x label" @@ -1424,7 +1424,7 @@ msgstr "Habilitar Passar a Ferro" #: fdmprinter.def.json msgctxt "ironing_enabled description" msgid "Go over the top surface one additional time, but this time extruding very little material. This is meant to melt the plastic on top further, creating a smoother surface. The pressure in the nozzle chamber is kept high so that the creases in the surface are filled with material." -msgstr "" +msgstr "Passa sobre a superfície superior uma vez a mais, mas extrudando muito pouco material. Isto serve para derreter mais o plástico em cima, criando uma superfície lisa. A pressão na câmara do bico é mantida alta tal que as rugas na superfície são preenchidas com material." #: fdmprinter.def.json msgctxt "ironing_only_highest_layer label" @@ -1704,12 +1704,12 @@ msgstr "O padrão de preenchimento é movido por esta distância no eixo Y." #: fdmprinter.def.json msgctxt "infill_randomize_start_location label" msgid "Randomize Infill Start" -msgstr "" +msgstr "Aleatorizar o Começo do Preenchimento" #: fdmprinter.def.json msgctxt "infill_randomize_start_location description" msgid "Randomize which infill line is printed first. This prevents one segment becoming the strongest, but it does so at the cost of an additional travel move." -msgstr "" +msgstr "Aleatoriza qual linha do preenchimento é impressa primeiro. Isto evita que um segmento seja mais forte que os outros, mas ao custo de um percurso adicional." #: fdmprinter.def.json msgctxt "infill_multiplier label" @@ -2273,7 +2273,7 @@ msgstr "Fluxo da Torre de Purga" #: fdmprinter.def.json msgctxt "prime_tower_flow description" msgid "Flow compensation on prime tower lines." -msgstr "" +msgstr "Compensação de fluxo em filetes de torre de purga." #: fdmprinter.def.json msgctxt "material_flow_layer_0 label" @@ -3568,7 +3568,7 @@ msgstr "Direção de Filete do Preenchimento de Suporte" #: fdmprinter.def.json msgctxt "support_infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angle 0 degrees." -msgstr "" +msgstr "Uma lista de direções inteiras de filete. Elementos da lista são usados sequencialmente à medida que as camadas progridem e quando o fim da lista é alcançado, ela recomeça do início. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia, o que significa usar o ângulo default de 0 graus." #: fdmprinter.def.json msgctxt "support_brim_enable label" @@ -4038,32 +4038,32 @@ msgstr "Quantidade de deslocamento aplicado às bases do suporte." #: fdmprinter.def.json msgctxt "support_interface_angles label" msgid "Support Interface Line Directions" -msgstr "" +msgstr "Direções do Filete de Interface de Suporte" #: fdmprinter.def.json msgctxt "support_interface_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "Uma lista de direções inteiras de filete. Elementos da lista são usados sequencialmente à medida que as camadas progridem e quando o fim da lista é alcançado, ela recomeça do início. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia, o que significa usar os ângulos default (alternando entre 45 e 135 graus se as interfaces forem grossas, ou 90 se não)." #: fdmprinter.def.json msgctxt "support_roof_angles label" msgid "Support Roof Line Directions" -msgstr "" +msgstr "Direções de Filete do Teto do Suporte" #: fdmprinter.def.json msgctxt "support_roof_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "Uma lista de direções inteiras de filete. Elementos da lista são usados sequencialmente à medida que as camadas progridem e quando o fim da lista é alcançado, ela recomeça do início. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia, o que significa usar os ângulos default (alternando entre 45 e 135 graus se as interfaces forem grossas, ou 90 se não)." #: fdmprinter.def.json msgctxt "support_bottom_angles label" msgid "Support Floor Line Directions" -msgstr "" +msgstr "Direções de Filete da Base do Suporte" #: fdmprinter.def.json msgctxt "support_bottom_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "Uma lista de direções inteiras de filete. Elementos da lista são usados sequencialmente à medida que as camadas progridem e quando o fim da lista é alcançado, ela recomeça do início. Os itens da lista são separados por vírgulas e a lista inteira é contida em colchetes. O default é uma lista vazia, o que significa usar os ângulos default (alternando entre 45 e 135 graus se as interfaces forem grossas, ou 90 se não)." #: fdmprinter.def.json msgctxt "support_fan_enable label" @@ -4183,7 +4183,7 @@ msgstr "Tipo de Aderência da Mesa de Impressão" #: fdmprinter.def.json msgctxt "adhesion_type description" msgid "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your model to prevent warping. Raft adds a thick grid with a roof below the model. Skirt is a line printed around the model, but not connected to the model." -msgstr "Diferentes opções que ajudam a melhorar a extrusão e a aderência à plataforma de construção. Brim (bainha) adiciona uma camada única e chata em volta da base de seu modelo para impedir warping. Raft (balsa) adiciona uma grade densa com 'teto' abaixo do modelo. Skirt (saia) é uma linha impressa em volta do modelo, mas não conectada ao modelo, para apenas iniciar o processo de extrusão." +msgstr "Diferentes opções que ajudam a melhorar a extrusão e a aderência à plataforma de impressão. Brim (bainha) adiciona uma camada única e chata em volta da base de seu modelo para impedir warping. Raft (balsa) adiciona uma grade densa com 'teto' abaixo do modelo. Skirt (saia) é uma linha impressa em volta do modelo, mas não conectada ao modelo, para apenas iniciar o processo de extrusão." #: fdmprinter.def.json msgctxt "adhesion_type option skirt" @@ -5192,7 +5192,7 @@ msgstr "Desvio Máximo" #: fdmprinter.def.json msgctxt "meshfix_maximum_deviation description" msgid "The maximum deviation allowed when reducing the resolution for the Maximum Resolution setting. If you increase this, the print will be less accurate, but the g-code will be smaller. Maximum Deviation is a limit for Maximum Resolution, so if the two conflict the Maximum Deviation will always be held true." -msgstr "" +msgstr "O desvio máximo permitido ao reduzir a resolução para o ajuste de Máxima Resolução. Se você aumentar isto, a impressão será menos precisa, mas o G-Code será menor. O Desvio Máximo é um limite para Resolução Máxima, portanto se os dois conflitarem o Desvio Máximo sempre será o valor dominante." #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -6196,42 +6196,42 @@ msgstr "A distância com que mover a cabeça pra frente e pra trás durante a va #: fdmprinter.def.json msgctxt "small_hole_max_size label" msgid "Small Hole Max Size" -msgstr "" +msgstr "Tamanho Máximo de Furos Pequenos" #: fdmprinter.def.json msgctxt "small_hole_max_size description" msgid "Holes and part outlines with a diameter smaller than this will be printed using Small Feature Speed." -msgstr "" +msgstr "Furos e contornos de partes com diâmetro menor que este serão impressos usando a Velocidade de Aspecto Pequeno." #: fdmprinter.def.json msgctxt "small_feature_max_length label" msgid "Small Feature Max Length" -msgstr "" +msgstr "Comprimento Máximo do Aspecto Pequeno" #: fdmprinter.def.json msgctxt "small_feature_max_length description" msgid "Feature outlines that are shorter than this length will be printed using Small Feature Speed." -msgstr "" +msgstr "Contornos de aspectos menores que este comprimento serão impressos usando a Velocidade de Aspecto Pequeno." #: fdmprinter.def.json msgctxt "small_feature_speed_factor label" msgid "Small Feature Speed" -msgstr "" +msgstr "Velocidade de Aspecto Pequeno" #: fdmprinter.def.json msgctxt "small_feature_speed_factor description" msgid "Small features will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy." -msgstr "" +msgstr "Pequenos aspectos serão impressos com esta porcentagem de sua velocidade normal de impressão. Impressão mais lenta pode ajudar com aderência e precisão." #: fdmprinter.def.json msgctxt "small_feature_speed_factor_0 label" msgid "First Layer Speed" -msgstr "" +msgstr "Velocidade da Primeira Camada" #: fdmprinter.def.json msgctxt "small_feature_speed_factor_0 description" msgid "Small features on the first layer will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy." -msgstr "" +msgstr "Aspectos pequenos na primeira camada serão impressos nesta porcentagem de sua velocidade normal de impressão. Impressão mais lenta pode ajudar com aderência e precisão." #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index de762a67f8..4987400320 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: Cura 4.3\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2019-09-10 16:55+0200\n" -"PO-Revision-Date: 2019-07-20 20:39+0800\n" +"PO-Revision-Date: 2019-09-19 23:41+0800\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: Zhang Heh Ji \n" "Language: zh_TW\n" @@ -118,12 +118,12 @@ msgstr "USB 列印正在進行中,關閉 Cura 將停止此列印工作。你 #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:127 msgctxt "@message" msgid "A print is still in progress. Cura cannot start another print via USB until the previous print has completed." -msgstr "" +msgstr "列印仍在進行中。列印完成前,Cura 無法透過 USB 開始另一次列印。" #: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:127 msgctxt "@message" msgid "Print in Progress" -msgstr "" +msgstr "列印正在進行中" #: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16 msgctxt "X3g Writer Plugin Description" @@ -294,28 +294,28 @@ msgstr "透過網路連接" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py:15 msgctxt "@info:status" msgid "Please wait until the current job has been sent." -msgstr "" +msgstr "請等待目前作業傳送完成。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py:16 msgctxt "@info:title" msgid "Print error" -msgstr "" +msgstr "列印錯誤" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:27 #, python-brace-format msgctxt "@info:status" msgid "You are attempting to connect to {0} but it is not the host of a group. You can visit the web page to configure it as a group host." -msgstr "" +msgstr "你正在嘗試連接到 {0},但它不是印表機群組的管理者。你可以透過網頁將其設定為印表機群組的管理者。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:30 msgctxt "@info:title" msgid "Not a group host" -msgstr "" +msgstr "不是印表機群組管理者" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py:35 msgctxt "@action" msgid "Configure group" -msgstr "" +msgstr "設定印表機群組" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27 msgctxt "@info:status" @@ -325,7 +325,7 @@ msgstr "利用你的 Ultimaker 帳號在任何地方傳送和監控列印作業 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33 msgctxt "@info:status Ultimaker Cloud should not be translated." msgid "Connect to Ultimaker Cloud" -msgstr "" +msgstr "連接到 Ultimaker Cloud" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36 msgctxt "@action" @@ -340,7 +340,7 @@ msgstr "正在傳送列印作業" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.py:15 msgctxt "@info:status" msgid "Uploading print job to printer." -msgstr "" +msgstr "正在上傳列印作業到印表機。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py:15 msgctxt "@info:status" @@ -355,23 +355,23 @@ msgstr "資料傳送" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py:18 msgctxt "@info:status" msgid "You are attempting to connect to a printer that is not running Ultimaker Connect. Please update the printer to the latest firmware." -msgstr "" +msgstr "你正在嘗試連接到一台未安裝 Ultimaker Connect 的印表機。請將印表機更新至最新版本的韌體。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py:21 msgctxt "@info:title" msgid "Update your printer" -msgstr "" +msgstr "更新你印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py:24 #, python-brace-format msgctxt "@info:status" msgid "Cura has detected material profiles that were not yet installed on the host printer of group {0}." -msgstr "" +msgstr "Cura 偵測到群組 {0} 的管理主機上未安裝的耗材參數。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py:26 msgctxt "@info:title" msgid "Sending materials to printer" -msgstr "" +msgstr "向印表機傳送耗材參數中" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py:15 msgctxt "@info:text" @@ -381,7 +381,7 @@ msgstr "雲端服務未上傳資料到印表機。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py:16 msgctxt "@info:title" msgid "Network error" -msgstr "" +msgstr "網路錯誤" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Utils.py:27 msgctxt "@info:status" @@ -504,32 +504,32 @@ msgstr "GIF 圖片" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:15 msgctxt "@item:inlistbox" msgid "Open Compressed Triangle Mesh" -msgstr "" +msgstr "Open Compressed Triangle Mesh" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:19 msgctxt "@item:inlistbox" msgid "COLLADA Digital Asset Exchange" -msgstr "" +msgstr "COLLADA Digital Asset Exchange" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:23 msgctxt "@item:inlistbox" msgid "glTF Binary" -msgstr "" +msgstr "glTF Binary" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:27 msgctxt "@item:inlistbox" msgid "glTF Embedded JSON" -msgstr "" +msgstr "glTF Embedded JSON" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:36 msgctxt "@item:inlistbox" msgid "Stanford Triangle Format" -msgstr "" +msgstr "Stanford Triangle Format" #: /home/ruben/Projects/Cura/plugins/TrimeshReader/__init__.py:40 msgctxt "@item:inlistbox" msgid "Compressed COLLADA Digital Asset Exchange" -msgstr "" +msgstr "Compressed COLLADA Digital Asset Exchange" #: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331 msgctxt "@info:status" @@ -846,7 +846,7 @@ msgstr "列印參數 {0} 含有不正確的資料,無法 #, python-brace-format msgctxt "@info:status Don't translate the XML tag !" msgid "Failed to import profile from {0}:" -msgstr "" +msgstr "從 {0} 匯入列印參數失敗:" #: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:320 #, python-brace-format @@ -1352,7 +1352,7 @@ msgstr "熱床" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151 msgctxt "@label" msgid "Heated build volume" -msgstr "" +msgstr "熱箱" #: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:163 msgctxt "@label" @@ -1671,27 +1671,27 @@ msgstr "相容性" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:124 msgctxt "@label:table_header" msgid "Machine" -msgstr "" +msgstr "機器" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:131 msgctxt "@label:table_header" msgid "Print Core" -msgstr "" +msgstr "Print Core" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:137 msgctxt "@label:table_header" msgid "Build Plate" -msgstr "" +msgstr "列印平台" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:143 msgctxt "@label:table_header" msgid "Support" -msgstr "" +msgstr "支撐" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:149 msgctxt "@label:table_header" msgid "Quality" -msgstr "" +msgstr "品質" #: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml:170 msgctxt "@action:label" @@ -1811,7 +1811,7 @@ msgstr "由於韌體遺失,導致韌體更新失敗。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:155 msgctxt "@label link to Connect and Cloud interfaces" msgid "Manage printer" -msgstr "" +msgstr "管理印表機" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:192 #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:183 @@ -2008,7 +2008,7 @@ msgstr "印表機網路位址" #: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102 msgctxt "@label" msgid "Enter the IP address of your printer on the network." -msgstr "" +msgstr "輸入印表機的 IP 位址。" #: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:364 #: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138 @@ -3132,7 +3132,7 @@ msgstr "是否跟隨滑鼠方向進行縮放?" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371 msgctxt "@info:tooltip" msgid "Zooming towards the mouse is not supported in the orthographic perspective." -msgstr "" +msgstr "正交透視不支援游標縮放功能。" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376 msgctxt "@action:button" @@ -3195,7 +3195,7 @@ msgstr "透視" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484 msgid "Orthographic" -msgstr "" +msgstr "正交" #: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515 msgctxt "@label" @@ -3993,7 +3993,7 @@ msgstr "在此耗材組合下,使用膠水以獲得較佳的附著。" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:128 msgctxt "@label" msgid "This configuration is not available because %1 is not recognized. Please visit %2 to download the correct material profile." -msgstr "由於無法識別 %1,因此無法使用此設定。 請連上 %2 下載正確的耗材參數設定。" +msgstr "由於無法識別 %1,因此無法使用此設定。 請連上 %2 下載正確的耗材參數設定。" #: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:129 msgctxt "@label" @@ -5078,12 +5078,12 @@ msgstr "行動裝置輸出設備外掛" #: UM3NetworkPrinting/plugin.json msgctxt "description" msgid "Manages network connections to Ultimaker networked printers." -msgstr "" +msgstr "管理與 Ultimaker 網絡印表機的網絡連線。" #: UM3NetworkPrinting/plugin.json msgctxt "name" msgid "Ultimaker Network Connection" -msgstr "" +msgstr "Ultimaker 網絡連線" #: MonitorStage/plugin.json msgctxt "description" @@ -5318,12 +5318,12 @@ msgstr "升級版本 2.2 到 2.4" #: VersionUpgrade/VersionUpgrade42to43/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 4.2 to Cura 4.3." -msgstr "" +msgstr "將設定從 Cura 4.2 版本升級至 4.3 版本。" #: VersionUpgrade/VersionUpgrade42to43/plugin.json msgctxt "name" msgid "Version Upgrade 4.2 to 4.3" -msgstr "" +msgstr "升級版本 4.2 到 4.3" #: ImageReader/plugin.json msgctxt "description" @@ -5338,12 +5338,12 @@ msgstr "圖片讀取器" #: TrimeshReader/plugin.json msgctxt "description" msgid "Provides support for reading model files." -msgstr "" +msgstr "提供讀取模型檔案的支援。" #: TrimeshReader/plugin.json msgctxt "name" msgid "Trimesh Reader" -msgstr "" +msgstr "Trimesh 讀取器" #: CuraEngineBackend/plugin.json msgctxt "description" @@ -6465,7 +6465,7 @@ msgstr "Cura 列印參數讀取器" #~ msgctxt "@label" #~ msgid "This printer is the host for a group of %1 Ultimaker 3 printers." -#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" +#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機。" #~ msgctxt "@label: arg 1 is group name" #~ msgid "%1 is not set up to host a group of connected Ultimaker 3 printers" @@ -7464,7 +7464,7 @@ msgstr "Cura 列印參數讀取器" #~ msgctxt "@label" #~ msgid "This printer is the host for a group of %1 connected Ultimaker 3 printers" -#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" +#~ msgstr "這台印表機是 %1 台 Ultimaker 3 印表機群組的主機" #~ msgctxt "@label" #~ msgid "Completed on: " diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index cd82a216e0..a8b0a7fc86 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: Cura 4.3\n" "Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n" "POT-Creation-Date: 2019-09-10 16:55+0000\n" -"PO-Revision-Date: 2019-07-23 21:08+0800\n" +"PO-Revision-Date: 2019-09-23 11:59+0200\n" "Last-Translator: Zhang Heh Ji \n" "Language-Team: Zhang Heh Ji \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" +"X-Generator: Poedit 2.2.1\n" #: fdmprinter.def.json msgctxt "machine_settings label" @@ -218,12 +218,12 @@ msgstr "機器是否有熱床。" #: fdmprinter.def.json msgctxt "machine_heated_build_volume label" msgid "Has Build Volume Temperature Stabilization" -msgstr "" +msgstr "具有列印空間溫度穩定性" #: fdmprinter.def.json msgctxt "machine_heated_build_volume description" msgid "Whether the machine is able to stabilize the build volume temperature." -msgstr "" +msgstr "機器是否能夠穩定列印空間溫度。" #: fdmprinter.def.json msgctxt "machine_center_is_zero label" @@ -1283,52 +1283,52 @@ msgstr "最尖銳的轉角" #: fdmprinter.def.json msgctxt "z_seam_position label" msgid "Z Seam Position" -msgstr "" +msgstr "Z 接縫位置" #: fdmprinter.def.json msgctxt "z_seam_position description" msgid "The position near where to start printing each part in a layer." -msgstr "" +msgstr "每一層開始列印位置要靠近哪個方向。" #: fdmprinter.def.json msgctxt "z_seam_position option backleft" msgid "Back Left" -msgstr "" +msgstr "左後方" #: fdmprinter.def.json msgctxt "z_seam_position option back" msgid "Back" -msgstr "" +msgstr "後方" #: fdmprinter.def.json msgctxt "z_seam_position option backright" msgid "Back Right" -msgstr "" +msgstr "右後方" #: fdmprinter.def.json msgctxt "z_seam_position option right" msgid "Right" -msgstr "" +msgstr "右方" #: fdmprinter.def.json msgctxt "z_seam_position option frontright" msgid "Front Right" -msgstr "" +msgstr "右前方" #: fdmprinter.def.json msgctxt "z_seam_position option front" msgid "Front" -msgstr "" +msgstr "前方" #: fdmprinter.def.json msgctxt "z_seam_position option frontleft" msgid "Front Left" -msgstr "" +msgstr "左前方" #: fdmprinter.def.json msgctxt "z_seam_position option left" msgid "Left" -msgstr "" +msgstr "左方" #: fdmprinter.def.json msgctxt "z_seam_x label" @@ -1423,7 +1423,7 @@ msgstr "啟用燙平" #: fdmprinter.def.json msgctxt "ironing_enabled description" msgid "Go over the top surface one additional time, but this time extruding very little material. This is meant to melt the plastic on top further, creating a smoother surface. The pressure in the nozzle chamber is kept high so that the creases in the surface are filled with material." -msgstr "" +msgstr "噴頭額外跑過上表層一次,但這次擠出的材料非常少。這是為了進一步融化頂部的塑料,創造更平滑的表面。噴頭中的壓力會保持很高,將表面中的細縫中填滿材料。" #: fdmprinter.def.json msgctxt "ironing_only_highest_layer label" @@ -1703,12 +1703,12 @@ msgstr "填充樣式在 Y 軸方向平移此距離。" #: fdmprinter.def.json msgctxt "infill_randomize_start_location label" msgid "Randomize Infill Start" -msgstr "" +msgstr "隨機填充起始位置" #: fdmprinter.def.json msgctxt "infill_randomize_start_location description" msgid "Randomize which infill line is printed first. This prevents one segment becoming the strongest, but it does so at the cost of an additional travel move." -msgstr "" +msgstr "隨機選擇第一條填充線列印。 這可以防止強度集中在某一個部分,但會花費額外的空跑。" #: fdmprinter.def.json msgctxt "infill_multiplier label" @@ -2112,7 +2112,7 @@ msgstr "回抽切斷前速度" #: fdmprinter.def.json msgctxt "material_break_preparation_speed description" msgid "How fast the filament needs to be retracted just before breaking it off in a retraction." -msgstr "回抽切斷前,耗材回抽的速度" +msgstr "回抽切斷前,耗材回抽的速度。" #: fdmprinter.def.json msgctxt "material_break_retracted_position label" @@ -3567,7 +3567,7 @@ msgstr "支撐填充線條方向" #: fdmprinter.def.json msgctxt "support_infill_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angle 0 degrees." -msgstr "" +msgstr "要使用的線條方向清單。清單中的項目隨著列印層增加順序使用,當到達清單的末端時,會再從頭開始。清單項目以逗號分隔,整個清單以中括號括住。預設值為空的清單,表示使用預設角度 0 度。" #: fdmprinter.def.json msgctxt "support_brim_enable label" @@ -4037,32 +4037,32 @@ msgstr "套用到支撐底板多邊形的偏移量。" #: fdmprinter.def.json msgctxt "support_interface_angles label" msgid "Support Interface Line Directions" -msgstr "" +msgstr "支撐介面線條方向" #: fdmprinter.def.json msgctxt "support_interface_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "要使用的線條方向清單。清單中的項目隨著列印層增加順序使用,當到達清單的末端時,會再從頭開始。清單項目以逗號分隔,整個清單以中括號括住。預設值為空的清單,表示使用預設角度(預設 90 度,若介面較厚則以 45 度和 135 度交替)。" #: fdmprinter.def.json msgctxt "support_roof_angles label" msgid "Support Roof Line Directions" -msgstr "" +msgstr "支撐頂板線條方向" #: fdmprinter.def.json msgctxt "support_roof_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "要使用的線條方向清單。清單中的項目隨著列印層增加順序使用,當到達清單的末端時,會再從頭開始。清單項目以逗號分隔,整個清單以中括號括住。預設值為空的清單,表示使用預設角度(預設 90 度,若介面較厚則以 45 度和 135 度交替)。" #: fdmprinter.def.json msgctxt "support_bottom_angles label" msgid "Support Floor Line Directions" -msgstr "" +msgstr "支撐底板線條方向" #: fdmprinter.def.json msgctxt "support_bottom_angles description" msgid "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees)." -msgstr "" +msgstr "要使用的線條方向清單。清單中的項目隨著列印層增加順序使用,當到達清單的末端時,會再從頭開始。清單項目以逗號分隔,整個清單以中括號括住。預設值為空的清單,表示使用預設角度(預設 90 度,若介面較厚則以 45 度和 135 度交替)。" #: fdmprinter.def.json msgctxt "support_fan_enable label" @@ -5191,7 +5191,7 @@ msgstr "最大偏差值" #: fdmprinter.def.json msgctxt "meshfix_maximum_deviation description" msgid "The maximum deviation allowed when reducing the resolution for the Maximum Resolution setting. If you increase this, the print will be less accurate, but the g-code will be smaller. Maximum Deviation is a limit for Maximum Resolution, so if the two conflict the Maximum Deviation will always be held true." -msgstr "" +msgstr "降低「最高解析度」設定時允許的最大偏差範圍。假如你增加這個設定值,列印精度會降低,但 G-code 會較小。最大偏差是最高解析度的限制,所以當兩者衝突時,會以最大偏差成立為優先。" #: fdmprinter.def.json msgctxt "support_skip_some_zags label" @@ -6195,42 +6195,42 @@ msgstr "將噴頭來回移動經過刷子的距離。" #: fdmprinter.def.json msgctxt "small_hole_max_size label" msgid "Small Hole Max Size" -msgstr "" +msgstr "細部模式最大直徑" #: fdmprinter.def.json msgctxt "small_hole_max_size description" msgid "Holes and part outlines with a diameter smaller than this will be printed using Small Feature Speed." -msgstr "" +msgstr "小於此直徑的孔洞和零件輪廓,使用細部模式速度列印。" #: fdmprinter.def.json msgctxt "small_feature_max_length label" msgid "Small Feature Max Length" -msgstr "" +msgstr "細部模式最大長度" #: fdmprinter.def.json msgctxt "small_feature_max_length description" msgid "Feature outlines that are shorter than this length will be printed using Small Feature Speed." -msgstr "" +msgstr "輪廓長度小於此值時,使用細部模式速度列印。" #: fdmprinter.def.json msgctxt "small_feature_speed_factor label" msgid "Small Feature Speed" -msgstr "" +msgstr "細部模式速度" #: fdmprinter.def.json msgctxt "small_feature_speed_factor description" msgid "Small features will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy." -msgstr "" +msgstr "細部模式將以正常列印速度的此百分比值列印。 較慢的列印有助於黏合和精度。" #: fdmprinter.def.json msgctxt "small_feature_speed_factor_0 label" msgid "First Layer Speed" -msgstr "" +msgstr "第一層速度" #: fdmprinter.def.json msgctxt "small_feature_speed_factor_0 description" msgid "Small features on the first layer will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy." -msgstr "" +msgstr "細部模式第一層將以正常列印速度的此百分比值列印。 較慢的列印有助於黏合和精度。" #: fdmprinter.def.json msgctxt "command_line_settings label" diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 4c143dcf0b..828d8854dd 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -447,7 +447,6 @@ UM.MainWindow target: Cura.Actions.addProfile onTriggered: { - preferences.show(); preferences.setPage(4); // Create a new profile after a very short delay so the preference page has time to initiate diff --git a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml index 5921a39933..9898fb2c6b 100644 --- a/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml +++ b/resources/qml/MachineSettings/NumericTextFieldWithUnit.qml @@ -35,6 +35,7 @@ UM.TooltipArea property alias labelWidth: fieldLabel.width property alias unitText: unitLabel.text + property alias textField: textFieldWithUnit property alias valueText: textFieldWithUnit.text property alias valueValidator: textFieldWithUnit.validator property alias editingFinishedFunction: textFieldWithUnit.editingFinishedFunction @@ -43,6 +44,8 @@ UM.TooltipArea // whether negative value is allowed. This affects the validation of the input field. property bool allowNegativeValue: false + // whether positive value is allowed. This affects the validation of the input field. + property bool allowPositiveValue: true // callback functions property var afterOnEditingFinishedFunction: dummy_func @@ -65,7 +68,7 @@ UM.TooltipArea anchors.left: parent.left anchors.verticalCenter: textFieldWithUnit.verticalCenter visible: text != "" - font: UM.Theme.getFont("medium") + font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") renderType: Text.NativeRendering } @@ -153,7 +156,13 @@ UM.TooltipArea const value = propertyProvider.properties.value return value ? value : "" } - validator: RegExpValidator { regExp: allowNegativeValue ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ } + validator: DoubleValidator + { + bottom: allowNegativeValue ? Number.NEGATIVE_INFINITY : 0 + top: allowPositiveValue ? Number.POSITIVE_INFINITY : 0 + decimals: 6 + notation: DoubleValidator.StandardNotation + } onEditingFinished: editingFinishedFunction() diff --git a/resources/qml/MachineSettings/PrintHeadMinMaxTextField.qml b/resources/qml/MachineSettings/PrintHeadMinMaxTextField.qml index 2eaaed4524..a08fa92c78 100644 --- a/resources/qml/MachineSettings/PrintHeadMinMaxTextField.qml +++ b/resources/qml/MachineSettings/PrintHeadMinMaxTextField.qml @@ -43,31 +43,48 @@ NumericTextFieldWithUnit { result = func(result, polygon[i][item]) } - result = Math.abs(result) return result } - valueValidator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ } + valueValidator: DoubleValidator { + bottom: allowNegativeValue ? Number.NEGATIVE_INFINITY : 0 + top: allowPositiveValue ? Number.POSITIVE_INFINITY : 0 + decimals: 6 + notation: DoubleValidator.StandardNotation + } + valueText: axisValue + Connections + { + target: textField + onActiveFocusChanged: + { + // When this text field loses focus and the entered text is not valid, make sure to recreate the binding to + // show the correct value. + if (!textField.activeFocus && !textField.acceptableInput) + { + valueText = axisValue + } + } + } + editingFinishedFunction: function() { var polygon = JSON.parse(propertyProvider.properties.value) - var newValue = parseFloat(valueText.replace(',', '.')) + if (axisName == "x") // x min/x max { var start_i1 = (axisMinOrMax == "min") ? 0 : 2 - var factor = (axisMinOrMax == "min") ? -1 : 1 - polygon[start_i1][0] = newValue * factor - polygon[start_i1 + 1][0] = newValue * factor + polygon[start_i1][0] = newValue + polygon[start_i1 + 1][0] = newValue } else // y min/y max { var start_i1 = (axisMinOrMax == "min") ? 1 : 0 - var factor = (axisMinOrMax == "min") ? -1 : 1 - polygon[start_i1][1] = newValue * factor - polygon[start_i1 + 2][1] = newValue * factor + polygon[start_i1][1] = newValue + polygon[start_i1 + 2][1] = newValue } var polygon_string = JSON.stringify(polygon) if (polygon_string != propertyProvider.properties.value) @@ -75,5 +92,8 @@ NumericTextFieldWithUnit propertyProvider.setPropertyValue("value", polygon_string) forceUpdateOnChangeFunction() } + + // Recreate the binding to show the correct value. + valueText = axisValue } } diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml index afb3aba82b..b47d77243c 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml @@ -107,8 +107,9 @@ Item Cura.PrinterTypeLabel { id: printerTypeLabel - text: Cura.MachineManager.getAbbreviatedMachineName(section) + text: section anchors.verticalCenter: parent.verticalCenter //One default margin above and one below. + autoFit: true } } diff --git a/resources/qml/ObjectItemButton.qml b/resources/qml/ObjectItemButton.qml index 683d0ed52b..b454fd929a 100644 --- a/resources/qml/ObjectItemButton.qml +++ b/resources/qml/ObjectItemButton.qml @@ -51,5 +51,21 @@ Button border.color: objectItemButton.checked ? UM.Theme.getColor("primary") : "transparent" } + TextMetrics + { + id: buttonTextMetrics + text: buttonText.text + font: buttonText.font + elide: buttonText.elide + elideWidth: buttonText.width + } + + Cura.ToolTip + { + id: tooltip + tooltipText: objectItemButton.text + visible: objectItemButton.hovered && buttonTextMetrics.elidedText != buttonText.text + } + onClicked: Cura.SceneController.changeSelection(index) } diff --git a/resources/qml/ObjectSelector.qml b/resources/qml/ObjectSelector.qml index 9bf0e18809..6757863e1c 100644 --- a/resources/qml/ObjectSelector.qml +++ b/resources/qml/ObjectSelector.qml @@ -78,7 +78,7 @@ Item id: contents width: parent.width visible: objectSelector.opened - height: visible ? scroll.height : 0 + height: visible ? listView.height : 0 color: UM.Theme.getColor("main_background") border.width: UM.Theme.getSize("default_lining").width border.color: UM.Theme.getColor("lining") @@ -87,50 +87,39 @@ Item anchors.bottom: parent.bottom - ScrollView + ListView { - id: scroll - width: parent.width + id: listView clip: true - padding: UM.Theme.getSize("default_lining").width - - contentItem: ListView + anchors { - id: listView + left: parent.left + right: parent.right + margins: UM.Theme.getSize("default_lining").width + } - // Can't use parent.width since the parent is the flickable component and not the ScrollView - width: scroll.width - scroll.leftPadding - scroll.rightPadding - property real maximumHeight: UM.Theme.getSize("objects_menu_size").height + ScrollBar.vertical: ScrollBar + { + hoverEnabled: true + } - // We use an extra property here, since we only want to to be informed about the content size changes. - onContentHeightChanged: + property real maximumHeight: UM.Theme.getSize("objects_menu_size").height + + height: Math.min(contentHeight, maximumHeight) + + model: Cura.ObjectsModel {} + + delegate: ObjectItemButton + { + id: modelButton + Binding { - // It can sometimes happen that (due to animations / updates) the contentHeight is -1. - // This can cause a bunch of updates to trigger oneother, leading to a weird loop. - if(contentHeight >= 0) - { - scroll.height = Math.min(contentHeight, maximumHeight) + scroll.topPadding + scroll.bottomPadding - } - } - - Component.onCompleted: - { - scroll.height = Math.min(contentHeight, maximumHeight) + scroll.topPadding + scroll.bottomPadding - } - model: Cura.ObjectsModel {} - - delegate: ObjectItemButton - { - id: modelButton - Binding - { - target: modelButton - property: "checked" - value: model.selected - } - text: model.name - width: listView.width + target: modelButton + property: "checked" + value: model.selected } + text: model.name + width: listView.width } } } diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 4adb3e72d2..3077ed253e 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -469,7 +469,7 @@ UM.PreferencesPage Label { - text: catalog.i18nc("@window:text", "Camera rendering: ") + text: catalog.i18nc("@window:text", "Camera rendering:") } ComboBox { diff --git a/resources/qml/PrinterSelector/MachineSelectorButton.qml b/resources/qml/PrinterSelector/MachineSelectorButton.qml index c37823ba82..115957dd64 100644 --- a/resources/qml/PrinterSelector/MachineSelectorButton.qml +++ b/resources/qml/PrinterSelector/MachineSelectorButton.qml @@ -72,6 +72,7 @@ Button verticalCenter: parent.verticalCenter } spacing: UM.Theme.getSize("narrow_margin").width + visible: (updatePrinterTypesOnlyWhenChecked && machineSelectorButton.checked) || !updatePrinterTypesOnlyWhenChecked Repeater { diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 9c964347ca..c2f23a6f1d 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -65,7 +65,7 @@ Item anchors.right: clearFilterButton.left anchors.rightMargin: Math.round(UM.Theme.getSize("thick_margin").width) - placeholderText: "" + "
" + catalog.i18nc("@label:textbox", "search settings") + placeholderText: "" + "
" + catalog.i18nc("@label:textbox", "Search settings") style: TextFieldStyle { diff --git a/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg index a6e5ddd0a2..62d3ceaf21 100644 --- a/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg +++ b/resources/quality/hms434/hms434_global_Coarse_Quality.inst.cfg @@ -7,9 +7,9 @@ definition = hms434 setting_version = 10 type = quality quality_type = coarse -weight = -3 +weight = -1 global_quality = True [values] layer_height = 0.4 -layer_height_0 = 0.4 +layer_height_0 = 0.2 diff --git a/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg deleted file mode 100644 index b7bd62f096..0000000000 --- a/resources/quality/hms434/hms434_global_Extra_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 4 -name = Extra Coarse -definition = hms434 - -[metadata] -setting_version = 10 -type = quality -quality_type = extra coarse -weight = -4 -global_quality = True - -[values] -layer_height = 0.6 -layer_height_0 = 0.6 diff --git a/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg deleted file mode 100644 index e1c5db19d2..0000000000 --- a/resources/quality/hms434/hms434_global_Super_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,16 +0,0 @@ -[general] -version = 4 -name = Super Coarse -definition = hms434 - -[metadata] -setting_version = 10 -type = quality -quality_type = super coarse -weight = -4 -global_quality = True - -[values] -layer_height = 0.8 -layer_height_0 = 0.8 - diff --git a/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg b/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg deleted file mode 100644 index 21c609199f..0000000000 --- a/resources/quality/hms434/hms434_global_Ultra_Coarse_Quality.inst.cfg +++ /dev/null @@ -1,15 +0,0 @@ -[general] -version = 4 -name = Ultra Coarse -definition = hms434 - -[metadata] -setting_version = 10 -type = quality -quality_type = ultra coarse -weight = -4 -global_quality = True - -[values] -layer_height = 1.0 -layer_height_0 = 1.0 diff --git a/resources/quality/hms434/pla/hms434_0.4_pla_high.inst.cfg b/resources/quality/hms434/pla/hms434_0.4_pla_high.inst.cfg new file mode 100644 index 0000000000..551978870e --- /dev/null +++ b/resources/quality/hms434/pla/hms434_0.4_pla_high.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = High +definition = hms434 + +[metadata] +setting_version = 10 +type = quality +quality_type = high +weight = 1 +material = generic_pla +variant = 0.4mm TP extruder + +[values] + +wall_0_wipe_dist = 0.0 + +infill_overlap_mm = -0.1 +infill_wipe_dist = 0 + +default_material_print_temperature = 190 +material_standby_temperature = 160 +default_material_bed_temperature = 45 +build_volume_temperature = 43 +material_flow = 100 +retraction_amount = 1 +retraction_speed = 40 +retraction_prime_speed = 8 +retraction_extra_prime_amount = 0 +switch_extruder_retraction_amount = 2 + +speed_print = 50 + +coasting_volume = 0.05 +coasting_min_volume = 0.17 +coasting_speed = 100 diff --git a/resources/quality/hms434/pla/hms434_0.4_pla_normal.inst.cfg b/resources/quality/hms434/pla/hms434_0.4_pla_normal.inst.cfg new file mode 100644 index 0000000000..3952acec60 --- /dev/null +++ b/resources/quality/hms434/pla/hms434_0.4_pla_normal.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Normal +definition = hms434 + +[metadata] +setting_version = 10 +type = quality +quality_type = normal +weight = 0 +material = generic_pla +variant = 0.4mm TP extruder + +[values] + +wall_0_wipe_dist = 0.0 + +infill_overlap_mm = -0.1 +infill_wipe_dist = 0 + +default_material_print_temperature = 190 +material_standby_temperature = 160 +default_material_bed_temperature = 45 +build_volume_temperature = 43 +material_flow = 100 +retraction_amount = 1 +retraction_speed = 40 +retraction_prime_speed = 8 +retraction_extra_prime_amount = 0 +switch_extruder_retraction_amount = 2 + +speed_print = 50 + +coasting_volume = 0.05 +coasting_min_volume = 0.17 +coasting_speed = 100 diff --git a/resources/quality/hms434/pla/hms434_0.8_pla_coarse.inst.cfg b/resources/quality/hms434/pla/hms434_0.8_pla_coarse.inst.cfg new file mode 100644 index 0000000000..897209b098 --- /dev/null +++ b/resources/quality/hms434/pla/hms434_0.8_pla_coarse.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Coarse +definition = hms434 + +[metadata] +setting_version = 10 +type = quality +quality_type = coarse +weight = -1 +material = generic_pla +variant = 0.8mm TP extruder + +[values] + +wall_0_wipe_dist = 0.0 + +infill_overlap_mm = -0.1 +infill_wipe_dist = 0 + +default_material_print_temperature = 190 +material_standby_temperature = 160 +default_material_bed_temperature = 45 +build_volume_temperature = 43 +material_flow = 100 +retraction_amount = 1 +retraction_speed = 40 +retraction_prime_speed = 8 +retraction_extra_prime_amount = 0 +switch_extruder_retraction_amount = 2 + +speed_print = 50 + +coasting_volume = 0.05 +coasting_min_volume = 0.17 +coasting_speed = 100 diff --git a/resources/quality/hms434/pla/hms434_0.8_pla_normal.inst.cfg b/resources/quality/hms434/pla/hms434_0.8_pla_normal.inst.cfg new file mode 100644 index 0000000000..53630ffd84 --- /dev/null +++ b/resources/quality/hms434/pla/hms434_0.8_pla_normal.inst.cfg @@ -0,0 +1,40 @@ +[general] +version = 4 +name = Normal +definition = hms434 + +[metadata] +setting_version = 10 +type = quality +quality_type = normal +weight = 0 +material = generic_pla +variant = 0.8mm TP extruder + +[values] + +wall_0_wipe_dist = 0.0 + +infill_overlap_mm = -0.1 +infill_sparse_thickness = =0.4 if infill_sparse_density < 90 else 0.2 +infill_wipe_dist = 0 + +default_material_print_temperature = 190 +material_standby_temperature = 160 +default_material_bed_temperature = 45 +build_volume_temperature = 43 +material_flow = 100 +retraction_amount = 1 +retraction_speed = 40 +retraction_prime_speed = 8 +retraction_extra_prime_amount = 0 +switch_extruder_retraction_amount = 2 + +speed_print = 50 +speed_infill = 42 + +support_infill_sparse_thickness = 0.4 + +coasting_volume = 0.05 +coasting_min_volume = 0.17 +coasting_speed = 100 diff --git a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_coarse.inst.cfg index c6487f8aa5..0c051bd0be 100644 --- a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_coarse.inst.cfg @@ -4,7 +4,7 @@ name = Coarse definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_fine.inst.cfg b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_fine.inst.cfg index d625fb86db..95e51dee0b 100644 --- a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_fine.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = high weight = 1 diff --git a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_medium.inst.cfg index cb308dd5c2..7aa8c122ee 100644 --- a/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/PETG/jbo_generic_petg_0.4_medium.inst.cfg @@ -4,7 +4,7 @@ name = Medium definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_coarse.inst.cfg b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_coarse.inst.cfg index 1968297bf9..fa0ec0a16b 100644 --- a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_coarse.inst.cfg @@ -4,7 +4,7 @@ name = Coarse definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_fine.inst.cfg b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_fine.inst.cfg index 300036d1af..7e08040eae 100644 --- a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_fine.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = high weight = 1 diff --git a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_medium.inst.cfg b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_medium.inst.cfg index 20d6efbdc2..c29b468b49 100644 --- a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_medium.inst.cfg +++ b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_medium.inst.cfg @@ -4,7 +4,7 @@ name = Medium definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_ultrafine.inst.cfg index 6ec63159d9..2742f86f31 100644 --- a/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/PLA/jbo_generic_pla_0.4_ultrafine.inst.cfg @@ -4,7 +4,7 @@ name = UltraFine definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = ultrahigh weight = 2 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg index 9601b2ed19..cc4f3de913 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_coarse.inst.cfg @@ -4,7 +4,7 @@ name = Coarse definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg index a99e2d656c..48111629d0 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_fine.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = high weight = 1 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg index af86a797f7..9827a272c0 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_normal.inst.cfg @@ -4,7 +4,7 @@ name = Medium definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg index 3edc3bba17..6c882498bd 100644 --- a/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg +++ b/resources/quality/imade3d_jellybox/imade3d_jellybox_ultrafine.inst.cfg @@ -4,7 +4,7 @@ name = UltraFine definition = imade3d_jellybox [metadata] -setting_version = 8 +setting_version = 10 type = quality quality_type = ultrahigh weight = 2 diff --git a/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.CFG b/resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.cfg similarity index 100% rename from resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.CFG rename to resources/quality/tizyx/tizyx_evy_dual/tizyx_evy_dual_global_Flex_Only_Quality.inst.cfg diff --git a/resources/quality/tizyx/tizyx_k25/tizyx_k25_high.inst.cfg b/resources/quality/tizyx/tizyx_k25/tizyx_k25_high.inst.cfg index d7600f847b..b307e33586 100644 --- a/resources/quality/tizyx/tizyx_k25/tizyx_k25_high.inst.cfg +++ b/resources/quality/tizyx/tizyx_k25/tizyx_k25_high.inst.cfg @@ -1,41 +1,41 @@ -[general] -version = 4 -name = High -definition = tizyx_k25 - -[metadata] -quality_type = draft -setting_version = 7 -type = quality -global_quality = True - -[values] -layer_height = 0.1 -initial_layer_line_width_factor = 90 -infill_overlap = 15 -material_flow_layer_0 = 93 -material_flow = 99 -speed_wall_0 = 45 -speed_wall_x = 50 -speed_topbottom = 45 -support_enable= True -support_angle = 70 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 2 -fill_outline_gaps = True -infill_sparse_density = 15 -material_diameter = 1.75 -retraction_min_travel = 2 -speed_print = 60 -cool_fan_speed_0 = 10 -cool_min_layer_time = 12 -layer_start_x = 250 -layer_start_y = 250 -coasting_enable = False -wall_line_count = 2 -material_print_temperature = =default_material_print_temperature -material_initial_print_temperature = =material_print_temperature -material_final_print_temperature = =material_print_temperature -z_seam_corner = z_seam_corner_none -optimize_wall_printing_order = True +[general] +version = 4 +name = High +definition = tizyx_k25 + +[metadata] +quality_type = draft +setting_version = 7 +type = quality +global_quality = True + +[values] +layer_height = 0.1 +initial_layer_line_width_factor = 90 +infill_overlap = 15 +material_flow_layer_0 = 93 +material_flow = 99 +speed_wall_0 = 45 +speed_wall_x = 50 +speed_topbottom = 45 +support_enable= True +support_angle = 70 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 2 +fill_outline_gaps = True +infill_sparse_density = 15 +material_diameter = 1.75 +retraction_min_travel = 2 +speed_print = 60 +cool_fan_speed_0 = 10 +cool_min_layer_time = 12 +layer_start_x = 250 +layer_start_y = 250 +coasting_enable = False +wall_line_count = 2 +material_print_temperature = =default_material_print_temperature +material_initial_print_temperature = =material_print_temperature +material_final_print_temperature = =material_print_temperature +z_seam_corner = z_seam_corner_none +optimize_wall_printing_order = True diff --git a/resources/quality/tizyx/tizyx_k25/tizyx_k25_normal.inst.cfg b/resources/quality/tizyx/tizyx_k25/tizyx_k25_normal.inst.cfg index 19e98fc9a9..ec6e78b65f 100644 --- a/resources/quality/tizyx/tizyx_k25/tizyx_k25_normal.inst.cfg +++ b/resources/quality/tizyx/tizyx_k25/tizyx_k25_normal.inst.cfg @@ -1,41 +1,41 @@ -[general] -version = 4 -name = Normal -definition = tizyx_k25 - -[metadata] -quality_type = normal -setting_version = 10 -type = quality -global_quality = True - -[values] -layer_height = 0.2 -initial_layer_line_width_factor = 90 -infill_overlap = 15 -material_flow_layer_0 = 93 -material_flow = 99 -speed_wall_0 = 45 -speed_wall_x = 50 -speed_topbottom = 45 -support_enable= True -support_angle = 70 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 2 -fill_outline_gaps = True -infill_sparse_density = 15 -material_diameter = 1.75 -retraction_min_travel = 2 -speed_print = 60 -cool_fan_speed_0 = 10 -cool_min_layer_time = 12 -layer_start_x = 250 -layer_start_y = 250 -coasting_enable = False -wall_line_count = 2 -material_print_temperature = =default_material_print_temperature -material_initial_print_temperature = =material_print_temperature -material_final_print_temperature = =material_print_temperature -z_seam_corner = z_seam_corner_none -optimize_wall_printing_order = True +[general] +version = 4 +name = Normal +definition = tizyx_k25 + +[metadata] +quality_type = normal +setting_version = 10 +type = quality +global_quality = True + +[values] +layer_height = 0.2 +initial_layer_line_width_factor = 90 +infill_overlap = 15 +material_flow_layer_0 = 93 +material_flow = 99 +speed_wall_0 = 45 +speed_wall_x = 50 +speed_topbottom = 45 +support_enable= True +support_angle = 70 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 2 +fill_outline_gaps = True +infill_sparse_density = 15 +material_diameter = 1.75 +retraction_min_travel = 2 +speed_print = 60 +cool_fan_speed_0 = 10 +cool_min_layer_time = 12 +layer_start_x = 250 +layer_start_y = 250 +coasting_enable = False +wall_line_count = 2 +material_print_temperature = =default_material_print_temperature +material_initial_print_temperature = =material_print_temperature +material_final_print_temperature = =material_print_temperature +z_seam_corner = z_seam_corner_none +optimize_wall_printing_order = True diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader index 4a3cd7f6e4..7f1b04dd59 100644 --- a/resources/shaders/overhang.shader +++ b/resources/shaders/overhang.shader @@ -60,11 +60,7 @@ fragment = highp float NdotR = clamp(dot(viewVector, reflectedLight), 0.0, 1.0); finalColor += pow(NdotR, u_shininess) * u_specularColor; - #if __VERSION__ >= 150 - finalColor = (u_faceId != gl_PrimitiveID) ? ((-normal.y > u_overhangAngle) ? u_overhangColor : finalColor) : u_faceColor; - #else finalColor = (-normal.y > u_overhangAngle) ? u_overhangColor : finalColor; - #endif gl_FragColor = finalColor; gl_FragColor.a = 1.0; diff --git a/resources/texts/change_log.txt b/resources/texts/change_log.txt index efc476f606..ea4ae85bc2 100644 --- a/resources/texts/change_log.txt +++ b/resources/texts/change_log.txt @@ -1,3 +1,84 @@ +[4.3.0] +*Ultimaker S3. +This release includes a new profile for our latest S-line of 3D printers: the Ultimaker S3. Eagle-eyed beta testers may have noticed this extra printer profile in the beta release, too. Well done to those who spotted it. Learn more about the Ultimaker S3 by reading the blog on Ultimaker.com. + +*Even more 3D file formats. +This version is compatible with even more 3D file formats out-of-the-box, so you can integrate CAD software, 3D scanning software, and 3D modeling software into your workflow with ease. Natively open Collada, GLTF, OpenCTM, and PLY formats, to name a few. And don’t forget, downloading plugins from the Ultimaker Marketplace brings in support for many more. + +*Align faces to the build plate. +Orienting your models with the rotation tool or the lay flat tool can be a hassle with complex geometries. This new time-saving feature lets you select a face of your model to rest on the build plate, so you can get the orientation you need quickly and easily. Please note this is disabled in compatibility mode (and if your machine is running OpenGL 3.2 or lower). + +*Support infill/interface line directions. +Improve reliability with more precise control over certain aspects of your print. Choose the angle that support-infill and interfaces print at, thanks to a contribution from vgribinchuck. Input a set of angles you want lines generated at, and these will be placed sequentially throughout your 3D print. + +*Randomize infill start. +Randomize which infill line is printed first. This distributes strength across the model, preventing one segment becoming the weakest link, at the cost of an additional travel move. + +*Print small features slower. +Smartavionics has contributed a setting which recognizes small perimeters and reduces print speed in order to boost the reliability and accuracy of small printed features. This is especially useful for small perimeters such as printed holes, as they tend to get ripped away from the build plate easily due to their low contact area. + +*Easy selector for Z seam positions. +Z seams are now easier to position on your model, thanks to a contribution by trouch. A drop down selection box has been added to custom mode, giving you a list of presets to place the z seam on your model. + +*Colorblind assist theme. +Nubnubbud has added a new theme for colorblind users which makes more distinction between colors, such as the yellow/green line colors in the layer view. + +*DisplayFilenameAndLayerOnLCD script. +Some improvements for this post processing script from the community. N95JPL has contributed updates to offer a wider range of optional information. Adecastilho has contributed updates so that the layer count is displayed before the filename to prevent the layer number getting truncated in the event of long filename, as well as an option to start layer count at either 0 or 1. The ':' in the display string has also been removed as it is a GCODE command that splits the line into two different commands. + +*Peripheral information for output devices. +Architectural changes in Ultimaker Cura to allow display information about peripherals in the printer output device, so that I can use it to later on show that information in the Monitor stage plugin. + +*Quality changes on import. +Users can now import profiles that have been created on a different machine other than the active one. + +*Remove prime after coasting. +Reduce the visibility of the z seam when printing with coasting by preventing nozzle priming. + +*Map Material Station slot data. +The available configurations drop down will display information about a Ultimaker S5 Material Station if connected. Read more about the Ultimaker S5 Material Station on ultimaker.com + +* Bug fixes +- Uninstall in silent mode. Fixed an issue where a dialog displays when uninstalling in silent mode. +- Build Interface if Support is Present. In some cases, support could be pushed away by large support XY distance, but interfaces could be left on overhangs which leads to situation when interface is generated without support. This has been fixed. +- Install in silent mode. The bundled Arduino driver is signed by a certificate that's not trusted on Windows by default, so there was no way to suppress the prompt or to have the installer skip driver installation. This has been fixed. +- 3MF project printer connection not included. When loading a project file that was saved while a network connection was active, the network connection is not re-established. This has been fixed. +- Thin Walls broken. Fixed an error with thin walls being broken. +- Tray icon remaining. Fixed a bug where the tray icon would remain after closing the application. +- Marketplace text. Fixed an issue where Marketplace text is blurry on some screens +- Unsupported profile imports. Fixed an issue where exported profiles could not be reimported. +- Loading file message. Added visual feedback when loading files such as STLs +- Loading GCODE on disabled extruders. Fixed an issue where GCODE imported using multi-extrusion fails to load if an extruder is disabled. +- Support brim with concentric support pattern. Fixed an issue where support would be in mid-air. +- Reduced cloud logging. Logging has been reduced for cloud connections on unstable connections. +- Application menu extruder menu. Fixed an issue where changing the extruder via the application menu didn’t work. +- Tool handles move when rotating. Fixed an issue where rotate tool handles would change location when rotating. +- F5 reload. Fixed an issue where F5 doesn't reload GCODE. +- Application not starting before the splash screen. Fixed an issue where the application wouldn’t start before the splash window. +- Qt 5.13 crashes. Fixed an issue where the ShaderEffect crashes using Qt 5.13 +- Can’t select other materials in print setting tab. Fixed an issue where other materials couldn’t be selected using the print settings tab. +- Drop down to buildplate after resize. Models don’t drop down to the build plate if they are scaled down from ‘too large to fit’. +- Unsupported quality profiles. Fixed unsupported quality profiles appearing for 0.25 + 0.8 print core combinations. +- 'Arrange all models' for groups. Fixed an issue where arrange all models hangs for grouped models. +- Update Checker not working. Fixed this so that updates are visible if using a legacy version. +- Missing support brim. Fixed an issue where support brim was missing if platform adhesion set to ‘None’. +- Multiply non-normal mesh doesn't work. Fixed instances where processes stopped and messages would hang. +- Settings not updating in GUI with inheritance. Fixed settings not updating GUI with inheritance. +- Prevent 'generic'-part in name of specific materials. Introduced checks for ‘generic’ material types to help material categorization. +- Hide temperature settings. The "Default Print Temperature" setting is currently editable, but editing this setting can cause problems with temperatures later especially when you have it in your custom profile. We decided to hide this setting so users can no longer edit it in the later releases to avoid confusion. The "Default Build Plate Temperature" has also been hidden because it causes a similar issue. +- Add machine_heated_build_volume. Introduced a new machine_heated_build_volume machine-setting, which is set it to false by default, and only set it to true for the Ultimaker S5. Users can alter their own definition if they do have a heated build volume. +- Z-hops on first layer. First move other start GCODE not z-hopped. Contributed by sailorgreg. +- Preserve extruder-only moves in post stretch script. Contributed by sgtnoodle. + +*Third-party printer definitions +New machine definitions added for: +- IMADE3D Jellybox. Contributed by filipgoc for IMADE3D Jellybox printers, which adds JellyBOX 2 printer and revises settings of JellyBOX Original. +- Vertex Nano. Contributed by velbn +- Felix Pro 2. Contributed by pnks +- JGAurora A35. Contributed by pinchies. +- eMotionTech Strateo3D. Contributed by KOUBeMT. +- NWA3D A31. Contributed by DragonJe. + [4.2.0] *Orthographic view. When preparing prints, professional users wanted more control over the 3D view type, so this version introduces an orthographic view, which is the same view type used by most professional CAD software packages. Find the orthographic view in View > Camera view > Orthographic, and compare the dimensions of your model to your CAD design with ease. diff --git a/resources/themes/cura-light/icons/pos_modify_dont_support_overlap.svg b/resources/themes/cura-light/icons/pos_modify_dont_support_overlap.svg new file mode 100644 index 0000000000..124e95f558 --- /dev/null +++ b/resources/themes/cura-light/icons/pos_modify_dont_support_overlap.svg @@ -0,0 +1,26 @@ + + + + pms_modify_dont_support_overlap + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/pos_modify_overlaps.svg b/resources/themes/cura-light/icons/pos_modify_overlaps.svg new file mode 100644 index 0000000000..a664e820a6 --- /dev/null +++ b/resources/themes/cura-light/icons/pos_modify_overlaps.svg @@ -0,0 +1,17 @@ + + + + pms_modify_overlaps + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/pos_normal.svg b/resources/themes/cura-light/icons/pos_normal.svg new file mode 100644 index 0000000000..8a49ef3a00 --- /dev/null +++ b/resources/themes/cura-light/icons/pos_normal.svg @@ -0,0 +1,9 @@ + + + + pms_Normal + Created with Sketch. + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/icons/pos_print_as_support.svg b/resources/themes/cura-light/icons/pos_print_as_support.svg new file mode 100644 index 0000000000..3562ca1fe0 --- /dev/null +++ b/resources/themes/cura-light/icons/pos_print_as_support.svg @@ -0,0 +1,14 @@ + + + + pms_printassupport + Created with Sketch. + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index f2361a8604..daf06ac6af 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -240,7 +240,7 @@ QtObject } Behavior on color { ColorAnimation { duration: 50; } } - border.width: (control.hasOwnProperty("needBorder") && control.needBorder) ? (control.checked ? Theme.getSize("thick_lining").width : Theme.getSize("default_lining").width) : 0 + border.width: (control.hasOwnProperty("needBorder") && control.needBorder) ? Theme.getSize("default_lining").width : 0 border.color: control.checked ? Theme.getColor("icon") : Theme.getColor("lining") } } diff --git a/resources/variants/hms434_0.25tpnozzle.inst.cfg b/resources/variants/hms434_0.25tpnozzle.inst.cfg deleted file mode 100644 index 19421ef587..0000000000 --- a/resources/variants/hms434_0.25tpnozzle.inst.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[general] -name = 0.25mm TP extruder -version = 4 -definition = hms434 - -[metadata] -setting_version = 10 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 0.25 -machine_nozzle_tip_outer_diameter = 1.05 diff --git a/resources/variants/hms434_0.6tpnozzle.inst.cfg b/resources/variants/hms434_0.6tpnozzle.inst.cfg deleted file mode 100644 index a57385f31b..0000000000 --- a/resources/variants/hms434_0.6tpnozzle.inst.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[general] -name = 0.6mm TP extruder -version = 4 -definition = hms434 - -[metadata] -setting_version = 10 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 0.6 -machine_nozzle_tip_outer_diameter = 1.05 diff --git a/resources/variants/hms434_1.2tpnozzle.inst.cfg b/resources/variants/hms434_1.2tpnozzle.inst.cfg deleted file mode 100644 index ce63070b40..0000000000 --- a/resources/variants/hms434_1.2tpnozzle.inst.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[general] -name = 1.2mm TP extruder -version = 4 -definition = hms434 - -[metadata] -setting_version = 10 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 1.2 -machine_nozzle_tip_outer_diameter = 1.3 diff --git a/resources/variants/hms434_1.5tpnozzle.inst.cfg b/resources/variants/hms434_1.5tpnozzle.inst.cfg deleted file mode 100644 index ba5eb263dc..0000000000 --- a/resources/variants/hms434_1.5tpnozzle.inst.cfg +++ /dev/null @@ -1,13 +0,0 @@ -[general] -name = 1.5mm TP extruder -version = 4 -definition = hms434 - -[metadata] -setting_version = 10 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 1.5 -machine_nozzle_tip_outer_diameter = 1.6 diff --git a/run_mypy.py b/run_mypy.py index 27f07cd281..6be424bda8 100644 --- a/run_mypy.py +++ b/run_mypy.py @@ -1,80 +1,82 @@ -#!/usr/bin/env python -import os -import sys -import subprocess - - -# A quick Python implementation of unix 'where' command. -def where(exe_name: str, search_path: str = os.getenv("PATH")) -> str: - if search_path is None: - search_path = "" - paths = search_path.split(os.pathsep) - result = "" - print(" -> sys.executable location: %s" % sys.executable) - sys_exec_dir = os.path.dirname(sys.executable) - root_dir = os.path.dirname(sys_exec_dir) - paths += [sys_exec_dir, - os.path.join(root_dir, "bin"), - os.path.join(root_dir, "scripts"), - ] - paths = set(paths) - - for path in sorted(paths): - print(" -> Searching %s" % path) - candidate_path = os.path.join(path, exe_name) - if os.path.exists(candidate_path): - result = candidate_path - break - return result - - -def findModules(path): - result = [] - for entry in os.scandir(path): - if entry.is_dir() and os.path.exists(os.path.join(path, entry.name, "__init__.py")): - result.append(entry.name) - return result - - -def main(): - # Find Uranium via the PYTHONPATH var - uraniumUMPath = where("UM", os.getenv("PYTHONPATH")) - if uraniumUMPath is None: - uraniumUMPath = os.path.join("..", "Uranium") - uraniumPath = os.path.dirname(uraniumUMPath) - - mypy_path_parts = [".", os.path.join(".", "plugins"), os.path.join(".", "plugins", "VersionUpgrade"), - uraniumPath, os.path.join(uraniumPath, "stubs")] - if sys.platform == "win32": - os.putenv("MYPYPATH", ";".join(mypy_path_parts)) - else: - os.putenv("MYPYPATH", ":".join(mypy_path_parts)) - - # Mypy really needs to be run via its Python script otherwise it can't find its data files. - mypy_exe_name = "mypy.exe" if sys.platform == "win32" else "mypy" - mypy_exe_dir = where(mypy_exe_name) - mypy_module = os.path.join(os.path.dirname(mypy_exe_dir), mypy_exe_name) - print("Found mypy exe path: %s" % mypy_exe_dir) - print("Found mypy module path: %s" % mypy_module) - - plugins = findModules("plugins") - plugins.sort() - - mods = ["cura"] + plugins + findModules("plugins/VersionUpgrade") - - for mod in mods: - print("------------- Checking module {mod}".format(**locals())) - if sys.platform == "win32": - result = subprocess.run([mypy_module, "-p", mod, "--ignore-missing-imports"]) - else: - result = subprocess.run([sys.executable, mypy_module, "-p", mod, "--ignore-missing-imports"]) - if result.returncode != 0: - print("\nModule {mod} failed checking. :(".format(**locals())) - return 1 - else: - print("\n\nDone checking. All is good.") - return 0 - - -if __name__ == "__main__": - sys.exit(main()) +#!/usr/bin/env python +import os +import sys +import subprocess + + +# A quick Python implementation of unix 'where' command. +def where(exe_name: str, search_path: str = os.getenv("PATH")) -> str: + if search_path is None: + search_path = "" + paths = search_path.split(os.pathsep) + result = "" + print(" -> sys.executable location: %s" % sys.executable) + sys_exec_dir = os.path.dirname(sys.executable) + root_dir = os.path.dirname(sys_exec_dir) + paths += [sys_exec_dir, + os.path.join(root_dir, "bin"), + os.path.join(root_dir, "scripts"), + ] + paths = set(paths) + + for path in sorted(paths): + print(" -> Searching %s" % path) + candidate_path = os.path.join(path, exe_name) + if os.path.exists(candidate_path): + result = candidate_path + break + return result + + +def findModules(path): + result = [] + for entry in os.scandir(path): + if entry.is_dir() and os.path.exists(os.path.join(path, entry.name, "__init__.py")): + result.append(entry.name) + return result + + +def main(): + # Find Uranium via the PYTHONPATH var + uraniumUMPath = where("UM", os.getenv("PYTHONPATH")) + if uraniumUMPath is None: + uraniumUMPath = os.path.join("..", "Uranium") + uraniumPath = os.path.dirname(uraniumUMPath) + + mypy_path_parts = [".", os.path.join(".", "plugins"), os.path.join(".", "plugins", "VersionUpgrade"), + uraniumPath, os.path.join(uraniumPath, "stubs")] + if sys.platform == "win32": + os.putenv("MYPYPATH", ";".join(mypy_path_parts)) + else: + os.putenv("MYPYPATH", ":".join(mypy_path_parts)) + + # Mypy really needs to be run via its Python script otherwise it can't find its data files. + mypy_exe_name = "mypy.exe" if sys.platform == "win32" else "mypy" + mypy_exe_dir = where(mypy_exe_name) + mypy_module = os.path.join(os.path.dirname(mypy_exe_dir), mypy_exe_name) + print("Found mypy exe path: %s" % mypy_exe_dir) + print("Found mypy module path: %s" % mypy_module) + + plugins = findModules("plugins") + plugins.sort() + + mods = ["cura"] + plugins + findModules("plugins/VersionUpgrade") + success_code = 0 + for mod in mods: + print("------------- Checking module {mod}".format(**locals())) + if sys.platform == "win32": + result = subprocess.run([mypy_module, "-p", mod, "--ignore-missing-imports"]) + else: + result = subprocess.run([sys.executable, mypy_module, "-p", mod, "--ignore-missing-imports"]) + if result.returncode != 0: + print("\nModule {mod} failed checking. :(".format(**locals())) + success_code = 1 + if success_code: + print("\n\nSome modules failed checking!") + else: + print("\n\nDone checking. All is good.") + return success_code + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/TestMachineManager.py b/tests/TestMachineManager.py index 65c581ac34..313ada2bf0 100644 --- a/tests/TestMachineManager.py +++ b/tests/TestMachineManager.py @@ -139,7 +139,7 @@ def test_resetSettingForAllExtruders(machine_manager): extruder_2 = createMockedExtruder("extruder_2") extruder_1.userChanges = createMockedInstanceContainer("settings_1") extruder_2.userChanges = createMockedInstanceContainer("settings_2") - global_stack.extruders = {"1": extruder_1, "2": extruder_2} + global_stack.extruderList = [extruder_1, extruder_2] machine_manager.resetSettingForAllExtruders("whatever")