mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 09:56:04 +08:00
Merge branch 'master' into feature_headless_docker
This commit is contained in:
commit
c47a0a17a5
@ -8,7 +8,9 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
|||||||
|
|
||||||
## Simple operation to set the buildplate number of a scenenode.
|
## Simple operation to set the buildplate number of a scenenode.
|
||||||
class SetBuildPlateNumberOperation(Operation):
|
class SetBuildPlateNumberOperation(Operation):
|
||||||
|
|
||||||
def __init__(self, node: SceneNode, build_plate_nr: int) -> None:
|
def __init__(self, node: SceneNode, build_plate_nr: int) -> None:
|
||||||
|
super().__init__()
|
||||||
self._node = node
|
self._node = node
|
||||||
self._build_plate_nr = build_plate_nr
|
self._build_plate_nr = build_plate_nr
|
||||||
self._previous_build_plate_nr = None
|
self._previous_build_plate_nr = None
|
||||||
|
@ -34,7 +34,7 @@ class PlatformPhysics:
|
|||||||
self._change_timer.timeout.connect(self._onChangeTimerFinished)
|
self._change_timer.timeout.connect(self._onChangeTimerFinished)
|
||||||
self._move_factor = 1.1 # By how much should we multiply overlap to calculate a new spot?
|
self._move_factor = 1.1 # By how much should we multiply overlap to calculate a new spot?
|
||||||
self._max_overlap_checks = 10 # How many times should we try to find a new spot per tick?
|
self._max_overlap_checks = 10 # How many times should we try to find a new spot per tick?
|
||||||
self._minimum_gap = 2 # It is a minimum distance between two models, applicable for small models
|
self._minimum_gap = 2 # It is a minimum distance (in mm) between two models, applicable for small models
|
||||||
|
|
||||||
Preferences.getInstance().addPreference("physics/automatic_push_free", True)
|
Preferences.getInstance().addPreference("physics/automatic_push_free", True)
|
||||||
Preferences.getInstance().addPreference("physics/automatic_drop_down", True)
|
Preferences.getInstance().addPreference("physics/automatic_drop_down", True)
|
||||||
@ -42,7 +42,7 @@ class PlatformPhysics:
|
|||||||
def _onSceneChanged(self, source):
|
def _onSceneChanged(self, source):
|
||||||
self._change_timer.start()
|
self._change_timer.start()
|
||||||
|
|
||||||
def _onChangeTimerFinished(self, was_triggered_by_tool=False):
|
def _onChangeTimerFinished(self):
|
||||||
if not self._enabled:
|
if not self._enabled:
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -58,7 +58,6 @@ class PlatformPhysics:
|
|||||||
|
|
||||||
# Only check nodes inside build area.
|
# Only check nodes inside build area.
|
||||||
nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)]
|
nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)]
|
||||||
active_build_plate = Application.getInstance().getBuildPlateModel().activeBuildPlate
|
|
||||||
|
|
||||||
random.shuffle(nodes)
|
random.shuffle(nodes)
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
@ -72,7 +71,7 @@ class PlatformPhysics:
|
|||||||
|
|
||||||
if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")) and node.isEnabled(): #If an object is grouped, don't move it down
|
if Preferences.getInstance().getValue("physics/automatic_drop_down") and not (node.getParent() and node.getParent().callDecoration("isGroup")) and node.isEnabled(): #If an object is grouped, don't move it down
|
||||||
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
|
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
|
||||||
move_vector = move_vector.set(y=-bbox.bottom + z_offset)
|
move_vector = move_vector.set(y = -bbox.bottom + z_offset)
|
||||||
|
|
||||||
# If there is no convex hull for the node, start calculating it and continue.
|
# If there is no convex hull for the node, start calculating it and continue.
|
||||||
if not node.getDecorator(ConvexHullDecorator):
|
if not node.getDecorator(ConvexHullDecorator):
|
||||||
@ -131,17 +130,14 @@ class PlatformPhysics:
|
|||||||
overlap = own_convex_hull.translate(move_vector.x, move_vector.z).intersectsPolygon(other_convex_hull)
|
overlap = own_convex_hull.translate(move_vector.x, move_vector.z).intersectsPolygon(other_convex_hull)
|
||||||
if overlap: # Moving ensured that overlap was still there. Try anew!
|
if overlap: # Moving ensured that overlap was still there. Try anew!
|
||||||
temp_move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor,
|
temp_move_vector = move_vector.set(x = move_vector.x + overlap[0] * self._move_factor,
|
||||||
z = move_vector.z + overlap[1] * self._move_factor)
|
z = move_vector.z + overlap[1] * self._move_factor)
|
||||||
|
|
||||||
# if the distance between two models less than 2mm then try to find a new factor
|
# if the distance between two models less than 2mm then try to find a new factor
|
||||||
if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap:
|
if abs(temp_move_vector.x - overlap[0]) < self._minimum_gap and abs(temp_move_vector.y - overlap[1]) < self._minimum_gap:
|
||||||
temp_scale_factor = self._move_factor
|
|
||||||
temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0 # find x move_factor, like (3.4 + 2) / 3.4 = 1.58
|
temp_x_factor = (abs(overlap[0]) + self._minimum_gap) / overlap[0] if overlap[0] != 0 else 0 # find x move_factor, like (3.4 + 2) / 3.4 = 1.58
|
||||||
temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] != 0 else 0 # find y move_factor
|
temp_y_factor = (abs(overlap[1]) + self._minimum_gap) / overlap[1] if overlap[1] != 0 else 0 # find y move_factor
|
||||||
if abs(temp_x_factor) > abs(temp_y_factor):
|
|
||||||
temp_scale_factor = temp_x_factor
|
temp_scale_factor = temp_x_factor if abs(temp_x_factor) > abs(temp_y_factor) else temp_y_factor
|
||||||
else:
|
|
||||||
temp_scale_factor = temp_y_factor
|
|
||||||
|
|
||||||
move_vector = move_vector.set(x = move_vector.x + overlap[0] * temp_scale_factor,
|
move_vector = move_vector.set(x = move_vector.x + overlap[0] * temp_scale_factor,
|
||||||
z = move_vector.z + overlap[1] * temp_scale_factor)
|
z = move_vector.z + overlap[1] * temp_scale_factor)
|
||||||
@ -149,7 +145,7 @@ class PlatformPhysics:
|
|||||||
move_vector = temp_move_vector
|
move_vector = temp_move_vector
|
||||||
else:
|
else:
|
||||||
# This can happen in some cases if the object is not yet done with being loaded.
|
# This can happen in some cases if the object is not yet done with being loaded.
|
||||||
# Simply waiting for the next tick seems to resolve this correctly.
|
# Simply waiting for the next tick seems to resolve this correctly.
|
||||||
overlap = None
|
overlap = None
|
||||||
|
|
||||||
if not Vector.Null.equals(move_vector, epsilon = 1e-5):
|
if not Vector.Null.equals(move_vector, epsilon = 1e-5):
|
||||||
@ -181,4 +177,4 @@ class PlatformPhysics:
|
|||||||
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||||
|
|
||||||
self._enabled = True
|
self._enabled = True
|
||||||
self._onChangeTimerFinished(True)
|
self._onChangeTimerFinished()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user