/// <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); } } } } }
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)); }