FUNCTION convert_spatial_to_ypr_rotation

(* SCHEMA step_merged_ap_schema; *)
-- DIFF IN AP214
-- CASE DIFF IN AP238 STEP-NC
-- IN AP214/AP238 STEP-NC/AP242
FUNCTION convert_spatial_to_ypr_rotation
      (pair : kinematic_pair;
       rotation : spatial_rotation ) : ypr_rotation;
   LOCAL
      axis : direction;
      angle : plane_angle_measure;
      conv_angle : plane_angle_measure;
      ya : plane_angle_measure;
      pa : plane_angle_measure;
      ra : plane_angle_measure;
      ucf : REAL;
      dx : REAL;
      dy : REAL;
      dz : REAL;
      s_a : REAL;
      c_a : REAL;
      rotmat : ARRAY [1:3] OF ARRAY [1:3] OF REAL;
      cm1 : REAL;
      s_y : REAL;
      c_y : REAL;
      s_r : REAL;
      c_r : REAL;
   END_LOCAL;
      IF 'STEP_MERGED_AP_SCHEMA.YPR_ROTATION' IN TYPEOF(rotation) THEN
         RETURN (rotation);
      END_IF;
      axis := normalise(rotation\rotation_about_direction.direction_of_axis);
      angle := rotation\rotation_about_direction.rotation_angle;
      IF angle = 0.0 THEN
         RETURN ([ 0.0, 0.0, 0.0 ]);
      END_IF;
      dx := axis.direction_ratios[1];
      dy := axis.direction_ratios[2];
      dz := axis.direction_ratios[3];
      conv_angle := plane_angle_for_pair_in_radian(pair, angle);
      IF NOT ('STEP_MERGED_AP_SCHEMA.PLANE_ANGLE_MEASURE' IN TYPEOF(conv_angle)) THEN
         RETURN (?);
      END_IF;
      ucf := angle / conv_angle;
      s_a := SIN(conv_angle);
      c_a := COS(conv_angle);
      IF (dy = 0.0) AND (dx * dz = 0.0) THEN
         REPEAT WHILE conv_angle <= -3.14159;
            conv_angle := conv_angle + 2.0 * 3.14159;
         END_REPEAT;
         REPEAT WHILE conv_angle > 3.14159;
            conv_angle := conv_angle - 2.0 * 3.14159;
         END_REPEAT;
         ya := ucf * conv_angle;
         IF conv_angle <> 3.14159 THEN
            ra := -ya;
         ELSE
            ra := ya;
         END_IF;
         IF dx <> 0.0 THEN
            IF dx > 0.0 THEN
               RETURN ([ 0.0, 0.0, ya ]);
            ELSE
               RETURN ([ 0.0, 0.0, ra ]);
            END_IF;
         ELSE
            IF dz > 0.0 THEN
               RETURN ([ ya, 0.0, 0.0 ]);
            ELSE
               RETURN ([ ra, 0.0, 0.0 ]);
            END_IF;
         END_IF;
      END_IF;
      IF ((dy <> 0.0) AND (dx = 0.0)) AND (dz = 0.0) THEN
         IF c_a >= 0.0 THEN
            ya := 0.0;
            ra := 0.0;
         ELSE
            ya := ucf * 3.14159;
            ra := ya;
         END_IF;
         pa := ucf * ATAN(s_a, ABS(c_a));
         IF dy < 0.0 THEN
            pa := -pa;
         END_IF;
         RETURN ([ ya, pa, ra ]);
      END_IF;
      cm1 := 1.0 - c_a;
      rotmat := [ [ dx * dx * cm1 + c_a, dx * dy * cm1 - dz * s_a, dx * dz * cm1 + dy * s_a ], [ dx * dy * cm1 + dz * s_a, dy * dy * cm1 + c_a, dy * dz * cm1 - dx * s_a ], [ dx * dz * cm1 - dy * s_a, dy * dz * cm1 + dx * s_a, dz * dz * cm1 + c_a ] ];
      IF ABS(rotmat[1][3]) = 1.0 THEN
         BEGIN
            IF rotmat[1][3] = 1.0 THEN
               pa := 0.500000 * 3.14159;
            ELSE
               pa := -0.500000 * 3.14159;
            END_IF;
            ra := 0.0;
            ya := ATAN(rotmat[2][1], rotmat[2][2]);
            IF rotmat[2][2] < 0.0 THEN
               IF ya <= 0.0 THEN
                  ya := ya + 3.14159;
               ELSE
                  ya := ya - 3.14159;
               END_IF;
            END_IF;
         END;
      ELSE
         BEGIN
            ya := ATAN(-rotmat[1][2], rotmat[1][1]);
            IF rotmat[1][1] < 0.0 THEN
               IF ya <= 0.0 THEN
                  ya := ya + 3.14159;
               ELSE
                  ya := ya - 3.14159;
               END_IF;
            END_IF;
            ra := ATAN(-rotmat[2][3], rotmat[3][3]);
            IF rotmat[3][3] < 0.0 THEN
               IF ra <= 0.0 THEN
                  ra := ra + 3.14159;
               ELSE
                  ra := ra - 3.14159;
               END_IF;
            END_IF;
            s_y := SIN(ya);
            c_y := COS(ya);
            s_r := SIN(ra);
            c_r := COS(ra);
            IF ((ABS(s_y) > ABS(c_y)) AND (ABS(s_y) > ABS(s_r))) AND (ABS(s_y) > ABS(c_r)) THEN
               cm1 := -rotmat[1][2] / s_y;
            ELSE
               IF (ABS(c_y) > ABS(s_r)) AND (ABS(c_y) > ABS(c_r)) THEN
                  cm1 := rotmat[1][1] / c_y;
               ELSE
                  IF ABS(s_r) > ABS(c_r) THEN
                     cm1 := -rotmat[2][3] / s_r;
                  ELSE
                     cm1 := rotmat[3][3] / c_r;
                  END_IF;
               END_IF;
            END_IF;
            pa := ATAN(rotmat[1][3], cm1);
         END;
      END_IF;
      ya := ya * ucf;
      pa := pa * ucf;
      ra := ra * ucf;
      RETURN ([ ya, pa, ra ]);
END_FUNCTION;

Referenced By

Defintion convert_spatial_to_ypr_rotation is references by the following definitions:
DefinitionType
 point_on_planar_curve_pair_value ENTITY
 point_on_surface_pair_value ENTITY
 spherical_pair_value ENTITY


[Top Level Definitions] [Exit]

Generated by STEP Tools® EXPRESS to HTML Converter
2020-07-28T17:02:20-04:00