/// <summary> /// 获取下一个图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="graphElement">当前图元</param> /// <param name="metaData">图元数据</param> /// <param name="graphElementList">遍历过的图元链表</param> /// <param name="graphElementTable">绘图索引哈希表</param> private void FindNextMetaData(DataManager dataManager, GraphElement graphElement, FlowChartMetaData metaData, List <GraphElement> graphElementList, Hashtable graphElementTable) { graphElementList.Add(graphElement); graphElementTable[graphElement] = metaData; List <GraphElement> list = dataManager.GetNextGraphElements(graphElement, false); foreach (GraphElement g in list) { object data = dataManager.GetData(g); if (!graphElementList.Contains(g)) { DataElement dataElement = dataManager.GetDataElement(g); FlowChartMetaData newMetaData = new FlowChartMetaData(g.ID, data, dataElement.DataType); newMetaData.DisplayText = g.TooltipText; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable); } else { FlowChartMetaData newMetaData = graphElementTable[g] as FlowChartMetaData; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); } } }
/// <summary> /// 设置图元是否可用 /// </summary> /// <param name="list">遍历过的图元链表</param> /// <param name="graphElement">当前图元</param> /// <param name="eventNode">事件结点</param> /// <param name="enable">图元是否可用</param> protected virtual void ReBindEventNode(List <GraphElement> list, GraphElement graphElement, EventGraphElement eventNode, bool enable) { if (!list.Contains(graphElement)) // 还没有遍历过当前图元 { GraphManager graphManager = data as GraphManager; DataManager dataManager = graphManager.CurrentFlowChartManager.CurrentDataManager; if (graphElement is SlotContainer) // 该图元是插槽容器 { SlotContainer slotContainer = graphElement as SlotContainer; if (!enable && slotContainer.EventNode != null && dataManager.IsConnect(slotContainer.EventNode, slotContainer)) // 不需要更新当前图元的事件结点 { } else { list.Add(slotContainer); slotContainer.Enable = enable; slotContainer.EventNode = eventNode; foreach (GraphElement g in dataManager.GetNextGraphElements(graphElement)) { ReBindEventNode(list, g, eventNode, enable); } } } else if (graphElement is ConnectorContainer) // 该图元是连接线控制点容器 { ConnectorContainer line = graphElement as ConnectorContainer; if (!enable && line.EventNode != null && dataManager.IsConnect(line.EventNode, line)) // 不需要更新当前图元的事件结点 { } else { list.Add(line); line.Enable = enable; line.EventNode = eventNode; foreach (GraphElement g in dataManager.GetNextGraphElements(graphElement)) { ReBindEventNode(list, g, eventNode, enable); } } } } }
/// <summary> /// 获取下一个图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="graphElement">当前图元</param> /// <param name="metaData">图元数据</param> /// <param name="graphElementList">遍历过的图元链表</param> /// <param name="graphElementTable">绘图索引哈希表</param> private void FindNextMetaData(DataManager dataManager, GraphElement graphElement, FlowChartMetaData metaData, List<GraphElement> graphElementList, Hashtable graphElementTable) { graphElementList.Add(graphElement); graphElementTable[graphElement] = metaData; List<GraphElement> list = dataManager.GetNextGraphElements(graphElement, false); foreach (GraphElement g in list) { object data = dataManager.GetData(g); if (!graphElementList.Contains(g)) { DataElement dataElement = dataManager.GetDataElement(g); FlowChartMetaData newMetaData = new FlowChartMetaData(g.ID, data, dataElement.DataType); newMetaData.DisplayText = g.TooltipText; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable); } else { FlowChartMetaData newMetaData = graphElementTable[g] as FlowChartMetaData; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); } } }
/// <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="name">流程图的名称</param> /// <param name="slotContainerList">插槽容器链表</param> /// <param name="showDetail">是否显示细节</param> /// <param name="logBox">输出日志窗体</param> /// <return>循环圈是否有效</return> private bool CheckCircleAvail(DataManager dataManager, string name, List<SlotContainer> slotContainerList, TextBoxX logBox, bool showDetail) { bool avail = true; List<SlotContainer> list = new List<SlotContainer>(); List<List<SlotContainer>> circleLists = new List<List<SlotContainer>>(); List<SlotContainer> circleNodeList = new List<SlotContainer>(); List<List<SlotContainer>> markList = new List<List<SlotContainer>>(); foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer is EventGraphElement) { dataManager.FindNextNode(slotContainer, list, circleLists, circleNodeList); } } if (circleLists.Count > 0) { foreach (List<SlotContainer> circleList in circleLists) { avail = false; foreach (SlotContainer node in circleList) { if (node is ConditionGraphElement) // 找到所有的条件结点 { // 检查当前圈中的连接线是设置了条件的条件连接线 foreach (GraphElement graphElement in dataManager.GetNextGraphElements(node)) { ConnectorContainer line = graphElement as ConnectorContainer; if (dataManager.GetData(line) != null && circleList.Contains(line.OutSlotContainer)) { avail = true; break; } } if (avail) { break; } // 检查是否有通过条件结点连出圈的结点 foreach (SlotContainer nextNode in dataManager.GetSpecifyNextSlotContainers(node, circleList)) { if (!circleNodeList.Contains(nextNode)) // 有连出圈的结点 { avail = true; break; } } if (avail) { break; } } } if (!avail) { markList.Add(circleList); string circleString = ""; for (int i = 0; i < circleList.Count; i++) { circleString += circleList[i].ID + " -> "; } circleString += circleList[0].ID; logBox.AppendText(string.Format("检测出循环圈{0}!\r\n", circleString)); } } if (markList.Count > 0) // 检测到无效的循环 { avail = false; MessageBox.Show(string.Format("流程图 {0} 中有可能无效的循环,请确认所有的循环是否设置了有效出口!", name), "流程图有效性检查", MessageBoxButtons.OK, MessageBoxIcon.Information); if (showDetail) // 显示细节 { CheckCircleForm cForm = new CheckCircleForm(dataManager.CurrentFlowChartManager.CurrentGraphManager, markList); cForm.ShowDialog(); } } } return avail; }
/// <summary> /// 设置图元是否可用 /// </summary> /// <param name="dataManager">事件管理器</param> /// <param name="list">遍历过的图元链表</param> /// <param name="graphElement">当前图元</param> /// <param name="enable">图元是否可用</param> public void ReBindEventNode(DataManager dataManager, List<GraphElement> list, GraphElement graphElement, bool enable) { if (!list.Contains(graphElement)) // 还没有遍历过当前图元 { list.Add(graphElement); if(enable) { graphElement.Enable = enable; } else { if(graphElement is SlotContainer) // 插槽容器 { if(!dataManager.IsConnectEventNode(graphElement as SlotContainer)) { graphElement.Enable = enable; } } else if(graphElement is ConnectorContainer) // 连接线 { if (!dataManager.IsConnectEventNode(graphElement as ConnectorContainer)) { graphElement.Enable = enable; } } } foreach (GraphElement g in dataManager.GetNextGraphElements(graphElement, false)) { ReBindEventNode(dataManager, list, g, enable); } } }
/// <summary> /// 获取下一个流程图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="graphElement">当前图元</param> /// <param name="metaData">流程图元数据</param> /// <param name="graphElementList">遍历过的图元链表</param> /// <param name="graphElementTable">流程图索引哈希表</param> private void FindNextMetaData(DataManager dataManager, GraphElement graphElement, FlowChartMetaData metaData, List<GraphElement> graphElementList, Hashtable graphElementTable) { graphElementList.Add(graphElement); graphElementTable[graphElement] = metaData; List<GraphElement> list = dataManager.GetNextGraphElements(graphElement, false); foreach (GraphElement g in list) { object data = dataManager.GetData(g); if(!graphElementList.Contains(g)) { DataElement dataElement = dataManager.GetDataElement(g); FlowChartMetaData newMetaData = new FlowChartMetaData(g.ID, data, dataElement.DataType); newMetaData.Code = CodeProvider.CodeProviderClass.ConvertToCode(data, dataElement.DataType); newMetaData.DisplayText = g.TooltipText; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); FindNextMetaData(dataManager, g, newMetaData, graphElementList, graphElementTable); } else { FlowChartMetaData newMetaData = graphElementTable[g] as FlowChartMetaData; newMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(newMetaData); } } if (graphElement is ConditionGraphElement) // 条件结点 { bool avail = true; // 是否需要生成else连接线 foreach(GraphElement g in list) { if(dataManager.GetData(g) == null) // 找到else连接线 { avail = false; break; } } if(avail) // 需要生成else连接线 { FlowChartMetaData lineMetaData = new FlowChartMetaData(0, null, "Line"); lineMetaData.Code = ""; lineMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(lineMetaData); FlowChartMetaData endMetaData = new FlowChartMetaData(0, null, "EndNode"); endMetaData.AddPreviousMetaData(lineMetaData); lineMetaData.AddNextMetaData(endMetaData); } else // 连接线需要重排序 { List<GraphElement> lineList = new List<GraphElement>(); GraphElement elseLine = null; FlowChartMetaData newMetaData; foreach(GraphElement g in list) { if(dataManager.GetData(g) == null) // else连接线 { elseLine = g; } else // 普通连接线 { lineList.Add(g); } } metaData.ClearNextMetaDataList(); foreach(GraphElement g in lineList) { newMetaData = graphElementTable[g] as FlowChartMetaData; metaData.AddNextMetaData(newMetaData); } newMetaData = graphElementTable[elseLine] as FlowChartMetaData; metaData.AddNextMetaData(newMetaData); } } else { if(list.Count == 0) // 当前图元没有后续图元 { FlowChartMetaData lineMetaData = new FlowChartMetaData(0, null, "Line"); lineMetaData.AddPreviousMetaData(metaData); metaData.AddNextMetaData(lineMetaData); FlowChartMetaData endMetaData = new FlowChartMetaData(0, null, "EndNode"); endMetaData.AddPreviousMetaData(lineMetaData); lineMetaData.AddNextMetaData(endMetaData); } } }