mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-15 16:16:00 +08:00
Merge branch '2.7'
This commit is contained in:
commit
9aa65eab44
@ -61,6 +61,12 @@ class GlobalStack(CuraContainerStack):
|
|||||||
# already have the maximum number of extruders.
|
# already have the maximum number of extruders.
|
||||||
def addExtruder(self, extruder: ContainerStack) -> None:
|
def addExtruder(self, extruder: ContainerStack) -> None:
|
||||||
extruder_count = self.getProperty("machine_extruder_count", "value")
|
extruder_count = self.getProperty("machine_extruder_count", "value")
|
||||||
|
|
||||||
|
if extruder_count <= 1:
|
||||||
|
Logger.log("i", "Not adding extruder[%s] to [%s] because it is a single-extrusion machine.",
|
||||||
|
extruder.id, self.id)
|
||||||
|
return
|
||||||
|
|
||||||
if extruder_count and len(self._extruders) + 1 > extruder_count:
|
if extruder_count and len(self._extruders) + 1 > extruder_count:
|
||||||
Logger.log("w", "Adding extruder {meta} to {id} but its extruder count is {count}".format(id = self.id, count = extruder_count, meta = str(extruder.getMetaData())))
|
Logger.log("w", "Adding extruder {meta} to {id} but its extruder count is {count}".format(id = self.id, count = extruder_count, meta = str(extruder.getMetaData())))
|
||||||
return
|
return
|
||||||
@ -73,7 +79,9 @@ class GlobalStack(CuraContainerStack):
|
|||||||
if any(item.getId() == extruder.id for item in self._extruders.values()):
|
if any(item.getId() == extruder.id for item in self._extruders.values()):
|
||||||
Logger.log("w", "Extruder [%s] has already been added to this stack [%s]", extruder.id, self._id)
|
Logger.log("w", "Extruder [%s] has already been added to this stack [%s]", extruder.id, self._id)
|
||||||
return
|
return
|
||||||
|
|
||||||
self._extruders[position] = extruder
|
self._extruders[position] = extruder
|
||||||
|
Logger.log("i", "Extruder[%s] added to [%s] at position [%s]", extruder.id, self.id, position)
|
||||||
|
|
||||||
## Overridden from ContainerStack
|
## Overridden from ContainerStack
|
||||||
#
|
#
|
||||||
|
@ -17,6 +17,7 @@ from .WorkspaceDialog import WorkspaceDialog
|
|||||||
|
|
||||||
import xml.etree.ElementTree as ET
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
from cura.Settings.CuraStackBuilder import CuraStackBuilder
|
||||||
from cura.Settings.ExtruderManager import ExtruderManager
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
from cura.Settings.ExtruderStack import ExtruderStack
|
from cura.Settings.ExtruderStack import ExtruderStack
|
||||||
from cura.Settings.GlobalStack import GlobalStack
|
from cura.Settings.GlobalStack import GlobalStack
|
||||||
@ -665,6 +666,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
Logger.log("e", "Resolve strategy of %s for machine is not supported",
|
Logger.log("e", "Resolve strategy of %s for machine is not supported",
|
||||||
self._resolve_strategies["machine"])
|
self._resolve_strategies["machine"])
|
||||||
|
|
||||||
|
# Create a new definition_changes container if it was empty
|
||||||
|
if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer():
|
||||||
|
stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings"))
|
||||||
global_stack = stack
|
global_stack = stack
|
||||||
Job.yieldThread()
|
Job.yieldThread()
|
||||||
except:
|
except:
|
||||||
@ -674,51 +678,65 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
self._container_registry.removeContainer(container.getId())
|
self._container_registry.removeContainer(container.getId())
|
||||||
return
|
return
|
||||||
|
|
||||||
|
#
|
||||||
|
# Use the number of extruders from the global stack instead of the number of extruder stacks this project file
|
||||||
|
# contains. The Custom FDM Printer can have multiple extruders, but the actual number of extruders in used is
|
||||||
|
# defined in the global stack.
|
||||||
|
# Because for single-extrusion machines, there won't be an extruder stack, so relying on the the extruder count
|
||||||
|
# in the global stack can avoid problems in those cases.
|
||||||
|
#
|
||||||
|
extruder_count_from_global_stack = global_stack.getProperty("machine_extruder_count", "value")
|
||||||
|
|
||||||
# --
|
# --
|
||||||
# load extruder stack files
|
# load extruder stack files
|
||||||
try:
|
if extruder_count_from_global_stack > 1:
|
||||||
for extruder_stack_file in extruder_stack_files:
|
try:
|
||||||
container_id = self._stripFileToId(extruder_stack_file)
|
for extruder_stack_file in extruder_stack_files:
|
||||||
extruder_file_content = archive.open(extruder_stack_file, "r").read().decode("utf-8")
|
container_id = self._stripFileToId(extruder_stack_file)
|
||||||
|
extruder_file_content = archive.open(extruder_stack_file, "r").read().decode("utf-8")
|
||||||
|
|
||||||
if self._resolve_strategies["machine"] == "override":
|
if self._resolve_strategies["machine"] == "override":
|
||||||
# deserialize new extruder stack over the current ones
|
# deserialize new extruder stack over the current ones
|
||||||
stack = self._overrideExtruderStack(global_stack, extruder_file_content)
|
stack = self._overrideExtruderStack(global_stack, extruder_file_content)
|
||||||
|
|
||||||
elif self._resolve_strategies["machine"] == "new":
|
elif self._resolve_strategies["machine"] == "new":
|
||||||
new_id = extruder_stack_id_map[container_id]
|
new_id = extruder_stack_id_map[container_id]
|
||||||
stack = ExtruderStack(new_id)
|
stack = ExtruderStack(new_id)
|
||||||
|
|
||||||
# HACK: the global stack can have a new name, so we need to make sure that this extruder stack
|
# HACK: the global stack can have a new name, so we need to make sure that this extruder stack
|
||||||
# references to the new name instead of the old one. Normally, this can be done after
|
# references to the new name instead of the old one. Normally, this can be done after
|
||||||
# deserialize() by setting the metadata, but in the case of ExtruderStack, deserialize()
|
# deserialize() by setting the metadata, but in the case of ExtruderStack, deserialize()
|
||||||
# also does addExtruder() to its machine stack, so we have to make sure that it's pointing
|
# also does addExtruder() to its machine stack, so we have to make sure that it's pointing
|
||||||
# to the right machine BEFORE deserialization.
|
# to the right machine BEFORE deserialization.
|
||||||
extruder_config = configparser.ConfigParser()
|
extruder_config = configparser.ConfigParser()
|
||||||
extruder_config.read_string(extruder_file_content)
|
extruder_config.read_string(extruder_file_content)
|
||||||
extruder_config.set("metadata", "machine", global_stack_id_new)
|
extruder_config.set("metadata", "machine", global_stack_id_new)
|
||||||
tmp_string_io = io.StringIO()
|
tmp_string_io = io.StringIO()
|
||||||
extruder_config.write(tmp_string_io)
|
extruder_config.write(tmp_string_io)
|
||||||
extruder_file_content = tmp_string_io.getvalue()
|
extruder_file_content = tmp_string_io.getvalue()
|
||||||
|
|
||||||
stack.deserialize(extruder_file_content)
|
stack.deserialize(extruder_file_content)
|
||||||
|
|
||||||
# Ensure a unique ID and name
|
# Ensure a unique ID and name
|
||||||
stack._id = new_id
|
stack._id = new_id
|
||||||
|
|
||||||
self._container_registry.addContainer(stack)
|
self._container_registry.addContainer(stack)
|
||||||
extruder_stacks_added.append(stack)
|
extruder_stacks_added.append(stack)
|
||||||
containers_added.append(stack)
|
containers_added.append(stack)
|
||||||
else:
|
else:
|
||||||
Logger.log("w", "Unknown resolve strategy: %s", self._resolve_strategies["machine"])
|
Logger.log("w", "Unknown resolve strategy: %s", self._resolve_strategies["machine"])
|
||||||
|
|
||||||
extruder_stacks.append(stack)
|
# Create a new definition_changes container if it was empty
|
||||||
except:
|
if stack.definitionChanges == self._container_registry.getEmptyInstanceContainer():
|
||||||
Logger.logException("w", "We failed to serialize the stack. Trying to clean up.")
|
stack.setDefinitionChanges(CuraStackBuilder.createDefinitionChangesContainer(stack, stack._id + "_settings"))
|
||||||
# Something went really wrong. Try to remove any data that we added.
|
|
||||||
for container in containers_added:
|
extruder_stacks.append(stack)
|
||||||
self._container_registry.removeContainer(container.getId())
|
except:
|
||||||
return
|
Logger.logException("w", "We failed to serialize the stack. Trying to clean up.")
|
||||||
|
# Something went really wrong. Try to remove any data that we added.
|
||||||
|
for container in containers_added:
|
||||||
|
self._container_registry.removeContainer(container.getId())
|
||||||
|
return
|
||||||
|
|
||||||
#
|
#
|
||||||
# Replacing the old containers if resolve is "new".
|
# Replacing the old containers if resolve is "new".
|
||||||
@ -823,9 +841,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
if extruder_stacks:
|
if extruder_stacks:
|
||||||
for stack in extruder_stacks:
|
for stack in extruder_stacks:
|
||||||
ExtruderManager.getInstance().registerExtruder(stack, global_stack.getId())
|
ExtruderManager.getInstance().registerExtruder(stack, global_stack.getId())
|
||||||
else:
|
|
||||||
# Machine has no extruders, but it needs to be registered with the extruder manager.
|
|
||||||
ExtruderManager.getInstance().registerExtruder(None, global_stack.getId())
|
|
||||||
|
|
||||||
Logger.log("d", "Workspace loading is notifying rest of the code of changes...")
|
Logger.log("d", "Workspace loading is notifying rest of the code of changes...")
|
||||||
|
|
||||||
|
@ -2,11 +2,9 @@ from UM.Workspace.WorkspaceWriter import WorkspaceWriter
|
|||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
from UM.Preferences import Preferences
|
from UM.Preferences import Preferences
|
||||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||||
from UM.Settings.ContainerStack import ContainerStack
|
|
||||||
from cura.Settings.ExtruderManager import ExtruderManager
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
import zipfile
|
import zipfile
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
import copy
|
|
||||||
import configparser
|
import configparser
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,8 +76,11 @@ class SliceInfo(Extension):
|
|||||||
data["active_machine"] = {"definition_id": global_container_stack.definition.getId(), "manufacturer": global_container_stack.definition.getMetaData().get("manufacturer","")}
|
data["active_machine"] = {"definition_id": global_container_stack.definition.getId(), "manufacturer": global_container_stack.definition.getMetaData().get("manufacturer","")}
|
||||||
|
|
||||||
data["extruders"] = []
|
data["extruders"] = []
|
||||||
extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()))
|
extruder_count = len(global_container_stack.extruders)
|
||||||
extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position"))
|
extruders = []
|
||||||
|
if extruder_count > 1:
|
||||||
|
extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()))
|
||||||
|
extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position"))
|
||||||
|
|
||||||
if not extruders:
|
if not extruders:
|
||||||
extruders = [global_container_stack]
|
extruders = [global_container_stack]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user