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(); }