using LB_SmartVisionCommon; using LB_VisionControl; using LB_VisionProcesses.Cameras; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; using System.Windows.Media.Media3D; using static ZXing.QrCode.Internal.Mode; namespace LB_SmartVision.Forms.Pages.MotionControlPage { public partial class MotionControlForm : Form { BaseCamera camera { get; set; } UserPictureBox onlinePictureBox { get; set; } string communicatorsName { get; set; } public MotionControlForm() { InitializeComponent(); } string cameraSN = string.Empty; public MotionControlForm(BaseCamera camera) { InitializeComponent(); if (camera == null) return; this.camera = camera; this.Text = camera.SN; textBoxSN.Text = camera.SN; cameraSN = camera.SN; onlinePictureBox = new UserPictureBox(uiGroupBoxImage); this.uiGroupBoxImage.Controls.Clear(); this.uiGroupBoxImage.Controls.Add(onlinePictureBox); onlinePictureBox.Dock = DockStyle.Fill; //加载回调函数 Subscribe(); foreach (var name in GlobalVar.dicCommunicators.Items.Keys) { cmbCom.Items.Add(name); } } ConcurrentDictionary concurrentDictionary = new ConcurrentDictionary(); private void CameraForm_FormClosing(object sender, FormClosingEventArgs e) { if (camera == null) return; camera.StopGrabbing(); camera.StartGrabbing(); if (GlobalVar.dicMotionControlData.Keys.Contains(GlobalVar.strProductName)) { concurrentDictionary = GlobalVar.dicMotionControlData[GlobalVar.strProductName]; double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue; xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text); xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text); yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text); yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text); zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text); zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text); wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text); wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text); pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text); angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text); if (concurrentDictionary.Keys.Contains(cameraSN)) { RecordMotionControlData recordMotionControlData = new RecordMotionControlData { ProductName = GlobalVar.strProductName, CommunicatorsName = communicatorsName, CameraSN = cameraSN, XAxisAddress = this.textBoxXVarAddress.Text, XAxisDetectLocationValue = xAxisDetectLocationValue, XAxisOriginalLocationValue = xAxisOriginalLocationValue, YAxisAddress = this.textBoxYVarAddress.Text, YAxisDetectLocationValue = yAxisDetectLocationValue, YAxisOriginalLocationValue = yAxisOriginalLocationValue, ZAxisAddress = this.textBoxZVarAddress.Text, ZAxisDetectLocationValue = zAxisDetectLocationValue, ZAxisOriginalLocationValue = zAxisOriginalLocationValue, WAxisAddress = this.textBoxWVarAddress.Text, WAxisDetectLocationValue = wAxisDetectLocationValue, WAxisOriginalLocationValue = wAxisOriginalLocationValue, PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text, PulseMotionSpeedValue = pulseMotionSpeedValue, AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text, AngularVelocityValue = angularVelocityValue }; concurrentDictionary.TryAdd(cameraSN, recordMotionControlData); } else { RecordMotionControlData recordMotionControlData = new RecordMotionControlData { ProductName = GlobalVar.strProductName, CommunicatorsName = communicatorsName, CameraSN = cameraSN, XAxisAddress = this.textBoxXVarAddress.Text, XAxisDetectLocationValue = xAxisDetectLocationValue, XAxisOriginalLocationValue = xAxisOriginalLocationValue, YAxisAddress = this.textBoxYVarAddress.Text, YAxisDetectLocationValue = yAxisDetectLocationValue, YAxisOriginalLocationValue = yAxisOriginalLocationValue, ZAxisAddress = this.textBoxZVarAddress.Text, ZAxisDetectLocationValue = zAxisDetectLocationValue, ZAxisOriginalLocationValue = zAxisOriginalLocationValue, WAxisAddress = this.textBoxWVarAddress.Text, WAxisDetectLocationValue = wAxisDetectLocationValue, WAxisOriginalLocationValue = wAxisOriginalLocationValue, PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text, PulseMotionSpeedValue = pulseMotionSpeedValue, AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text, AngularVelocityValue = angularVelocityValue }; concurrentDictionary.TryAdd(cameraSN, recordMotionControlData); } } else { double xAxisDetectLocationValue, xAxisOriginalLocationValue, yAxisDetectLocationValue, yAxisOriginalLocationValue, zAxisDetectLocationValue, zAxisOriginalLocationValue, wAxisDetectLocationValue, wAxisOriginalLocationValue, pulseMotionSpeedValue, angularVelocityValue; xAxisDetectLocationValue = double.Parse(this.textBoxXDetectLocation.Text); xAxisOriginalLocationValue = double.Parse(this.textBoxXOriginalLocation.Text); yAxisDetectLocationValue = double.Parse(this.textBoxYDetectLocation.Text); yAxisOriginalLocationValue = double.Parse(this.textBoxYOriginalLocation.Text); zAxisDetectLocationValue = double.Parse(this.textBoxZDetectLocation.Text); zAxisOriginalLocationValue = double.Parse(this.textBoxZOriginalLocation.Text); wAxisDetectLocationValue = double.Parse(this.textBoxWDetectLocation.Text); wAxisOriginalLocationValue = double.Parse(this.textBoxWOriginalLocation.Text); pulseMotionSpeedValue = double.Parse(this.textBoxPointSpeed.Text); angularVelocityValue = double.Parse(this.textBoxPointSpeed.Text); if (concurrentDictionary.Keys.Contains(cameraSN)) { RecordMotionControlData recordMotionControlData = new RecordMotionControlData { ProductName = GlobalVar.strProductName, CommunicatorsName = communicatorsName, CameraSN = cameraSN, XAxisAddress = this.textBoxXVarAddress.Text, XAxisDetectLocationValue = xAxisDetectLocationValue, XAxisOriginalLocationValue = xAxisOriginalLocationValue, YAxisAddress = this.textBoxYVarAddress.Text, YAxisDetectLocationValue = yAxisDetectLocationValue, YAxisOriginalLocationValue = yAxisOriginalLocationValue, ZAxisAddress = this.textBoxZVarAddress.Text, ZAxisDetectLocationValue = zAxisDetectLocationValue, ZAxisOriginalLocationValue = zAxisOriginalLocationValue, WAxisAddress = this.textBoxWVarAddress.Text, WAxisDetectLocationValue = wAxisDetectLocationValue, WAxisOriginalLocationValue = wAxisOriginalLocationValue, PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text, PulseMotionSpeedValue = pulseMotionSpeedValue, AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text, AngularVelocityValue = angularVelocityValue }; concurrentDictionary.TryAdd(cameraSN, recordMotionControlData); } else { RecordMotionControlData recordMotionControlData = new RecordMotionControlData { ProductName = GlobalVar.strProductName, CommunicatorsName = communicatorsName, CameraSN = cameraSN, XAxisAddress = this.textBoxXVarAddress.Text, XAxisDetectLocationValue = xAxisDetectLocationValue, XAxisOriginalLocationValue = xAxisOriginalLocationValue, YAxisAddress = this.textBoxYVarAddress.Text, YAxisDetectLocationValue = yAxisDetectLocationValue, YAxisOriginalLocationValue = yAxisOriginalLocationValue, ZAxisAddress = this.textBoxZVarAddress.Text, ZAxisDetectLocationValue = zAxisDetectLocationValue, ZAxisOriginalLocationValue = zAxisOriginalLocationValue, WAxisAddress = this.textBoxWVarAddress.Text, WAxisDetectLocationValue = wAxisDetectLocationValue, WAxisOriginalLocationValue = wAxisOriginalLocationValue, PulseMotionSpeedAddress = this.textBoxPulseMotionSpeedAddress.Text, PulseMotionSpeedValue = pulseMotionSpeedValue, AngularVelocityAddress = this.textBoxAngularVelocityAddress.Text, AngularVelocityValue = angularVelocityValue }; concurrentDictionary.TryAdd(cameraSN, recordMotionControlData); } } GlobalVar.dicMotionControlData.TryAdd(GlobalVar.strProductName, concurrentDictionary); ConfigManager>>.SaveConfig>>(GlobalVar.dicMotionControlData, GlobalVar.allMotionControlDataPath); Unsubscribe(); } public void Unsubscribe() { try { if (camera == null) return; //取消回调函数 camera.ImageGrabbed -= GetImageBllComplete; } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } public void Subscribe() { try { if (camera == null) return; //取消回调函数 camera.ImageGrabbed -= GetImageBllComplete; //加载回调函数 camera.ImageGrabbed += GetImageBllComplete; } catch (Exception ex) { // 记录错误信息 Debug.WriteLine($"错误: {ex.Message}"); } } /// /// 相机回调运行 /// /// /// private void GetImageBllComplete(object sender, CameraEventArgs e) { if (e.Bitmap == null) return; lock (e.Bitmap) { if (this.InvokeRequired) // 检查是否需要在UI线程上调用 { this.Invoke(new Action(() => { onlinePictureBox.Image = e.Bitmap; })); // 递归调用自身,但这次在UI线程上 } else { onlinePictureBox.Image = e.Bitmap; } } } private void uiButtonGrabOnce_Click(object sender, EventArgs e) { if (camera == null) return; Task.Factory.StartNew(() => { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software); DateTime startTime = DateTime.Now; // 当前时间 camera.GetImageWithSoftTrigger(out Bitmap bitmap); }); } private void uiButtonCloseSoftGrab_Click(object sender, EventArgs e) { if (camera == null) return; Task.Factory.StartNew(() => { camera.StopGrabbing(); camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software); camera.StartGrabbing(); }); } private void uiButtonHardGrabWithPLC_Click(object sender, EventArgs e) { if (camera == null) return; Task.Factory.StartNew(() => { camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0); camera.StopGrabbing(); camera.StartWith_HardTriggerModel(); }); } private void uiButtonDecreaseX_Click(object sender, EventArgs e) { float xPosition = 0; xPosition = float.Parse(textBoxXPosition.Text); MovePosition(-xPosition, 0, 0, 0); PositionNow(); } private void uiButtonIncreaseX_Click(object sender, EventArgs e) { float xPosition = 0; xPosition = float.Parse(textBoxXPosition.Text); MovePosition(xPosition, 0, 0, 0); PositionNow(); } private void uiButtonDecreaseY_Click(object sender, EventArgs e) { float yPosition = 0; yPosition = float.Parse(textBoxYPosition.Text); MovePosition(0, -yPosition, 0, 0); PositionNow(); } private void uiButtonIncreaseY_Click(object sender, EventArgs e) { float yPosition = 0; yPosition = float.Parse(textBoxYPosition.Text); MovePosition(0, yPosition, 0, 0); PositionNow(); } private void uiButtonDecreaseZ_Click(object sender, EventArgs e) { float zPosition = 0; zPosition = float.Parse(textBoxZPosition.Text); MovePosition(0, 0, -zPosition, 0); PositionNow(); } private void uiButtonIncreaseZ_Click(object sender, EventArgs e) { float zPosition = 0; zPosition = float.Parse(textBoxZPosition.Text); MovePosition(0, 0, zPosition, 0); PositionNow(); } private void uiButtonDecreasePitchAngle_Click(object sender, EventArgs e) { float pitchanglePosition = 0; pitchanglePosition = float.Parse(textBoxPitchAnglePosition.Text); MovePosition(0, 0, 0, -pitchanglePosition); AngNow(); } private void uiButtonIncreasePitchAngle_Click(object sender, EventArgs e) { float pitchanglePosition = 0; pitchanglePosition = float.Parse(textBoxPitchAnglePosition.Text); MovePosition(0, 0, 0, pitchanglePosition); AngNow(); } public float XPositionDt; public float YPositionDt; public float ZPositionDt; public float AnglePositionDt; public void MovePosition(float fDeltaX, float fDeltaY, float fDeltaZ, float fDeltAngle) { XPositionDt += fDeltaX; YPositionDt += fDeltaY; ZPositionDt += fDeltaZ; AnglePositionDt += fDeltAngle; } private void textBoxPointSpeed_TextChanged(object sender, EventArgs e) { float pointspeed = 0; pointspeed = float.Parse(textBoxPointSpeed.Text); } private void textBoxAngSpeed_TextChanged(object sender, EventArgs e) { float angspeed = 0; angspeed = float.Parse(textBoxAngSpeed.Text); } private void textBoxPositionNow_TextChanged(object sender, EventArgs e) { textBoxPositionNow.Enabled = false; string x; string y; string z; x = Convert.ToString(Math.Round(XPositionDt, 3)); y = Convert.ToString(Math.Round(YPositionDt, 3)); z = Convert.ToString(Math.Round(ZPositionDt, 3)); textBoxPositionNow.Text = "(" + x + "," + y + "," + z + ")"; } private void textBoxAngleNow_TextChanged(object sender, EventArgs e) { textBoxAngleNow.Enabled = false; string ang; ang = Convert.ToString(Math.Round(AnglePositionDt, 3)); textBoxAngleNow.Text = ang; } private void PositionNow() { string x; string y; string z; x = Convert.ToString(Math.Round(XPositionDt, 3)); y = Convert.ToString(Math.Round(YPositionDt, 3)); z = Convert.ToString(Math.Round(ZPositionDt, 3)); textBoxPositionNow.Text = "(" + x + y + z + ")"; } private void AngNow() { string ang; ang = Convert.ToString(Math.Round(AnglePositionDt, 3)); textBoxAngleNow.Text = "(" + ang + ")"; } private void uiGroupBoxMotionControl_Enter(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } private void tableLayoutPanel3_Paint(object sender, PaintEventArgs e) { } private void uiSplitContainer1_Panel1_Paint(object sender, PaintEventArgs e) { } // 使用KeyDown事件更适合处理回车键 private void textBoxXPosition_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { //// 验证输入 //if (ValidateXPosition()) //{ // // 执行确认操作 // ProcessXPosition(); //} // 阻止系统声音并让文本框失去焦点 e.SuppressKeyPress = true; e.Handled = true; this.ActiveControl = null; } } // 使用KeyPress验证实时输入 private void textBoxXPosition_KeyPress(object sender, KeyPressEventArgs e) { // 允许回车键(虽然KeyDown会处理它) if (e.KeyChar == (char)Keys.Enter) return; // 允许退格键 if (e.KeyChar == (char)Keys.Back) return; // 只允许数字 if (!char.IsDigit(e.KeyChar)) { e.Handled = true; // 阻止输入 } } // 验证方法 private bool ValidateXPosition() { if (string.IsNullOrWhiteSpace(textBoxXPosition.Text)) return false; return Regex.IsMatch(textBoxXPosition.Text, @"^\d+$"); } // 处理确认的方法 private void ProcessXPosition() { if (int.TryParse(textBoxXPosition.Text, out int xPosition)) { // 执行逻辑 //LogInfo?.Invoke($"X位置已更新为: {xPosition}", LogInfoType.INFO); } } private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) { } private void cmbCom_SelectedIndexChanged(object sender, EventArgs e) { communicatorsName = cmbCom.Text; } } }