/// <summary> /// 获取下一个绘图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="graphElement">当前图元</param> /// <param name="metaData">绘图元数据</param> /// <param name="graphElementList">遍历过的图元链表</param> /// <param name="graphElementTable">流程图索引哈希表</param> /// <param name="actionsTable">动作组数据哈希表</param> private void FindNextMetaData(DataManager dataManager, GraphElement graphElement, FlowChartMetaData metaData, List<GraphElement> graphElementList, Hashtable graphElementTable, Hashtable actionsTable) { graphElementList.Add(graphElement); graphElementTable[graphElement] = metaData; List<GraphElement> list = dataManager.GetNextGraphElements(graphElement, true); foreach (GraphElement g in list) { object data = dataManager.GetCompileData(g); DataElement dataElement = dataManager.GetCompileDataElement(g); if (!graphElementList.Contains(g)) { FlowChartMetaData newMetaData = new FlowChartMetaData(g.ID, data, dataElement.DataType); newMetaData.DisplayText = g.Text; if (g is AIStateGraphElement) // 状态 { string stateNodeName = CodeProviderClass.GetStateString(data); newMetaData.Code = stateNodeName; InitSetStateMetaData(metaData, newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable, actionsTable); } else if (g is AILineGraphElement) // 连接线 { newMetaData.Code = CodeProviderClass.GetEventString(data); newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable, actionsTable); } else if (g is AIActionGraphElement) // 动作 { newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable, actionsTable); } else if (g is AIActionsGraphElement) // 动作组 { List<FlowChartMetaData> metaDataList = actionsTable[g] as List<FlowChartMetaData>; metaDataList[0].AddPreviousMetaData(metaData); metaData.AddNextMetaData(metaDataList[0]); FindNextMetaData(dataManager, g, metaDataList[metaDataList.Count - 1], graphElementList, graphElementTable, actionsTable); } } else { if (g is AIActionsGraphElement) // 动作组要特殊处理 { List<FlowChartMetaData> metaDataList = actionsTable[g] as List<FlowChartMetaData>; metaDataList[0].AddPreviousMetaData(metaData); metaData.AddNextMetaData(metaDataList[0]); } else if (g is AIStateGraphElement) // 状态结点要特殊处理 { FlowChartMetaData newMetaData = graphElementTable[g] as FlowChartMetaData; InitSetStateMetaData(metaData, newMetaData); } else { FlowChartMetaData newMetaData = graphElementTable[g] as FlowChartMetaData; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); } } } }
/// <summary> /// 获取流程图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="slotContainerList">流程图插槽容器的链表</param> /// <returns>流程图元数据的链表</returns> protected override List<FlowChartMetaData> GetMetaData(DataManager dataManager, List<SlotContainer> slotContainerList) { // 初始化ID maxID = dataManager.CurrentFlowChartManager.CurrentGraphManager.IDIndex + 1; List<FlowChartMetaData> metaDataList = new List<FlowChartMetaData>(); List<GraphElement> graphElementList = new List<GraphElement>(); Hashtable graphElementTable = new Hashtable(); dataManager.InitCompileTable(); Hashtable actionsTable = new Hashtable(); // 动作组数据哈希表 // 预处理动作组结点 foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer is AIActionsGraphElement) { AIActionsGraphElement actionsGraphElement = slotContainer as AIActionsGraphElement; List<FlowChartMetaData> actionsMetaDataList = GetActionsMetaDataList(dataManager, actionsGraphElement); actionsTable[actionsGraphElement] = actionsMetaDataList; } } // 预处理子绘图结点 AIStateGraphElement stateNode = null; foreach (SlotContainer slotContainer in slotContainerList) { // 所有子绘图的图元都重新分配ID if (slotContainer is InnerChart) { InnerChart innerChart = slotContainer as InnerChart; InnerChartEditor innerChartEditor = dataManager.GetDataElement(innerChart) as InnerChartEditor; List<GraphElement> list = innerChartEditor.GraphElementList; foreach (GraphElement graphElement in list) { graphElement.ID = maxID; graphElement.Tag = innerChart.ID; maxID++; dataManager.AddCompileData(graphElement, innerChartEditor.GetDataElement(graphElement)); // 重命名名称 RenameGraphElement(dataManager, graphElement); if (graphElement is AIStateGraphElement) { AIStateGraphElement aiStateGraphElement = graphElement as AIStateGraphElement; if (aiStateGraphElement.IsInitialState) { stateNode = aiStateGraphElement; } } else if (graphElement is AIActionsGraphElement) { AIActionsGraphElement actionsGraphElement = graphElement as AIActionsGraphElement; List<FlowChartMetaData> actionsMetaDataList = GetActionsMetaDataList(dataManager, actionsGraphElement); actionsTable[actionsGraphElement] = actionsMetaDataList; } } } } // 处理绘图结点 foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer is AIStateGraphElement) { AIStateGraphElement stateGraphElement = slotContainer as AIStateGraphElement; if (stateGraphElement.IsInitialState) { stateNode = stateGraphElement; break; } } } if (stateNode != null) { object data = dataManager.GetCompileData(stateNode); DataElement dataElement = dataManager.GetCompileDataElement(stateNode); FlowChartMetaData metaData = new FlowChartMetaData(stateNode.ID, data, "AIStateNode"); string stateNodeName = CodeProviderClass.GetStateString(data); metaData.Code = stateNodeName; metaData.DisplayText = stateNode.Text; FindNextMetaData(dataManager, stateNode, metaData, graphElementList, graphElementTable, actionsTable); metaDataList.Add(metaData); } return metaDataList; }