Merge branch 'master' of github.com:Ultimaker/Cura

This commit is contained in:
Jaime van Kessel 2018-03-14 11:32:52 +01:00
commit 561b97c255
40 changed files with 128 additions and 117 deletions

View File

@ -101,13 +101,6 @@ class MaterialManager(QObject):
# GUID -> material group list # GUID -> material group list
self._guid_material_groups_map = defaultdict(list) self._guid_material_groups_map = defaultdict(list)
for root_material_id, material_group in self._material_group_map.items(): for root_material_id, material_group in self._material_group_map.items():
# This can happen when we are updating with incomplete data.
if material_group.root_material_node is None:
Logger.log("e", "Missing root material node for [%s]. Probably caused by update using incomplete data."
" Check all related signals for further debugging.",
material_group.name)
self._update_timer.start()
return
guid = material_group.root_material_node.metadata["GUID"] guid = material_group.root_material_node.metadata["GUID"]
self._guid_material_groups_map[guid].append(material_group) self._guid_material_groups_map[guid].append(material_group)

View File

@ -53,8 +53,8 @@ class BrandMaterialsModel(ListModel):
self._extruder_manager = CuraApplication.getInstance().getExtruderManager() self._extruder_manager = CuraApplication.getInstance().getExtruderManager()
self._material_manager = CuraApplication.getInstance().getMaterialManager() self._material_manager = CuraApplication.getInstance().getMaterialManager()
self._machine_manager.globalContainerChanged.connect(self._update) self._machine_manager.activeStackChanged.connect(self._update) #Update when switching machines.
self._material_manager.materialsUpdated.connect(self._update) self._material_manager.materialsUpdated.connect(self._update) #Update when the list of materials changes.
self._update() self._update()
def setExtruderPosition(self, position: int): def setExtruderPosition(self, position: int):

View File

@ -15,8 +15,8 @@ class GenericMaterialsModel(BaseMaterialsModel):
self._extruder_manager = CuraApplication.getInstance().getExtruderManager() self._extruder_manager = CuraApplication.getInstance().getExtruderManager()
self._material_manager = CuraApplication.getInstance().getMaterialManager() self._material_manager = CuraApplication.getInstance().getMaterialManager()
self._machine_manager.globalContainerChanged.connect(self._update) self._machine_manager.activeStackChanged.connect(self._update) #Update when switching machines.
self._material_manager.materialsUpdated.connect(self._update) self._material_manager.materialsUpdated.connect(self._update) #Update when the list of materials changes.
self._update() self._update()
def _update(self): def _update(self):

View File

@ -56,12 +56,15 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._connection_state_before_timeout = None # type: Optional[ConnectionState] self._connection_state_before_timeout = None # type: Optional[ConnectionState]
printer_type = self._properties.get(b"machine", b"").decode("utf-8") printer_type = self._properties.get(b"machine", b"").decode("utf-8")
if printer_type.startswith("9511"): printer_type_identifiers = {
self._printer_type = "ultimaker3_extended" "9066": "ultimaker3",
elif printer_type.startswith("9066"): "9511": "ultimaker3_extended"
self._printer_type = "ultimaker3" }
else: self._printer_type = "Unknown"
self._printer_type = "unknown" for key, value in printer_type_identifiers.items():
if printer_type.startswith(key):
self._printer_type = value
break
def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs) -> None: def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs) -> None:
raise NotImplementedError("requestWrite needs to be implemented") raise NotImplementedError("requestWrite needs to be implemented")

View File

