2020년 1월 10일

sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 3)

이번시간에는 하나의 문서(Document) 데이타를 뷰어와 에디터에 같이 처리하는 것을 예로 들어보겠습니다.

아래와 같이 하나의 폼안에 각각 에디터(SiriusEditorForm) 와 뷰(SiriusViewerForm)을 각각 끌어다 놓습니다. 해당 인스턴스의 이름이 siriusEditorForm1, siriusViewerForm1 으로 생성되었겠지요.



자 그럼, 다음과 같이 하나의 문서 데이타를 에디터및 뷰어에 연결해 줍니다.

public FormMain()
{
    InitializeComponent();
    SpiralLab.Core.Initialize();

     var doc = new DocumentDefault();
     siriusEditorForm1.Document = doc;
     siriusViewerForm1.Document = doc;
...
}

만약 에디터에서 사용자가 신규 문서(Document)를 열(Open) 경우, 이 변경사항이 뷰어에도 알려져야 동일한 데이타를 기반으로 화면에 출력이 되므로, 아래의 이벤트 핸들러와 같이 구현해 줍니다.

{
...
  /// 소스 문서(IDocument) 가 변경될경우 다른 멀티 뷰에 이를 통지하는 이벤트 핸들러 등록
    siriusEditorForm1.OnDocumentSourceChanged += SiriusEditorForm1_OnDocumentSourceChanged;
...
}

private void SiriusEditorForm1_OnDocumentSourceChanged(object sender, IDocument doc)
{
    /// 변경된 문서 소스 업데이트
    siriusEditorForm1.Document = doc;
    siriusViewerForm1.Document = doc;
}


자 그럼 왼쪽 에디터에서 외부의 DXF 파일을 가져오기(Import) 를 하면, 위와 같이 오른쪽 뷰어에도 해당 데이타가 출력 되는것을 확인할수있습니다. 심지어 왼쪽 편집기에서 개체(Entity)를 이동, 삭제, 추가 등을 해보시면 그 수정사항이 고스란히 오른쪽 뷰어에도 반영이 됩니다. 위 예제에서는 결국 하나의 데이타 문서 소스(Document)를 가지고 여러개의 뷰, 즉 1 Source Multiple View 가 가능함을 보여주고 있습니다.

sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 2)

이번시간에는 각종 가공 데이타를 생성, 저장, 편집 등의 예제를 살펴보도록 하겠습니다.

Sirius 라이브러리에서 가공 데이타는 문서(Document) 라는 이름으로 관리됩니다. 예를 들어 가공 형상을 몇가지 만들고 이를 저장, 불러오기 하는 예제를 보면

1. 문서 생성및 관리

    SpiralLab.Core.Initialize();

     ///신규 문서(Document) 생성
    var doc1 = new DocumentDefault("Unnamed");
    /// 레이어 생성
    var layer = new Layer("default");
    /// 레이어를 문서해 추가
    doc1.Layers.Add(layer);
 
    ///레이어에 선 형상 개체(Entity) 생성및 추가
    layer.Add(new Line(0, 10, 20,20));
    ///레이어에 원 형상 개체(Entity) 생성및 추가
    layer.Add(new Circle(0, 0, 10));
    ///레이어에 나선 형상 개체(Entity) 생성및 추가
    layer.Add(new Spiral(-20.0f, 0.0f, 0.5f, 2.0f, 5, true));
 
    /// 문서(Document) 저장하기
    string filename = "default.sirius";
    var serializer = new DocumentSerializer();
    serializer.Save(doc1, filename);

    /// 문서(Document) 불러오기
    var doc2 = DocumentSerializer.OpenSirius(filename);


자 그럼 위의 데이타를 화면에 출력 (렌더링) 및 편집등을 해 보도록 하겠습니다.

우선 Sirius 라이브러리에서는 해당 뷰어및 에디터를 윈폼의 사용자 컨트롤 형태로 제공하고 있으므로 우선 도구상자에서 이 컨트롤을 등록해야 합니다. 아래와 같이 Visual Studio 개발툴에서

2. "항목선택" 을 합니다.


3. "찾아보기" 버튼 클릭하여 dll 파일을 선택


4. spirallab.sirius.dll 파일을 선택


5. 도구상자에 두 항목 (SiriusEditorForm, SiriusViewerForm)이 추가된 모습


6. SiriusEditorForm 을 끌어놓기(drag and drop) 한 모습


또는 SiriusViewerForm 을 끌어놓기 한 모습 



7. 문서(Document) 와 에디터(혹은 뷰어) 연결하기

위 1번 예제에서 생성한 문서 (doc1)를 6번에서 만든 에디터와 연결하기 위해서는 단순히,

siriusEditorForm1.Document = doc1;

와 같이 지정하는것 만으로도 처리가 됩니다. 실제 가공 데이타가 에디터에 출력된 모습은 다음과 같습니다.


8. 해당 문서 데이타의 가공 준비하기

/// RTC 를 생성 초기화 합니다
var rtc = new Rtc5(0);
...

