펜을 이용한 가공 파라메터 변경

가공 파라메터 (속도, 주파수, 펄스 폭, 각종 지연값들) 를 변경하면서 가공하는 방식은 매우 많이 사용됩니다. 이번 예제에서는 펜(IPen) 객체를 생성하여 파라메터를 설정하고 이를 기반으로 가공하는 방식을 보여주고 있습니다. 가공은 레이어(Layer)에 삽입된 순서를 따라 가공됩니다. 때문에 IPen 을 레이어의 제일 처음 위치로 해 놓는것이 일반적입니다.

IPen 을 여러개 만들어서 레이어의 특정 위치에 삽입하게 된다면 당연히 IPen 이후에 오는 모든 개체(IEntity)들은 해당 펜 파라메터의 영향을 받게 됩니다.

static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    #region initialize RTC 
    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", 20);
    #region create entities
    // 문서 생성
    var doc = new DocumentDefault("Unnamed");
    // 레이어 생성및 문서에 추가
    var layer = new Layer("default");
    // 펜 개체(Entity) 생성및 레이어에 추가            
    var pen = new PenDefault()
    {
        Frequency = 100 * 1000, //주파수 Hz
        PulseWidth = 2, //펄스폭 usec
        LaserOnDelay = 0, // 레이저 시작 지연 usec
        LaserOffDelay = 0, // 레이저 끝 지연 usec
        ScannerJumpDelay = 100, // 스캐너 점프 지연 usec
        ScannerMarkDelay = 200, // 스캐너 마크 지연 usec
        ScannerPolygonDelay = 0, // 스캐너 폴리곤 지연 usec
        JumpSpeed = 500, // 스캐너 점프 속도 mm/s
        MarkSpeed = 500, // 스캐너 마크 속도 mm/s
    };
    layer.Add(pen);
    // 선 개체 추가
    layer.Add(new Line(0, 0, 10, 20));
    // 원 개체 추가
    layer.Add(new Circle(0, 0, 10));
    // 나선 개체 추가
    layer.Add(new Spiral(-20.0f, 0.0f, 0.5f, 2.0f, 5, true));            
    //레이어의 모든 개채들 내부 데이타 계산및 갱신
    layer.Regen();
    // 문서에 레이어 추가
    doc.Layers.Add(layer);
    // 문서를 지정된 파일에 저장
    DocumentSerializer.Save(doc, "test.sirius");
    #endregion
    ConsoleKeyInfo key;
    do
    {
        Console.WriteLine("Testcase for spirallab.sirius. powered by labspiral@gmail.com (https://sepwind.blogspot.com)");
        Console.WriteLine("");
        Console.WriteLine("'D' : draw entities by pen");
        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.D:
                Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
                var timer = Stopwatch.StartNew();
                if (DrawForFieldCorrection(laser, rtc, doc))
                    rtc.ListExecute(true);
                Console.WriteLine($"processing time = {timer.ElapsedMilliseconds / 1000.0:F3}s");
                break;
        }
    } while (true);
    rtc.Dispose();
}

private static bool DrawForFieldCorrection(ILaser laser, IRtc rtc, IDocument doc)
{
    bool success = true;
    var markerArg = new MarkerArgDefault()
    {
        Document = doc,
        Rtc = rtc,
        Laser = laser,
    };
    rtc.ListBegin(laser);
    // 레이어 순회
    foreach (var layer in doc.Layers)
    {
        // 레이어 내의 개체들을 순회
        foreach (var entity in layer)
        {
            var markerable = entity as IMarkerable;
            // 해당 개체가 레이저 가공이 가능한지 여부를 판별
            if (null != markerable)
                success &= markerable.Mark(markerArg);    // 레이저 가공 실시
            if (!success)
                break;
        }
        if (!success)
            break;
    }
    if (success)
        rtc.ListEnd();
    return success;
}  

댓글 달기

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

Scroll to Top