Allen's 데이터 맛집
C#과 Basler Pylon을 사용한 IntSliderUserControl 클래스 - 정수 파라미터 제어 본문
Programming/Pylon .Net API
C#과 Basler Pylon을 사용한 IntSliderUserControl 클래스 - 정수 파라미터 제어
Allen93 2024. 8. 22. 16:50C#과 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