Allen's 데이터 맛집

C#과 Basler Pylon을 사용한 IntSliderUserControl 클래스 - 정수 파라미터 제어 본문

Programming/Pylon .Net API

C#과 Basler Pylon을 사용한 IntSliderUserControl 클래스 - 정수 파라미터 제어

Allen93 2024. 8. 22. 16:50
C#과 Basler Pylon .NET API를 사용하여 카메라의 정수(int) 파라미터를 제어할 수 있는 IntSliderUserControl 클래스에 대해 설명하겠습니다. 이 클래스는 슬라이더 바를 통해 사용자가 카메라의 정수 파라미터를 직관적으로 조작할 수 있도록 도와줍니다.

 


 

클래스 개요

 

IntSliderUserControl 클래스는 Basler Pylon 카메라의 정수 파라미터를 설정하고 제어할 수 있는 사용자 인터페이스를 제공합니다. 슬라이더 바와 함께 최소값, 최대값, 현재 값을 표시하여 사용자가 파라미터를 쉽게 조작할 수 있습니다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using Basler.Pylon;

namespace PylonLiveViewControl
{
    // Displays a slider bar, the name of the node, minimum, maximum, and current value.
    public partial class IntSliderUserControl : UserControl
    {
        // Sets up the initial state.
        public IntSliderUserControl()
        {
            InitializeComponent();
            Reset();
        }

        private IIntegerParameter parameter = null; // The interface of the integer parameter.
        private string defaultName = "N/A";

        // Sets the parameter displayed by the user control.
        public IIntegerParameter Parameter
        {
            set
            {
                // Remove the old parameter.
                if (parameter != null)
                {
                    parameter.ParameterChanged -= ParameterChanged;
                }

                // Set the new parameter.
                parameter = value;
                if (parameter != null)
                {
                    parameter.ParameterChanged += ParameterChanged;
                    labelName.Text = parameter.Advanced.GetPropertyOrDefault(AdvancedParameterAccessKey.DisplayName, parameter.Name);
                    UpdateValues();
                }
                else
                {
                    labelName.Text = defaultName;
                    Reset();
                }
            }
        }

        // Sets the default name of the control.
        public string DefaultName
        {
            set
            {
                defaultName = value;
                if (parameter == null)
                {
                    labelName.Text = defaultName;
                }
            }
            get
            {
                return defaultName;
            }
        }

        // The parameter state changed. Update the control.
        private void ParameterChanged(Object sender, EventArgs e)
        {
            if (InvokeRequired)
            {
                BeginInvoke(new EventHandler<EventArgs>(ParameterChanged), sender, e);
                return;
            }
            try
            {
                UpdateValues();
            }
            catch
            {
                Reset();
            }
        }

        // Deactivate the control.
        private void Reset()
        {
            slider.Enabled = false;
            labelMin.Enabled = false;
            labelMax.Enabled = false;
            labelName.Enabled = false;
            labelCurrentValue.Enabled = false;
        }

        // Get the current values from the parameter and display them.
        private void UpdateValues()
        {
            try
            {
                if (parameter != null)
                {
                    if (parameter.IsReadable)  // Check if parameter is accessible.
                    {
                        // Get values.
                        int min = checked((int)parameter.GetMinimum());
                        int max = checked((int)parameter.GetMaximum());
                        int val = checked((int)parameter.GetValue());
                        int inc = checked((int)parameter.GetIncrement());

                        // Update the slider.
                        slider.Minimum = min;
                        slider.Maximum = max;
                        slider.Value = val;
                        slider.SmallChange = inc;
                        slider.TickFrequency = (max - min + 5) / 10;

                        // Update the displayed values.
                        labelMin.Text = "" + min;
                        labelMax.Text = "" + max;
                        labelCurrentValue.Text = "" + val;

                        // Update accessibility.
                        slider.Enabled = parameter.IsWritable;
                        labelMin.Enabled = true;
                        labelMax.Enabled = true;
                        labelName.Enabled = true;
                        labelCurrentValue.Enabled = true;

                        return;
                    }
                }
            }
            catch
            {
                // If errors occurred disable the control.
            }
            Reset();
        }

        // Handle slider position changes.
        private void slider_Scroll(object sender, EventArgs e)
        {
            if (parameter != null)
            {
                try
                {
                    // Set the value if writable.
                    parameter.TrySetValue(slider.Value, IntegerValueCorrection.Nearest);
                }
                catch
                {
                    // Ignore any errors here.
                }
            }
        }
    }
}

2. 주요 구성 요소 및 기능

a. 초기화 및 리셋

public IntSliderUserControl()
{
    InitializeComponent();
    Reset();
}

private void Reset()
{
    slider.Enabled = false;
    labelMin.Enabled = false;
    labelMax.Enabled = false;
    labelName.Enabled = false;
    labelCurrentValue.Enabled = false;
}
  • 초기화: 클래스 생성자에서 컨트롤을 초기화하고 초기 상태로 리셋합니다.
  • 리셋: 슬라이더와 라벨을 비활성화하여 초기 상태로 만듭니다.

b. 파라미터 설정 및 갱신

private IIntegerParameter parameter = null; // The interface of the integer parameter.
private string defaultName = "N/A";

// Sets the parameter displayed by the user control.
public IIntegerParameter Parameter
{
    set
    {
        if (parameter != null)
        {
            parameter.ParameterChanged -= ParameterChanged;
        }

        parameter = value;
        if (parameter != null)
        {
            parameter.ParameterChanged += ParameterChanged;
            labelName.Text = parameter.Advanced.GetPropertyOrDefault(AdvancedParameterAccessKey.DisplayName, parameter.Name);
            UpdateValues();
        }
        else
        {
            labelName.Text = defaultName;
            Reset();
        }
    }
}
  • 파라미터 설정: 파라미터가 변경될 때마다 이벤트 핸들러를 등록/제거하고, 파라미터 값에 따라 컨트롤을 업데이트합니다.

 

c. 기본 이름 설정

public string DefaultName
{
    set
    {
        defaultName = value;
        if (parameter == null)
        {
            labelName.Text = defaultName;
        }
    }
    get
    {
        return defaultName;
    }
}
  • 기본 이름 설정: 파라미터가 없는 경우 표시할 기본 이름을 설정합니다.

 

d. 파라미터 변경 처리

private void ParameterChanged(Object sender, EventArgs e)
{
    if (InvokeRequired)
    {
        BeginInvoke(new EventHandler<EventArgs>(ParameterChanged), sender, e);
        return;
    }
    try
    {
        UpdateValues();
    }
    catch
    {
        Reset();
    }
}
  • 파라미터 변경 처리: 파라미터 상태가 변경되었을 때 컨트롤 값을 업데이트합니다. 다른 스레드에서 호출된 경우 Invoke 메서드를 사용하여 호출을 적절한 스레드로 마샬링합니다.

 

e. 값 업데이트

private void UpdateValues()
{
    try
    {
        if (parameter != null)
        {
            if (parameter.IsReadable)  // Check if parameter is accessible.
            {
                int min = checked((int)parameter.GetMinimum());
                int max = checked((int)parameter.GetMaximum());
                int val = checked((int)parameter.GetValue());
                int inc = checked((int)parameter.GetIncrement());

                slider.Minimum = min;
                slider.Maximum = max;
                slider.Value = val;
                slider.SmallChange = inc;
                slider.TickFrequency = (max - min + 5) / 10;

                labelMin.Text = "" + min;
                labelMax.Text = "" + max;
                labelCurrentValue.Text = "" + val;

                slider.Enabled = parameter.IsWritable;
                labelMin.Enabled = true;
                labelMax.Enabled = true;
                labelName.Enabled = true;
                labelCurrentValue.Enabled = true;

                return;
            }
        }
    }
    catch
    {
        // If errors occurred, disable the control.
    }
    Reset();
}
  • 값 업데이트: 파라미터 값을 읽어 슬라이더와 라벨을 업데이트합니다. 파라미터가 읽기 가능하고 쓰기 가능한 경우 슬라이더를 활성화하고 값을 설정합니다.

 

f. 슬라이더 변경 처리

private void slider_Scroll(object sender, EventArgs e)
{
    if (parameter != null)
    {
        try
        {
            parameter.TrySetValue(slider.Value, IntegerValueCorrection.Nearest);
        }
        catch
        {
            // Ignore any errors here.
        }
    }
}
  • 슬라이더 변경 처리: 슬라이더 값이 변경될 때 파라미터 값을 업데이트합니다. 슬라이더 값을 가장 가까운 유효 값으로 설정합니다.

 

 

IntSliderUserControl 클래스는 Basler Pylon 카메라의 정수 파라미터를 사용자 인터페이스에서 쉽게 제어할 수 있는 강력한 도구입니다. 슬라이더 바와 함께 최소값, 최대값, 현재 값을 표시하여 사용자가 파라미터를 직관적으로 조작할 수 있도록 도와줍니다.

728x90