Table of Contents

Class EulerUtil

Namespace
Hi.NcParsers.NcWriteback
Assembly
HiMech.dll

Decomposes a rotation matrix into euler angles for a configurable EulerSequence (default Zxz, the Fanuc G68.2 standard format) such that new Mat4d(third, θ3) * new Mat4d(second, θ2) * new Mat4d(first, θ1) reproduces the input — for ZXZ this is the exact composition IsoG68p2TiltSyntax performs when parsing G68.2 X_ Y_ Z_ I_ J_ K_, so a synthesized command round-trips to the same ProgramToMcTransform tilt entry.

The sequence is configurable because real controllers interpret tilted plane commands with controller-dependent conventions (Fanuc G68.2 P formats, Siemens CYCLE800, Heidenhain PLANE SPATIAL); pick the sequence the target controller expects. Note the replaying parse side (IsoG68p2TiltSyntax) currently reads ZXZ only — in-project replay parity holds for the ZXZ default.

Implementation: the input is conjugated by a signed axis-permutation rotation into the family's canonical frame (ZXZ for proper-euler sequences, XYZ for Tait-Bryan), decomposed analytically there (with the gimbal branches), and mapped back; every result is verified by recomposition before reporting success.

public static class EulerUtil
Inheritance
EulerUtil
Inherited Members

Methods

Compose(EulerSequence, double, double, double)

Composes euler angles (degrees) for sequence into a rotation matrix: R(Third, third)·R(Second, second)·R(First, first), the same primitive-call shape as the G68.2 parse side.

public static Mat4d Compose(EulerSequence sequence, double firstDeg, double secondDeg, double thirdDeg)

Parameters

sequence EulerSequence
firstDeg double
secondDeg double
thirdDeg double

Returns

Mat4d

Compose(double, double, double)

Composes ZXZ euler angles (degrees) into a rotation matrix using the same primitive calls as the G68.2 parse side.

public static Mat4d Compose(double iDeg, double jDeg, double kDeg)

Parameters

iDeg double
jDeg double
kDeg double

Returns

Mat4d

TryDecompose(Mat4d, EulerSequence, out double, out double, out double, double)

Tries to decompose the rotation part of rotation into euler angles (degrees) for sequence. Returns false when the input is not a proper rotation (recomposition check fails beyond tolerance); the out values are still the best attempt.

public static bool TryDecompose(Mat4d rotation, EulerSequence sequence, out double firstDeg, out double secondDeg, out double thirdDeg, double tolerance = 1E-09)

Parameters

rotation Mat4d

Source matrix; only the rotation rows are read.

sequence EulerSequence

Rotation sequence to decompose into.

firstDeg double

Angle of the first applied rotation, degrees.

secondDeg double

Angle of the second applied rotation, degrees; in [0, 180] for proper-euler sequences, [-90, 90] for Tait-Bryan sequences.

thirdDeg double

Angle of the third applied rotation, degrees.

tolerance double

Max absolute element error allowed by the recomposition check.

Returns

bool

TryDecompose(Mat4d, out double, out double, out double, double)

Tries to decompose the rotation part of rotation into ZXZ euler angles in degrees (the G68.2 standard format I/J/K). Returns false when the input is not a proper rotation (recomposition check fails beyond tolerance); the out values are still the best attempt.

public static bool TryDecompose(Mat4d rotation, out double iDeg, out double jDeg, out double kDeg, double tolerance = 1E-09)

Parameters

rotation Mat4d

Source matrix; only the rotation rows are read.

iDeg double

First rotation about Z, degrees.

jDeg double

Second rotation about (rotated) X, degrees; in [0, 180].

kDeg double

Third rotation about (rotated) Z, degrees.

tolerance double

Max absolute element error allowed by the recomposition check.

Returns

bool