from Vector import Vector from Metadata import export, constmethod, class_declarations, no_args from PyObjectBase import PyObjectBase from enum import IntEnum from typing import overload, Union, Tuple, Sequence class ScaleType(IntEnum): Other = -1 NoScaling = 0 NonUniformRight = 1 NonUniformLeft = 2 Uniform = 3 @export( TwinPointer="Matrix4D", Constructor=True, Delete=True, NumberProtocol=True, RichCompare=True, ) @class_declarations( """public: MatrixPy(const Matrix4D & mat, PyTypeObject *T = &Type) :PyObjectBase(new Matrix4D(mat),T){} Matrix4D value() const { return *(getMatrixPtr()); } """ ) class Matrix(PyObjectBase): """ Base.Matrix class. A 4x4 Matrix. In particular, this matrix can represent an affine transformation, that is, given a 3D vector `x`, apply the transformation y = M*x + b, where the matrix `M` is a linear map and the vector `b` is a translation. `y` can be obtained using a linear transformation represented by the 4x4 matrix `A` conformed by the augmented 3x4 matrix (M|b), augmented by row with (0,0,0,1), therefore: (y, 1) = A*(x, 1). The following constructors are supported: Matrix() Empty constructor. Matrix(matrix) Copy constructor. matrix : Base.Matrix. Matrix(*coef) Define from 16 coefficients of the 4x4 matrix. coef : sequence of float The sequence can have up to 16 elements which complete the matrix by rows. Matrix(vector1, vector2, vector3, vector4) Define from four 3D vectors which represent the columns of the 3x4 submatrix, useful to represent an affine transformation. The fourth row is made up by (0,0,0,1). vector1 : Base.Vector vector2 : Base.Vector vector3 : Base.Vector vector4 : Base.Vector Default to (0,0,0). Optional. Author: Juergen Riegel (FreeCAD@juergen-riegel.net) Licence: LGPL """ A11: float = 0.0 """The (1,1) matrix element.""" A12: float = 0.0 """The (1,2) matrix element.""" A13: float = 0.0 """The (1,3) matrix element.""" A14: float = 0.0 """The (1,4) matrix element.""" A21: float = 0.0 """The (2,1) matrix element.""" A22: float = 0.0 """The (2,2) matrix element.""" A23: float = 0.0 """The (2,3) matrix element.""" A24: float = 0.0 """The (2,4) matrix element.""" A31: float = 0.0 """The (3,1) matrix element.""" A32: float = 0.0 """The (3,2) matrix element.""" A33: float = 0.0 """The (3,3) matrix element.""" A34: float = 0.0 """The (3,4) matrix element.""" A41: float = 0.0 """The (4,1) matrix element.""" A42: float = 0.0 """The (4,2) matrix element.""" A43: float = 0.0 """The (4,3) matrix element.""" A44: float = 0.0 """The (4,4) matrix element.""" A: Sequence[float] = [] """The matrix elements.""" @overload def move(self, vector: Vector) -> None: ... @overload def move(self, x: float, y: float, z: float) -> None: ... def move(self, *args) -> None: """ move(vector) -> None move(x, y, z) -> None Move the matrix along a vector, equivalent to left multiply the matrix by a pure translation transformation. vector : Base.Vector, tuple x : float `x` translation. y : float `y` translation. z : float `z` translation. """ ... @overload def scale(self, vector: Vector) -> None: ... @overload def scale(self, x: float, y: float, z: float) -> None: ... @overload def scale(self, factor: float) -> None: ... def scale(self, *args) -> None: """ scale(vector) -> None scale(x, y, z) -> None scale(factor) -> None Scale the first three rows of the matrix. vector : Base.Vector x : float First row factor scale. y : float Second row factor scale. z : float Third row factor scale. factor : float global factor scale. """ ... @constmethod def hasScale(self, tol: float = 0) -> ScaleType: """ hasScale(tol=0) -> ScaleType Return an enum value of ScaleType. Possible values are: Uniform, NonUniformLeft, NonUniformRight, NoScaling or Other if it's not a scale matrix. tol : float """ ... @constmethod def decompose(self) -> Tuple["Matrix", "Matrix", "Matrix", "Matrix"]: """ decompose() -> Base.Matrix, Base.Matrix, Base.Matrix, Base.Matrix Return a tuple of matrices representing shear, scale, rotation and move. So that matrix = move * rotation * scale * shear. """ ... @no_args def nullify(self) -> None: """ nullify() -> None Make this the null matrix. """ ... @no_args @constmethod def isNull(self) -> bool: """ isNull() -> bool Check if this is the null matrix. """ ... @no_args def unity(self) -> None: """ unity() -> None Make this matrix to unity (4D identity matrix). """ ... @constmethod def isUnity(self, tol: float = 0.0) -> bool: """ isUnity([tol=0.0]) -> bool Check if this is the unit matrix (4D identity matrix). """ ... def transform(self, vector: Vector, matrix2: "Matrix") -> None: """ transform(vector, matrix2) -> None Transform the matrix around a given point. Equivalent to left multiply the matrix by T*M*T_inv, where M is `matrix2`, T the translation generated by `vector` and T_inv the inverse translation. For example, if `matrix2` is a rotation, the result is the transformation generated by the current matrix followed by a rotation around the point represented by `vector`. vector : Base.Vector matrix2 : Base.Matrix """ ... @constmethod def col(self, index: int) -> Vector: """ col(index) -> Base.Vector Return the vector of a column, that is, the vector generated by the three first elements of the specified column. index : int Required column index. """ ... def setCol(self, index: int, vector: Vector) -> None: """ setCol(index, vector) -> None Set the vector of a column, that is, the three first elements of the specified column by index. index : int Required column index. vector : Base.Vector """ ... @constmethod def row(self, index: int) -> Vector: """ row(index) -> Base.Vector Return the vector of a row, that is, the vector generated by the three first elements of the specified row. index : int Required row index. """ ... def setRow(self, index: int, vector: Vector) -> None: """ setRow(index, vector) -> None Set the vector of a row, that is, the three first elements of the specified row by index. index : int Required row index. vector : Base.Vector """ ... @no_args @constmethod def diagonal(self) -> Vector: """ diagonal() -> Base.Vector Return the diagonal of the 3x3 leading principal submatrix as vector. """ ... def setDiagonal(self, vector: Vector) -> None: """ setDiagonal(vector) -> None Set the diagonal of the 3x3 leading principal submatrix. vector : Base.Vector """ ... def rotateX(self, angle: float) -> None: """ rotateX(angle) -> None Rotate around X axis. angle : float Angle in radians. """ ... def rotateY(self, angle: float) -> None: """ rotateY(angle) -> None Rotate around Y axis. angle : float Angle in radians. """ ... def rotateZ(self, angle: float) -> None: """ rotateZ(angle) -> None Rotate around Z axis. angle : float Angle in radians. """ ... @overload def multiply(self, matrix: "Matrix") -> "Matrix": ... @overload def multiply(self, vector: Vector) -> Vector: ... @constmethod def multiply(self, obj: Union["Matrix", Vector]) -> Union["Matrix", Vector]: """ multiply(matrix) -> Base.Matrix multiply(vector) -> Base.Vector Right multiply the matrix by the given object. If the argument is a vector, this is augmented to the 4D vector (`vector`, 1). matrix : Base.Matrix vector : Base.Vector """ ... @constmethod def multVec(self, vector: Vector) -> Vector: """ multVec(vector) -> Base.Vector Compute the transformed vector using the matrix. vector : Base.Vector """ ... @no_args def invert(self) -> None: """ invert() -> None Compute the inverse matrix in-place, if possible. """ ... @no_args @constmethod def inverse(self) -> "Matrix": """ inverse() -> Base.Matrix Compute the inverse matrix, if possible. """ ... @no_args def transpose(self) -> None: """ transpose() -> None Transpose the matrix in-place. """ ... @no_args @constmethod def transposed(self) -> "Matrix": """ transposed() -> Base.Matrix Returns a transposed copy of this matrix. """ ... @no_args @constmethod def determinant(self) -> float: """ determinant() -> float Compute the determinant of the matrix. """ ... @constmethod def isOrthogonal(self, tol: float = 1e-6) -> float: """ isOrthogonal(tol=1e-6) -> float Checks if the matrix is orthogonal, i.e. M * M^T = k*I and returns the multiple of the identity matrix. If it's not orthogonal 0 is returned. tol : float Tolerance used to check orthogonality. """ ... @constmethod def submatrix(self, dim: int) -> "Matrix": """ submatrix(dim) -> Base.Matrix Get the leading principal submatrix of the given dimension. The (4 - `dim`) remaining dimensions are completed with the corresponding identity matrix. dim : int Dimension parameter must be in the range [1,4]. """ ... @no_args @constmethod def analyze(self) -> str: """ analyze() -> str Analyzes the type of transformation. """ ...