示例#1
0
        /// <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));
                }
            }
        }
示例#2
0
        /// <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);
        }