@ -50,7 +50,6 @@ class MachineManager(QObject):
self._global_container_stack = None # type: GlobalStack self._global_container_stack = None # type: GlobalStack
self._current_root_material_id = {} self._current_root_material_id = {}
self._current_root_material_name = {}
self._current_quality_group = None self._current_quality_group = None
self._current_quality_changes_group = None self._current_quality_changes_group = None
@ -129,6 +128,9 @@ class MachineManager(QObject):
# When the materials lookup table gets updated, it can mean that a material has its name changed, which should # When the materials lookup table gets updated, it can mean that a material has its name changed, which should
# be reflected on the GUI. This signal emission makes sure that it happens. # be reflected on the GUI. This signal emission makes sure that it happens.
self._material_manager.materialsUpdated.connect(self.rootMaterialChanged) self._material_manager.materialsUpdated.connect(self.rootMaterialChanged)
# When the materials get updated, it can be that an activated material's diameter gets changed. In that case,
# a material update should be triggered to make sure that the machine still has compatible materials activated.
self._material_manager.materialsUpdated.connect(self._updateUponMaterialMetadataChange)
self.rootMaterialChanged.connect(self._onRootMaterialChanged) self.rootMaterialChanged.connect(self._onRootMaterialChanged)
activeQualityGroupChanged = pyqtSignal() activeQualityGroupChanged = pyqtSignal()
@ -877,11 +879,13 @@ class MachineManager(QObject):
return self._default_extruder_position return self._default_extruder_position
## This will fire the propertiesChanged for all settings so they will be updated in the front-end ## This will fire the propertiesChanged for all settings so they will be updated in the front-end
@pyqtSlot()
def forceUpdateAllSettings(self): def forceUpdateAllSettings(self):
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
property_names = ["value", "resolve"] property_names = ["value", "resolve"]
for setting_key in self._global_container_stack.getAllKeys(): for container in [self._global_container_stack] + list(self._global_container_stack.extruders.values()):
self._global_container_stack.propertiesChanged.emit(setting_key, property_names) for setting_key in container.getAllKeys():
container.propertiesChanged.emit(setting_key, property_names)
@pyqtSlot(int, bool) @pyqtSlot(int, bool)
def setExtruderEnabled(self, position: int, enabled) -> None: def setExtruderEnabled(self, position: int, enabled) -> None:
@ -926,28 +930,18 @@ class MachineManager(QObject):
return [] return []
return sorted(list(self._global_container_stack.extruders.keys())) return sorted(list(self._global_container_stack.extruders.keys()))
## Update _current_root_material_id and _current_root_material_name when ## Update _current_root_material_id when the current root material was changed.
# the current root material was changed.
def _onRootMaterialChanged(self): def _onRootMaterialChanged(self):
self._current_root_material_id = {} self._current_root_material_id = {}
if self._global_container_stack: if self._global_container_stack:
for position in self._global_container_stack.extruders: for position in self._global_container_stack.extruders:
self._current_root_material_id[position] = self._global_container_stack.extruders[position].material.getMetaDataEntry("base_file") self._current_root_material_id[position] = self._global_container_stack.extruders[position].material.getMetaDataEntry("base_file")
self._current_root_material_name = {}
for position in self._global_container_stack.extruders:
if position not in self._current_root_material_name:
material = self._global_container_stack.extruders[position].material
self._current_root_material_name[position] = material.getName()
@pyqtProperty("QVariant", notify = rootMaterialChanged) @pyqtProperty("QVariant", notify = rootMaterialChanged)
def currentRootMaterialId(self): def currentRootMaterialId(self):
return self._current_root_material_id return self._current_root_material_id
@pyqtProperty("QVariant", notify = rootMaterialChanged)
def currentRootMaterialName(self):
return self._current_root_material_name
## Return the variant names in the extruder stack(s). ## Return the variant names in the extruder stack(s).
## For the variant in the global stack, use activeVariantBuildplateName ## For the variant in the global stack, use activeVariantBuildplateName
@pyqtProperty("QVariant", notify = activeVariantChanged) @pyqtProperty("QVariant", notify = activeVariantChanged)
@ -1044,15 +1038,12 @@ class MachineManager(QObject):
if container_node: if container_node:
self._global_container_stack.extruders[position].material = container_node.getContainer() self._global_container_stack.extruders[position].material = container_node.getContainer()
root_material_id = container_node.metadata["base_file"] root_material_id = container_node.metadata["base_file"]
root_material_name = container_node.getContainer().getName()
else: else:
self._global_container_stack.extruders[position].material = self._empty_material_container self._global_container_stack.extruders[position].material = self._empty_material_container
root_material_id = None root_material_id = None
root_material_name = None
# The _current_root_material_id is used in the MaterialMenu to see which material is selected # 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]: if root_material_id != self._current_root_material_id[position]:
self._current_root_material_id[position] = root_material_id self._current_root_material_id[position] = root_material_id
self._current_root_material_name[position] = root_material_name
self.rootMaterialChanged.emit() self.rootMaterialChanged.emit()
def activeMaterialsCompatible(self): def activeMaterialsCompatible(self):
@ -1066,7 +1057,7 @@ class MachineManager(QObject):
return True return True
## Update current quality type and machine after setting material ## Update current quality type and machine after setting material
def _updateQualityWithMaterial(self): def _updateQualityWithMaterial(self, *args):
Logger.log("i", "Updating quality/quality_changes due to material change") Logger.log("i", "Updating quality/quality_changes due to material change")
current_quality_type = None current_quality_type = None
if self._current_quality_group: if self._current_quality_group:
@ -1111,9 +1102,15 @@ class MachineManager(QObject):
extruder = self._global_container_stack.extruders[position] extruder = self._global_container_stack.extruders[position]
current_material_base_name = extruder.material.getMetaDataEntry("base_file") current_material_base_name = extruder.material.getMetaDataEntry("base_file")
current_variant_name = None
if extruder.variant.getId() != self._empty_variant_container.getId():
current_variant_name = extruder.variant.getMetaDataEntry("name") current_variant_name = extruder.variant.getMetaDataEntry("name")
material_diameter = self._global_container_stack.getProperty("material_diameter", "value") from UM.Settings.Interfaces import PropertyEvaluationContext
from cura.Settings.CuraContainerStack import _ContainerIndexes
context = PropertyEvaluationContext(extruder)
context.context["evaluate_from_container_index"] = _ContainerIndexes.DefinitionChanges
material_diameter = self._global_container_stack.getProperty("material_diameter", "value", context)
candidate_materials = self._material_manager.getAvailableMaterials( candidate_materials = self._material_manager.getAvailableMaterials(
self._global_container_stack.definition.getId(), self._global_container_stack.definition.getId(),
current_variant_name, current_variant_name,
@ -1128,6 +1125,11 @@ class MachineManager(QObject):
self._setMaterial(position, new_material) self._setMaterial(position, new_material)
continue continue
# The current material is not available, find the preferred one
material_node = self._material_manager.getDefaultMaterial(self._global_container_stack, current_variant_name)
if material_node is not None:
self._setMaterial(position, material_node)
## Given a printer definition name, select the right machine instance. In case it doesn't exist, create a new ## Given a printer definition name, select the right machine instance. In case it doesn't exist, create a new
# instance with the same network key. # instance with the same network key.
@pyqtSlot(str) @pyqtSlot(str)
@ -1252,3 +1254,8 @@ class MachineManager(QObject):
elif self._current_quality_group: elif self._current_quality_group:
name = self._current_quality_group.name name = self._current_quality_group.name
return name return name
def _updateUponMaterialMetadataChange(self):
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
self._updateMaterialWithVariant(None)
self._updateQualityWithMaterial()

View File

@ -1,7 +1,7 @@
# Copyright (c) 2017 Ultimaker B.V. # Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal from PyQt5.QtCore import QObject, QTimer, pyqtProperty, pyqtSignal
from UM.FlameProfiler import pyqtSlot from UM.FlameProfiler import pyqtSlot
from UM.Application import Application from UM.Application import Application
from UM.Logger import Logger from UM.Logger import Logger
@ -30,6 +30,11 @@ class SettingInheritanceManager(QObject):
ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged)
self._onActiveExtruderChanged() self._onActiveExtruderChanged()
self._update_timer = QTimer()
self._update_timer.setInterval(500)
self._update_timer.setSingleShot(True)
self._update_timer.timeout.connect(self._update)
settingsWithIntheritanceChanged = pyqtSignal() settingsWithIntheritanceChanged = pyqtSignal()
## Get the keys of all children settings with an override. ## Get the keys of all children settings with an override.
@ -226,9 +231,7 @@ class SettingInheritanceManager(QObject):
self._onActiveExtruderChanged() self._onActiveExtruderChanged()
def _onContainersChanged(self, container): def _onContainersChanged(self, container):
# TODO: Multiple container changes in sequence now cause quite a few recalculations. self._update_timer.start()
# This isn't that big of an issue, but it could be in the future.
self._update()
@staticmethod @staticmethod
def createSettingInheritanceManager(engine=None, script_engine=None): def createSettingInheritanceManager(engine=None, script_engine=None):

View File

@ -265,13 +265,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
for material_container_file in material_container_files: for material_container_file in material_container_files:
container_id = self._stripFileToId(material_container_file) container_id = self._stripFileToId(material_container_file)
from hashlib import sha1
hex_container_id = sha1(container_id.encode('utf-8')).hexdigest()
serialized = archive.open(material_container_file).read().decode("utf-8") serialized = archive.open(material_container_file).read().decode("utf-8")
metadata_list = xml_material_profile.deserializeMetadata(serialized, hex_container_id) metadata_list = xml_material_profile.deserializeMetadata(serialized, container_id)
reverse_map = {metadata["id"].replace(hex_container_id, container_id): container_id.replace(hex_container_id, container_id) reverse_map = {metadata["id"]: container_id for metadata in metadata_list}
for metadata in metadata_list}
reverse_material_id_dict.update(reverse_map) reverse_material_id_dict.update(reverse_map)
material_labels.append(self._getMaterialLabelFromSerialized(serialized)) material_labels.append(self._getMaterialLabelFromSerialized(serialized))
@ -754,15 +750,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
quality_changes_containers = self._container_registry.findInstanceContainers(name = quality_changes_name, quality_changes_containers = self._container_registry.findInstanceContainers(name = quality_changes_name,
type = "quality_changes") type = "quality_changes")
for container in quality_changes_containers: for container in quality_changes_containers:
extruder_definition_id = container.getMetaDataEntry("extruder") extruder_position = container.getMetaDataEntry("position")
if not extruder_definition_id: if extruder_position is None:
quality_changes_info.global_info.container = container quality_changes_info.global_info.container = container
else: else:
extruder_definition_metadata = self._container_registry.findDefinitionContainersMetadata(id = extruder_definition_id)[0] if extruder_position not in quality_changes_info.extruder_info_dict:
position = extruder_definition_metadata["position"] quality_changes_info.extruder_info_dict[extruder_position] = ContainerInfo(None, None, None)
if position not in quality_changes_info.extruder_info_dict: container_info = quality_changes_info.extruder_info_dict[extruder_position]
quality_changes_info.extruder_info_dict[position] = ContainerInfo(None, None, None)
container_info = quality_changes_info.extruder_info_dict[position]
container_info.container = container container_info.container = container
# If there is no quality changes for any extruder, create one. # If there is no quality changes for any extruder, create one.

View File

@ -281,7 +281,7 @@ class StartSliceJob(Job):
default_extruder_position = int(Application.getInstance().getMachineManager().defaultExtruderPosition) default_extruder_position = int(Application.getInstance().getMachineManager().defaultExtruderPosition)
result = {} result = {}
for key in stack.getAllKeys(): for key in stack.getAllKeys():
setting_type = stack.getProperty(key, "type") setting_type = stack.definition.getProperty(key, "type")
value = stack.getProperty(key, "value") value = stack.getProperty(key, "value")
if setting_type == "extruder" and value == -1: if setting_type == "extruder" and value == -1:
# replace with the default value # replace with the default value

View File

@ -382,6 +382,11 @@ Cura.MachineAction
property string settingKey: "machine_nozzle_size" property string settingKey: "machine_nozzle_size"
property string label: catalog.i18nc("@label", "Nozzle size") property string label: catalog.i18nc("@label", "Nozzle size")
property string unit: catalog.i18nc("@label", "mm") property string unit: catalog.i18nc("@label", "mm")
function afterOnEditingFinished()
{
// Somehow the machine_nozzle_size dependent settings are not updated otherwise
Cura.MachineManager.forceUpdateAllSettings()
}
property bool isExtruderSetting: true property bool isExtruderSetting: true
} }

