public override TimeRecord<Vector3d<double>> GetRecordAt(ITime2 at, List<string> eventArgMessages)
        {
            if (at.DurationInDays > 0)
                throw new Exception();

            var vs = _engineProxy.GetComponent1Values(at.StampAsModifiedJulianDay, _link.ID);

            var record = ToTimeRecord(at, vs, _missingValue);

            _cache.Add(record);

            if (_cache.Count > 0)
                ((Utilities.Standard1.DummyComponent1Target)_link.TargetComponent).EarliestInputTime
                    = new Utilities.Standard1.TimeStamp(_cache[0].Time.StampAsModifiedJulianDay);

            return base.GetRecordAt(at, eventArgMessages);
        }
        static TimeRecord<Vector3d<double>> ToTimeRecord(ITime2 time2, IValueSet vs, Vector3d<double> missingValue)
        {
            var vectorSet = vs as IVectorSet;

            if (vectorSet == null)
                throw new Exception("Scalar set should be using ValueSetConverterTimeEngineDoubleStandard1");

            var values = new Vector3d<double>[vectorSet.Count];

            for (int n = 0; n < vectorSet.Count; ++n)
            {
                if (vectorSet.IsValid(n))
                {
                    var vector = vectorSet.GetVector(n);

                    values[n] = new Vector3d<double>(
                        vector.XComponent,
                        vector.YComponent,
                        vector.ZComponent);
                }
                else
                    values[n] = missingValue;
            }

            return new TimeRecord<Vector3d<double>>(time2, values);
        }
        static TimeRecord<double> ToTimeRecord(ITime2 time2, IValueSet vs, double missingValue)
        {
            var scalarSet = vs as IScalarSet;

            if (scalarSet == null)
                throw new Exception("Vector set should be using ValueSetConverterTimeEngineDoubleVector3dStandard1");

            var values = new double[scalarSet.Count];

            for (int n = 0; n < scalarSet.Count; ++n)
                values[n] = scalarSet.IsValid(n)
                    ? scalarSet.GetScalar(n)
                    : missingValue;

            return new TimeRecord<double>(time2, values);
        }