private void ResolveScriptNodeConnections(IEnumerable <CNode> nodes, Dictionary <CNode, CScriptNodeViewmodel> nodeToViewModel) { foreach (CNode graphNode in nodes) { CScriptNodeViewmodel sourceViewModel = nodeToViewModel[graphNode]; for (int i = 0; i < graphNode.OutExecutionPins.Count; i++) { CExecutionPin inExecutionPin = graphNode.OutExecutionPins[i]; if (inExecutionPin.TargetNode == null) { continue; } CScriptNodeViewmodel targetViewModel = nodeToViewModel[inExecutionPin.TargetNode]; if (targetViewModel.InExecutionPins.Count > 0) { CNodeConnectionViewModel newConnection = new CNodeConnectionViewModel(sourceViewModel.OutExecutionPins[i], targetViewModel.InExecutionPins[inExecutionPin.TargetPinIndex], this); newConnection.Connect(); } else { inExecutionPin.TargetNode = null; LogUtility.Log("[ScriptLoadError] node {0} tried to connect to {1} but the target does not have an in execution pin", sourceViewModel.Name, targetViewModel.Name); } } for (int i = 0; i < graphNode.InputPins.Count; i++) { CInputPin inputPin = graphNode.InputPins[i]; if (inputPin.SourceNode == null) { continue; } CScriptNodeViewmodel inputSourceVm = nodeToViewModel[inputPin.SourceNode]; if (inputSourceVm.OutputPins.Count > inputPin.SourceParameterIndex) { COutputPinViewModel sourcePinVM = inputSourceVm.OutputPins[inputPin.SourceParameterIndex]; if (inputPin.Type.IsAssignableFrom(sourcePinVM.ValueType)) { CNodeConnectionViewModel newConnection = new CNodeConnectionViewModel(sourcePinVM, sourceViewModel.InputPins[i], this); newConnection.Connect(); } else { inputPin.SourceNode = null; inputPin.SourceParameterIndex = -1; LogUtility.Log("[ScriptLoadWarning] Node {0} tried to connect to {1} at output pin index {2} but the pin types are not compatible, connection removed", sourceViewModel.Name, inputSourceVm.Name, inputPin.SourceParameterIndex); } } else { inputPin.SourceNode = null; inputPin.SourceParameterIndex = -1; LogUtility.Log("[ScriptLoadError] node {0} tried to connect to {1} at output pin index {2} but there are not enough pins", sourceViewModel.Name, inputSourceVm.Name, inputPin.SourceParameterIndex); } } } }
private void ConnectPins(CPinViewModel source, CPinViewModel target) { CNodeConnectionViewModel newConnection = new CNodeConnectionViewModel(source, target, this); void Redo() { newConnection.Connect(); } void Undo() { newConnection.Disconnect(); } Redo(); UndoRedoUtility.Record(new CRelayUndoItem(Undo, Redo)); }