View File

@ -838,14 +838,10 @@ class XmlMaterialProfile(InstanceContainer):
if machine_compatibility: if machine_compatibility:
new_material_id = container_id + "_" + machine_id new_material_id = container_id + "_" + machine_id
# The child or derived material container may already exist. This can happen when a material in a # Do not look for existing container/container metadata with the same ID although they may exist.
# project file and the a material in Cura have the same ID. # In project loading and perhaps some other places, we only want to get information (metadata)
# In the case if a derived material already exists, override that material container because if # from a file without changing the current state of the system. If we overwrite the existing
# the data in the parent material has been changed, the derived ones should be updated too. # metadata here, deserializeMetadata() will not be safe for retrieving information.
found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_material_id)
if found_materials:
new_material_metadata = found_materials[0]
else:
new_material_metadata = {} new_material_metadata = {}
new_material_metadata.update(base_metadata) new_material_metadata.update(base_metadata)
@ -854,7 +850,6 @@ class XmlMaterialProfile(InstanceContainer):
new_material_metadata["machine_manufacturer"] = machine_manufacturer new_material_metadata["machine_manufacturer"] = machine_manufacturer
new_material_metadata["definition"] = machine_id new_material_metadata["definition"] = machine_id
if len(found_materials) == 0: #This is a new material.
result_metadata.append(new_material_metadata) result_metadata.append(new_material_metadata)
buildplates = machine.iterfind("./um:buildplate", cls.__namespaces) buildplates = machine.iterfind("./um:buildplate", cls.__namespaces)
@ -866,12 +861,12 @@ class XmlMaterialProfile(InstanceContainer):
if buildplate_id is None: if buildplate_id is None:
continue continue
variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = buildplate_id) variant_metadata = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = buildplate_id)
if not variant_containers: if not variant_metadata:
# It is not really properly defined what "ID" is so also search for variants by name. # It is not really properly defined what "ID" is so also search for variants by name.
variant_containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = buildplate_id) variant_metadata = ContainerRegistry.getInstance().findInstanceContainersMetadata(definition = machine_id, name = buildplate_id)
if not variant_containers: if not variant_metadata:
continue continue
settings = buildplate.iterfind("./um:setting", cls.__namespaces) settings = buildplate.iterfind("./um:setting", cls.__namespaces)
@ -900,11 +895,7 @@ class XmlMaterialProfile(InstanceContainer):
new_hotend_specific_material_id = container_id + "_" + machine_id + "_" + hotend_name.replace(" ", "_") new_hotend_specific_material_id = container_id + "_" + machine_id + "_" + hotend_name.replace(" ", "_")
# Same as machine compatibility, keep the derived material containers consistent with the parent material # Same as above, do not overwrite existing metadata.
found_materials = ContainerRegistry.getInstance().findInstanceContainersMetadata(id = new_hotend_specific_material_id)
if found_materials:
new_hotend_material_metadata = found_materials[0]
else:
new_hotend_material_metadata = {} new_hotend_material_metadata = {}
new_hotend_material_metadata.update(base_metadata) new_hotend_material_metadata.update(base_metadata)
@ -917,7 +908,6 @@ class XmlMaterialProfile(InstanceContainer):
new_hotend_material_metadata["buildplate_compatible"] = buildplate_map["buildplate_compatible"] new_hotend_material_metadata["buildplate_compatible"] = buildplate_map["buildplate_compatible"]
new_hotend_material_metadata["buildplate_recommended"] = buildplate_map["buildplate_recommended"] new_hotend_material_metadata["buildplate_recommended"] = buildplate_map["buildplate_recommended"]
if len(found_materials) == 0:
result_metadata.append(new_hotend_material_metadata) result_metadata.append(new_hotend_material_metadata)
# there is only one ID for a machine. Once we have reached here, it means we have already found # there is only one ID for a machine. Once we have reached here, it means we have already found

