Ejemplo n.º 1
0
        /// <summary>
        /// 递归获取该节点创建sequence时需要包含的所有节点id
        /// 遇到CreateSequenceNode则停止往右探索
        /// </summary>
        /// <returns></returns>
        public void GetSequenceNodesIdsRecursive(ref List <int> rightSideNodeIdList)
        {
            if (rightSideNodeIdList == null)
            {
                rightSideNodeIdList = new List <int>();
            }

            if (flowOutPortViews != null)
            {
                for (int i = 0; i < flowOutPortViews.Length; i++)
                {
                    List <PortEditorView> connectionPortList = flowOutPortViews[i].connectedPortList;
                    for (int j = 0; j < connectionPortList.Count; j++)
                    {
                        NodeEditorView targetNode = connectionPortList[j].NodeView;
                        int            nodeId     = targetNode.NodeId;
                        if (!rightSideNodeIdList.Contains(nodeId))
                        {
                            rightSideNodeIdList.Add(nodeId);

                            if (!targetNode.ReflectionInfo.IsCreateSequenceNode)
                            {
                                targetNode.GetSequenceNodesIdsRecursive(ref rightSideNodeIdList);
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < outputPortViewList.Count; i++)
            {
                OutputPortEditorView  outputPort         = outputPortViewList[i];
                List <PortEditorView> connectionPortList = outputPort.connectedPortList;
                for (int j = 0; j < connectionPortList.Count; j++)
                {
                    NodeEditorView targetNode = connectionPortList[j].NodeView;
                    int            nodeId     = targetNode.NodeId;
                    if (!rightSideNodeIdList.Contains(nodeId))
                    {
                        rightSideNodeIdList.Add(nodeId);

                        if (!targetNode.ReflectionInfo.IsCreateSequenceNode)
                        {
                            targetNode.GetSequenceNodesIdsRecursive(ref rightSideNodeIdList);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private static Offset <NodeInfo> ConvertToRuntimeNodeInfo(FlatBufferBuilder fbb, NodeEditorView nodeView)
        {
            FlowOutPortEditorView[]        flowOutPortViews   = nodeView.flowOutPortViews;
            Offset <NodeFlowOutPortInfo>[] flowOutInfoOffsets = new Offset <NodeFlowOutPortInfo> [flowOutPortViews.Length];
            for (int i = 0; i < flowOutPortViews.Length; i++)
            {
                flowOutInfoOffsets[i] = ConvertToRuntimeFlowOutPortInfo(fbb, flowOutPortViews[i]);
            }

            List <InputPortEditorView> inputPortViewList = nodeView.inputPortViewList;

            Offset <NodeInputFieldInfo>[] inputPortInfoOffsets = new Offset <NodeInputFieldInfo> [inputPortViewList.Count];
            for (int i = 0; i < inputPortViewList.Count; i++)
            {
                inputPortInfoOffsets[i] = ConvertToRuntimeInputPortInfo(fbb, inputPortViewList[i]);
            }

            //这里处理rightSideNodeIds数组
            VectorOffset rightSideNodeIdsVectorOffset = new VectorOffset();

            if (nodeView.ReflectionInfo.IsEntranceNode || nodeView.ReflectionInfo.IsCreateSequenceNode)
            {
                List <int> rightSideNodeIdList = new List <int>();
                nodeView.GetSequenceNodesIdsRecursive(ref rightSideNodeIdList);

                if (rightSideNodeIdList.Count > 0)
                {
                    rightSideNodeIdsVectorOffset = NodeInfo.CreateRightSideNodeIdsVector(fbb, rightSideNodeIdList.ToArray());
                }
            }

            VectorOffset flowOutVectorOffset = NodeInfo.CreateFlowOutPortInfosVector(fbb, flowOutInfoOffsets);
            VectorOffset inputVectorOffset   = NodeInfo.CreateInputPortInfosVector(fbb, inputPortInfoOffsets);
            StringOffset nodeTypeNameOffset  = fbb.CreateString(nodeView.ReflectionInfo.Type.FullName);

            NodeInfo.StartNodeInfo(fbb);
            NodeInfo.AddNodeId(fbb, nodeView.NodeId);
            NodeInfo.AddNodeClassTypeName(fbb, nodeTypeNameOffset);
            NodeInfo.AddFlowOutPortInfos(fbb, flowOutVectorOffset);
            NodeInfo.AddInputPortInfos(fbb, inputVectorOffset);
            if (nodeView.ReflectionInfo.IsEntranceNode || nodeView.ReflectionInfo.IsCreateSequenceNode)
            {
                NodeInfo.AddRightSideNodeIds(fbb, rightSideNodeIdsVectorOffset);
            }

            return(NodeInfo.EndNodeInfo(fbb));
        }