mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-29 17:45:45 +08:00
Merge branch 'main' into CURA-8076_seam_avoid_overhangs
This commit is contained in:
commit
49984b620e
@ -115,15 +115,15 @@ class Account(QObject):
|
|||||||
self._update_timer.setSingleShot(True)
|
self._update_timer.setSingleShot(True)
|
||||||
self._update_timer.timeout.connect(self.sync)
|
self._update_timer.timeout.connect(self.sync)
|
||||||
|
|
||||||
self._sync_services: Dict[str, int] = {}
|
|
||||||
"""contains entries "service_name" : SyncState"""
|
"""contains entries "service_name" : SyncState"""
|
||||||
self.syncRequested.connect(self._updatePermissions)
|
self._sync_services: Dict[str, int] = {}
|
||||||
|
|
||||||
def initialize(self) -> None:
|
def initialize(self) -> None:
|
||||||
self._authorization_service.initialize(self._application.getPreferences())
|
self._authorization_service.initialize(self._application.getPreferences())
|
||||||
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
|
self._authorization_service.onAuthStateChanged.connect(self._onLoginStateChanged)
|
||||||
self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged)
|
self._authorization_service.onAuthenticationError.connect(self._onLoginStateChanged)
|
||||||
self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
|
self._authorization_service.accessTokenChanged.connect(self._onAccessTokenChanged)
|
||||||
|
self._authorization_service.accessTokenChanged.connect(self._updatePermissions)
|
||||||
self._authorization_service.loadAuthDataFromPreferences()
|
self._authorization_service.loadAuthDataFromPreferences()
|
||||||
|
|
||||||
@pyqtProperty(int, notify=syncStateChanged)
|
@pyqtProperty(int, notify=syncStateChanged)
|
||||||
|
@ -96,7 +96,8 @@ class ThreeMFWriter(MeshWriter):
|
|||||||
@staticmethod
|
@staticmethod
|
||||||
def _convertUMNodeToSavitarNode(um_node,
|
def _convertUMNodeToSavitarNode(um_node,
|
||||||
transformation = Matrix(),
|
transformation = Matrix(),
|
||||||
exported_settings: Optional[Dict[str, Set[str]]] = None):
|
exported_settings: Optional[Dict[str, Set[str]]] = None,
|
||||||
|
center_mesh = False):
|
||||||
"""Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode
|
"""Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode
|
||||||
|
|
||||||
:returns: Uranium Scene node.
|
:returns: Uranium Scene node.
|
||||||
@ -111,16 +112,20 @@ class ThreeMFWriter(MeshWriter):
|
|||||||
savitar_node = Savitar.SceneNode()
|
savitar_node = Savitar.SceneNode()
|
||||||
savitar_node.setName(um_node.getName())
|
savitar_node.setName(um_node.getName())
|
||||||
|
|
||||||
node_matrix = Matrix()
|
|
||||||
mesh_data = um_node.getMeshData()
|
mesh_data = um_node.getMeshData()
|
||||||
# compensate for original center position, if object(s) is/are not around its zero position
|
|
||||||
if mesh_data is not None:
|
if center_mesh:
|
||||||
extents = mesh_data.getExtents()
|
node_matrix = Matrix()
|
||||||
if extents is not None:
|
# compensate for original center position, if object(s) is/are not around its zero position
|
||||||
# We use a different coordinate space while writing, so flip Z and Y
|
if mesh_data is not None:
|
||||||
center_vector = Vector(extents.center.x, extents.center.z, extents.center.y)
|
extents = mesh_data.getExtents()
|
||||||
node_matrix.setByTranslation(center_vector)
|
if extents is not None:
|
||||||
node_matrix.multiply(um_node.getLocalTransformation())
|
# We use a different coordinate space while writing, so flip Z and Y
|
||||||
|
center_vector = Vector(extents.center.x, extents.center.y, extents.center.z)
|
||||||
|
node_matrix.setByTranslation(center_vector)
|
||||||
|
node_matrix.multiply(um_node.getLocalTransformation())
|
||||||
|
else:
|
||||||
|
node_matrix = um_node.getLocalTransformation()
|
||||||
|
|
||||||
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation))
|
matrix_string = ThreeMFWriter._convertMatrixToString(node_matrix.preMultiply(transformation))
|
||||||
|
|
||||||
@ -147,7 +152,7 @@ class ThreeMFWriter(MeshWriter):
|
|||||||
for key in changed_setting_keys:
|
for key in changed_setting_keys:
|
||||||
savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value")))
|
savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value")))
|
||||||
else:
|
else:
|
||||||
# We want to export only the specified settings
|
# We want to export only the specified settings
|
||||||
if um_node.getName() in exported_settings:
|
if um_node.getName() in exported_settings:
|
||||||
model_exported_settings = exported_settings[um_node.getName()]
|
model_exported_settings = exported_settings[um_node.getName()]
|
||||||
|
|
||||||
@ -283,7 +288,8 @@ class ThreeMFWriter(MeshWriter):
|
|||||||
for root_child in node.getChildren():
|
for root_child in node.getChildren():
|
||||||
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child,
|
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child,
|
||||||
transformation_matrix,
|
transformation_matrix,
|
||||||
exported_model_settings)
|
exported_model_settings,
|
||||||
|
center_mesh = True)
|
||||||
if savitar_node:
|
if savitar_node:
|
||||||
savitar_scene.addSceneNode(savitar_node)
|
savitar_scene.addSceneNode(savitar_node)
|
||||||
else:
|
else:
|
||||||
@ -442,7 +448,7 @@ class ThreeMFWriter(MeshWriter):
|
|||||||
def sceneNodesToString(scene_nodes: [SceneNode]) -> str:
|
def sceneNodesToString(scene_nodes: [SceneNode]) -> str:
|
||||||
savitar_scene = Savitar.Scene()
|
savitar_scene = Savitar.Scene()
|
||||||
for scene_node in scene_nodes:
|
for scene_node in scene_nodes:
|
||||||
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node)
|
savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(scene_node, center_mesh = True)
|
||||||
savitar_scene.addSceneNode(savitar_node)
|
savitar_scene.addSceneNode(savitar_node)
|
||||||
parser = Savitar.ThreeMFParser()
|
parser = Savitar.ThreeMFParser()
|
||||||
scene_string = parser.sceneToString(savitar_scene)
|
scene_string = parser.sceneToString(savitar_scene)
|
||||||
|
@ -544,7 +544,7 @@ class CuraEngineBackend(QObject, Backend):
|
|||||||
|
|
||||||
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
|
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
|
||||||
self._error_message = Message(catalog.i18nc("@info:status",
|
self._error_message = Message(catalog.i18nc("@info:status",
|
||||||
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getMessage(),
|
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getAssociatedDisabledExtruders(),
|
||||||
title = catalog.i18nc("@info:title", "Unable to slice"),
|
title = catalog.i18nc("@info:title", "Unable to slice"),
|
||||||
message_type = Message.MessageType.WARNING)
|
message_type = Message.MessageType.WARNING)
|
||||||
self._error_message.show()
|
self._error_message.show()
|
||||||
|
@ -146,6 +146,7 @@ class StartSliceJob(Job):
|
|||||||
self._slice_message: Arcus.PythonMessage = slice_message
|
self._slice_message: Arcus.PythonMessage = slice_message
|
||||||
self._is_cancelled: bool = False
|
self._is_cancelled: bool = False
|
||||||
self._build_plate_number: Optional[int] = None
|
self._build_plate_number: Optional[int] = None
|
||||||
|
self._associated_disabled_extruders: Optional[str] = None
|
||||||
|
|
||||||
# cache for all setting values from all stacks (global & extruder) for the current machine
|
# cache for all setting values from all stacks (global & extruder) for the current machine
|
||||||
self._all_extruders_settings: Optional[Dict[str, Any]] = None
|
self._all_extruders_settings: Optional[Dict[str, Any]] = None
|
||||||
@ -153,6 +154,9 @@ class StartSliceJob(Job):
|
|||||||
def getSliceMessage(self) -> Arcus.PythonMessage:
|
def getSliceMessage(self) -> Arcus.PythonMessage:
|
||||||
return self._slice_message
|
return self._slice_message
|
||||||
|
|
||||||
|
def getAssociatedDisabledExtruders(self) -> Optional[str]:
|
||||||
|
return self._associated_disabled_extruders
|
||||||
|
|
||||||
def setBuildPlate(self, build_plate_number: int) -> None:
|
def setBuildPlate(self, build_plate_number: int) -> None:
|
||||||
self._build_plate_number = build_plate_number
|
self._build_plate_number = build_plate_number
|
||||||
|
|
||||||
@ -334,7 +338,7 @@ class StartSliceJob(Job):
|
|||||||
if has_model_with_disabled_extruders:
|
if has_model_with_disabled_extruders:
|
||||||
self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
|
self.setResult(StartJobResult.ObjectsWithDisabledExtruder)
|
||||||
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders}
|
associated_disabled_extruders = {p + 1 for p in associated_disabled_extruders}
|
||||||
self.setMessage(", ".join(map(str, sorted(associated_disabled_extruders))))
|
self._associated_disabled_extruders = ", ".join(map(str, sorted(associated_disabled_extruders)))
|
||||||
return
|
return
|
||||||
|
|
||||||
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
|
# There are cases when there is nothing to slice. This can happen due to one at a time slicing not being
|
||||||
|
@ -206,25 +206,25 @@ chardet==3.0.4 \
|
|||||||
idna==2.8 \
|
idna==2.8 \
|
||||||
--hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \
|
--hash=sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407 \
|
||||||
--hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c
|
--hash=sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c
|
||||||
attrs==21.2.0 \
|
attrs==21.3.0 \
|
||||||
--hash=sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1 \
|
--hash=sha256:8f7335278dedd26b58c38e006338242cc0977f06d51579b2b8b87b9b33bff66c \
|
||||||
--hash=sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb
|
--hash=sha256:50f3c9b216dc9021042f71b392859a773b904ce1a029077f58f6598272432045
|
||||||
requests==2.22.0 \
|
requests==2.22.0 \
|
||||||
--hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \
|
--hash=sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4 \
|
||||||
--hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31
|
--hash=sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31
|
||||||
# twisted
|
# twisted
|
||||||
Twisted==23.8.0 \
|
Twisted==21.2.0 \
|
||||||
--hash=sha256:3c73360add17336a622c0d811c2a2ce29866b6e59b1125fd6509b17252098a24 \
|
--hash=sha256:77544a8945cf69b98d2946689bbe0c75de7d145cdf11f391dd487eae8fc95a12 \
|
||||||
--hash=sha256:b8bdba145de120ffb36c20e6e071cce984e89fba798611ed0704216fb7f884cd
|
--hash=sha256:aab38085ea6cda5b378b519a0ec99986874921ee8881318626b0a3414bb2631e
|
||||||
constantly==15.1.0 \
|
constantly==15.1.0 \
|
||||||
--hash=sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35 \
|
--hash=sha256:586372eb92059873e29eba4f9dec8381541b4d3834660707faf8ba59146dfc35 \
|
||||||
--hash=sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d
|
--hash=sha256:dd2fa9d6b1a51a83f0d7dd76293d734046aa176e384bf6e33b7e44880eb37c5d
|
||||||
hyperlink==21.0.0 \
|
hyperlink==21.0.0 \
|
||||||
--hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \
|
--hash=sha256:427af957daa58bc909471c6c40f74c5450fa123dd093fc53efd2e91d2705a56b \
|
||||||
--hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4
|
--hash=sha256:e6b14c37ecb73e89c77d78cdb4c2cc8f3fb59a885c5b3f819ff4ed80f25af1b4
|
||||||
incremental==21.3.0 \
|
incremental==22.10.0 \
|
||||||
--hash=sha256:02f5de5aff48f6b9f665d99d48bfc7ec03b6e3943210de7cfc88856d755d6f57 \
|
--hash=sha256:b864a1f30885ee72c5ac2835a761b8fe8aa9c28b9395cacf27286602688d3e51 \
|
||||||
--hash=sha256:92014aebc6a20b78a8084cdd5645eeaa7f74b8933f70fa3ada2cfbd1e3b54321
|
--hash=sha256:912feeb5e0f7e0188e6f42241d2f450002e11bbc0937c65865045854c24c0bd0
|
||||||
zope.interface==5.4.0 \
|
zope.interface==5.4.0 \
|
||||||
--hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \
|
--hash=sha256:0f91b5b948686659a8e28b728ff5e74b1be6bf40cb04704453617e5f1e945ef3 \
|
||||||
--hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \
|
--hash=sha256:3c02411a3b62668200910090a0dff17c0b25aaa36145082a5a6adf08fa281e54 \
|
||||||
|
@ -6208,6 +6208,7 @@
|
|||||||
"type": "bool",
|
"type": "bool",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||||
|
"resolve": "any(extruderValues('raft_remove_inside_corners'))",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false,
|
"settable_per_extruder": false,
|
||||||
"children":
|
"children":
|
||||||
@ -6220,6 +6221,7 @@
|
|||||||
"value": "raft_remove_inside_corners",
|
"value": "raft_remove_inside_corners",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||||
|
"resolve": "any(extruderValues('raft_base_remove_inside_corners'))",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false
|
"settable_per_extruder": false
|
||||||
},
|
},
|
||||||
@ -6231,6 +6233,7 @@
|
|||||||
"value": "raft_remove_inside_corners",
|
"value": "raft_remove_inside_corners",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||||
|
"resolve": "any(extruderValues('raft_interface_remove_inside_corners'))",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false
|
"settable_per_extruder": false
|
||||||
},
|
},
|
||||||
@ -6242,6 +6245,7 @@
|
|||||||
"value": "raft_remove_inside_corners",
|
"value": "raft_remove_inside_corners",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
"enabled": "resolveOrValue('adhesion_type') == 'raft'",
|
||||||
|
"resolve": "any(extruderValues('raft_surface_remove_inside_corners'))",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": false
|
"settable_per_extruder": false
|
||||||
}
|
}
|
||||||
@ -6845,7 +6849,7 @@
|
|||||||
"label": "Prime Tower Type",
|
"label": "Prime Tower Type",
|
||||||
"description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>",
|
"description": "<html>How to generate the prime tower:<ul><li><b>Normal:</b> create a bucket in which secondary materials are primed</li><li><b>Interleaved:</b> create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other</li></ul></html>",
|
||||||
"type": "enum",
|
"type": "enum",
|
||||||
"resolve": "'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
|
"resolve": "'interleaved' if all(mode == 'interleaved' for mode in extruderValues('prime_tower_mode')) else 'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'",
|
||||||
"options":
|
"options":
|
||||||
{
|
{
|
||||||
"normal": "Normal",
|
"normal": "Normal",
|
||||||
|
@ -80,6 +80,7 @@
|
|||||||
"maximum_value_warning": "120",
|
"maximum_value_warning": "120",
|
||||||
"minimum_value": "0"
|
"minimum_value": "0"
|
||||||
},
|
},
|
||||||
|
"material_print_temp_wait": { "value": false },
|
||||||
"material_print_temperature": { "minimum_value": "0" },
|
"material_print_temperature": { "minimum_value": "0" },
|
||||||
"material_standby_temperature":
|
"material_standby_temperature":
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,13 @@
|
|||||||
|
[5.7.2]
|
||||||
|
|
||||||
|
* Bugfixes
|
||||||
|
- Fixed a bug where modifier meshes and support meshes were not loaded in the correct position, should resolve https://github.com/Ultimaker/Cura/issues/18761 (and https://github.com/5axes/SpoonAntiWarping/issues/8)
|
||||||
|
- Primeblobs were not printed for a second extruder
|
||||||
|
- Interleaved prime tower can now be printed with a raft
|
||||||
|
- Improved behaviors for start temperature for multiple extruders
|
||||||
|
- Improved preheating logic when using a raft with multiple extruders
|
||||||
|
- Enabled Raft Remove Inside Corners and Prime Tower Mode to be shipped with a material profile
|
||||||
|
|
||||||
[5.7.1]
|
[5.7.1]
|
||||||
|
|
||||||
* Introducing the UltiMaker Factor 4
|
* Introducing the UltiMaker Factor 4
|
||||||
|
Loading…
x
Reference in New Issue
Block a user