View File

@ -0,0 +1,38 @@
{
"version": 2,
"name": "Printrbot Simple Maker's Kit (1405)",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Timur Tabi",
"manufacturer": "Printrbot",
"file_formats": "text/x-gcode"
},
"overrides": {
"machine_name": { "default_value": "Printrbot Simple Maker's Kit (1405)" },
"machine_heated_bed": { "default_value": false },
"machine_width": { "default_value": 100 },
"machine_depth": { "default_value": 100 },
"machine_height": { "default_value": 115 },
"material_diameter": { "default_value": 1.75 },
"machine_nozzle_size": { "default_value": 0.4 },
"machine_head_with_fans_polygon": {
"default_value": [
[-40, 1000],
[-40, -10],
[60, 1000],
[60, -10]
]
},
"gantry_height": { "default_value": 1000 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
"default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;home X/Y\nG28 Z0 ;home Z\nG92 E0 ;zero the extruded length\nG29 ;initiate auto bed leveling sequence"
},
"machine_end_gcode": {
"default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nM106 S0 ;fan off\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit\nG1 Z+1 E-5 F9000 ;move Z up a bit and retract even more\nG28 X0 Y0 ;home X/Y, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning"
}
}
}

View File

@ -126,7 +126,7 @@
"retraction_count_max": { "value": "10" }, "retraction_count_max": { "value": "10" },
"retraction_extrusion_window": { "value": "1" }, "retraction_extrusion_window": { "value": "1" },
"retraction_hop": { "value": "2" }, "retraction_hop": { "value": "2" },
"retraction_hop_enabled": { "value": "True" }, "retraction_hop_enabled": { "value": "extruders_enabled_count > 1" },
"retraction_hop_only_when_collides": { "value": "True" }, "retraction_hop_only_when_collides": { "value": "True" },
"retraction_min_travel": { "value": "5" }, "retraction_min_travel": { "value": "5" },
"retraction_prime_speed": { "value": "15" }, "retraction_prime_speed": { "value": "15" },
@ -150,7 +150,7 @@
"switch_extruder_prime_speed": { "value": "15" }, "switch_extruder_prime_speed": { "value": "15" },
"switch_extruder_retraction_amount": { "value": "8" }, "switch_extruder_retraction_amount": { "value": "8" },
"top_bottom_thickness": { "value": "1" }, "top_bottom_thickness": { "value": "1" },
"travel_avoid_distance": { "value": "3" }, "travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" }, "wall_0_inset": { "value": "0" },
"wall_line_width_x": { "value": "round(wall_line_width * 0.3 / 0.35, 2)" }, "wall_line_width_x": { "value": "round(wall_line_width * 0.3 / 0.35, 2)" },
"wall_thickness": { "value": "1" }, "wall_thickness": { "value": "1" },

