public XInputControllerAnalogNode() : base(XInputControllerAnalogNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(); conExecute = new ExecutionConnectorViewModel(); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); // Prepare Connections conLeftThumbX = new ConnectorViewModel("LeftThumbX", typeof(NodeDataNumeric)); conLeftThumbY = new ConnectorViewModel("LeftThumbY", typeof(NodeDataNumeric)); conLeftTrigger = new ConnectorViewModel("LeftTrigger", typeof(NodeDataNumeric)); conRightThumbX = new ConnectorViewModel("RightThumbX", typeof(NodeDataNumeric)); conRightThumbY = new ConnectorViewModel("RightThumbY", typeof(NodeDataNumeric)); conRightTrigger = new ConnectorViewModel("RightTrigger", typeof(NodeDataNumeric)); //conButtons = new ConnectorViewModel("Buttons", typeof(NodeDataXInputButtons)); this.OutputConnectors.Add(conLeftThumbX); this.OutputConnectors.Add(conLeftThumbY); this.OutputConnectors.Add(conLeftTrigger); this.OutputConnectors.Add(conRightThumbX); this.OutputConnectors.Add(conRightThumbY); this.OutputConnectors.Add(conRightTrigger); //this.OutputConnectors.Add(conButtons); // State Values currentUser = UserIndex.One; controller = new SharpDX.XInput.Controller(currentUser); // Create Dialog dlgEdit = new PropertyDialog(); }
/// <summary> /// Called when the user has started to drag out a connector, thus creating a new connection. /// </summary> public ExecutionConnectionViewModel ExecutionConnectionDragStarted(ExecutionConnectorViewModel draggedOutConnector, Point curDragPoint) { // // Create a new connection to add to the view-model. // var connection = new ExecutionConnectionViewModel(); if (draggedOutConnector.Type == ConnectorType.Output) { // // The user is dragging out a source connector (an output) and will connect it to a destination connector (an input). // connection.SourceConnector = draggedOutConnector; connection.DestConnectorHotspot = curDragPoint; } else { // // The user is dragging out a destination connector (an input) and will connect it to a source connector (an output). // connection.DestConnector = draggedOutConnector; connection.SourceConnectorHotspot = curDragPoint; } // // Add the new connection to the view-model. // this.Network.ExecutionConnections.Add(connection); return(connection); }
//public override string Note { get { } } public ExecuteRoutingNode() : base(ExecuteRoutingNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(); conExecute = new ExecutionConnectorViewModel(); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); }
public ExecuteRoutingNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) : base(ExecuteRoutingNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(executeIn[0]); conExecute = new ExecutionConnectorViewModel(executeOut[0]); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); // Set Name //Name = (string)data["name"]; }
public XInputControllerDigitalNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) : base(XInputControllerDigitalNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(executeIn[0]); conExecute = new ExecutionConnectorViewModel(executeOut[0]); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); // Prepare Connections conDPadUp = new ConnectorViewModel("DPadUp", typeof(NodeDataBoolean), dataOut[0]); conDPadDown = new ConnectorViewModel("DPadDown", typeof(NodeDataBoolean), dataOut[1]); conDPadLeft = new ConnectorViewModel("DPadLeft", typeof(NodeDataBoolean), dataOut[2]); conDPadRight = new ConnectorViewModel("DPadRight", typeof(NodeDataBoolean), dataOut[3]); conStart = new ConnectorViewModel("Start", typeof(NodeDataBoolean), dataOut[4]); conBack = new ConnectorViewModel("Back", typeof(NodeDataBoolean), dataOut[5]); conLeftThumb = new ConnectorViewModel("LeftThumb", typeof(NodeDataBoolean), dataOut[6]); conRightThumb = new ConnectorViewModel("RightThumb", typeof(NodeDataBoolean), dataOut[7]); conLeftShoulder = new ConnectorViewModel("LeftShoulder", typeof(NodeDataBoolean), dataOut[8]); conRightShoulder = new ConnectorViewModel("RightShoulder", typeof(NodeDataBoolean), dataOut[9]); conA = new ConnectorViewModel("A", typeof(NodeDataBoolean), dataOut[10]); conB = new ConnectorViewModel("B", typeof(NodeDataBoolean), dataOut[11]); conX = new ConnectorViewModel("X", typeof(NodeDataBoolean), dataOut[12]); conY = new ConnectorViewModel("Y", typeof(NodeDataBoolean), dataOut[13]); this.OutputConnectors.Add(conDPadUp); this.OutputConnectors.Add(conDPadDown); this.OutputConnectors.Add(conDPadLeft); this.OutputConnectors.Add(conDPadRight); this.OutputConnectors.Add(conStart); this.OutputConnectors.Add(conBack); this.OutputConnectors.Add(conLeftThumb); this.OutputConnectors.Add(conRightThumb); this.OutputConnectors.Add(conLeftShoulder); this.OutputConnectors.Add(conRightShoulder); this.OutputConnectors.Add(conA); this.OutputConnectors.Add(conB); this.OutputConnectors.Add(conX); this.OutputConnectors.Add(conY); // Set Name Name = (string)data["name"]; // State Values if (!Enum.TryParse <UserIndex>((string)data["currentUser"], out currentUser)) { currentUser = UserIndex.One; } controller = new SharpDX.XInput.Controller(currentUser); // Create Dialog dlgEdit = new PropertyDialog(); }
public IntervalTriggerNode() : base(IntervalTriggerNodeFactory.TYPESTRING) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(); this.OutputExecutionConnectors.Add(conExecute); //diposeInterlock = new Semaphore(0, 1); // State Value this.period = 100; worker = new Thread(DoWork); // Create Dialog dlgEdit = new PropertyDialog(); }
public XInputControllerAnalogNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) : base(XInputControllerAnalogNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(executeIn[0]); conExecute = new ExecutionConnectorViewModel(executeOut[0]); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); // Prepare Connections conLeftThumbX = new ConnectorViewModel("LeftThumbX", typeof(NodeDataNumeric), dataOut[0]); conLeftThumbY = new ConnectorViewModel("LeftThumbY", typeof(NodeDataNumeric), dataOut[1]); conLeftTrigger = new ConnectorViewModel("LeftTrigger", typeof(NodeDataNumeric), dataOut[2]); conRightThumbX = new ConnectorViewModel("RightThumbX", typeof(NodeDataNumeric), dataOut[3]); conRightThumbY = new ConnectorViewModel("RightThumbY", typeof(NodeDataNumeric), dataOut[4]); conRightTrigger = new ConnectorViewModel("RightTrigger", typeof(NodeDataNumeric), dataOut[5]); //if (dataIn.Length > 5) //{ // conButtons = new ConnectorViewModel("Buttons", typeof(NodeDataXInputButtons), dataOut[6]); //} //else //{ // conButtons = new ConnectorViewModel("Buttons", typeof(NodeDataXInputButtons)); //} this.OutputConnectors.Add(conLeftThumbX); this.OutputConnectors.Add(conLeftThumbY); this.OutputConnectors.Add(conLeftTrigger); this.OutputConnectors.Add(conRightThumbX); this.OutputConnectors.Add(conRightThumbY); this.OutputConnectors.Add(conRightTrigger); //this.OutputConnectors.Add(conButtons); // Set Name Name = (string)data["name"]; // State Values if (!Enum.TryParse <UserIndex>((string)data["currentUser"], out currentUser)) { currentUser = UserIndex.One; } controller = new SharpDX.XInput.Controller(currentUser); // Create Dialog dlgEdit = new PropertyDialog(); }
public SetVariableNode() : base(SetVariableNodeFactory.TYPESTRING) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(); conIn = new ConnectorViewModel("Set", typeof(INodeData)); this.InputExecutionConnectors.Add(conExecute); this.InputConnectors.Add(conIn); // State Values VarName = null; Value = null; // Create Dialog dlgEdit = new PropertyDialog(); }
public XInputControllerDigitalNode() : base(XInputControllerDigitalNodeFactory.TYPESTRING) { // Prepare Execution Connection conExecuted = new ExecutionConnectorViewModel(); conExecute = new ExecutionConnectorViewModel(); this.InputExecutionConnectors.Add(conExecuted); this.OutputExecutionConnectors.Add(conExecute); // Prepare Connections conDPadUp = new ConnectorViewModel("DPadUp", typeof(NodeDataBoolean)); conDPadDown = new ConnectorViewModel("DPadDown", typeof(NodeDataBoolean)); conDPadLeft = new ConnectorViewModel("DPadLeft", typeof(NodeDataBoolean)); conDPadRight = new ConnectorViewModel("DPadRight", typeof(NodeDataBoolean)); conStart = new ConnectorViewModel("Start", typeof(NodeDataBoolean)); conBack = new ConnectorViewModel("Back", typeof(NodeDataBoolean)); conLeftThumb = new ConnectorViewModel("LeftThumb", typeof(NodeDataBoolean)); conRightThumb = new ConnectorViewModel("RightThumb", typeof(NodeDataBoolean)); conLeftShoulder = new ConnectorViewModel("LeftShoulder", typeof(NodeDataBoolean)); conRightShoulder = new ConnectorViewModel("RightShoulder", typeof(NodeDataBoolean)); conA = new ConnectorViewModel("A", typeof(NodeDataBoolean)); conB = new ConnectorViewModel("B", typeof(NodeDataBoolean)); conX = new ConnectorViewModel("X", typeof(NodeDataBoolean)); conY = new ConnectorViewModel("Y", typeof(NodeDataBoolean)); this.OutputConnectors.Add(conDPadUp); this.OutputConnectors.Add(conDPadDown); this.OutputConnectors.Add(conDPadLeft); this.OutputConnectors.Add(conDPadRight); this.OutputConnectors.Add(conStart); this.OutputConnectors.Add(conBack); this.OutputConnectors.Add(conLeftThumb); this.OutputConnectors.Add(conRightThumb); this.OutputConnectors.Add(conLeftShoulder); this.OutputConnectors.Add(conRightShoulder); this.OutputConnectors.Add(conA); this.OutputConnectors.Add(conB); this.OutputConnectors.Add(conX); this.OutputConnectors.Add(conY); // State Values currentUser = UserIndex.One; controller = new SharpDX.XInput.Controller(currentUser); // Create Dialog dlgEdit = new PropertyDialog(); }
public ForkNode() : base(ForkNodeFactory.TYPESTRING) { // Prepare Connections conExecuteIn = new ExecutionConnectorViewModel(); conExecuteOut = new ExecutionConnectorViewModel(); conIn = new ConnectorViewModel("Set", typeof(NodeDataBoolean)); this.InputExecutionConnectors.Add(conExecuteIn); this.OutputExecutionConnectors.Add(conExecuteOut); this.InputConnectors.Add(conIn); // State Values Value = null; // Create Dialog dlgEdit = new PropertyDialog(); }
public SetVariableNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) : base(SetVariableNodeFactory.TYPESTRING) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(executeIn[0]); conIn = new ConnectorViewModel("Set", typeof(INodeData), dataIn[0]); this.InputExecutionConnectors.Add(conExecute); this.InputConnectors.Add(conIn); // Set Name Name = (string)data["name"]; // State Values VarName = (string)data["varname"]; // Create Dialog dlgEdit = new PropertyDialog(); }
public IntervalTriggerNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(executeOut[0]); this.OutputExecutionConnectors.Add(conExecute); //diposeInterlock = new Semaphore(0, 1); // Set Name Name = (string)data["name"]; // State Value this.period = (int)data["period"]; worker = new Thread(DoWork); // Create Dialog dlgEdit = new PropertyDialog(); }
/// <summary> /// Called to query the application for feedback while the user is dragging the connection. /// </summary> public void QueryExecutionConnnectionFeedback(ExecutionConnectorViewModel draggedOutConnector, ExecutionConnectorViewModel draggedOverConnector, out object feedbackIndicator, out bool connectionOk) { if (draggedOutConnector == draggedOverConnector) { // // Can't connect to self! // Provide feedback to indicate that this connection is not valid! // feedbackIndicator = new ConnectionBadIndicator(); connectionOk = false; } else { var sourceConnector = draggedOutConnector; var destConnector = draggedOverConnector; // // Only allow connections from output connector to input connector (ie each // connector must have a different type). // Also only allocation from one node to another, never one node back to the same node. // connectionOk = sourceConnector.ParentNode != destConnector.ParentNode && sourceConnector.Type != destConnector.Type; if (connectionOk) { // // Yay, this is a valid connection! // Provide feedback to indicate that this connection is ok! // feedbackIndicator = new ConnectionOkIndicator(); } else { // // Connectors with the same connector type (eg input & input, or output & output) // can't be connected. // Only connectors with separate connector type (eg input & output). // Provide feedback to indicate that this connection is not valid! // feedbackIndicator = new ConnectionBadIndicator(); } } }
public ValueBufferNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) : base(ValueBufferNodeFactory.TYPESTRING) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(executeIn[0]); conIn = new ConnectorViewModel("Set", typeof(INodeData), dataIn[0]); conOut = new ConnectorViewModel("Value", typeof(INodeData), dataOut[0]); this.InputExecutionConnectors.Add(conExecute); this.InputConnectors.Add(conIn); this.OutputConnectors.Add(conOut); // Set Name Name = (string)data["name"]; // State Values //Value = (Double)data["value"]; // no way to serilize generic values yet // Create Dialog dlgEdit = new PropertyDialog(); }
// Load Data Constructor public EmoteSetVariableNode(JObject data, Guid[] executeIn, Guid[] executeOut, Guid[] dataIn, Guid[] dataOut) { // Prepare Connections conExecute = new ExecutionConnectorViewModel(executeIn[0]); inputValue = new ConnectorViewModel("Value", typeof(NodeDataNumeric), dataIn[0]); if (dataIn.Length > 1) // allow loading older node graph saves { inputFrameCount = new ConnectorViewModel("FrameCount", typeof(NodeDataNumeric), dataIn[1]); inputEasing = new ConnectorViewModel("Easing", typeof(NodeDataNumeric), dataIn[2]); } else { inputFrameCount = new ConnectorViewModel("FrameCount", typeof(NodeDataNumeric)); inputEasing = new ConnectorViewModel("Easing", typeof(NodeDataNumeric)); } this.InputExecutionConnectors.Add(conExecute); this.InputConnectors.Add(inputValue); this.InputConnectors.Add(inputFrameCount); this.InputConnectors.Add(inputEasing); // Set Name Name = (string)data["name"]; // State Values value = (float)data["value"]; frameCount = (float)data["frameCount"]; easing = (float)data["easing"]; varName = (string)data["varName"]; // Create Dialog dlgEdit = new PropertyDialog(); // Get Character Context charContext = CharacterContext.GetCharacterContext(); }
private void openToolStripMenuItem_Click(object sender, EventArgs e) { Dictionary <Guid, Guid> Remap = new Dictionary <Guid, Guid>(); Func <Guid, Guid> convertGuid = ((input) => { if (Remap.ContainsKey(input)) { return(Remap[input]); } Remap[input] = Guid.NewGuid(); return(Remap[input]); }); if (openFileDialog1.ShowDialog() == DialogResult.OK) { // Take a copy of the selected nodes list so we can delete nodes while iterating. var nodesCopy = this.nodeGraph1.ViewModel.Network.Nodes.ToArray(); foreach (var node in nodesCopy) { //if (node.IsSelected) { nodeGraph1.ViewModel.DeleteNode(node); node.Dispose(); } } { JObject obj = JObject.Parse(File.ReadAllText(openFileDialog1.FileName)); if (obj["nodes"] != null && obj["nodes"].Type == JTokenType.Array) { List <NodeViewModel> nodeList = new List <NodeViewModel>(); JArray arr = (JArray)obj["nodes"]; arr.ToList().ForEach(dr => { if (dr["type"] != null && dr["type"].Type == JTokenType.String) { string type = (string)dr["type"]; if (TypeToFactory.ContainsKey(type)) { Guid[] _ei = dr["ei"] != null && dr["ei"].Type == JTokenType.Array ? ((JArray)dr["ei"]).Select(dx => convertGuid(new Guid((string)dx))).ToArray() : new Guid[0]; Guid[] _eo = dr["eo"] != null && dr["eo"].Type == JTokenType.Array ? ((JArray)dr["eo"]).Select(dx => convertGuid(new Guid((string)dx))).ToArray() : new Guid[0]; Guid[] _di = dr["di"] != null && dr["di"].Type == JTokenType.Array ? ((JArray)dr["di"]).Select(dx => convertGuid(new Guid((string)dx))).ToArray() : new Guid[0]; Guid[] _do = dr["do"] != null && dr["do"].Type == JTokenType.Array ? ((JArray)dr["do"]).Select(dx => convertGuid(new Guid((string)dx))).ToArray() : new Guid[0]; NodeViewModel model = TypeToFactory[type].CreateNode((JObject)dr["data"], _ei, _eo, _di, _do); if (model != null) { nodeList.Add(model); model.X = dr["x"] != null && dr["x"].Type == JTokenType.Float ? (float)dr["x"] : 0f; model.Y = dr["y"] != null && dr["y"].Type == JTokenType.Float ? (float)dr["y"] : 0f; NodeViewModel created = nodeGraph1.ViewModel.CreateNode(model, /*position,*/ false); } } } }); if (obj["dcons"] != null && obj["dcons"].Type == JTokenType.Array) { ((JArray)obj["dcons"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = convertGuid(new Guid((string)(((JObject)dr)["s"]))); Guid conDest = convertGuid(new Guid((string)(((JObject)dr)["d"]))); ConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.Connections.Add(new ConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } if (obj["econs"] != null && obj["econs"].Type == JTokenType.Array) { ((JArray)obj["econs"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = convertGuid(new Guid((string)(((JObject)dr)["s"]))); Guid conDest = convertGuid(new Guid((string)(((JObject)dr)["d"]))); ExecutionConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputExecutionConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ExecutionConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputExecutionConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.ExecutionConnections.Add(new ExecutionConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } nodeList.ForEach(dr => dr.Start()); } } } }
private void appendToolStripMenuItem_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { JObject obj = JObject.Parse(File.ReadAllText(openFileDialog1.FileName)); if (obj["nodes"] != null && obj["nodes"].Type == JTokenType.Array) { List <NodeViewModel> nodeList = new List <NodeViewModel>(); JArray arr = (JArray)obj["nodes"]; arr.ToList().ForEach(dr => { if (dr["type"] != null && dr["type"].Type == JTokenType.String) { string type = (string)dr["type"]; if (TypeToFactory.ContainsKey(type)) { Guid[] _ei = dr["ei"] != null && dr["ei"].Type == JTokenType.Array ? ((JArray)dr["ei"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _eo = dr["eo"] != null && dr["eo"].Type == JTokenType.Array ? ((JArray)dr["eo"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _di = dr["di"] != null && dr["di"].Type == JTokenType.Array ? ((JArray)dr["di"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _do = dr["do"] != null && dr["do"].Type == JTokenType.Array ? ((JArray)dr["do"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; NodeViewModel model = TypeToFactory[type].CreateNode((JObject)dr["data"], _ei, _eo, _di, _do); if (model != null) { nodeList.Add(model); model.X = dr["x"] != null && dr["x"].Type == JTokenType.Float ? (float)dr["x"] : 0f; model.Y = dr["y"] != null && dr["y"].Type == JTokenType.Float ? (float)dr["y"] : 0f; NodeViewModel created = nodeGraph1.ViewModel.CreateNode(model, /*position,*/ false); } } } }); if (obj["dcons"] != null && obj["dcons"].Type == JTokenType.Array) { ((JArray)obj["dcons"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = new Guid((string)(((JObject)dr)["s"])); Guid conDest = new Guid((string)(((JObject)dr)["d"])); ConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.Connections.Add(new ConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } if (obj["econs"] != null && obj["econs"].Type == JTokenType.Array) { ((JArray)obj["econs"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = new Guid((string)(((JObject)dr)["s"])); Guid conDest = new Guid((string)(((JObject)dr)["d"])); ExecutionConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputExecutionConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ExecutionConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputExecutionConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.ExecutionConnections.Add(new ExecutionConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } nodeList.ForEach(dr => dr.Start()); } } }
/// <summary> /// Retrieve a connection between the two connectors. /// Returns null if there is no connection between the connectors. /// </summary> public ExecutionConnectionViewModel FindExecutionConnection(ExecutionConnectorViewModel connector1, ExecutionConnectorViewModel connector2) { Trace.Assert(connector1.Type != connector2.Type); // // Figure out which one is the source connector and which one is the // destination connector based on their connector types. // var sourceConnector = connector1.Type == ConnectorType.Output ? connector1 : connector2; var destConnector = connector1.Type == ConnectorType.Output ? connector2 : connector1; // // Now we can just iterate attached connections of the source // and see if it each one is attached to the destination connector. // foreach (var connection in sourceConnector.AttachedExecutionConnections) { if (connection.DestConnector == destConnector) { // // Found a connection that is outgoing from the source connector // and incoming to the destination connector. // return(connection); } } return(null); }
/// <summary> /// Called when the user has finished dragging out the new connection. /// </summary> public void ExecutionConnectionDragCompleted(ExecutionConnectionViewModel newConnection, ExecutionConnectorViewModel connectorDraggedOut, ExecutionConnectorViewModel connectorDraggedOver) { if (connectorDraggedOver == null) { // // The connection was unsuccessful. // Maybe the user dragged it out and dropped it in empty space. // this.Network.ExecutionConnections.Remove(newConnection); return; } // // Only allow connections from output connector to input connector (ie each // connector must have a different type). // Also only allocation from one node to another, never one node back to the same node. // bool connectionOk = connectorDraggedOut.ParentNode != connectorDraggedOver.ParentNode && connectorDraggedOut.Type != connectorDraggedOver.Type; if (!connectionOk) { // // Connections between connectors that have the same type, // eg input -> input or output -> output, are not allowed, // Remove the connection. // this.Network.ExecutionConnections.Remove(newConnection); return; } // // The user has dragged the connection on top of another valid connector. // // // Remove any existing connection between the same two connectors. // var existingConnection = FindExecutionConnection(connectorDraggedOut, connectorDraggedOver); if (existingConnection != null) { this.Network.ExecutionConnections.Remove(existingConnection); } // // Finalize the connection by attaching it to the connector // that the user dragged the mouse over. // if (newConnection.DestConnector == null) { newConnection.DestConnector = connectorDraggedOver; } else { newConnection.SourceConnector = connectorDraggedOver; } }
private void duplicateNodesToolStripMenuItem_Click(object sender, EventArgs e) { string dmpCache = string.Empty; { List <FunctionalNetworkModel.NodeViewModel> nodes = this.nodeGraph1.ViewModel.Network.Nodes.Where(dr => dr.IsSelected).ToList(); List <FunctionalNetworkModel.ConnectionViewModel> connections = nodes.SelectMany(dr => dr.AttachedConnections).Distinct().Where(dr => nodes.Contains(dr.DestConnector.ParentNode)).ToList(); List <FunctionalNetworkModel.ExecutionConnectionViewModel> executionConnections = nodes.SelectMany(dr => dr.AttachedExecutionConnections).Distinct().Where(dr => nodes.Contains(dr.DestConnector.ParentNode)).ToList(); JObject SaveData = new JObject(); SaveData["nodes"] = JArray.FromObject(nodes .Select(dr => { JObject tmp = new JObject(); tmp["type"] = dr.Type; tmp["data"] = dr.Serialize(); tmp["x"] = dr.X; tmp["y"] = dr.Y; tmp["ei"] = JArray.FromObject(dr.InputExecutionConnectors.Select(dx => dx.Guid)); tmp["eo"] = JArray.FromObject(dr.OutputExecutionConnectors.Select(dx => dx.Guid)); tmp["di"] = JArray.FromObject(dr.InputConnectors.Select(dx => dx.Guid)); tmp["do"] = JArray.FromObject(dr.OutputConnectors.Select(dx => dx.Guid)); return(tmp); }) .ToList()); SaveData["dcons"] = JArray.FromObject(connections .Select(dr => { JObject tmp = new JObject(); tmp["s"] = dr.SourceConnector.Guid; tmp["d"] = dr.DestConnector.Guid; return(tmp); }) .Where(dr => dr != null) .ToList()); SaveData["econs"] = JArray.FromObject(executionConnections .Select(dr => { JObject tmp = new JObject(); tmp["s"] = dr.SourceConnector.Guid; tmp["d"] = dr.DestConnector.Guid; return(tmp); }) .Where(dr => dr != null) .ToList()); dmpCache = SaveData.ToString(); } { JObject obj = JObject.Parse(dmpCache); if (obj["nodes"] != null && obj["nodes"].Type == JTokenType.Array) { List <NodeViewModel> nodeList = new List <NodeViewModel>(); JArray arr = (JArray)obj["nodes"]; arr.ToList().ForEach(dr => { if (dr["type"] != null && dr["type"].Type == JTokenType.String) { string type = (string)dr["type"]; if (TypeToFactory.ContainsKey(type)) { Guid[] _ei = dr["ei"] != null && dr["ei"].Type == JTokenType.Array ? ((JArray)dr["ei"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _eo = dr["eo"] != null && dr["eo"].Type == JTokenType.Array ? ((JArray)dr["eo"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _di = dr["di"] != null && dr["di"].Type == JTokenType.Array ? ((JArray)dr["di"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; Guid[] _do = dr["do"] != null && dr["do"].Type == JTokenType.Array ? ((JArray)dr["do"]).Select(dx => new Guid((string)dx)).ToArray() : new Guid[0]; NodeViewModel model = TypeToFactory[type].CreateNode((JObject)dr["data"], _ei, _eo, _di, _do); if (model != null) { nodeList.Add(model); model.X = dr["x"] != null && dr["x"].Type == JTokenType.Float ? (float)dr["x"] : 0f; model.Y = dr["y"] != null && dr["y"].Type == JTokenType.Float ? (float)dr["y"] : 0f; NodeViewModel created = nodeGraph1.ViewModel.CreateNode(model, /*position,*/ false); } } } }); if (obj["dcons"] != null && obj["dcons"].Type == JTokenType.Array) { ((JArray)obj["dcons"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = new Guid((string)(((JObject)dr)["s"])); Guid conDest = new Guid((string)(((JObject)dr)["d"])); ConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.Connections.Add(new ConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } if (obj["econs"] != null && obj["econs"].Type == JTokenType.Array) { ((JArray)obj["econs"]).ToList().ForEach(dr => { if (dr != null && dr.Type == JTokenType.Object) { Guid conSource = new Guid((string)(((JObject)dr)["s"])); Guid conDest = new Guid((string)(((JObject)dr)["d"])); ExecutionConnectorViewModel conSource2 = nodeList.SelectMany(dx => dx.OutputExecutionConnectors).Where(dx => dx.Guid == conSource).FirstOrDefault(); ExecutionConnectorViewModel conDest2 = nodeList.SelectMany(dx => dx.InputExecutionConnectors).Where(dx => dx.Guid == conDest).FirstOrDefault(); if (conSource2 != null && conDest2 != null) { nodeGraph1.ViewModel.Network.ExecutionConnections.Add(new ExecutionConnectionViewModel() { DestConnector = conDest2, SourceConnector = conSource2 }); } } }); } nodeList.ForEach(dr => dr.Start()); } } }