Files
create/src/Base/Placement.pyi
2025-11-11 13:23:10 -05:00

242 lines
7.1 KiB
Python

# SPDX-License: LGPL-2.1-or-later
from __future__ import annotations
from Metadata import export, constmethod, class_declarations
from PyObjectBase import PyObjectBase
from Matrix import Matrix as MatrixPy
from Rotation import Rotation as RotationPy
from Vector import Vector
from typing import Sequence, overload
@export(
Constructor=True,
Delete=True,
NumberProtocol=True,
RichCompare=True,
)
@class_declarations(
"""public:
PlacementPy(const Placement & pla, PyTypeObject *T = &Type)
:PyObjectBase(new Placement(pla),T){}
Placement value() const
{ return *(getPlacementPtr()); }
"""
)
class Placement(PyObjectBase):
"""
Base.Placement class.
A Placement defines an orientation (rotation) and a position (base) in 3D space.
It is used when no scaling or other distortion is needed.
The following constructors are supported:
Placement()
Empty constructor.
Placement(placement)
Copy constructor.
placement : Base.Placement
Placement(matrix)
Define from a 4D matrix consisting of rotation and translation.
matrix : Base.Matrix
Placement(base, rotation)
Define from position and rotation.
base : Base.Vector
rotation : Base.Rotation
Placement(base, rotation, center)
Define from position and rotation with center.
base : Base.Vector
rotation : Base.Rotation
center : Base.Vector
Placement(base, axis, angle)
define position and rotation.
base : Base.Vector
axis : Base.Vector
angle : float
"""
Base: Vector = None
"""Vector to the Base Position of the Placement."""
Rotation: Vector = None
"""Orientation of the placement expressed as rotation."""
Matrix: MatrixPy = None
"""Set/get matrix representation of the placement."""
# fmt: off
@overload
def __init__(self) -> None: ...
@overload
def __init__(self, placement: "Placement") -> None: ...
@overload
def __init__(self, matrix: MatrixPy) -> None: ...
@overload
def __init__(self, base: Vector, rotation: RotationPy) -> None: ...
@overload
def __init__(self, base: Vector, rotation: RotationPy, center: Vector) -> None: ...
@overload
def __init__(self, base: Vector, axis: Vector, angle: float) -> None: ...
# fmt: on
@constmethod
def copy(self) -> "Placement":
"""
Returns a copy of this placement.
"""
...
def move(self, vector: Vector, /) -> None:
"""
Move the placement along a vector.
vector : Base.Vector
Vector by which to move the placement.
"""
...
def translate(self, vector: Vector, /) -> None:
"""
Alias to move(), to be compatible with TopoShape.translate().
vector : Base.Vector
Vector by which to move the placement.
"""
...
@overload
def rotate(
self, center: Sequence[float], axis: Sequence[float], angle: float, *, comp: bool = False
) -> None:
...
@overload
def rotate(self, center: Vector, axis: Vector, angle: float, *, comp: bool = False) -> None:
"""
Rotate the current placement around center and axis with the given angle.
This method is compatible with TopoShape.rotate() if the (optional) keyword
argument comp is True (default=False).
center : Base.Vector, sequence of float
Rotation center.
axis : Base.Vector, sequence of float
Rotation axis.
angle : float
Rotation angle in degrees.
comp : bool
optional keyword only argument, if True (default=False),
behave like TopoShape.rotate() (i.e. the resulting placements are interchangeable).
"""
def rotate(self, *args, **kwargs) -> None:
...
@constmethod
def multiply(self, placement: "Placement", /) -> "Placement":
"""
Right multiply this placement with another placement.
Also available as `*` operator.
placement : Base.Placement
Placement by which to multiply this placement.
"""
...
@constmethod
def multVec(self, vector: Vector, /) -> Vector:
"""
Compute the transformed vector using the placement.
vector : Base.Vector
Vector to be transformed.
"""
...
@constmethod
def toMatrix(self) -> MatrixPy:
"""
Compute the matrix representation of the placement.
"""
...
@constmethod
def inverse(self) -> "Placement":
"""
Compute the inverse placement.
"""
...
@constmethod
def pow(self, t: float, shorten: bool = True, /) -> "Placement":
"""
Raise this placement to real power using ScLERP interpolation.
Also available as `**` operator.
t : float
Real power.
shorten : bool
If True, ensures rotation quaternion is net positive to make
the path shorter.
"""
...
@constmethod
def sclerp(self, placement2: "Placement", t: float, shorten: bool = True, /) -> "Placement":
"""
Screw Linear Interpolation (ScLERP) between this placement and `placement2`.
Interpolation is a continuous motion along a helical path parametrized by `t`
made of equal transforms if discretized.
If quaternions of rotations of the two placements differ in sign, the interpolation
will take a long path.
placement2 : Base.Placement
t : float
Parameter of helical path. t=0 returns this placement, t=1 returns
`placement2`. t can also be outside of [0, 1] range for extrapolation.
shorten : bool
If True, the signs are harmonized before interpolation and the interpolation
takes the shorter path.
"""
...
@constmethod
def slerp(self, placement2: "Placement", t: float, /) -> "Placement":
"""
Spherical Linear Interpolation (SLERP) between this placement and `placement2`.
This function performs independent interpolation of rotation and movement.
Result of such interpolation might be not what application expects, thus this tool
might be considered for simple cases or for interpolating between small intervals.
For more complex cases you better use the advanced sclerp() function.
placement2 : Base.Placement
t : float
Parameter of the path. t=0 returns this placement, t=1 returns `placement2`.
"""
...
@constmethod
def isIdentity(self, tol: float = 0.0, /) -> bool:
"""
Returns True if the placement has no displacement and no rotation.
Matrix representation is the 4D identity matrix.
tol : float
Tolerance used to check for identity.
If tol is negative or zero, no tolerance is used.
"""
...
@constmethod
def isSame(self, other: "Placement", tol: float = 0.0, /) -> bool:
"""
Checks whether this and the given placement are the same.
The default tolerance is set to 0.0
"""
...