View File

@ -346,15 +346,9 @@ Column
{ {
id: materialSelection id: materialSelection
property var currentRootMaterialName: property var activeExtruder: Cura.MachineManager.activeStack
{ property var hasActiveExtruder: activeExtruder != null
var materials = Cura.MachineManager.currentRootMaterialName; property var currentRootMaterialName: hasActiveExtruder ? activeExtruder.material.name : ""
var materialName = "";
if (base.currentExtruderIndex in materials) {
materialName = materials[base.currentExtruderIndex];
}
return materialName;
}
text: currentRootMaterialName text: currentRootMaterialName
tooltip: currentRootMaterialName tooltip: currentRootMaterialName
@ -373,7 +367,11 @@ Column
property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported property var valueWarning: ! Cura.MachineManager.isActiveQualitySupported
function isMaterialSupported () { function isMaterialSupported () {
return Cura.ContainerManager.getContainerMetaDataEntry(Cura.MachineManager.activeMaterialId, "compatible") == "True" if (!hasActiveExtruder)
{
return false;
}
return Cura.ContainerManager.getContainerMetaDataEntry(activeExtruder.material.id, "compatible") == "True"
} }
} }
} }

View File

@ -101,7 +101,7 @@ UM.Dialog
} }
Label Label
{ {
text: Cura.MachineManager.activeMachine.definition.name text: (Cura.MachineManager.activeMachine == null) ? "" : Cura.MachineManager.activeMachine.definition.name
width: (parent.width / 3) | 0 width: (parent.width / 3) | 0
} }
} }
@ -173,7 +173,7 @@ UM.Dialog
} }
Label Label
{ {
text: Cura.MachineManager.activeVariantNames[modelData] + ", " + Cura.MachineManager.currentRootMaterialName[modelData] text: Cura.MachineManager.activeVariantNames[modelData] + ", " + Cura.MachineManager.getExtruder(modelData).material.name
width: (parent.width / 3) | 0 width: (parent.width / 3) | 0
} }
} }

