Allen's 데이터 맛집

C#과 Basler Pylon을 사용한FloatSliderUserControl 클래스 본문

Programming/Pylon .Net API

C#과 Basler Pylon을 사용한FloatSliderUserControl 클래스

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

 

클래스 개요

FloatSliderUserControl 클래스는 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 parameter, minimum, maximum, and current value.
    public partial class FloatSliderUserControl : UserControl
    {
        // Sets up the initial state.
        public FloatSliderUserControl()
        {
            InitializeComponent();
            Reset();
        }

        private IFloatParameter parameter = null; // The interface of the float parameter.
        private string defaultName = "N/A";
        private bool sliderMoving = false;

        // Sets the parameter displayed by the user control.
        public IFloatParameter 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;
            }
        }

        // Occurs when the parameter state has changed. Updates 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 and deregister the callback.
        private void Reset()
        {
            slider.Enabled = false;
            labelMin.Enabled = false;
            labelMax.Enabled = false;
            labelName.Enabled = false;
            labelCurrentValue.Enabled = false;
        }

        // Converts slider range to percent value.
        private int PercentToSliderValue(double percent)
        {
            return (int)((100000.0 / 100.0) * percent);
        }

        // Converts percent value to slider range.
        private double SliderToPercentValue(int sliderValue)
        {
            return (((double)sliderValue) / 100000.0) * 100.0;
        }

        // Gets the current values from the node and displays them.
        private void UpdateValues()
        {
            try
            {
                if (parameter != null)
                {
                    if (parameter.IsReadable)  // Check if the parameter is readable.
                    {
                        // Get the values.
                        double min = parameter.GetMinimum();
                        double max = parameter.GetMaximum();
                        double val = parameter.GetValue();
                        double percent = parameter.GetValuePercentOfRange();

                        // Update the slider.
                        slider.Minimum = PercentToSliderValue(0);
                        slider.Maximum = PercentToSliderValue(100);
                        slider.Value = PercentToSliderValue(percent);
                        slider.SmallChange = PercentToSliderValue(0.05);
                        slider.TickFrequency = PercentToSliderValue(10);

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

                        // Update the access status.
                        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();
        }

        // Occurs when the slider position changes.
        private void slider_Scroll(object sender, EventArgs e)
        {
            if (parameter != null)
            {
                try
                {
                    if (parameter.IsWritable && !sliderMoving)
                    {
                        // Break any recursion if the value does not exactly match the slider value.
                        sliderMoving = true;

                        // Set the value.
                        parameter.SetValuePercentOfRange(SliderToPercentValue(slider.Value));
                    }
                }
                catch
                {
                    // Ignore any errors here.
                }
                finally
                {
                    sliderMoving = false;
                }
            }
        }
    }
}

 

 

2. 주요 구성 요소 및 기능

 

a. 초기화 및 리셋

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

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

 

b. 파라미터 설정 및 갱신

private IFloatParameter parameter = null; // The interface of the float parameter.
private string defaultName = "N/A";
private bool sliderMoving = false;

// Sets the parameter displayed by the user control.
public IFloatParameter 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. 슬라이더 값 변환

// Converts slider range to percent value.
private int PercentToSliderValue(double percent)
{
    return (int)((100000.0 / 100.0) * percent);
}

// Converts percent value to slider range.
private double SliderToPercentValue(int sliderValue)
{
    return (((double)sliderValue) / 100000.0) * 100.0;
}
  • 슬라이더 값 변환: 슬라이더 범위를 백분율 값으로 변환하고, 백분율 값을 슬라이더 범위로 변환하는 메서드입니다.

 

f. 값 업데이트

private void UpdateValues()
{
    try
    {
        if (parameter != null)
        {
            if (parameter.IsReadable)  // Check if the parameter is readable.
            {
                double min = parameter.GetMinimum();
                double max = parameter.GetMaximum();
                double val = parameter.GetValue();
                double percent = parameter.GetValuePercentOfRange();

                slider.Minimum = PercentToSliderValue(0);
                slider.Maximum = PercentToSliderValue(100);
                slider.Value = PercentToSliderValue(percent);
                slider.SmallChange = PercentToSliderValue(0.05);
                slider.TickFrequency = PercentToSliderValue(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();
}
  • 값 업데이트: 파라미터 값을 읽어 슬라이더와 라벨을 업데이트합니다. 파라미터가 읽기 가능하고 쓰기 가능한 경우 슬라이더를 활성화하고 값을 설정합니다.

 

g. 슬라이더 변경 처리

private void slider_Scroll(object sender, EventArgs e)
{
    if (parameter != null)
    {
        try
        {
            if (parameter.IsWritable && !sliderMoving)
            {
                sliderMoving = true;
                parameter.SetValuePercentOfRange(SliderToPercentValue(slider.Value));
            }
        }
        catch
        {
            // Ignore any errors here.
        }
        finally
        {
            sliderMoving = false;
        }
    }
}
  • 슬라이더 변경 처리: 슬라이더 값이 변경될 때 파라미터 값을 업데이트합니다. 슬라이더가 움직이는 동안 재귀 호출을 방지합니다.

 

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

728x90