마커 사용하기

마커는 복잡한 가공에 대한 처리를 알아서 해주는 역할을 합니다. 예를 들어 가공 데이타(IDocument)를 가지고 가공을 하게 되면 해당 주 쓰레드는 다른 일을 하지 못하고 가공 종료를 대기해야 하는 상태 (일종의 Blocking 상태)가 됩니다. 때문에 별도의 작업 쓰레드를 만들고 처리하는 등의 추가 작업이 필요합니다. 더우기 2개의 쓰레드에 의해 가공 데이타들에 수시로 접근이 되는 상황(Cross Thread)이 발생할 뿐 아니라, 개체들의 내부 값이 수정이 가능한 등, 공유 데이타에 대한 읽기 쓰기 접근 제한이 전혀 되지 않는 문제도 예상됩니다.

마커(IMarker)는 바로 이런 불편함을 모두 내부에서 해결해주는 역할을 합니다.

static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    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
    ILaser laser = new LaserVirtual(0, "virtual", 10.0f);
    laser.Initialize();
    laser.CtlPower(rtc, 5);

    var doc = new DocumentDefault("3x3 scanner field correction");
    //레이어 생성
    var layer = new Layer("default");
    // 나선 개체 추가
    layer.Add(new Spiral(0.0f, 0.0f, 0.5f, 2.0f, 5, true));
    //레이어의 모든 개채들 내부 데이타 계산및 갱신
    layer.Regen();
    //문서에 레이어 추가
    doc.Layers.Add(layer);
    //문서 저장
    DocumentSerializer.Save(doc, "test.sirius");
    ConsoleKeyInfo key;
    do
    {
        Console.WriteLine("Testcase for spirallab.sirius");
        Console.WriteLine("");
        Console.WriteLine("'M' : draw entities by marker");
        Console.WriteLine("'O' : draw entities by marker with offsets");
        Console.WriteLine("'Q' : quit");
        Console.WriteLine("");
        Console.Write("select your target : ");
        key = Console.ReadKey(false);
        if (key.Key == ConsoleKey.Q)
            break;
        Console.WriteLine("");
        switch (key.Key)
        {
            case ConsoleKey.M:
                Console.WriteLine("WARNING !!! LASER IS BUSY ...");
                DrawByMarker(doc, rtc, laser);
                break;
            case ConsoleKey.O:
                Console.WriteLine("WARNING !!! LASER IS BUSY ...");
                DrawByMarkerWithOffset(doc, rtc, laser);
                break;
        }
    } while (true);
    rtc.Dispose();
}
private static void DrawByMarker(IDocument doc, IRtc rtc, ILaser laser)
{
    var marker = new MarkerDefault(0);            
    marker.Name = "marker #1";
    //가공 완료 이벤트 핸들러 등록
    marker.OnFinished += Marker_OnFinished;
    var markerArg = new MarkerArgDefault()
    {
        Document = doc,
        Rtc = rtc,
        Laser = laser,
    };
    // 하나의 오프셋 정보(0,0 및 회전 각도 0) 를 추가한다.
    markerArg.Offsets.Clear();
    markerArg.Offsets.Add(Offset.Zero);
    // 마커에 가공 문서(doc)및 rtc, laser 정보를 전달하고 가공 준비를 실시한다.
    marker.Ready(markerArg);
    // 가공을 시작한다. 
    marker.Start();
}
private static void DrawByMarkerWithOffset(IDocument doc, IRtc rtc, ILaser laser)
{
    var marker = new MarkerDefault(0);
    marker.Name = "marker #2";
    //가공 완료 이벤트 핸들러 등록
    marker.OnFinished += Marker_OnFinished;
    var markerArg = new MarkerArgDefault()
    {
        Document = doc,
        Rtc = rtc,
        Laser = laser,
    };
    // 9개의 오프셋 정보를 추가한다
    markerArg.Offsets.Clear();
    markerArg.Offsets.Add(new Offset(-20.0f, 20.0f, -90f));
    markerArg.Offsets.Add(new Offset(0.0f, 20.0f, 0.0f));
    markerArg.Offsets.Add(new Offset(20.0f, 20.0f, 90.0f));
    markerArg.Offsets.Add(new Offset(-20.0f, 0.0f, -180.0f));
    markerArg.Offsets.Add(new Offset(0.0f, 0.0f, 0.0f));
    markerArg.Offsets.Add(new Offset(20.0f, 0.0f, 180.0f));
    markerArg.Offsets.Add(new Offset(-20.0f, -20.0f, -270.0f));
    markerArg.Offsets.Add(new Offset(0.0f, -20.0f, 0.0f));
    markerArg.Offsets.Add(new Offset(20.0f, -20.0f, 270.0f));
    // 마커에 가공 문서(doc)및 rtc, laser 정보를 전달하고 가공 준비를 실시한다.
    marker.Ready(markerArg);
    // 가공을 시작한다. 
    marker.Start();
}
private static void Marker_OnFinished(IMarker sender, TimeSpan span)
{
    Console.WriteLine($"{sender.Name} finished : {span.ToString()}");
}

데모(DEMO) 프로젝트에는 이 마커를 직접 구현하는 예제도 제공하고 있습니다. 이를 활용하면 다양한 가공 방식을 만들 수 있습니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to Top