View File

@ -34,7 +34,6 @@ raft_airgap = 0.25
raft_interface_thickness = =max(layer_height * 1.5, 0.225) raft_interface_thickness = =max(layer_height * 1.5, 0.225)
retraction_count_max = 80 retraction_count_max = 80
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -38,7 +38,6 @@ retraction_count_max = 45
retraction_extra_prime_amount = 0.2 retraction_extra_prime_amount = 0.2
retraction_extrusion_window = 6.5 retraction_extrusion_window = 6.5
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 13 retraction_prime_speed = 13

View File

@ -44,7 +44,6 @@ raft_interface_thickness = =max(layer_height * 1.5, 0.225)
retraction_count_max = 80 retraction_count_max = 80
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -43,7 +43,6 @@ raft_interface_thickness = =max(layer_height * 1.5, 0.225)
retraction_count_max = 80 retraction_count_max = 80
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -44,7 +44,6 @@ raft_interface_thickness = =max(layer_height * 1.5, 0.225)
retraction_count_max = 80 retraction_count_max = 80
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -41,7 +41,6 @@ raft_interface_thickness = =max(layer_height * 1.5, 0.225)
retraction_count_max = 80 retraction_count_max = 80
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -45,7 +45,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 18 retraction_prime_speed = 18
@ -61,7 +60,6 @@ support_angle = 50
switch_extruder_prime_speed = 15 switch_extruder_prime_speed = 15
switch_extruder_retraction_amount = 20 switch_extruder_retraction_amount = 20
switch_extruder_retraction_speeds = 35 switch_extruder_retraction_speeds = 35
travel_avoid_distance = 3
wall_0_inset = 0 wall_0_inset = 0
wall_line_width_x = =line_width wall_line_width_x = =line_width
wall_thickness = =line_width * 3 wall_thickness = =line_width * 3

