/// <summary> /// 显示AI动作的数据 /// </summary> /// <param name="action">AI动作</param> private void ShowActionData(AI_Action action) { this.textBoxX1.Text = action.Info; for (int i = 0; i < 5; i++) { // 多余的参数,禁止掉 if (i >= action.Args.Count) { labelArray[i].Text = "-"; comboBoxArray[i].Text = ""; comboBoxArray[i].Enabled = false; checkBoxArray[i].Checked = false; checkBoxArray[i].Enabled = false; } else { AI_Parm parm = action.Args[i]; // 步骤1:初始化枚举(常数)列表 如果是枚举,则添加枚举项进来。 comboBoxArray[i].Enabled = true; comboBoxArray[i].Items.Clear(); if (parm.m_type > 0) { comboBoxArray[i].Items.AddRange(EnumTable.GetEnumTypeByID(parm.m_type.ToString()).Items.ToArray()); } // 改标签 string strLab = null; switch (parm.m_type) { case -1: { strLab = "数字"; // 目前只支持数字的变量类型 checkBoxArray[i].Enabled = true; break; } case -2: { strLab = "字符串"; // 暂时不支持字符串的变量类型 checkBoxArray[i].Enabled = false; break; } default: { strLab = "枚举"; // 暂时不支持枚举的变量类型 checkBoxArray[i].Enabled = false; break; } } if (parm.Name.Length > 10) { labelArray[i].Text = string.Format("{0}... ({1})", parm.Name.Substring(0, 8), strLab); } else { labelArray[i].Text = string.Format("{0} ({1})", parm.Name, strLab); } // 步骤2:初始化 模板参数,如果定义了这种类型的模板变量,就加进来。 comboBoxArray[i].Items.AddRange(AI_TemplateParmTable.GetAIParamTemplateTable().AIParamItemList.ToArray()); // 步骤3:设值 if (parm.Value != null) { comboBoxArray[i].Text = parm.Value.ToString(); } else { comboBoxArray[i].Text = ""; } // 步骤4:读取参数类型 checkBoxArray[i].Checked = parm.IsVar; } } }
/// <summary> /// 选择确定 /// </summary> /// <param name="sender">事件发送者</param> /// <param name="e">事件参数</param> private void buttonX1_Click(object sender, EventArgs e) { AI_Action newAction = null; if (tabControl1.SelectedTabIndex == 0) // 选择系统Action { Node currentNode = actionTree.SelectedNode; if (currentNode != null && currentNode.Level == 1) { AI_Action selectedAction = actionTable[currentNode.Tag.ToString()] as AI_Action; if (selectedAction != null) { // 第一步,检查输入数据正确性 for (int i = 0; i < selectedAction.Args.Count; i++) { if (!CheckParameterValid(selectedAction.Args[i].m_type, comboBoxArray[i].Text, checkBoxArray[i].Checked)) { MessageBox.Show(string.Format("{0}参数值无效!", labelArray[i].Text), "参数检查", MessageBoxButtons.OK, MessageBoxIcon.Error); comboBoxArray[i].Focus(); return; } } // 第二步,把输入数据存到Action里 newAction = selectedAction.Clone() as AI_Action; for (int i = 0; i < newAction.Args.Count; i++) { AI_Parm parm = newAction.Args[i]; object objSelect = comboBoxArray[i].SelectedItem; if (comboBoxArray[i].Text.StartsWith("<") && comboBoxArray[i].Text.EndsWith(">")) // 模板参数 { if (checkBoxArray[i].Checked) { MessageBox.Show("模板参数不能为变量类型!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); comboBoxArray[i].Focus(); return; } parm.m_IsTemplateParm = true; AI_TemplateParmItem tpitem = objSelect as AI_TemplateParmItem; if (objSelect == null) { MessageBox.Show("参数错误", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); comboBoxArray[i].Focus(); return; } int index = AI_TemplateParmTable.GetAIParamTemplateTable().GetAIParamIndex(tpitem.Name); parm.SetTemplateValue(index.ToString()); } else // 非模板参数 { parm.m_IsTemplateParm = false; if (objSelect == null) // 是填的,不是选的,那就是字符串或者数字了 { parm.m_Value = comboBoxArray[i].Text; } else if (objSelect is EnumItem) // 是枚举 { EnumItem ei = objSelect as EnumItem; parm.m_Value = ei.m_asParentsPos.ToString(); } } // 记录下是否是变量类型 parm.IsVar = checkBoxArray[i].Checked; } } } else { MessageBox.Show("请先选择动作!", "参数检查", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } else // 选择自定义Action { string functionName = actionNameBox.Text; string functionText = codeEditBox.Text; string returnValue = ""; if (functionName == "") { MessageBox.Show("动作名不能为空!", "参数检查", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (functionText == "") { MessageBox.Show("自定义脚本不能为空!", "参数检查", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } for (int i = 0; i < 3; i++) { if (returnValueBoxArray[i].Text.Trim() != "") { returnValue += string.Format("{0},", returnValueBoxArray[i].Text.Trim()); } else { break; } } returnValue = returnValue.TrimEnd(new char[] { ',' }); if (returnValue == "") { MessageBox.Show("至少需要有一个返回值!", "参数检查", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } int actionID = graphElementID + 2000; if (inActionGroup) // 动作组内的自定义动作需要重新分配ID { actionID = (graphElementID + 2000) * 10 + groupIndex; } string englishName = GetFunctionName(functionText); if (!CheckScriptValid(functionText)) // 检查脚本有效性 { MessageBox.Show("脚本必须在最后明确返回执行结果(如:return 1)!", "脚本检查", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } if (!AIDiagramHelper.CheckScript(codeEditBox, functionText)) // 没有通过脚本检查 { if (MessageBox.Show("没有通过脚本检查,是否重新编辑脚本?", "脚本检查", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK) { return; } } newAction = new AI_Action(); newAction.ActionID = actionID.ToString(); newAction.Name = functionName; newAction.Info = functionText; newAction.Ename = englishName; newAction.Args = new List <AI_Parm>(); newAction.rettype = returnValue; } singleAction.Action = newAction; editSuccess = true; this.DialogResult = DialogResult.OK; this.Close(); }