public void Rotate(SWMM.Point3D newPosition, SWMM.Point3D oldPosition) { var me = _rotationHandle as IMachineElement; var m = new SWMM.Matrix3D(_matrix.M11, _matrix.M12, _matrix.M13, _matrix.M14, _matrix.M21, _matrix.M22, _matrix.M23, _matrix.M24, _matrix.M31, _matrix.M32, _matrix.M33, _matrix.M34, _matrix.OffsetX, _matrix.OffsetY, _matrix.OffsetZ, _matrix.M44); m.Invert(); var p1 = m.Transform(oldPosition); var p2 = m.Transform(newPosition); var v1 = GetOrtoComponent(p1 - _rotationCenter, _rotationDirection); var v2 = GetOrtoComponent(p2 - _rotationCenter, _rotationDirection); var a = SWMM.Vector3D.AngleBetween(v1, v2); _rotationHandle.Rotate(a); }