public override void Evaluate(int SpreadMax) { if (FInput.IsAnyInvalid()) { FOutput.FlushNil(); return; } bool doFlush = false; // is any Update slice checked? var anyUpdate = FUpdate.Any(); // Flush upstream changes through the plugin if (FInput.IsChanged) { FOutput.SliceCount = 0; FOutput.AssignFrom(FInput); // push change from upstream if valid doFlush = true; } else if (!anyUpdate) { return; // if no update and no change, no need to flush! } bool newData = FPins.Any(pinName => pinName.Value.ToISpread().IsChanged); // changed pins newData |= !FAutoSense[0]; // assume newData, if AutoSense is off. if (anyUpdate && newData) { int messageIndex = 0; foreach (var message in FInput) { if (FUpdate[messageIndex]) { doFlush |= CopyFromPins(message, messageIndex, FAutoSense[0]); } messageIndex++; } } if (doFlush) { FOutput.Flush(); } if (RemovePinsFirst) { RetryConfig(); } }
public void Evaluate(int SpreadMax) { if (!FInput.IsChanged && !FTopic.IsChanged && !(FUpdate.IsChanged && FUpdate.Any()) ) { return; } SpreadMax = FInput.IsAnyInvalid() ? 0 : FInput.SliceCount; for (int i = 0; i < SpreadMax; i++) { // double check if topic change needs to occur, because setting it will mark the message as dirty if (FUpdate[i] && !FInput[i].Topic.Equals(FTopic[i])) { FInput[i].Topic = FTopic[i]; } } FOutput.FlushResult(FInput); }
public virtual bool PinChanged() { return(FSet.Any(x => x == true) || FRemove.Any(x => x == true) || FInsert.Any(x => x == true)); //return FSet.IsChanged || FRemove.IsChanged || FInsert.IsChanged; }
public override bool PinChanged() { return(base.PinChanged() || FIncrement.Any(x => x == true)); }
public override void Evaluate(int SpreadMax) { if (RemovePinsFirst) { RetryConfig(); } SpreadMax = FSpreadCount.IsAnyInvalid() || FTopic.IsAnyInvalid() ? 0 : FSpreadCount[0]; SpreadMax = Math.Max(SpreadMax, 0); // safeguard against negative binsizes // Reset? var anyUpdate = ResetNecessary; var forceUpdate = !FAutoSense[0] || FAutoSense.IsChanged; var newData = FPins.Any(x => x.Value.ToISpread().IsChanged); // changed pins newData |= forceUpdate; // if update is forced, then predent it is new Data var newTopic = FTopic.IsChanged; newTopic |= forceUpdate; // if update is forced, then pretend it is a new Topic // remove superfluous entries if (SpreadMax < Keep.Count) { anyUpdate = true; Keep.RemoveRange(SpreadMax, Keep.Count - SpreadMax); } // add new entries for (int i = Keep.Count; i < SpreadMax; i++) { anyUpdate = true; // new entry in Keep will require data newData = true; newTopic = true; var message = new Message(Formular); message.Topic = FTopic[i]; Keep.Add(message); } // check update pin anyUpdate |= FUpdate.Any(); if (anyUpdate && (newData || newTopic)) { // ...and start filling messages int messageIndex = 0; foreach (var message in Keep) { // only copy, when Update is true for this message if (newData && FUpdate[messageIndex] && CopyFromPins(message, messageIndex, !forceUpdate)) { anyUpdate = true; } if (newTopic && FUpdate[messageIndex] && message.Topic != FTopic[messageIndex]) { message.Topic = FTopic[messageIndex]; anyUpdate = true; } messageIndex++; } } if (Keep.IsChanged) { UpKeep(anyUpdate); } else // no change, so make sure, none is reported { if (FChangeOut.SliceCount > 0) { FChangeOut.SliceCount = 0; FChangeIndexOut.SliceCount = 0; } } }
public override void Evaluate(int SpreadMax) { InitDX11Graph(); bool warnPinSafety = false; if (RemovePinsFirst) { warnPinSafety = !RetryConfig(); // defer PinConnectionException until end of method, if not successful } SpreadMax = FSpreadCount.IsAnyInvalid() || FTopic.IsAnyInvalid() ? 0 : FSpreadCount[0]; SpreadMax = Math.Max(SpreadMax, 0); // safeguard against negative binsizes // Reset? var anyUpdate = FResetNecessary; var forceUpdate = FForce[0] || FForce.IsChanged; var newData = FPins.Any(x => x.Value.ToISpread().IsChanged); // changed pins newData |= forceUpdate; // if update is forced, then predent it is new Data var newTopic = FTopic.IsChanged; newTopic |= forceUpdate; // if update is forced, then pretend it is a new Topic // remove superfluous entries if (SpreadMax < Keep.Count) { anyUpdate = true; Keep.RemoveRange(SpreadMax, Keep.Count - SpreadMax); } // add new entries for (int i = Keep.Count; i < SpreadMax; i++) { anyUpdate = true; // new entry in Keep will require data newData = true; newTopic = true; var message = new Message(Formular); message.Topic = FTopic[i]; Keep.Add(message); } // check update pin anyUpdate |= FUpdate.Any(); if (anyUpdate && (newData || newTopic)) { // ...and start filling messages int messageIndex = 0; foreach (var message in Keep) { // only copy, when Update is true for this message if (newData && FUpdate[messageIndex] && CopyFromPins(message, messageIndex, !forceUpdate)) { anyUpdate = true; } if (newTopic && FUpdate[messageIndex] && message.Topic != FTopic[messageIndex]) { message.Topic = FTopic[messageIndex]; anyUpdate = true; } messageIndex++; } } if (Keep.IsChanged || Keep.Any(m => m.HasRecentCommit(Keep))) { UpKeep(anyUpdate); } else // no change, so make sure, none is reported { if (FChangeOut.SliceCount > 0) { FChangeOut.FlushNil(); FChangeIndexOut.FlushNil(); } } if (warnPinSafety) { throw new PinConnectionException("Manually remove unneeded links first! [ConfigKeep]. ID = [" + PluginHost.GetNodePath(false) + "]"); } }
public override void Evaluate(int SpreadMax) { if (FInput.IsAnyInvalid()) { FOutput.FlushNil(); return; // if no input, no further calculation. } bool doFlush = false; // any of the update slices is true -> update the plugin. var anyUpdate = FUpdate.Any(); // Flush upstream changes through the plugin if (FInput.IsChanged) { FOutput.SliceCount = 0; FOutput.AssignFrom(FInput); doFlush = true; } else if (!anyUpdate) { return; } var keyCount = FKey.SliceCount; var ValueSpread = FValue.ToISpread(); bool newData = ValueSpread.IsChanged; // changed pin newData |= !FAutoSense[0]; // assume newData, if AutoSense is off. if (anyUpdate && newData) { SpreadMax = FInput.SliceCount; doFlush = true; for (int i = 0; i < SpreadMax; i++) { Message message = FInput[i]; var keyIndex = 0; foreach (var key in FKey) { var fieldIndex = i * keyCount + keyIndex; keyIndex++; if (!FUpdate[fieldIndex]) { continue; } if (!message.Fields.Contains(key)) { message[key] = BinFactory.New(TargetDynamicType); } var value = ValueSpread[fieldIndex] as ISpread; if (value.SliceCount > 0) { if (message[key].GetInnerType().IsAssignableFrom(TargetDynamicType)) { // check if any relevant change occurred if (!message[key].Equals(value as IEnumerable)) { message.AssignFrom(key, value); } } else { var casted = from slice in value as IEnumerable <object> let targetType = message[key].GetInnerType() select Convert.ChangeType(slice, targetType); if (!message[key].Equals(casted)) { message.AssignFrom(key, casted); } } } else { message[key].Clear(); } } } } if (doFlush) { FOutput.Flush(); } }
public override void Evaluate(int SpreadMax) { InitDX11Graph(); bool warnPinSafety = false; if (RemovePinsFirst) { warnPinSafety = RetryConfig(); } if (FInput.IsAnyInvalid()) { FOutput.FlushNil(); if (warnPinSafety) { throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]"); } return; } bool doFlush = false; // is any Update slice checked? var anyUpdate = FUpdate.Any(); // Flush upstream changes through the plugin if (FInput.IsChanged) { FOutput.SliceCount = 0; FOutput.AssignFrom(FInput); // push change from upstream if valid doFlush = true; } else if (!anyUpdate) { if (warnPinSafety) { throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]"); } return; // if no update and no change, no need to flush! } bool newData = FPins.Any(pinName => pinName.Value.ToISpread().IsChanged); // changed pins newData |= FForce[0]; // assume newData, if AutoSense is off. if (anyUpdate && newData) { int messageIndex = 0; foreach (var message in FInput) { if (FUpdate[messageIndex]) { doFlush |= CopyFromPins(message, messageIndex, !FForce[0]); } messageIndex++; } } if (doFlush) { FOutput.Flush(); } if (warnPinSafety) { throw new PinConnectionException("Manually remove unneeded links first! [Edit]. ID = [" + PluginHost.GetNodePath(false) + "]"); } }
public override void Evaluate(int SpreadMax) { InitDX11Graph(); if (FInput.IsAnyInvalid()) { FOutput.FlushNil(); return; // if no input, no further calculation. } bool doFlush = false; // any of the update slices is true -> update the plugin. var anyUpdate = FUpdate.Any(); // Flush upstream changes through the plugin if (FInput.IsChanged) { FOutput.SliceCount = 0; FOutput.AssignFrom(FInput); doFlush = true; } else if (!anyUpdate) { return; } var dataSpread = FValue.ToISpread(); bool newData = dataSpread.IsChanged; // changed pin newData |= FForce[0]; // assume newData, if AutoSense is off. if (anyUpdate && newData) { // Update and Force not included in spreading. SpreadMax = dataSpread.SliceCount.CombineWith(FKey).CombineWith(FInput); if (FUpdate.IsAnyInvalid() || FForce.IsAnyInvalid()) { SpreadMax = 0; } FIterations[0] = SpreadMax; doFlush = true; var fieldIndex = 0; for (int i = 0; i < SpreadMax; i++) // iterate spreaded (except update, which gets cut short) { Message message = FInput[i]; for (int j = 0; j < FKey[i].SliceCount; j++, fieldIndex++) // iterate all relevant fields for each message { if (!FUpdate[fieldIndex]) { continue; // update is per-field } var key = FKey[i][j]; var spread = dataSpread[fieldIndex] as ISpread; LazyInsert(message, key, spread); } } } if (doFlush) { FOutput.Flush(); } }
private void InputPinChanged(object _) { if (HandleIn != null && FEnabledIn != null && ModeIn != null) { int spreadMax = HandleIn.CombineWith(FEnabledIn).CombineWith(ModeIn); if (spreadMax > 0) { if (HandleIn.Any(i => i < 0)) //handle any window { if (FEnabledIn[0]) { foreach (var s in FWMService.Subclasses) { if (TryRegisterTouch(s, ModeIn[0])) { TouchEnabledWindows.Add(s); } } } else { var disabled = new List <Subclass>(); foreach (var s in TouchEnabledWindows) { if (TryUnregisterTouch(s)) { disabled.Add(s); } } foreach (var s in disabled) { TouchEnabledWindows.Remove(s); } } } else { var former = new HashSet <Subclass>(TouchEnabledWindows); TouchEnabledWindows.Clear(); for (int i = 0; i < spreadMax; i++) { var selected = FWMService.Subclasses.Where(s => s.HWnd.ToInt32() == HandleIn[i]).FirstOrDefault(); if (selected != null) { if (FEnabledIn[i]) { if (TryRegisterTouch(selected, ModeIn[i])) { TouchEnabledWindows.Add(selected); former.Remove(selected); } } } } foreach (var s in former) { if (!TryUnregisterTouch(s)) { TouchEnabledWindows.Add(s); } } } } } }