Navigation
Navigate Navigate Navigate Navigate

IfcNormalise

Definition from ISO/CD 10303-42:1992: This function returns a vector or direction whose components are normalized to have a sum of squares of 1.0. The output is of the same type (Direction or Vector, with the same units) as the input argument. If the input argument is not defined or of zero length then the output vector is undefined.

NOTE  Corresponding STEP function: normalise. Please refer to ISO/IS 10303-42:1994, p.105 for the final definition of the formal standard. 

HISTORY  New function in IFC Release 1.5

EXPRESS specification:

FUNCTION IfcNormalise
  (Arg : IfcVectorOrDirection) 
    : IfcVectorOrDirection;
LOCAL
  Ndim : INTEGER;
  V    : IfcDirection
       := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]); 
  Vec  : IfcVector 
       := IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcVector (
            IfcRepresentationItem() || IfcGeometricRepresentationItem () || IfcDirection([1.,0.]), 1.);
  Mag  : REAL;
  Result : IfcVectorOrDirection
         := V;
END_LOCAL;

  IF NOT EXISTS (Arg) THEN
    RETURN (?);
  ELSE
    Ndim := Arg.Dim;
    IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(Arg) THEN
      BEGIN
V.DirectionRatios := Arg.Orientation.DirectionRatios;
        Vec.Magnitude := Arg.Magnitude;
Vec.Orientation := V;
        IF Arg.Magnitude = 0.0 THEN
          RETURN(?);
        ELSE
          Vec.Magnitude := 1.0;
        END_IF;
      END;
    ELSE
      V.DirectionRatios := Arg.DirectionRatios;
    END_IF;
    Mag := 0.0;
      REPEAT i := 1 TO Ndim;
        Mag := Mag + V.DirectionRatios[i]*V.DirectionRatios[i];
      END_REPEAT;
    IF Mag > 0.0 THEN
      Mag := SQRT(Mag);
      REPEAT i := 1 TO Ndim;
        V.DirectionRatios[i] := V.DirectionRatios[i]/Mag;
      END_REPEAT;
      IF 'IFCGEOMETRYRESOURCE.IFCVECTOR' IN TYPEOF(arg) THEN
        Vec.Orientation := V;
        Result := Vec;
      ELSE
        Result := V;
      END_IF;
    ELSE
      RETURN(?);
    END_IF;
  END_IF;
  RETURN (Result);
END_FUNCTION;