mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 17:45:56 +08:00
Merge pull request #3524 from fieldOfView/fix_support_eraser_grouping
Fix support eraser grouping
This commit is contained in:
commit
19792fc1a6
@ -1105,7 +1105,7 @@ class CuraApplication(QtApplication):
|
|||||||
continue
|
continue
|
||||||
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
if not node.getMeshData() and not node.callDecoration("isGroup"):
|
||||||
continue # Node that doesnt have a mesh and is not a group.
|
continue # Node that doesnt have a mesh and is not a group.
|
||||||
if node.getParent() and node.getParent().callDecoration("isGroup"):
|
if node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent().callDecoration("isSliceable"):
|
||||||
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
|
||||||
if not node.isSelectable():
|
if not node.isSelectable():
|
||||||
continue # i.e. node with layer data
|
continue # i.e. node with layer data
|
||||||
@ -1383,6 +1383,12 @@ class CuraApplication(QtApplication):
|
|||||||
group_node.setPosition(center)
|
group_node.setPosition(center)
|
||||||
group_node.setCenterPosition(center)
|
group_node.setCenterPosition(center)
|
||||||
|
|
||||||
|
# Remove nodes that are directly parented to another selected node from the selection so they remain parented
|
||||||
|
selected_nodes = Selection.getAllSelectedObjects().copy()
|
||||||
|
for node in selected_nodes:
|
||||||
|
if node.getParent() in selected_nodes and not node.getParent().callDecoration("isGroup"):
|
||||||
|
Selection.remove(node)
|
||||||
|
|
||||||
# Move selected nodes into the group-node
|
# Move selected nodes into the group-node
|
||||||
Selection.applyOperation(SetParentOperation, group_node)
|
Selection.applyOperation(SetParentOperation, group_node)
|
||||||
|
|
||||||
@ -1401,6 +1407,10 @@ class CuraApplication(QtApplication):
|
|||||||
group_parent = node.getParent()
|
group_parent = node.getParent()
|
||||||
children = node.getChildren().copy()
|
children = node.getChildren().copy()
|
||||||
for child in children:
|
for child in children:
|
||||||
|
# Ungroup only 1 level deep
|
||||||
|
if child.getParent() != node:
|
||||||
|
continue
|
||||||
|
|
||||||
# Set the parent of the children to the parent of the group-node
|
# Set the parent of the children to the parent of the group-node
|
||||||
op.addOperation(SetParentOperation(child, group_parent))
|
op.addOperation(SetParentOperation(child, group_parent))
|
||||||
|
|
||||||
|
@ -33,6 +33,7 @@ class MultiplyObjectsJob(Job):
|
|||||||
root = scene.getRoot()
|
root = scene.getRoot()
|
||||||
arranger = Arrange.create(scene_root=root)
|
arranger = Arrange.create(scene_root=root)
|
||||||
nodes = []
|
nodes = []
|
||||||
|
|
||||||
for node in self._objects:
|
for node in self._objects:
|
||||||
# If object is part of a group, multiply group
|
# If object is part of a group, multiply group
|
||||||
current_node = node
|
current_node = node
|
||||||
@ -49,18 +50,20 @@ class MultiplyObjectsJob(Job):
|
|||||||
for i in range(self._count):
|
for i in range(self._count):
|
||||||
# We do place the nodes one by one, as we want to yield in between.
|
# We do place the nodes one by one, as we want to yield in between.
|
||||||
if not node_too_big:
|
if not node_too_big:
|
||||||
node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr)
|
new_node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr)
|
||||||
if node_too_big or not solution_found:
|
if node_too_big or not solution_found:
|
||||||
found_solution_for_all = False
|
found_solution_for_all = False
|
||||||
new_location = node.getPosition()
|
new_location = new_node.getPosition()
|
||||||
new_location = new_location.set(z = 100 - i * 20)
|
new_location = new_location.set(z = 100 - i * 20)
|
||||||
node.setPosition(new_location)
|
new_node.setPosition(new_location)
|
||||||
|
|
||||||
# Same build plate
|
# Same build plate
|
||||||
build_plate_number = current_node.callDecoration("getBuildPlateNumber")
|
build_plate_number = current_node.callDecoration("getBuildPlateNumber")
|
||||||
node.callDecoration("setBuildPlateNumber", build_plate_number)
|
new_node.callDecoration("setBuildPlateNumber", build_plate_number)
|
||||||
|
for child in new_node.getChildren():
|
||||||
|
child.callDecoration("setBuildPlateNumber", build_plate_number)
|
||||||
|
|
||||||
nodes.append(node)
|
nodes.append(new_node)
|
||||||
current_progress += 1
|
current_progress += 1
|
||||||
status_message.setProgress((current_progress / total_progress) * 100)
|
status_message.setProgress((current_progress / total_progress) * 100)
|
||||||
Job.yieldThread()
|
Job.yieldThread()
|
||||||
|
@ -15,7 +15,7 @@ class BuildPlateDecorator(SceneNodeDecorator):
|
|||||||
self._build_plate_number = nr
|
self._build_plate_number = nr
|
||||||
if isinstance(self._node, CuraSceneNode):
|
if isinstance(self._node, CuraSceneNode):
|
||||||
self._node.transformChanged() # trigger refresh node without introducing a new signal
|
self._node.transformChanged() # trigger refresh node without introducing a new signal
|
||||||
if self._node and self._node.callDecoration("isGroup"):
|
if self._node:
|
||||||
for child in self._node.getChildren():
|
for child in self._node.getChildren():
|
||||||
child.callDecoration("setBuildPlateNumber", nr)
|
child.callDecoration("setBuildPlateNumber", nr)
|
||||||
|
|
||||||
|
@ -16,7 +16,6 @@ from UM.Mesh.MeshBuilder import MeshBuilder
|
|||||||
from UM.Mesh.MeshReader import MeshReader
|
from UM.Mesh.MeshReader import MeshReader
|
||||||
from UM.Scene.GroupDecorator import GroupDecorator
|
from UM.Scene.GroupDecorator import GroupDecorator
|
||||||
|
|
||||||
from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
|
||||||
from cura.Settings.ExtruderManager import ExtruderManager
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
from cura.Scene.CuraSceneNode import CuraSceneNode
|
from cura.Scene.CuraSceneNode import CuraSceneNode
|
||||||
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
||||||
@ -81,7 +80,7 @@ class ThreeMFReader(MeshReader):
|
|||||||
|
|
||||||
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
||||||
|
|
||||||
um_node = CuraSceneNode()
|
um_node = CuraSceneNode() # This adds a SettingOverrideDecorator
|
||||||
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
um_node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||||
um_node.setName(node_name)
|
um_node.setName(node_name)
|
||||||
transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation())
|
transformation = self._createMatrixFromTransformationString(savitar_node.getTransformation())
|
||||||
@ -110,8 +109,6 @@ class ThreeMFReader(MeshReader):
|
|||||||
|
|
||||||
# Add the setting override decorator, so we can add settings to this node.
|
# Add the setting override decorator, so we can add settings to this node.
|
||||||
if settings:
|
if settings:
|
||||||
um_node.addDecorator(SettingOverrideDecorator())
|
|
||||||
|
|
||||||
global_container_stack = Application.getInstance().getGlobalContainerStack()
|
global_container_stack = Application.getInstance().getGlobalContainerStack()
|
||||||
|
|
||||||
# Ensure the correct next container for the SettingOverride decorator is set.
|
# Ensure the correct next container for the SettingOverride decorator is set.
|
||||||
@ -140,7 +137,7 @@ class ThreeMFReader(MeshReader):
|
|||||||
continue
|
continue
|
||||||
setting_container.setProperty(key, "value", setting_value)
|
setting_container.setProperty(key, "value", setting_value)
|
||||||
|
|
||||||
if len(um_node.getChildren()) > 0:
|
if len(um_node.getChildren()) > 0 and um_node.getMeshData() is None:
|
||||||
group_decorator = GroupDecorator()
|
group_decorator = GroupDecorator()
|
||||||
um_node.addDecorator(group_decorator)
|
um_node.addDecorator(group_decorator)
|
||||||
um_node.setSelectable(True)
|
um_node.setSelectable(True)
|
||||||
|
@ -19,10 +19,8 @@ from cura.Scene.CuraSceneNode import CuraSceneNode
|
|||||||
|
|
||||||
from cura.PickingPass import PickingPass
|
from cura.PickingPass import PickingPass
|
||||||
|
|
||||||
from UM.Operations.GroupedOperation import GroupedOperation
|
|
||||||
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
|
from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation
|
||||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||||
from cura.Operations.SetParentOperation import SetParentOperation
|
|
||||||
|
|
||||||
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator
|
||||||
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
from cura.Scene.BuildPlateDecorator import BuildPlateDecorator
|
||||||
@ -105,15 +103,12 @@ class SupportEraser(Tool):
|
|||||||
mesh = MeshBuilder()
|
mesh = MeshBuilder()
|
||||||
mesh.addCube(10,10,10)
|
mesh.addCube(10,10,10)
|
||||||
node.setMeshData(mesh.build())
|
node.setMeshData(mesh.build())
|
||||||
node.setPosition(position)
|
|
||||||
|
|
||||||
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate
|
||||||
|
|
||||||
node.addDecorator(SettingOverrideDecorator())
|
|
||||||
node.addDecorator(BuildPlateDecorator(active_build_plate))
|
node.addDecorator(BuildPlateDecorator(active_build_plate))
|
||||||
node.addDecorator(SliceableObjectDecorator())
|
node.addDecorator(SliceableObjectDecorator())
|
||||||
|
|
||||||
stack = node.callDecoration("getStack") # created by SettingOverrideDecorator
|
stack = node.callDecoration("getStack") # created by SettingOverrideDecorator that is automatically added to CuraSceneNode
|
||||||
settings = stack.getTop()
|
settings = stack.getTop()
|
||||||
|
|
||||||
definition = stack.getSettingDefinition("anti_overhang_mesh")
|
definition = stack.getSettingDefinition("anti_overhang_mesh")
|
||||||
@ -122,13 +117,9 @@ class SupportEraser(Tool):
|
|||||||
new_instance.resetState() # Ensure that the state is not seen as a user state.
|
new_instance.resetState() # Ensure that the state is not seen as a user state.
|
||||||
settings.addInstance(new_instance)
|
settings.addInstance(new_instance)
|
||||||
|
|
||||||
root = self._controller.getScene().getRoot()
|
op = AddSceneNodeOperation(node, parent)
|
||||||
|
|
||||||
op = GroupedOperation()
|
|
||||||
# First add the node to the scene, so it gets the expected transform
|
|
||||||
op.addOperation(AddSceneNodeOperation(node, root))
|
|
||||||
op.addOperation(SetParentOperation(node, parent))
|
|
||||||
op.push()
|
op.push()
|
||||||
|
node.setPosition(position, CuraSceneNode.TransformSpace.World)
|
||||||
|
|
||||||
Application.getInstance().getController().getScene().sceneChanged.emit(node)
|
Application.getInstance().getController().getScene().sceneChanged.emit(node)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user