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