View File

@ -44,7 +44,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 18 retraction_prime_speed = 18
@ -61,7 +60,6 @@ switch_extruder_prime_speed = 15
switch_extruder_retraction_amount = 20 switch_extruder_retraction_amount = 20
switch_extruder_retraction_speeds = 35 switch_extruder_retraction_speeds = 35
top_bottom_thickness = 1.1 top_bottom_thickness = 1.1
travel_avoid_distance = 3
wall_0_inset = 0 wall_0_inset = 0
wall_line_width_x = =line_width wall_line_width_x = =line_width
wall_thickness = =line_width * 3 wall_thickness = =line_width * 3

View File

@ -43,7 +43,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 0.8 retraction_min_travel = 0.8
retraction_prime_speed = 18 retraction_prime_speed = 18
@ -60,7 +59,6 @@ switch_extruder_prime_speed = 15
switch_extruder_retraction_amount = 20 switch_extruder_retraction_amount = 20
switch_extruder_retraction_speeds = 35 switch_extruder_retraction_speeds = 35
top_bottom_thickness = 1 top_bottom_thickness = 1
travel_avoid_distance = 3
wall_0_inset = 0 wall_0_inset = 0
wall_line_width_x = =line_width wall_line_width_x = =line_width
wall_thickness = =line_width * 3 wall_thickness = =line_width * 3

View File

@ -43,7 +43,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 1.5 retraction_hop = 1.5
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = =line_width * 2 retraction_min_travel = =line_width * 2
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -44,7 +44,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 1.5 retraction_hop = 1.5
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = =line_width * 2 retraction_min_travel = =line_width * 2
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -41,7 +41,6 @@ retraction_count_max = 12
retraction_extra_prime_amount = 0.8 retraction_extra_prime_amount = 0.8
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 1.5 retraction_hop = 1.5
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = =line_width * 2 retraction_min_travel = =line_width * 2
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -36,4 +36,3 @@ support_bottom_distance = =support_z_distance
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
support_z_distance = =layer_height support_z_distance = =layer_height
top_bottom_thickness = 1.2 top_bottom_thickness = 1.2
travel_avoid_distance = 1.5

View File

@ -37,4 +37,3 @@ support_bottom_distance = =support_z_distance
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
support_z_distance = =layer_height support_z_distance = =layer_height
top_bottom_thickness = 1.2 top_bottom_thickness = 1.2
travel_avoid_distance = 1.5

View File

@ -37,4 +37,3 @@ support_bottom_distance = =support_z_distance
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
support_z_distance = =layer_height support_z_distance = =layer_height
top_bottom_thickness = 1.2 top_bottom_thickness = 1.2
travel_avoid_distance = 1.5

View File

