Allen's 데이터 맛집
C#과 Basler Pylon을 사용한FloatSliderUserControl 클래스 본문
Programming/Pylon .Net API
C#과 Basler Pylon을 사용한FloatSliderUserControl 클래스
Allen93 2024. 8. 20. 16:44C#과 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