using LB_VisionControls; using LB_VisionProcesses.Alogrithms; using System.Data; using System.Windows.Forms; namespace LB_VisionProcesses.Processes { public partial class ScriptToolEdit : TAlgorithmEdit { ScriptEditControl ScriptEditControl = new ScriptEditControl(); public ScriptToolEdit(ScriptTool subject = null) { InitializeComponent(); if (subject == null) subject = new ScriptTool(); this.grpScript.Controls.Add(ScriptEditControl); ScriptEditControl.Dock = DockStyle.Fill; this.Subject = subject; this.ScriptEditControl.TabStop = false; // 避免焦点切换 this.ScriptEditControl.Focus();// 确保控件可获得焦点 // 设置高质量渲染模式 SetStyle(ControlStyles.OptimizedDoubleBuffer, true); DataGridInputs.ForeColor = Color.Black; DataGridOutputs.ForeColor = Color.Black; } private void ScriptToolEdit_Load(object sender, EventArgs e) { LoadParas(); this.ScriptEditControl.ScriptText = ProcessParams.ConvertToString(Subject.Params.Inputs["Scrip"]); } DataGridViewComboBoxColumn CreateComboBox(string[] items, string Name = "Type", string HeaderText = "类型" , string DataPropertyName = "Type") { DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn { Name = Name, HeaderText = HeaderText, DataPropertyName = DataPropertyName, //FlatStyle = FlatStyle.Flat, //Width = 120 }; column.Items.AddRange(items); return column; } /// /// 加载运行参数 /// public override void LoadParas() { this.Invoke(new Action(() => { // 绑定输入参数 Dictionary dicInputs = ((ScriptTool)Subject).GetInputs(); DataGridInputs.Columns.Add("Key", "键"); DataGridInputs.Columns.Add("Type", "类"); if (DataGridOutputs.Columns.Contains("Type")) DataGridOutputs.Columns["Type"].ReadOnly = true; //DataGridInputs.Columns.Add(CreateComboBox(((ScriptTool)Subject).SupportTypeArray)); DataGridInputs.Columns.Add("Value", "值"); DataGridInputs.Rows.Clear(); foreach (var item in dicInputs) { // 添加行并设置文本 string type = item.Value?.GetType().Name; int rowIndex = DataGridInputs.Rows.Add(item.Key, type, item.Value); } // 绑定输出参数 Dictionary dicOutputs = Subject.Params.Outputs.GetAllByName(); DataGridOutputs.Columns.Add("Key", "键"); DataGridOutputs.Columns.Add("Type", "类"); if (DataGridOutputs.Columns.Contains("Type")) DataGridOutputs.Columns["Type"].ReadOnly = true; //DataGridOutputs.Columns.Add(CreateComboBox(((ScriptTool)Subject).SupportTypeArray)); DataGridOutputs.Columns.Add("Value", "值"); DataGridOutputs.Rows.Clear(); foreach (var item in dicOutputs) { // 添加行并设置文本 string type = item.Value?.GetType().Name; int rowIndex = DataGridOutputs.Rows.Add(item.Key, type, item.Value); } })); } private void btnCompileCode_Click(object sender, EventArgs e) { Subject.Params.Inputs["Scrip"] = this.ScriptEditControl.ScriptText; ((ScriptTool)Subject).CompileCode(); this.richTextBoxLog.Text = Subject.Msg; } private void btnRunCode_Click(object sender, EventArgs e) { //运行前需要更新输入参数Paras UpdataInputs(); DateTime StartTime = DateTime.Now; Subject.Run(); this.lblRunTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds.ToString("F0")}ms"; this.richTextBoxLog.Text = Subject.Msg; UpdataOutputs(); } /// /// 更新运行参数 /// public override void UpdataInputs() { //设置运行参数 int iResult = 0; Subject.Params.Inputs["Scrip"] = this.ScriptEditControl.ScriptText; Dictionary dicInputs = new Dictionary(); foreach (DataGridViewRow row in DataGridInputs.Rows) { // 使用 row.Cells["列名"] 或 row.Cells[索引] if (row.Cells["Key"].Value == null || string.IsNullOrEmpty(row.Cells["Key"].Value.ToString())) continue; string key = row.Cells["Key"].Value?.ToString(); object value = row.Cells["Value"].Value; if (!string.IsNullOrEmpty(key)) dicInputs.Add(key, value); } ((ScriptTool)Subject).SetInputs(dicInputs); ((ScriptTool)Subject).ClearOutputs(); foreach (DataGridViewRow row in DataGridOutputs.Rows) { // 使用 row.Cells["列名"] 或 row.Cells[索引] if (row.Cells["Key"].Value == null || string.IsNullOrEmpty(row.Cells["Key"].Value.ToString())) continue; string key = row.Cells["Key"].Value?.ToString(); object value = row.Cells["Value"].Value; if (!string.IsNullOrEmpty(key)) Subject.Params.Outputs.Add(key, value); } return; } /// /// 更新输出结果 /// public override void UpdataOutputs() { this.BeginInvoke(new Action(() => { DataGridInputs.Rows.Clear(); foreach (var item in ((ScriptTool)Subject).GetInputs()) { // 添加行并设置文本 string type = item.Value?.GetType().Name ?? "String"; int rowIndex = DataGridInputs.Rows.Add(item.Key, type, item.Value); } DataGridOutputs.Rows.Clear(); foreach (var item in Subject.Params.Outputs.GetAllByName()) { // 添加行并设置文本 string type = item.Value?.GetType().Name ?? "String"; int rowIndex = DataGridOutputs.Rows.Add(item.Key, type, item.Value); } })); } } }