앞서 사용자 컨트롤(User Control) 을 도구상자(ToolBox)에 추가하는 방법을 설명드렸습니다. 이번에는 이를 이용해 실제 뷰어/에디터를 만들어 보겠습니다.
- 윈폼(Winforms) 에 시리우스 뷰어(SiriusEditorForm) 추가하기
윈폼 프로젝트를 하나 생성하고 도구상자에 추가된 SiriusEditorForm 사용자 컨트롤을 드래그 앤 드롭 합니다. 이후 아래 예제코드와 같이 SiriusEditorForm의 4가지 주요 속성에 해당하는 객체들을 생성하여 지정합니다. (IRtc, ILaser, IMarker, IDocument)

public MainForm()
{
InitializeComponent();
SpiralLab.Core.Initialize();
var doc = new DocumentDefault();
siriusEditorForm1.Document = doc;
// 내부 데이타(IDocument) 가 변경될경우 이를 이벤트 통지를 받는 핸들러 등록
siriusEditorForm1.OnDocumentSourceChanged += SiriusEditorForm1_OnDocumentSourceChanged;
var rtc = new Rtc5(0); //create Rtc5 controller
float fov = 60.0f; ///scanner field of view : 60mm
float kfactor = (float)Math.Pow(2, 20) / fov; // k factor (bits/mm) = 2^20 / fov
var correctionFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "correction", "cor_1to1.ct5");
rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile);
rtc.CtlFrequency(50 * 1000, 2); // laser frequency : 50KHz, pulse width : 2usec
rtc.CtlSpeed(100, 100); // default jump and mark speed : 100mm/s
rtc.CtlDelay(10, 100, 200, 200, 0); // scanner and laser delays
this.siriusEditorForm1.Rtc = rtc;
ILaser laser = new LaserVirtual(0, "virtual", 20.0f);
laser.Initialize();
laser.CtlPower(rtc, 10);
this.siriusEditorForm1.Laser = laser;
var marker = new MarkerDefault(0);
this.siriusEditorForm1.Marker = marker;
}
private void SiriusEditorForm1_OnDocumentSourceChanged(object sender, IDocument doc)
{
siriusEditorForm1.Document = doc;
}
2. 윈폼(Winforms)에 시리우스 에디터(SiriusViewerForm) 추가
윈폼 프로젝트를 하나 생성하고 도구상자에 추가된 SiriusViewerForm 사용자 컨트롤을 드래그 앤 드롭 합니다. 이후 아래 예제코드와 같이 IDocument 객체들을 생성하여 지정합니다.

public MainForm()
{
InitializeComponent();
// 라이브러리 초기화
SpiralLab.Core.Initialize();
// 문서 생성후 뷰어에 지정
var doc = new DocumentDefault();
siriusViewerForm1.Document = doc;
}
/// <summary>
/// 시리우스 문서 파일을 외부에서 오픈하는 함수
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public bool Open(string fileName)
{
// 문서 파일 오픈 후 뷰어에 지정
var doc = DocumentSerializer.OpenSirius(fileName);
siriusViewerForm1.Document = doc;
return true;
}
3. 시리우스 에디터(SiriusEditorForm) 와 뷰어(SiriusViewerForm) 를 같이 사용하기
두 개의 사용자 정의 컨트롤을 아래와 같이 화면에 배치해 줍니다. 스플릿 컨테이너(Split Container) 각각 넣어 보았습니다. 실제 코드에서는 문서(IDocument)를 생성해 뷰어와 에디터에 지정해 줍니다. 또한 문서가 변경 (가공 데이타를 새로 불러올 경우 등)될 경우 에디터와 뷰어에 각각 이를 통지하는 코드를 추가해 줍니다.

public FormMain()
{
InitializeComponent();
SpiralLab.Core.Initialize();
// 문서 생성
var doc = new DocumentDefault();
siriusEditorForm1.Document = doc;
siriusViewerForm1.Document = doc;
// 소스 문서(IDocument) 가 변경될경우 다른 멀티 뷰에 이를 통지하는 이벤트 핸들러 등록
siriusEditorForm1.OnDocumentSourceChanged += SiriusEditorForm1_OnDocumentSourceChanged;
var rtc = new Rtc5(0); //create Rtc5 controller
float fov = 60.0f; // scanner field of view : 60mm
float kfactor = (float)Math.Pow(2, 20) / fov; // k factor (bits/mm) = 2^20 / fov
rtc.Initialize(kfactor, LaserMode.Yag1, "cor_1to1.ct5"); // 스캐너 보정 파일 지정 : correction file
rtc.CtlFrequency(50 * 1000, 2); // laser frequency : 50KHz, pulse width : 2usec
rtc.CtlSpeed(100, 100); // default jump and mark speed : 100mm/s
rtc.CtlDelay(10, 100, 200, 200, 0); // scanner and laser delays
this.siriusEditorForm1.Rtc = rtc;
ILaser laser = new LaserVirtual(0, "virtual", 20.0f);
laser.Initialize();
laser.CtlPower(rtc, 10);
this.siriusEditorForm1.Laser = laser;
var marker = new MarkerDefault(0);
this.siriusEditorForm1.Marker = marker;
}
private void SiriusEditorForm1_OnDocumentSourceChanged(object sender, IDocument doc)
{
// 변경된 문서 소스를 상대에게 통지하여 업데이트
siriusEditorForm1.Document = doc;
siriusViewerForm1.Document = doc;
}