바코드(editor_barcode) 데모 프로젝트는, 여러 위치에 텍스트나 바코드 개체의 데이타를 실시간 변경해 가면서 가공해야 하는 경우 유용한 데모 프로젝트입니다.
초기화 과정을 살펴보면, 우선 라이브러리 초기화를 실시합니다.
SpiralLab.Sirius2.Core.Initialize();
RTC(IRtc) 및 레이저 (ILaser) 객체들을 생성해 줍니다. 여기에서는 EditorHelper 를 사용하여 외부 설정 파일(config.ini) 에 지정된 여러 장치들을 손쉽게 생성, 초기화 해 줍니다. 또한 가공 절차를 담당하는 마커(Marker) 객체의 생성도 진행합니다.
// Create devices
EditorHelper.CreateDevices(out var rtc, out var laser);
// Assign devices into usercontrol
siriusEditorUserControl1.Rtc = rtc;
siriusEditorUserControl1.Laser = laser;
// Create marker
EditorHelper.CreateMarker(out var marker);
// Assign marker to user control
siriusEditorUserControl1.Marker = marker;
자 이제 바코드 및 텍스트 개체를 수동으로 생성해 보겠습니다.
// Create entities for test. for example: Datamatrix barcode entity
var dataMatrix = EntityFactory.CreateDataMatrix("SIRIUS2", Barcode2DCells.Circles, 3, 4, 4);
dataMatrix.Name = "MyBarcode1";
dataMatrix.IsConvertedText = true;
document.ActAdd(dataMatrix);
// Create entities for test. for example: text entity
var text = EntityFactory.CreateText("Arial", $"SIRIUS2", FontStyle.Bold, 1);
text.Name = "MyText1";
text.IsConvertedText = true;
text.Translate(0, -1);
document.ActAdd(text);
// Create entities for test. for example: 1D barcode entity
var bcd1 = EntityFactory.CreateBarcode("1234567890", Barcode1DFormats.Code128, 3, 6, 2);
bcd1.Name = "MyBarcode1";
bcd1.IsConvertedText = true;
bcd1.Translate(0, -3.2);
// Attach event handler for convert barcode and text data
// Event will be fired every do mark
SpiralLab.Sirius2.Winforms.Config.OnTextConvert += Text_OnTextConvert;
3개의 서로 다른 개체를 생성하였습니다. 아래와 같이 3개의 개체가 생성된 후 화면에 렌더링 된 모습입니다.

이때 IsConvertedText 속성을 True 로 설정하였습니다. 이 값이 False 면 현재 화면에 표시되는 데이타 그대로 가공이 진행됩니다. 반면, 이 값을 True 설정하면, 개체 가공시 OnTextConvert 이벤트에 등록된 핸들러가 호출되고, 이때 반환(리턴)된 데이타로 변경한 이후 가공이 시작되게 됩니다. 때문에 매 가공시 데이타를 변경해야 한다면 IsConvertedText 값을 True 로 설정하고 이벤트 핸들러를 구현해야 합니다.
// Assign 6 offset array positions
var offsets = new List<Offset>()
{
new Offset(-20, 10, 0),
new Offset(0, 10, 0),
new Offset(20, 10, 0),
new Offset(-20, -10, 0),
new Offset(0, -10, 0),
new Offset(20, -10, 0),
};
marker.Offsets = offsets.ToArray();
3개의 개체를 가진 가공 레이아웃(Layout) 을 총 6개의 오프셋 위치에 반복적으로 가공을 하기 위해 Dx,Dy 및 Dz 값 목록을 마커(IMarker)에 지정하였습니다. (지정하지 않을 경우 기본적으로 오프셋은 0,0,0 값으로 초기화 됩니다)
// Do mark procedure as offset first
marker.MarkProcedure = MarkProcedures.OffsetFirst;
마커(IMarker)에서는 두 가지의 가공 절차를 지원합니다. 각각 레이어 우선(Layer First), 오프셋 우선(Offset First) 방식으로, 어떤 대상을 먼저 가공할 것인지를 선택할 수 있습니다. 여기에서는 오프셋 우선(Offset First) 방식을 사용하였습니다.

마커 창(Marker Window)에서는 오프셋(Offset) 목록이 표시되며, 가공 방식(Mark Procedure) 등 현재 설정된 상태 확인 및 변경이 가능합니다. 가공 시작 버튼(Start) 혹은 Marker.Start() 으로 가공을 시작합니다.
아래와 같이 이벤트(OnTextConvert) 핸들러를 등록해 놓았기 때문에 가공이 시작되면, 이벤트 핸들러가 호출됩니다. 여기에서는 개체의 이름을 비교하여 가공 데이타를 변경하는 예를 보여주고 있습니다. 사용자는 이벤트 핸들러를 직접 작성하여 날짜, 시간, 일련번호 등 다양한 데이타 조합으로 변경되도록 구현이 가능합니다.
private string Text_OnTextConvert(IMarker marker, ITextConvertible textConvertible)
{
var entity = textConvertible as IEntity;
switch (entity.Name)
{
case "MyBarcode1":
return $"SIRIUS2 {marker.CurrentOffsetIndex}";
case "MyText1":
return $"SIRIUS2 {DateTime.Now.ToString("HH:mm:ss")} {marker.CurrentOffsetIndex}";
default:
return textConvertible.SourceText;
}
}

또한 변환 이벤트 핸들러 내부에서는 IMarker 의 다양한 값들(Offset Index, Layer Index, Entity Index 등)을 통해 현재 어떤 위치(오프셋)를 가공하려는 것인지, 이때 데이타는 무엇으로 변환할지 여부를 판단할 수 있습니다.

가공중 실시간 데이타가 변경되는 모습

6개의 위치에 가공이 완료되고 마지막 오프셋 위치(5)값으로 데이타가 최종 변경된 모습
(주의) 시뮬레이션 가공일 경우 IMarker 전달되는 값은 MarkerVirtual 이 됩니다.