개체(IEntity) 여러개를 하나의 집합 개체로 만들기 위한 그룹(Group) 개체를 제공합니다. 아래의 예제처럼 컨테이너 역할 뿐 아니라 어떤 가공 조건과 데이타를 묶어 하나의 그룹으로 생성이 가능합니다. 또한 그룹에 대한 반복회수(Repeat) 를 제공하고 있습니다.
예제에는 없지만 특별히 오프셋(Offset) 기능을 제공하는데, 그룹 가공 정보를 여러 위치에 반복 가공하고 싶을 경우 매우 유용하게 사용가능합니다. 일종의 바둑판식 가공의 경우를 생각해 보시길 바랍니다.
또한 외부 Dxf 파일을 가져오기(Import) 할 경우에도 그룹 개체가 생성되기도 합니다.
static void Main(string[] args)
{
SpiralLab.Core.Initialize();
#region initialize RTC
var rtc = new Rtc5(0);
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);
// 신규 문서 생성
var doc = new DocumentDefault("Unnamed");
// 레이어 생성후 문서에 추가
var layer = new Layer("default");
//첫번째 그룹 객체 생성
var group1 = new Group();
group1.Add(
new PenDefault() // 그룹내에 펜 개체 추가
{
Frequency = 100 * 1000,
PulseWidth = 2,
LaserOnDelay = 0,
LaserOffDelay = 0,
ScannerJumpDelay = 100,
ScannerMarkDelay = 200,
ScannerPolygonDelay = 0,
JumpSpeed = 500,
MarkSpeed = 500,
}
);
// 그룹내에 선 개체 추가
group1.Add(new Line(0, 0, 10, 20));
// 그룹내에 원 개체 추가
group1.Add(new Circle(0, 0, 10));
// 그룹내에 나선 개체 추가
group1.Add(new Spiral(-20.0f, 0.0f, 0.5f, 2.0f, 5, true));
// 그룹의 반복 회수 설정 (10회 가공)
group1.Repeat = 10;
// 두번째 그룹 객체 생성
var group2 = new Group();
group2.Add(
new PenDefault() // 그룹내에 펜 개체 추가
{
Frequency = 50 * 1000,
PulseWidth = 2,
LaserOnDelay = 0,
LaserOffDelay = 0,
ScannerJumpDelay = 100,
ScannerMarkDelay = 200,
ScannerPolygonDelay = 0,
JumpSpeed = 500,
MarkSpeed = 500,
}
);
group1.Add(new Line(0, 0, 5, 10));
group1.Add(new Circle(0, 0, 50));
group1.Add(new Spiral(-10.0f, 0.0f, 0.5f, 2.0f, 10, true));
group1.Repeat = 20; // 20 회 가공
layer.Add(group2);
//레이어의 모든 개체들 내부 데이타 계산및 갱신
layer.Regen();
// 문서에 레이어 추가
doc.Layers.Add(layer);
// 해당 문서 데이타를 지정된 파일에 저장
DocumentSerializer.Save(doc, "test.sirius");
ConsoleKeyInfo key;
do
{
Console.WriteLine("Testcase for spirallab.sirius");
Console.WriteLine("");
Console.WriteLine("'D' : draw group entities with 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)
rtc.ListEnd();
return success;
}