@ -29,4 +29,3 @@ speed_topbottom = =math.ceil(speed_print * 25 / 50)
speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall = =math.ceil(speed_print * 40 / 50)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
travel_avoid_distance = 3

View File

@ -29,4 +29,3 @@ speed_topbottom = =math.ceil(speed_print * 25 / 50)
speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall = =math.ceil(speed_print * 40 / 50)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
travel_avoid_distance = 3

View File

@ -30,4 +30,3 @@ speed_topbottom = =math.ceil(speed_print * 25 / 50)
speed_wall = =math.ceil(speed_print * 40 / 50) speed_wall = =math.ceil(speed_print * 40 / 50)
speed_wall_0 = =math.ceil(speed_wall * 30 / 40) speed_wall_0 = =math.ceil(speed_wall * 30 / 40)
support_line_width = =round(line_width * 0.6 / 0.7, 2) support_line_width = =round(line_width * 0.6 / 0.7, 2)
travel_avoid_distance = 3

View File

@ -45,7 +45,6 @@ retraction_amount = 6.5
retraction_count_max = 25 retraction_count_max = 25
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
skin_overlap = 5 skin_overlap = 5
speed_equalize_flow_enabled = True speed_equalize_flow_enabled = True

View File

@ -12,6 +12,7 @@ hardware_type = nozzle
brim_width = 7 brim_width = 7
machine_nozzle_cool_down_speed = 0.9 machine_nozzle_cool_down_speed = 0.9
machine_nozzle_id = AA 0.4 machine_nozzle_id = AA 0.4
machine_nozzle_tip_outer_diameter = 1.0
raft_acceleration = =acceleration_print raft_acceleration = =acceleration_print
raft_airgap = 0.3 raft_airgap = 0.3
raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2

View File

@ -20,6 +20,7 @@ jerk_support_interface = =math.ceil(jerk_support * 10 / 15)
jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5 machine_nozzle_heat_up_speed = 1.5
machine_nozzle_id = BB 0.4 machine_nozzle_id = BB 0.4
machine_nozzle_tip_outer_diameter = 1.0
prime_tower_purge_volume = 1 prime_tower_purge_volume = 1
raft_base_speed = 20 raft_base_speed = 20
raft_interface_speed = 20 raft_interface_speed = 20

View File

@ -45,7 +45,6 @@ retraction_amount = 6.5
retraction_count_max = 25 retraction_count_max = 25
retraction_extrusion_window = 1 retraction_extrusion_window = 1
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
skin_overlap = 5 skin_overlap = 5
speed_equalize_flow_enabled = True speed_equalize_flow_enabled = True

View File

@ -12,6 +12,7 @@ hardware_type = nozzle
brim_width = 7 brim_width = 7
machine_nozzle_cool_down_speed = 0.9 machine_nozzle_cool_down_speed = 0.9
machine_nozzle_id = AA 0.4 machine_nozzle_id = AA 0.4
machine_nozzle_tip_outer_diameter = 1.0
raft_acceleration = =acceleration_print raft_acceleration = =acceleration_print
raft_airgap = 0.3 raft_airgap = 0.3
raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2

View File

@ -56,7 +56,6 @@ retraction_amount = 4.5
retraction_count_max = 15 retraction_count_max = 15
retraction_extrusion_window = =retraction_amount retraction_extrusion_window = =retraction_amount
retraction_hop = 2 retraction_hop = 2
retraction_hop_enabled = True
retraction_hop_only_when_collides = True retraction_hop_only_when_collides = True
retraction_min_travel = 5 retraction_min_travel = 5
retraction_prime_speed = 15 retraction_prime_speed = 15

View File

@ -20,6 +20,7 @@ jerk_support_interface = =math.ceil(jerk_support * 10 / 15)
jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5 machine_nozzle_heat_up_speed = 1.5
machine_nozzle_id = BB 0.4 machine_nozzle_id = BB 0.4
machine_nozzle_tip_outer_diameter = 1.0
prime_tower_purge_volume = 1 prime_tower_purge_volume = 1
raft_base_speed = 20 raft_base_speed = 20
raft_interface_speed = 20 raft_interface_speed = 20

0
tools/check_preset_settings.py Executable file → Normal file
View File