/// 레이저 소스를 생성 초기화 합니다
var laser =  new LaserVirtual(0, "virtual", 10);
...

/// 마커를 생성 초기화 합니다.
/// 마커는 레이저 가공이 오래 걸리게 되므로, 비동기 처리를 위해
/// 내부적으로는 가공을 위한 작업 쓰레드를 만들고
/// 가공 개수, 순서 위치, 등을 처리해주는 기능으로
/// sirius 라이브러리에서는 기본 마커(MarkerDefault)가 구현되어 있습니다.
/// (마커의 자세한 구현방법은 Demos 폴더의 7번 예제를 참고)
var marker = new MarkerDefault(0);

siriusEditorForm1.Rtc = rtc;
siriusEditorForm1.Laser = laser;
siriusEditorForm1.Marker= marker ;

/// 위와 같이 3가지가 미리 지정되어 있으면, 이제 가공이 가능해 집니다.


9. 가공 시작하기

마우스 오른쪽 버튼을 누르면 팝업 메뉴가 나오는데 이때 마커(Marker)를 선택해 줍니다.


마커 창에서는 마커의 상태및 가공 시작, 중지, 에러 리셋 명령 버튼이 있습니다. 당연히 Start Marker 버튼이 가공을 시작하는 명령에 해당합니다. 다들 해 보시면 되겠지요. 천천히 여기까지 따라해 보시기 바랍니다 !

(기타) 여기에 있는 모든 예제는 Demos 프로젝트에 실제 코드가 있습니다.

10. 부가적인 팁


마우스를 이용해 3개의 개체(Entity)들을 선택한후 오른쪽 속성창에서 Mark Path 를 True 로 설정해 보시기 바랍니다. 위와 같이 가공 순서를 알려주게 됩니다.
(참고) 마우스 가운데 버튼으로 확대,축소를 하고, 가운데 버튼을 누른째 마우스를 이동하면, 화면의 중심이 이동됩니다.

가공할 개체(Entity)들을 선택한후 위의 "Normal" 버튼을 눌러보시면, 또다른 재미있는 기능이 동작되는데 바로 레이저 가공을 시뮬레이션 해 볼수있습니다.  백문이 불여일견 실행해 보시면 압니다 !...



sirius 라이브러리를 활용한 스캐너 및 레이저 제어 방법 (예제 1)

안녕하십니까 지난 시간에 sirius 라이브러리를 개발하고 있다는 소식을 알려드렸는데, 어느덧 상당한 작업이 되어 0.8 버전까지 개발이 진행되었습니다. 그래서 몇가지 예제를 통해 설명을 드리고자 합니다.

저장소 링크 : https://github.com/labspiral/sirius

Visual Studio 에서 이 라이브러리를 사용하기 위해서는 해당 링크에서 다운로드 받은후 몇몇 dll 파일이 반드시 필요합니다. 즉 bin 폴더에 있는 파일들과 각종 폰트 디렉토리를 모두 복사해 사용해 주시기 바랍니다. 이후 bin 폴더에 있던 dll 을 사용자의 프로젝트에 참조로 추가해 주시기 바랍니다.
참조가 필요한 최소한의 DLL 파일들 : spirallab.sirius.core.dll, spirallab.sirius.dll



1. RTC5 와 레이저 소스 객체를 만들어 원 모양 가공하기

using SpiralLab.Sirius;
static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    var rtc = new Rtc5(0); /// 첫번째 RTC5 카드 사용
    float fov = 60.0f;    /// 스캐너의 가공영역 : 60mm         
    float kfactor = (float)Math.Pow(2, 20) / fov; /// k factor (bits/mm) = 2^20 / fov
    var correctionFile = "correction\\cor_1to1.ct5"; /// 보정 파일 이름
    rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile); /// 초기화 실시

    /// 위와 같이 RTC5 제어기를 초기화 해 주시기 바랍니다.  이후 주파수및 속도, 지연값 등을 설정

    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

   /// 가상의 레이저 소스 생성
   var laser = new LaserVirtual(0, "virtual", 10);  /// 최대 출력 10W

   Console.Write("press any keys to start ... ");
   Console.ReadKey(false);

   /// 원 모양 가공 시작
   float radius = 10.0f; /// 반지름 10 mm 원
   rtc.ListBegin(laser); /// 리스트 명령시작
   rtc.ListJump(new Vector2((float)radius, 0));  ///원 시작 위치로 점프
   rtc.ListArc(new Vector2(0, 0), 360.0f);  /// 0,0 을 중심으로 반시계 방향으로 360도 회전 가공
   rtc.ListEnd(); /// 리스트 명령 끝
   rtc.ListExecute(true); /// 가공 시작및 완료시까지 대기
}



2. RTC5  + VarioSCAN 을 이용해 Z 위치를 이동하며 가공하기
* spirallab.sirius.3d.dll 파일을 참조로 추가해 주시기 바랍니다.

