mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-23 22:54:01 -06:00
Added 'align selected face with buildplate' feature.
Alt-click to select a face. See the (identically named) 'feature_bottom_face' branch in Uranium for more indepth information.
This commit is contained in:
parent
243d51eb23
commit
b97015a354
5 changed files with 55 additions and 2 deletions
|
@ -7,11 +7,13 @@ from typing import List, cast
|
|||
|
||||
from UM.Event import CallFunctionEvent
|
||||
from UM.FlameProfiler import pyqtSlot
|
||||
from UM.Math.Quaternion import Quaternion
|
||||
from UM.Math.Vector import Vector
|
||||
from UM.Scene.Selection import Selection
|
||||
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
|
||||
from UM.Operations.GroupedOperation import GroupedOperation
|
||||
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
|
||||
from UM.Operations.RotateOperation import RotateOperation
|
||||
from UM.Operations.TranslateOperation import TranslateOperation
|
||||
|
||||
import cura.CuraApplication
|
||||
|
@ -73,6 +75,36 @@ class CuraActions(QObject):
|
|||
operation.addOperation(center_operation)
|
||||
operation.push()
|
||||
|
||||
# Rotate the selection, so that the face that the mouse-pointer is on, faces the build-plate.
|
||||
@pyqtSlot()
|
||||
def bottomFaceSelection(self) -> None:
|
||||
selected_face = Selection.getSelectedFace()
|
||||
if not selected_face:
|
||||
Logger.log("e", "Bottom face operation shouldn't have been called without a selected face.")
|
||||
return
|
||||
|
||||
original_node, face_id = selected_face
|
||||
meshdata = original_node.getMeshDataTransformed()
|
||||
if not meshdata or face_id < 0 or face_id > 0x10001:
|
||||
return
|
||||
|
||||
rotation_point, face_normal = meshdata.getFacePlane(face_id)
|
||||
rotation_point_vector = Vector(rotation_point[0], rotation_point[1], rotation_point[2])
|
||||
face_normal_vector = Vector(face_normal[0], face_normal[1], face_normal[2])
|
||||
rotation_quaternion = Quaternion.rotationTo(face_normal_vector.normalized(), Vector(0.0, -1.0, 0.0))
|
||||
|
||||
operation = GroupedOperation()
|
||||
for node in Selection.getAllSelectedObjects():
|
||||
current_node = node
|
||||
parent_node = current_node.getParent()
|
||||
while parent_node and parent_node.callDecoration("isGroup"):
|
||||
current_node = parent_node
|
||||
parent_node = current_node.getParent()
|
||||
|
||||
rotate_operation = RotateOperation(current_node, rotation_quaternion, rotation_point_vector)
|
||||
operation.addOperation(rotate_operation)
|
||||
operation.push()
|
||||
|
||||
## Multiply all objects in the selection
|
||||
#
|
||||
# \param count The number of times to multiply the selection.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue