가공 파라메터 (속도, 주파수, 펄스 폭, 각종 지연값들) 를 변경하면서 가공하는 방식은 매우 많이 사용됩니다. 이번 예제에서는 펜(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;
}