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