/// <summary> /// 检查是否更新事件结点 /// </summary> /// <param name="graphElement">当前图元</param> /// <param name="eventNode">事件结点</param> /// <returns>是否需要更新</returns> protected virtual bool CheckCanBindEventNode(GraphElement graphElement, EventGraphElement eventNode) { bool avail = true; GraphManager graphManager = data as GraphManager; DataManager dataManager = graphManager.CurrentFlowChartManager.CurrentDataManager; IComparable com1; IComparable com2; if (graphElement is SlotContainer) // 插槽容器 { SlotContainer slotContainer = graphElement as SlotContainer; if (slotContainer.EventNode != null && slotContainer.EventNode != eventNode) { com1 = dataManager.GetData(slotContainer.EventNode) as IComparable; com2 = dataManager.GetData(eventNode) as IComparable; avail = (com1.CompareTo(com2) == 0); } } else if (graphElement is ConnectorContainer) // 连接线 { ConnectorContainer line = graphElement as ConnectorContainer; if (line.EventNode != null && line.EventNode != eventNode) { com1 = dataManager.GetData(line.EventNode) as IComparable; com2 = dataManager.GetData(eventNode) as IComparable; avail = (com1.CompareTo(com2) == 0); } } return(avail); }
/// <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="slotContainerList">插槽容器链表</param> /// <returns>图元数据链表</returns> protected virtual List <FlowChartMetaData> GetMetaData(DataManager dataManager, List <SlotContainer> slotContainerList) { List <FlowChartMetaData> metaDataList = new List <FlowChartMetaData>(); List <GraphElement> graphElementList = new List <GraphElement>(); Hashtable graphElementTable = new Hashtable(); foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer.IsEntrance) { object data = dataManager.GetData(slotContainer); DataElement dataElement = dataManager.GetDataElement(slotContainer); FlowChartMetaData metaData = new FlowChartMetaData(slotContainer.ID, data, slotContainer.TypeString); metaData.DisplayText = slotContainer.TooltipText; FindNextMetaData(dataManager, slotContainer, metaData, graphElementList, graphElementTable); metaDataList.Add(metaData); } } return(metaDataList); }
/// <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="slotContainerList">插槽容器链表</param> /// <returns>图元数据链表</returns> protected virtual List<FlowChartMetaData> GetMetaData(DataManager dataManager, List<SlotContainer> slotContainerList) { List<FlowChartMetaData> metaDataList = new List<FlowChartMetaData>(); List<GraphElement> graphElementList = new List<GraphElement>(); Hashtable graphElementTable = new Hashtable(); foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer.IsEntrance) { object data = dataManager.GetData(slotContainer); DataElement dataElement = dataManager.GetDataElement(slotContainer); FlowChartMetaData metaData = new FlowChartMetaData(slotContainer.ID, data, slotContainer.TypeString); metaData.DisplayText = slotContainer.TooltipText; FindNextMetaData(dataManager, slotContainer, metaData, graphElementList, graphElementTable); metaDataList.Add(metaData); } } return metaDataList; }
/// <summary> /// 编辑图元 /// </summary> /// <param name="flowChartManager">绘图管理器</param> /// <param name="logicData">逻辑数据</param> /// <returns>是否操作成功</returns> protected virtual bool LogicEdit(FlowChartManager flowChartManager, object logicData) { bool executeResult = true; GraphManager graphManager = flowChartManager.CurrentGraphManager; DataManager dataManager = flowChartManager.CurrentDataManager; DocumentManager documentManager = DocumentManager.GetDocumentManager(); GraphElement graphElement = logicData as GraphElement; DataElement dataElement = dataManager.GetDataElement(graphElement); object data = dataManager.GetData(graphElement); Hashtable information = new Hashtable(); information["data"] = data; information["prev_data"] = dataManager.GetPreviousData(graphElement); information["next_data"] = dataManager.GetNextData(graphElement); information["neighbor_data"] = dataManager.GetNeighborData(graphElement); information["globe_args"] = dataManager.GlobeArgs; information["flowchart_name"] = flowChartManager.Name; information["map_name"] = flowChartManager.MapName; information["client_dir"] = Helper.GetHelper().OutputDir; dataElement.PrintInformation = new DataElement.PrintInfo(documentManager.PrintText); try { executeResult = dataElement.EditData(information); } catch (Exception ex) { executeResult = false; MessageBox.Show("当前图元由于以下原因无法编辑:\n\n" + ex.Message, "图元编辑", MessageBoxButtons.OK, MessageBoxIcon.Information); } if (executeResult) // 保存图元数据 { Hashtable previousDataTable = information["prev_data"] as Hashtable; Hashtable nextDataTable = information["next_data"] as Hashtable; GraphElement currentGraphElement; DataElement editDataElement; // 检查是否需要更新图元和数据元的数据 foreach (string id in previousDataTable.Keys) { editDataElement = previousDataTable[id] as DataElement; if (editDataElement != null && editDataElement.Data == null) { currentGraphElement = dataManager.FindGraphElementByID(int.Parse(id)); currentGraphElement.Text = editDataElement.Text; currentGraphElement.TooltipText = editDataElement.TooltipText; currentGraphElement.ShowText = false; } } foreach (string id in nextDataTable.Keys) { editDataElement = nextDataTable[id] as DataElement; if (editDataElement != null && editDataElement.Data == null) { currentGraphElement = dataManager.FindGraphElementByID(int.Parse(id)); currentGraphElement.Text = editDataElement.Text; currentGraphElement.TooltipText = editDataElement.TooltipText; currentGraphElement.ShowText = false; } } graphElement.TooltipText = dataElement.TooltipText; graphElement.Text = dataElement.Text; if (string.IsNullOrEmpty(dataElement.Text)) { graphElement.ShowText = false; } else { graphElement.ShowText = true; } // 调整文本 if (graphElement is SlotContainer) { SlotContainer slotContainer = graphElement as SlotContainer; slotContainer.AdjustText(); // 根据文本内容调整插槽容器的大小 slotContainer.AdjustElementSize(); } else if (graphElement is ConnectorContainer) { ConnectorContainer line = graphElement as ConnectorContainer; line.AdjustText(); } } return(executeResult); }
/// <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="slotContainer">插槽容器</param> private void CheckLineValid(DataManager dataManager, SlotContainer slotContainer) { int invalidLineCount = 0; List<ConnectorContainer> list = new List<ConnectorContainer>(); foreach (SlotGraphElement slot in slotContainer.GetOutSlotList()) { if (slot.Binded) { object data = dataManager.GetData(slot.BindingConnector.Line); if (data == null) { list.Add(slot.BindingConnector.Line); invalidLineCount++; } else { slot.BindingConnector.Line.Invalid = false; } } } if (invalidLineCount == 1) // 无效连接线数等于1 { foreach (ConnectorContainer line in list) { line.Invalid = false; line.Text = "else"; line.ShowText = true; line.AdjustText(); } } else if (invalidLineCount > 1) // 无效连接线数大于1 { foreach (ConnectorContainer line in list) { line.Invalid = true; line.Text = "×"; line.ShowText = true; line.AdjustText(); } } else { foreach (ConnectorContainer line in list) { line.Invalid = false; line.ShowText = false; } } }
/// <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); } } }
/// <summary> /// 获取流程图元数据 /// </summary> /// <param name="dataManager">数据管理器</param> /// <param name="slotContainerList">流程图插槽容器的链表</param> /// <returns>流程图元数据的链表</returns> protected override List<FlowChartMetaData> GetMetaData(DataManager dataManager, List<SlotContainer> slotContainerList) { List<FlowChartMetaData> metaDataList = new List<FlowChartMetaData>(); List<GraphElement> graphElementList = new List<GraphElement>(); Hashtable graphElementTable = new Hashtable(); foreach (SlotContainer slotContainer in slotContainerList) { if (slotContainer is EventGraphElement) { object data = dataManager.GetData(slotContainer); DataElement dataElement = dataManager.GetDataElement(slotContainer); FlowChartMetaData metaData = new FlowChartMetaData(slotContainer.ID, data, "EventNode"); metaData.Code = CodeProvider.CodeProviderClass.ConvertToCode(data, dataElement.DataType); metaData.DisplayText = slotContainer.TooltipText; FindNextMetaData(dataManager, slotContainer, metaData, graphElementList, graphElementTable); metaDataList.Add(metaData); } } return metaDataList; }