using SpiralLab.Sirius;
static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    var rtc = new Rtc53D(0); /// 첫번째 RTC5 카드 사용
    float fov = 60.0f;    /// 스캐너의 가공영역 : 60mm         
    float kfactor = (float)Math.Pow(2, 20) / fov; /// k factor (bits/mm) = 2^20 / fov
    var correctionFile = "correction\\cor_1to1.ct5"; /// 보정 파일 이름
    rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile); /// 초기화 실시

    /// 위와 같이 RTC5 제어기를 초기화 해 주시기 바랍니다.  이후 주파수및 속도, 지연값 등을 설정

    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
    var rtc3D = rtc as IRtc3D;
    rtc3D.CtlZOffset(1); /// Z 위치 오프셋을 +1mm 로 설정 (이후 가공시에는 모든 레이저 좌표값에서 Z +1mm 만큼 추가됨)

   /// 가상의 레이저 소스 생성
   var laser = new LaserVirtual(0, "virtual", 10);  /// 최대 출력 10W

   Console.Write("press any keys to start ... ");
   Console.ReadKey(false);

   /// 원 모양 가공 시작 (Z는 2mm (= 1+1) 위치에서 가공됨)
   float radius = 10.0f; /// 반지름 10 mm 원
   rtc.ListBegin(laser); /// 리스트 명령시작
   rtc3D.ListJump3D(new Vector3((float)radius, 0, 1));  ///원 시작 위치로 점프
   rtc3D.ListArc(new Vector3(0, 0, 1), 360.0f);  /// 0,0 을 중심으로 반시계 방향으로 360도 회전 가공
   rtc.ListEnd(); /// 리스트 명령 끝
   rtc.ListExecute(true); /// 가공 시작및 완료시까지 대기
}



3. RTC5  + MOTF 를 이용한 온더 플라이 가공
* spirallab.sirius.motf.dll 파일을 참조로 추가해 주시기 바랍니다.

using SpiralLab.Sirius;
static void Main(string[] args)
{
    SpiralLab.Core.Initialize();
    var rtc = new Rtc5MOTF(0); /// 첫번째 RTC5 카드 사용
    float fov = 60.0f;    /// 스캐너의 가공영역 : 60mm         
    float kfactor = (float)Math.Pow(2, 20) / fov; /// k factor (bits/mm) = 2^20 / fov
    var correctionFile = "correction\\cor_1to1.ct5"; /// 보정 파일 이름
    rtc.Initialize(kfactor, LaserMode.Yag1, correctionFile); /// 초기화 실시

    /// 위와 같이 RTC5 제어기를 초기화 해 주시기 바랍니다.  이후 주파수및 속도, 지연값 등을 설정

    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
    var rtcMOTF = rtc as IRtcMOTF;
    rtcMOTF.CtlEncoderReset(); /// 입력 엔코더 X, Y 값을 0 으로 설정

    /// 가상의 레이저 소스 생성
    var laser = new LaserVirtual(0, "virtual", 10);  /// 최대 출력 10W

    Console.Write("press any keys to start ... ");
    Console.ReadKey(false);

    rtc.ListBegin(laser);
    ///직선을 그립니다. (엔코더 입력과 무관합니다)
    rtc.ListJump(new Vector2(0, 0));
    rtc.ListMark(new Vector2(10, 0));

    /// MOTF 를 시작합니다.
    /// ListMOTFBegin 부터 ListMOTFEnd 사이의 모든 list 명령어는 엔코더 입력값이 좌표값에 누적됩니다
    rtcMOTF .ListMOTFBegin();
    /// 엔코더 X 값이  10mm 가 넘을때(Over) 까지 리스트 명령을 대기
   rtcMOTF .ListMOTFWait(RtcEncoder.EncX, 10, EncoderWaitCondition.Over); /// 엔코더 X 입력이 10mm 가 넘을때 까지 대기
    ///원 을 그린다
    rtc.ListJump(new Vector2((float)10, 0));
    rtc.ListArc(new Vector2(0, 0), 360.0f);
    /// MOTF 중지 및 0,0 위치(스캐너 중심 위치)로 jump 실시
   rtcMOTF .ListMOTFEnd(Vector2.Zero);
   rtc.ListEnd();
}


위 예제들은 사용자가 직접 RTC, VARIOSCAN 옵션, (3D 가공을 위한 Z축 제어용), MOTF 옵션 등을 Sirius 라이브러리를 이용하여 직접 구현할 경우 그 사용 예제를 보여주고 있습니다. 하지만 통상은 캐드와 같은 벡터 데이타를 UI 로 처리하는것이 직관적이며, 이 역시 sirius 라이브러리 내에 모두 포함되어 있습니다. 이에 대한 사용법은 다음시간에 ...

시리우스 라이브러리 홈페이지 오픈

현재 시리우스(Sirius) 라이브러리라는 제품을 개발하고 이를 소개하는 홈페이지를 오픈 하였습니다. 관심있는 분들의 많은 방문 요청드립니다. 앞으로 업데이트 소식및 변경사항은 스파이럴랩 홈페이지를 통해 진행할 예정입니다. 스파이럴랩 홈페이지 :  h...