mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-16 11:17:49 -06:00
Merge remote-tracking branch 'origin/3.3'
This commit is contained in:
commit
db5c18295b
6 changed files with 74 additions and 20 deletions
|
@ -986,7 +986,7 @@ class CuraApplication(QtApplication):
|
||||||
return self._i18n_catalog.i18nc("@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm.", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()}
|
return self._i18n_catalog.i18nc("@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm.", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()}
|
||||||
|
|
||||||
def updatePlatformActivityDelayed(self, node = None):
|
def updatePlatformActivityDelayed(self, node = None):
|
||||||
if node is not None and node.getMeshData() is not None:
|
if node is not None and (node.getMeshData() is not None or node.callDecoration("getLayerData")):
|
||||||
self._update_platform_activity_timer.start()
|
self._update_platform_activity_timer.start()
|
||||||
|
|
||||||
## Update scene bounding box for current build plate
|
## Update scene bounding box for current build plate
|
||||||
|
|
|
@ -323,16 +323,21 @@ class PrintInformation(QObject):
|
||||||
# when a file is opened using the terminal; the filename comes from _onFileLoaded and still contains its
|
# when a file is opened using the terminal; the filename comes from _onFileLoaded and still contains its
|
||||||
# extension. This cuts the extension off if necessary.
|
# extension. This cuts the extension off if necessary.
|
||||||
name = os.path.splitext(name)[0]
|
name = os.path.splitext(name)[0]
|
||||||
|
filename_parts = os.path.basename(base_name).split(".")
|
||||||
|
|
||||||
|
# If it's a gcode, also always update the job name
|
||||||
|
is_gcode = False
|
||||||
|
if len(filename_parts) > 1:
|
||||||
|
# Only check the extension(s)
|
||||||
|
is_gcode = "gcode" in filename_parts[1:]
|
||||||
|
|
||||||
# if this is a profile file, always update the job name
|
# if this is a profile file, always update the job name
|
||||||
# name is "" when I first had some meshes and afterwards I deleted them so the naming should start again
|
# name is "" when I first had some meshes and afterwards I deleted them so the naming should start again
|
||||||
is_empty = name == ""
|
is_empty = name == ""
|
||||||
if is_project_file or (is_empty or (self._base_name == "" and self._base_name != name)):
|
if is_gcode or is_project_file or (is_empty or (self._base_name == "" and self._base_name != name)):
|
||||||
# remove ".curaproject" suffix from (imported) the file name
|
# Only take the file name part
|
||||||
if name.endswith(".curaproject"):
|
self._base_name = filename_parts[0]
|
||||||
name = name[:name.rfind(".curaproject")]
|
self._updateJobName()
|
||||||
self._base_name = name
|
|
||||||
self._updateJobName()
|
|
||||||
|
|
||||||
@pyqtProperty(str, fset = setBaseName, notify = baseNameChanged)
|
@pyqtProperty(str, fset = setBaseName, notify = baseNameChanged)
|
||||||
def baseName(self):
|
def baseName(self):
|
||||||
|
|
|
@ -152,3 +152,17 @@ class GenericOutputController(PrinterOutputController):
|
||||||
for extruder in self._preheat_hotends:
|
for extruder in self._preheat_hotends:
|
||||||
self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), 0)
|
self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), 0)
|
||||||
self._preheat_hotends = set()
|
self._preheat_hotends = set()
|
||||||
|
|
||||||
|
# Cancel any ongoing preheating timers, without setting back the temperature to 0
|
||||||
|
# This can be used eg at the start of a print
|
||||||
|
def stopPreheatTimers(self):
|
||||||
|
if self._preheat_hotends_timer.isActive():
|
||||||
|
for extruder in self._preheat_hotends:
|
||||||
|
extruder.updateIsPreheating(False)
|
||||||
|
self._preheat_hotends = set()
|
||||||
|
|
||||||
|
self._preheat_hotends_timer.stop()
|
||||||
|
|
||||||
|
if self._preheat_bed_timer.isActive():
|
||||||
|
self._preheat_printer.updateIsPreheating(False)
|
||||||
|
self._preheat_bed_timer.stop()
|
||||||
|
|
|
@ -310,19 +310,40 @@ class MachineManager(QObject):
|
||||||
global_quality_changes = global_stack.qualityChanges
|
global_quality_changes = global_stack.qualityChanges
|
||||||
global_quality_changes_name = global_quality_changes.getName()
|
global_quality_changes_name = global_quality_changes.getName()
|
||||||
|
|
||||||
|
# Try to set the same quality/quality_changes as the machine specified.
|
||||||
|
# If the quality/quality_changes is not available, switch to the default or the first quality that's available.
|
||||||
|
same_quality_found = False
|
||||||
|
quality_groups = self._application.getQualityManager().getQualityGroups(global_stack)
|
||||||
|
|
||||||
if global_quality_changes.getId() != "empty_quality_changes":
|
if global_quality_changes.getId() != "empty_quality_changes":
|
||||||
quality_changes_groups = self._application._quality_manager.getQualityChangesGroups(global_stack)
|
quality_changes_groups = self._application.getQualityManager().getQualityChangesGroups(global_stack)
|
||||||
if global_quality_changes_name in quality_changes_groups:
|
new_quality_changes_group = quality_changes_groups.get(global_quality_changes_name)
|
||||||
new_quality_changes_group = quality_changes_groups[global_quality_changes_name]
|
if new_quality_changes_group is not None and new_quality_changes_group.is_available:
|
||||||
self._setQualityChangesGroup(new_quality_changes_group)
|
self._setQualityChangesGroup(new_quality_changes_group)
|
||||||
|
same_quality_found = True
|
||||||
|
Logger.log("i", "Machine '%s' quality changes set to '%s'",
|
||||||
|
global_stack.getName(), new_quality_changes_group.name)
|
||||||
else:
|
else:
|
||||||
quality_groups = self._application._quality_manager.getQualityGroups(global_stack)
|
if quality_type in quality_groups:
|
||||||
if quality_type not in quality_groups:
|
new_quality_group = quality_groups[quality_type]
|
||||||
Logger.log("w", "Quality type [%s] not found in available qualities [%s]", quality_type, ", ".join(quality_groups.keys()))
|
self._setQualityGroup(new_quality_group, empty_quality_changes = True)
|
||||||
self._setEmptyQuality()
|
same_quality_found = True
|
||||||
return
|
Logger.log("i", "Machine '%s' quality set to '%s'",
|
||||||
new_quality_group = quality_groups[quality_type]
|
global_stack.getName(), new_quality_group.quality_type)
|
||||||
self._setQualityGroup(new_quality_group, empty_quality_changes = True)
|
|
||||||
|
# Could not find the specified quality/quality_changes, switch to the preferred quality if available,
|
||||||
|
# otherwise the first quality that's available, otherwise empty (not supported).
|
||||||
|
if not same_quality_found:
|
||||||
|
Logger.log("i", "Machine '%s' could not find quality_type '%s' and quality_changes '%s'. "
|
||||||
|
"Available quality types are [%s]. Switching to default quality.",
|
||||||
|
global_stack.getName(), quality_type, global_quality_changes_name,
|
||||||
|
", ".join(quality_groups.keys()))
|
||||||
|
preferred_quality_type = global_stack.getMetaDataEntry("preferred_quality_type")
|
||||||
|
quality_group = quality_groups.get(preferred_quality_type)
|
||||||
|
if quality_group is None:
|
||||||
|
if quality_groups:
|
||||||
|
quality_group = list(quality_groups.values())[0]
|
||||||
|
self._setQualityGroup(quality_group, empty_quality_changes = True)
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def setActiveMachine(self, stack_id: str) -> None:
|
def setActiveMachine(self, stack_id: str) -> None:
|
||||||
|
@ -1012,6 +1033,10 @@ class MachineManager(QObject):
|
||||||
if empty_quality_changes:
|
if empty_quality_changes:
|
||||||
self._current_quality_changes_group = None
|
self._current_quality_changes_group = None
|
||||||
|
|
||||||
|
if quality_group is None:
|
||||||
|
self._setEmptyQuality()
|
||||||
|
return
|
||||||
|
|
||||||
# Set quality and quality_changes for the GlobalStack
|
# Set quality and quality_changes for the GlobalStack
|
||||||
self._global_container_stack.quality = quality_group.node_for_global.getContainer()
|
self._global_container_stack.quality = quality_group.node_for_global.getContainer()
|
||||||
if empty_quality_changes:
|
if empty_quality_changes:
|
||||||
|
|
|
@ -104,6 +104,9 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
|
||||||
if self._is_printing:
|
if self._is_printing:
|
||||||
return # Aleady printing
|
return # Aleady printing
|
||||||
|
|
||||||
|
# cancel any ongoing preheat timer before starting a print
|
||||||
|
self._printers[0].getController().stopPreheatTimers()
|
||||||
|
|
||||||
Application.getInstance().getController().setActiveStage("MonitorStage")
|
Application.getInstance().getController().setActiveStage("MonitorStage")
|
||||||
|
|
||||||
# find the G-code for the active build plate to print
|
# find the G-code for the active build plate to print
|
||||||
|
|
|
@ -4,6 +4,8 @@
|
||||||
import configparser #To parse preference files.
|
import configparser #To parse preference files.
|
||||||
import io #To serialise the preference files afterwards.
|
import io #To serialise the preference files afterwards.
|
||||||
import os
|
import os
|
||||||
|
import urllib.parse
|
||||||
|
import re
|
||||||
|
|
||||||
from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this.
|
from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this.
|
||||||
|
|
||||||
|
@ -118,6 +120,12 @@ class VersionUpgrade27to30(VersionUpgrade):
|
||||||
if not parser.has_section("general"):
|
if not parser.has_section("general"):
|
||||||
parser.add_section("general")
|
parser.add_section("general")
|
||||||
|
|
||||||
|
# Clean up the filename
|
||||||
|
file_base_name = os.path.basename(filename)
|
||||||
|
file_base_name = urllib.parse.unquote_plus(file_base_name)
|
||||||
|
|
||||||
|
um2_pattern = re.compile(r"^ultimaker[^a-zA-Z\\d\\s:]2_.*$")
|
||||||
|
|
||||||
# The ultimaker 2 family
|
# The ultimaker 2 family
|
||||||
ultimaker2_prefix_list = ["ultimaker2_extended_",
|
ultimaker2_prefix_list = ["ultimaker2_extended_",
|
||||||
"ultimaker2_go_",
|
"ultimaker2_go_",
|
||||||
|
@ -127,9 +135,8 @@ class VersionUpgrade27to30(VersionUpgrade):
|
||||||
"ultimaker2_plus_"]
|
"ultimaker2_plus_"]
|
||||||
|
|
||||||
# set machine definition to "ultimaker2" for the custom quality profiles that can be for the ultimaker 2 family
|
# set machine definition to "ultimaker2" for the custom quality profiles that can be for the ultimaker 2 family
|
||||||
file_base_name = os.path.basename(filename)
|
is_ultimaker2_family = um2_pattern.match(file_base_name) is not None
|
||||||
is_ultimaker2_family = False
|
if not is_ultimaker2_family and not any(file_base_name.startswith(ep) for ep in exclude_prefix_list):
|
||||||
if not any(file_base_name.startswith(ep) for ep in exclude_prefix_list):
|
|
||||||
is_ultimaker2_family = any(file_base_name.startswith(ep) for ep in ultimaker2_prefix_list)
|
is_ultimaker2_family = any(file_base_name.startswith(ep) for ep in ultimaker2_prefix_list)
|
||||||
|
|
||||||
# ultimaker2 family quality profiles used to set as "fdmprinter" profiles
|
# ultimaker2 family quality profiles used to set as "fdmprinter" profiles
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue