/// <summary> /// 执行命令 /// </summary> /// <param name="o">命令的参数</param> /// <returns>是否执行成功</returns> public override bool Execute(object o) { bool success = true; Point currentPoint = (Point)o; Size moveSize = Size.Empty; // 保存命令执行前的数据 if (firstCommand) // 只有第一条命令保存执行前的数据 { SaveBeforeExecute(flowChartManager.GetArguments()); } description = "粘贴图元"; Hashtable table = CopyGraphElement(documentManager.CopyTable); // 计算图元粘贴位置偏移 List <GraphElement> graphElementList = new List <GraphElement>(); foreach (object key in table.Keys) { graphElementList.Add(key as GraphElement); } moveSize = InitMoveSize(graphElementList, currentPoint); // 加入到绘图容器中 foreach (object key in table.Keys) { if (key is SlotContainer) // 插槽容器 { SlotContainer slotContainer = key as SlotContainer; slotContainer.Move(moveSize); graphManager.SlotContainerList.Add(slotContainer); // 分配新的图元ID slotContainer.ID = graphManager.AllocateGraphElementID(); // 复制数据 dataManager.AddDataElement(slotContainer); dataManager.SetData(slotContainer, table[key]); dataManager.ReloadData(slotContainer); } else if (key is ConnectorContainer) // 连接线 { ConnectorContainer line = key as ConnectorContainer; foreach (ConnectorGraphElement connector in line.GetConnectorList()) // 移动连接线控制点 { if (!connector.Binded) // 连接线控制点不是连接线的头结点和尾结点 { connector.Move(moveSize); } } graphManager.ConnectorContainerList.Add(line); // 分配新的图元ID line.ID = graphManager.AllocateGraphElementID(); // 复制数据 dataManager.AddDataElement(line); dataManager.SetData(line, table[key]); dataManager.ReloadData(line); } } // 检查事件结点是否有效 foreach (object key in table.Keys) { if (key is SlotContainer) // 插槽容器 { SlotContainer slotContainer = key as SlotContainer; slotContainer.Enable = dataManager.IsConnectEventNode(slotContainer); } else if (key is ConnectorContainer) // 连接线 { ConnectorContainer line = key as ConnectorContainer; line.Enable = dataManager.IsConnectEventNode(line); } } flowChartManager.PasteTable = table; if (success) // 保存命令执行后的数据 { flowChartManager.ContentChanged = true; SaveAfterExecute(flowChartManager.GetArguments()); } return(success); }