/// <summary> /// 复制选择 /// </summary> public virtual void DuplicateSelection() { List <BaseNodeView> nodes = new List <BaseNodeView>(); List <BaseConnectionView> edges = new List <BaseConnectionView>(); foreach (var element in selection) { switch (element) { case BaseNodeView nodeView: nodes.Add(element as BaseNodeView); break; case BaseConnectionView edgeView: edges.Add(element as BaseConnectionView); break; default: break; } } if (nodes.Count == 0 && edges.Count == 0) { return; } //序列化节点 Dictionary <string, string> saveUidMap = new Dictionary <string, string>(); Dictionary <string, BaseNode> newNodeMap = new Dictionary <string, BaseNode>(); for (int i = 0; i < nodes.Count; i++) { BaseNode oldNode = nodes[i].Model; string dataStr = LCJson.JsonMapper.ToJson(oldNode); string oldUid = oldNode.guid; string newUid = Model.GenerateNodeGUID(); BaseNode newNode = LCJson.JsonMapper.ToObject <BaseNode>(dataStr); newNode.guid = newUid; newNode.position += new UnityEngine.Vector2(nodes[i].contentRect.width + 100, 0); saveUidMap.Add(oldUid, newUid); CommandDispacter.Do(new AddNodeCommand(Model, newNode)); newNodeMap.Add(newUid, newNode); } //序列化链接 for (int i = 0; i < edges.Count; i++) { BaseConnection connectionView = edges[i].Model; string dataStr = LCJson.JsonMapper.ToJson(connectionView); BaseConnection newConnection = LCJson.JsonMapper.ToObject <BaseConnection>(dataStr); //链接替换 BaseNode from = null; string fromPortName = connectionView.fromPortName; if (saveUidMap.ContainsKey(newConnection.from)) { from = newNodeMap[saveUidMap[newConnection.from]]; } BaseNode to = null; string toPortName = connectionView.toPortName; if (saveUidMap.ContainsKey(newConnection.to)) { to = newNodeMap[saveUidMap[newConnection.to]]; } if (from != null && to != null) { CommandDispacter.Do(new ConnectCommand(Model, from, fromPortName, to, toPortName)); } } }
/// <summary> GraphView发生改变时调用 </summary> GraphViewChange GraphViewChangedCallback(GraphViewChange changes) { if (changes.movedElements != null) { CommandDispacter.BeginGroup(); // 当节点移动之后,与之连接的接口重新排序 Dictionary <BaseNode, Vector2> newPos = new Dictionary <BaseNode, Vector2>(); HashSet <BasePort> ports = new HashSet <BasePort>(); changes.movedElements.RemoveAll(element => { switch (element) { case BaseNodeView nodeView: newPos[nodeView.Model] = nodeView.GetPosition().position; // 记录需要重新排序的接口 foreach (var port in nodeView.Model.Ports.Values) { foreach (var connection in port.Connections) { if (port.direction == BasePort.Direction.Input) { ports.Add(connection.FromNode.Ports[connection.FromPortName]); } else { ports.Add(connection.ToNode.Ports[connection.ToPortName]); } } } return(true); default: break; } return(false); }); CommandDispacter.Do(new MoveNodesCommand(newPos)); // 排序 foreach (var port in ports) { port.Resort(); } CommandDispacter.EndGroup(); } if (changes.elementsToRemove != null) { changes.elementsToRemove.Sort((element1, element2) => { int GetPriority(GraphElement element) { switch (element) { case Edge edgeView: return(0); case BaseNodeView nodeView: return(1); } return(4); } return(GetPriority(element1).CompareTo(GetPriority(element2))); }); CommandDispacter.BeginGroup(); changes.elementsToRemove.RemoveAll(element => { switch (element) { case BaseConnectionView edgeView: if (edgeView.selected) { CommandDispacter.Do(new DisconnectCommand(Model, edgeView.Model)); } return(true); case BaseNodeView nodeView: if (nodeView.selected) { CommandDispacter.Do(new RemoveNodeCommand(Model, nodeView.Model)); } return(true); } return(false); }); CommandDispacter.EndGroup(); UpdateInspector(); } return(changes); }