mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-13 08:48:58 +08:00
Use a decorator to track Z offset
This makes it much easier to correct for Z offset after operations CURA-196 #Ready-for-Review
This commit is contained in:
parent
d0b5fe84b8
commit
07c9ecc931
@ -37,6 +37,7 @@ from . import CameraAnimation
|
|||||||
from . import PrintInformation
|
from . import PrintInformation
|
||||||
from . import CuraActions
|
from . import CuraActions
|
||||||
from . import MultiMaterialDecorator
|
from . import MultiMaterialDecorator
|
||||||
|
from . import ZOffsetDecorator
|
||||||
|
|
||||||
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
from PyQt5.QtCore import pyqtSlot, QUrl, Qt, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS
|
||||||
from PyQt5.QtGui import QColor, QIcon
|
from PyQt5.QtGui import QColor, QIcon
|
||||||
@ -342,14 +343,12 @@ class CuraApplication(QtApplication):
|
|||||||
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)
|
||||||
|
|
||||||
nodes.append(node)
|
nodes.append(node)
|
||||||
|
|
||||||
if nodes:
|
if nodes:
|
||||||
op = GroupedOperation()
|
op = GroupedOperation()
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
# Ensure that the object is above the build platform
|
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||||
move_distance = node.getBoundingBox().center.y
|
op.addOperation(SetTransformOperation(node, Vector(0,0,0)))
|
||||||
if move_distance <= 0:
|
|
||||||
move_distance = -node.getBoundingBox().bottom
|
|
||||||
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0)))
|
|
||||||
|
|
||||||
op.push()
|
op.push()
|
||||||
|
|
||||||
@ -371,10 +370,8 @@ class CuraApplication(QtApplication):
|
|||||||
|
|
||||||
for node in nodes:
|
for node in nodes:
|
||||||
# Ensure that the object is above the build platform
|
# Ensure that the object is above the build platform
|
||||||
move_distance = node.getBoundingBox().center.y
|
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||||
if move_distance <= 0:
|
op.addOperation(SetTransformOperation(node, Vector(0,0,0), Quaternion(), Vector(1, 1, 1)))
|
||||||
move_distance = -node.getBoundingBox().bottom
|
|
||||||
op.addOperation(SetTransformOperation(node, Vector(0,move_distance,0), Quaternion(), Vector(1, 1, 1)))
|
|
||||||
|
|
||||||
op.push()
|
op.push()
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from cura.ConvexHullDecorator import ConvexHullDecorator
|
|||||||
|
|
||||||
from . import PlatformPhysicsOperation
|
from . import PlatformPhysicsOperation
|
||||||
from . import ConvexHullJob
|
from . import ConvexHullJob
|
||||||
|
from . import ZOffsetDecorator
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import threading
|
import threading
|
||||||
@ -69,8 +70,12 @@ class PlatformPhysics:
|
|||||||
# Move it downwards if bottom is above platform
|
# Move it downwards if bottom is above platform
|
||||||
move_vector = Vector()
|
move_vector = Vector()
|
||||||
if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down
|
if not (node.getParent() and node.getParent().callDecoration("isGroup")): #If an object is grouped, don't move it down
|
||||||
|
z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0
|
||||||
if bbox.bottom > 0:
|
if bbox.bottom > 0:
|
||||||
move_vector.setY(-bbox.bottom)
|
move_vector.setY(-bbox.bottom + z_offset)
|
||||||
|
elif bbox.bottom < z_offset:
|
||||||
|
move_vector.setY((-bbox.bottom) - z_offset)
|
||||||
|
|
||||||
#if not Float.fuzzyCompare(bbox.bottom, 0.0):
|
#if not Float.fuzzyCompare(bbox.bottom, 0.0):
|
||||||
# pass#move_vector.setY(-bbox.bottom)
|
# pass#move_vector.setY(-bbox.bottom)
|
||||||
|
|
||||||
@ -149,5 +154,16 @@ class PlatformPhysics:
|
|||||||
self._enabled = False
|
self._enabled = False
|
||||||
|
|
||||||
def _onToolOperationStopped(self, tool):
|
def _onToolOperationStopped(self, tool):
|
||||||
|
if tool.getPluginId() == "TranslateTool":
|
||||||
|
for node in Selection.getAllSelectedObjects():
|
||||||
|
if node.getBoundingBox().bottom < 0:
|
||||||
|
if not node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
|
||||||
|
node.addDecorator(ZOffsetDecorator.ZOffsetDecorator())
|
||||||
|
|
||||||
|
node.callDecoration("setZOffset", node.getBoundingBox().bottom)
|
||||||
|
else:
|
||||||
|
if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator):
|
||||||
|
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
|
||||||
|
|
||||||
self._enabled = True
|
self._enabled = True
|
||||||
self._onChangeTimerFinished()
|
self._onChangeTimerFinished()
|
||||||
|
13
cura/ZOffsetDecorator.py
Normal file
13
cura/ZOffsetDecorator.py
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
|
||||||
|
|
||||||
|
## A decorator that stores the amount an object has been moved below the platform.
|
||||||
|
class ZOffsetDecorator(SceneNodeDecorator):
|
||||||
|
def __init__(self):
|
||||||
|
self._z_offset = 0
|
||||||
|
|
||||||
|
def setZOffset(self, offset):
|
||||||
|
print("setZOffset", offset)
|
||||||
|
self._z_offset = offset
|
||||||
|
|
||||||
|
def getZOffset(self):
|
||||||
|
return self._z_offset
|
Loading…
x
Reference in New Issue
Block a user