LB_VisionProcesses/Cameras/2DCameraForm.cs
@@ -1,5 +1,8 @@
using HalconDotNet;
using LB_SmartVisionCameraDevice.PHM6000;
using LB_VisionControl;
using LB_VisionProcesses.Cameras.HRCameras;
using LB_VisionProcesses.Cameras.LBCameras;
using MVSDK_Net;
using Newtonsoft.Json.Linq;
using OpenCvSharp;
@@ -37,9 +40,9 @@
        {
            InitializeComponent();
            //传入相机句柄后禁用连接/断开按键
            this.btnOpen.Enabled = false;
            this.btnClose.Enabled = false;
            this.cmbBrand.Enabled = false;
            //this.btnOpen.Enabled = false;
            //this.btnClose.Enabled = false;
            //this.cmbBrand.Enabled = false;
            this.panel_Picture.Controls.Clear();
            this.dicCameras = dicCameras;
@@ -107,6 +110,12 @@
                cmbSN.Text = SN;
                cmbSN.SelectedIndex = Index;
                // 如果没找到索引(可能是新增的),手动触发一次逻辑以更新UI
                if (Index == -1)
                {
                    cmbSN_SelectedIndexChanged(null, null);
                }
                ckbLocalTest.Checked = Convert.ToBoolean(camConfig.Params.Inputs["是否本地取图"].ToString());
                ckbUpParams.Checked = Convert.ToBoolean(camConfig.Params.Inputs["是否每次写入参数"].ToString());
                ckbRegrab.Checked = Convert.ToBoolean(camConfig.Params.Inputs["是否失败重新取图"].ToString());
@@ -154,10 +163,10 @@
                switch (brand)
                {
                    case CameraBrand.HRCamera:
                        //camera = new HRCamera();
                        camera = new HRCamera();
                        break;
                    case CameraBrand.LBCamera:
                        //camera = new LBCamera();
                        camera = new PHM6000Camera();
                        break;
                    default:
                        Debug.WriteLine("未知品牌");
@@ -195,14 +204,26 @@
                camera = dicCameras[cmbSN.Text];
            //说明相机已经初始化成功
            if (camera != null && camera.isGrabbing)
            if (camera != null)
            {
                camera.ImageGrabbed -= GetImageBllComplete;
                camera.ImageGrabbed += GetImageBllComplete;
                int Index = cmbBrand.FindString(camera.Brand.ToString());
                if (Index >= 0)
                {
                    cmbBrand.Text = camera.Brand.ToString();
                    cmbBrand.SelectedIndex = Index;
                }
                int Index = cmbBrand.FindString(camera.Brand.ToString()); ;
                cmbBrand.Text = camera.Brand.ToString();
                cmbBrand.SelectedIndex = Index;
                if (camera.isGrabbing)
                {
                    camera.ImageGrabbed -= GetImageBllComplete;
                    camera.ImageGrabbed += GetImageBllComplete;
                    this.btnEdit.Enabled = true;
                }
                // 如果相机存在于字典中,说明是已连接的设备,允许编辑
                else if (dicCameras != null && dicCameras.ContainsKey(camera.SN))
                {
                    this.btnEdit.Enabled = true;
                }
            }
        }
@@ -221,10 +242,10 @@
                switch (brand)
                {
                    case CameraBrand.LBCamera:
                        //camera = new LBCamera();
                        camera = new PHM6000Camera();
                        break;
                    case CameraBrand.HRCamera:
                        //camera = new HRCamera();
                        camera = new HRCamera();
                        break;
                    default:
                        Debug.WriteLine($"【{DateTime.Now:HH:mm:ss.fff}】未知品牌");
@@ -236,6 +257,7 @@
                    camera.ImageGrabbed -= GetImageBllComplete;
                    camera.ImageGrabbed += GetImageBllComplete;
                    MessageBox.Show(camera.SN + "打开成功");
                    this.btnEdit.Enabled = true;
                }
            }
            else
