Exemple #1
0
        protected void SetData(Message message, int avoidNilIndex, string fieldName, ISpread output)
        {
            output.SliceCount = 0;
            if (!message.Fields.Contains(fieldName))
            {
                // is setting a default necessary?
                if (!FAvoidNilEnable.IsAnyInvalid() && FAvoidNilEnable[0])
                {
                    var avoidNil = FAvoidNil.ToISpread() as ISpread;
                    var results  = GetDefaults(avoidNil, avoidNilIndex).ToList();

                    output.SliceCount = results.Count;
                    for (int j = 0; j < results.Count; j++)
                    {
                        output[j] = results[j];
                    }
                }
            }
            else // copy from Message
            {
                var inputBin = message[fieldName];
                output.SliceCount = inputBin.Count;
                if (TargetDynamicType.IsAssignableFrom(inputBin.GetInnerType()))
                {
                    for (int j = 0; j < inputBin.Count; j++)
                    {
                        output[j] = inputBin[j];
                    }
                }
                else // will throw Exception, if Conversion is not possible
                {
                    for (int j = 0; j < inputBin.Count; j++)
                    {
                        output[j] = Convert.ChangeType(inputBin[j], TargetDynamicType, CultureInfo.InvariantCulture);
                    }
                }
            }
        }
        public override void Evaluate(int SpreadMax)
        {
            InitDX11Graph();

            if (!FInput.IsChanged && !FConfig.IsChanged && !FKey.IsChanged)
            {
                return;
            }

            SpreadMax = FInput.IsAnyInvalid() ? 0 : FInput.SliceCount;
            if (SpreadMax == 0)
            {
                if (FOutput.SliceCount > 0) // zero inputs -> zero outputs.
                {
                    FOutput.FlushNil();
                    FBinSize.SliceCount = 1;
                    FBinSize[0]         = 0;
                    FBinSize.Flush();
                    FValue.ToISpread().FlushNil();
                    return;
                }
                else
                {
                    return;  // already zero'ed
                }
            }
            FOutput.FlushResult(FInput);

            var keyCount = FKey.SliceCount;

            FBinSize.SliceCount = SpreadMax;

            var input = FValue.ToISpread();

            input.SliceCount = SpreadMax * keyCount;

            for (int i = 0; i < SpreadMax; i++)
            {
                Message message = FInput[i];

                var count = 0;
                var index = 0;
                foreach (var key in FKey)
                {
                    var output = (input[i * keyCount + index] as ISpread);

                    output.SliceCount = 0;
                    if (message.Fields.Contains(key))
                    {
                        var inputBin = message[key];
                        if (TargetDynamicType.IsAssignableFrom(inputBin.GetInnerType()))
                        {
                            output.SliceCount = inputBin.Count;
                            for (int j = 0; j < inputBin.Count; j++)
                            {
                                output[j] = inputBin[j];
                            }
                        }
                        else // will throw Exception, if Conversion is not possible
                        {
                            output.SliceCount = inputBin.Count;
                            for (int j = 0; j < inputBin.Count; j++)
                            {
                                output[j] = Convert.ChangeType(inputBin[j], TargetDynamicType, CultureInfo.InvariantCulture);
                            }
                        }
                    }
                    count += output.SliceCount;
                    index++;  // next field within Message
                }
                FBinSize[i] = count;
            }

            input.Flush();
            FBinSize.Flush();
        }