Visual Studio 에서 이 시리우스 라이브러리를 사용하기 위해서는 Git 저장소에서 다운로드 받은 후 중요 dll 파일이 반드시 필요합니다. bin 폴더에 있는 3개의 dll 파일을 신규 프로젝트에 참조(add reference) 되도록 지정해 주시기 바랍니다. (spirallab.core.dll, spirallab.sirius.dll, spirallab.sirius.rtc.dll, spirallab.sirius.fieldcororection.dll)

1. RTC5 와 레이저 소스 객체를 만들어 선분, 원, 사각형, 점 그리고 레스터(Pixel) 모양 가공하기
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
varlaser = new LaserVirtual(0, "virtual", 20); // 최대 출력 20W 의 가상 레이저 소스 생성
ConsoleKeyInfo key;
do
{
Console.WriteLine("Testcase for spirallab.sirius.");
Console.WriteLine("");
Console.WriteLine("'S' : get status");
Console.WriteLine("'L' : draw line");
Console.WriteLine("'C' : draw circle");
Console.WriteLine("'R' : draw rectangle");
Console.WriteLine("'D' : draw circle with dots");
Console.WriteLine("'P' : draw square area with pixel operation");
Console.WriteLine("'Q' : quit");
Console.WriteLine("");
Console.Write("select your target : ");
key = Console.ReadKey(false);
Console.WriteLine("");
if (key.Key == ConsoleKey.Q)
break;
var timer = Stopwatch.StartNew();
switch (key.Key)
{
case ConsoleKey.S: //RTC의 상태 확인
if (rtc.CtlGetStatus(RtcStatus.Busy))
Console.WriteLine($"\r\nRtc is busy!");
else if (!rtc.CtlGetStatus(RtcStatus.PowerOK))
Console.WriteLine($"\r\nScanner power is not ok");
else if (!rtc.CtlGetStatus(RtcStatus.PositionAckOK))
Console.WriteLine($"\r\nScanner position is not acked");
else if (!rtc.CtlGetStatus(RtcStatus.NoError))
Console.WriteLine($"\r\nRtc status has an error");
else
Console.WriteLine($"\r\nIt's okay");
break;
case ConsoleKey.L: // 선 모양 가공
Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
DrawLine(laser, rtc, -10,-10, 10, 10);
break;
case ConsoleKey.C: // 원 모양 가공
Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
DrawCircle(laser, rtc, 10);
break;
case ConsoleKey.R: // 사각형 모양 가공
Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
DrawRectangle(laser, rtc, 10, 10);
break;
case ConsoleKey.D: //점으로 이루어진 원 모양 가공
Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
DrawCircleWithDots(laser, rtc, 10, 1.0f);
break;
case ConsoleKey.P: // 픽셀 이루어진 사각 모양 가공
Console.WriteLine("\r\nWARNING !!! LASER IS BUSY ...");
DrawSquareAreaWithPixels(laser, rtc, 10, 0.2f);
break;
}
Console.WriteLine($"Processing time = {timer.ElapsedMilliseconds/1000.0:F3}s");
} while (true);
rtc.Dispose();
}
private static void DrawCircle(ILaser laser, IRtc rtc, float radius)
{
rtc.ListBegin(laser);
rtc.ListJump(radius, 0);
rtc.ListArc(0, 0, 360.0f);
rtc.ListEnd();
rtc.ListExecute(true);
}
private static void DrawLine(ILaser laser, IRtc rtc, float x1, float y1, float x2, float y2)
{
rtc.ListBegin(laser);
rtc.ListJump(x1, y1);
rtc.ListMark(x2, y2);
rtc.ListEnd();
rtc.ListExecute(true);
}
private static void DrawRectangle(ILaser laser, IRtc rtc, float width, float height)
{
rtc.ListBegin(laser);
rtc.ListJump(-width / 2, height / 2);
rtc.ListMark(width / 2, height / 2);
rtc.ListMark(width / 2, -height / 2);
rtc.ListMark(-width / 2, -height / 2);
rtc.ListMark(-width / 2, height / 2);
rtc.ListEnd();
rtc.ListExecute(true);
}
private static void DrawCircleWithDots(ILaser laser, IRtc rtc, float radius, float durationMsec)
{
rtc.ListBegin(laser);
for (float angle =0; angle<360; angle+=1)
{
double x = radius * Math.Sin(angle * Math.PI / 180.0);
double y = radius * Math.Cos(angle * Math.PI / 180.0);
rtc.ListJump((float)x, (float)y);
//지정된 짧은 시간동안 레이저 출사
rtc.ListLaserOn(durationMsec);
}
rtc.ListEnd();
rtc.ListExecute(true);
}
private static void DrawSquareAreaWithPixels(ILaser laser, IRtc rtc, float size, float gap)
{
// pixel operation 은 IRtcExtension 인터페이스에서 제공
var rtcExt = rtc as IRtcExtension;
if (null == rtcExt)
return;
int counts = (int)(size / gap);
rtc.ListBegin(laser);
for (int i=0; i< counts; i++)
{
//줄의 시작위치로 점프
rtc.ListJump(0, i * gap);
// pixel의 최대 주기시간 (200us), 출력 채널(analog 1), 간격, 총 pixel 개수
rtcExt.ListPixelLine(200, ExtensionChannel.ExtAO1, new Vector2(gap, 0), (uint)counts);
for (int j = 0; j < counts; j++)
rtcExt.ListPixel(20, 5); // 20usec, 5V
}
rtc.ListEnd();
rtc.ListExecute(true);
}
주의1) 64bit 사용시에는 bin\x64 폴더의 모든 파일들을 bin\ 폴더로 복사해 주시기 바랍니다. (32bit 사용시에는 bin/x32 의 모든 파일 복사)
주의2) 1.7 버전부터 HPGL(PLT파일) 분석용 라이브러리가 추가되었습니다. spirallab.hpglx64.dll / spirallab.hpgl.dll 파일
주의3) Visual Studio 로 솔류션 파일을 빌드하기전 NuGet 패키지 복원을 실시해 주시기 바랍니다