@@ -281,7 +303,81 @@
        private void btnEdit_Click(object sender, EventArgs e)
        {
            if (camera == null)
            {
                return;
            }
            using (Form editForm = new Form())
            {
                editForm.Text = "高级参数设置 - " + camera.SN;
                editForm.Size = new System.Drawing.Size(400, 500);
                editForm.StartPosition = FormStartPosition.CenterParent;
                editForm.FormBorderStyle = FormBorderStyle.SizableToolWindow;
                PropertyGrid pg = new PropertyGrid();
                pg.Dock = DockStyle.Fill;
                if (camera is PHM6000Camera phmCamera)
                {
                    pg.SelectedObject = phmCamera.GetSensorConfig();
                    pg.PropertyValueChanged += (s, ev) =>
                    {
                        phmCamera.UpdateSensorConfig((PHM6000SensorConfig)pg.SelectedObject);
                    };
                }
                else
                {
                    pg.SelectedObject = new CameraAdvancedSettings(camera);
                }
                editForm.Controls.Add(pg);
                editForm.ShowDialog();
            }
        }
        /// <summary>
        /// 相机高级设置包装类
        /// </summary>
        public class CameraAdvancedSettings
        {
            private BaseCamera _camera;
            public CameraAdvancedSettings(BaseCamera camera)
            {
                _camera = camera;
            }
            [System.ComponentModel.Category("触发设置"), System.ComponentModel.Description("触发源")]
            public TriggerSource TriggerSource
            {
                get { _camera.GetTriggerMode(out _, out TriggerSource s); return s; }
                set { _camera.GetTriggerMode(out TriggerMode m, out _); _camera.SetTriggerMode(m, value); }
            }
            [System.ComponentModel.Category("触发设置"), System.ComponentModel.Description("触发极性")]
            public TriggerPolarity TriggerPolarity
            {
                get { _camera.GetTriggerPolarity(out TriggerPolarity p); return p; }
                set { _camera.SetTriggerPolarity(value); }
            }
            [System.ComponentModel.Category("触发设置"), System.ComponentModel.Description("触发延时(us)")]
            public double TriggerDelay
            {
                get { _camera.GetTriggerDelay(out double d); return d; }
                set { _camera.SetTriggerDelay(value); }
            }
            [System.ComponentModel.Category("触发设置"), System.ComponentModel.Description("触发滤波(us)")]
            public double TriggerFilter
            {
                get { _camera.GetTriggerFliter(out double f); return f; }
                set { _camera.SetTriggerFliter(value); }
            }
            [System.ComponentModel.Category("图像设置"), System.ComponentModel.Description("自动白平衡")]
            public void AutoBalanceWhite()
            {
                _camera.AutoBalanceWhite();
            }
        }
        /// <summary>
@@ -516,9 +612,25 @@
            if (res == DialogResult.Yes)  //保存VPP
            {
                TriggerSource actualSource = TriggerSource.Line0;
                TriggerPolarity polarity = TriggerPolarity.RisingEdge;
                double delay = 0;
                double filter = 0;
                if (camera != null)
                {
                    camera.GetTriggerMode(out _, out actualSource);
                    camera.GetTriggerPolarity(out polarity);
                    camera.GetTriggerDelay(out delay);
                    camera.GetTriggerFliter(out filter);
                }
                camConfig.Params.Inputs.Add("相机SN", cmbSN.Text);
                camConfig.Params.Inputs.Add("触发模式", TriggerMode.On);
                camConfig.Params.Inputs.Add("触发方式", radioButtonSoft.Checked ? TriggerSource.Software : TriggerSource.Line0);
                camConfig.Params.Inputs.Add("触发方式", radioButtonSoft.Checked ? TriggerSource.Software : actualSource);
                camConfig.Params.Inputs.Add("触发极性", polarity);
                camConfig.Params.Inputs.Add("触发延时", delay);
                camConfig.Params.Inputs.Add("触发消抖", filter);
                camConfig.Params.Inputs.Add("是否本地取图", ckbLocalTest.Checked);
                camConfig.Params.Inputs.Add("本地取图路径", cmbImagesPath.Items.Cast<string>().ToList());
                camConfig.Params.Inputs.Add("是否失败重新取图", ckbRegrab.Checked);
@@ -547,10 +659,11 @@
                camera.ImageGrabbed -= GetImageBllComplete;
                camera.StopGrabbing();
                camera.GetTriggerMode(out _, out TriggerSource actualSource);
                if (radioButtonSoft.Checked)
                    camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
                else
                    camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
                    camera.SetTriggerMode(TriggerMode.On, actualSource);
                camera.StartGrabbing();
            }
@@ -620,10 +733,21 @@
            if (camera == null)
                return;
            camera.GetTriggerMode(out _, out TriggerSource currentSource);
            if (radioButtonSoft.Checked)
            {
                camera.SetTriggerMode(TriggerMode.On, TriggerSource.Software);
            }
            else
                camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
            {
                // 如果当前已经是硬件触发源,则保持;否则默认Line0
                if (currentSource == TriggerSource.Software)
                    camera.SetTriggerMode(TriggerMode.On, TriggerSource.Line0);
                else
                    camera.SetTriggerMode(TriggerMode.On, currentSource);
            }
        }
        System.Windows.Forms.ToolTip ToolTip = new System.Windows.Forms.ToolTip();
@@ -649,12 +773,17 @@
        private void controlBox_2DCameraForm_Click(object sender, EventArgs e)
        {
        }
        private void dungeonControlBox_2DCameraForm_Click(object sender, EventArgs e)
        {
           // this.Close();
            // this.Close();
        }
        private void theme_2DCameraForm_Click(object sender, EventArgs e)
        {
        }
    }
}