8.9.6.15 IfcNormalise
8.9.6.15.1 Semantic definition
8.9.6.15.2 Formal representation
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 IF 'IFC4X3_DEV_738df036.IFCVECTOR' IN TYPEOF(Arg) THEN BEGIN Ndim := Arg\IfcVector.Dim; V.DirectionRatios := Arg\IfcVector.Orientation.DirectionRatios; Vec.Magnitude := Arg\IfcVector.Magnitude; Vec.Orientation := V; IF Arg\IfcVector.Magnitude = 0.0 THEN RETURN(?); ELSE Vec.Magnitude := 1.0; END_IF; END; ELSE BEGIN Ndim := Arg\IfcDirection.Dim; V.DirectionRatios := Arg\IfcDirection.DirectionRatios; END; 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 'IFC4X3_DEV_738df036.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;