2020년 11월 18일

.NET 프레임워크 프로젝트를 .NET5 로 포팅하는 팁

지난주에 .NET 5 가 정식 출시되었습니다. 

.NET 프레임워크는 4.8 버전을 끝으로 완결(?) 되고, 이후부터는 .NET Core 가 지속적으로 .NET 란 이름으로 통합을 이끌어 낼꺼라고 하는데, 그렇다면 기존 .NET 프레임워크 기반으로 개발된 프로젝트를 NET5 으로 포팅하는 준비를 해야 겠지요.

What's new in .NET5 : https://docs.microsoft.com/en-us/dotnet/core/dotnet-five


Visual Studio 2019 최신 버전 (16.8 이상)이 필요합니다. 물론 .NET 5 SDK 도 설치해 주시구요.

NET5 SDK : https://dotnet.microsoft.com/download/dotnet/5.0



신규 프로젝트를 만듭니다. .NET5 용 별도 프로젝트 템플릿이 없으니 일단 .NET Core 로 신규 생성합니다.


프로젝트 속성에서 대상 프레임워크에 .NET 5 항목이 나타납니다. 



위와 같이 프로젝트 파일을 직접 편집(!) 해 보도록 합니다.



해당 파일 포맷은 기존 NET 프레임워크와 많이 다르니 주의바라며, .NET Core 의 방식을 따르며 위와 같이 변경된 사항 (net5.0) 이 확인됩니다. 특히 윈폼 혹은 WPF 등의 예전 UI 를 사용하고자 하면, 위와 같이 UseWindowsForms 항목을 true 로 해주셔야 합니다.




솔루션을 다시 로드해 보면 위와 같이 정상적으로 윈폼을 추가할수있는 컨텍스트 메뉴가 보여지게 됩니다.


프로젝트를 빌드를 해보면 다음과 같이 TargetFramework 정보가 추가된 폴더 구성을 보여집니다.
 



이같은 출력 구성이 불편하면 위와 같이 출력 경로에 해당 정보를 추가하지 않도록 프로젝트 파일을 편집합니다.



다시 빌드하게 되면 위와 같이 출력 경로가 변경됩니다.


.NET Core 에서는 프로젝트 빌드후 게시(Publish)를 통해 단일 파일로 빌드한다던가 하는 다양한 옵션도 제공합니다.

정리하면,

1. 프로젝트 파일을 편집하여 새로 만들고

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <UseWindowsForms>true</UseWindowsForms>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>

WPF 의 경우 

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>WinExe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <UseWPF>true</UseWPF>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>
</Project>


2. 기타 주의사항

프로젝트에 추가되는 파일은 경로상에 있기만 하면 자동적으로 추가되니 이를 강제로 배제 시켜야 합니다.

  <ItemGroup>
    <None Remove="파일이름" />
  </ItemGroup>

기존 .NET 프레임워크 참조 파일도 다음과 같이 지정합니다.

  <ItemGroup>
    <Reference Include="참조이름">
      <HintPath>DLL 어셈블리 파일 경로</HintPath>
    </Reference>
  </ItemGroup>


* 좀더 자세한 사항은 https://devblogs.microsoft.com/dotnet/how-to-port-desktop-applications-to-net-core-3-0/ 을 참고

2020년 5월 14일

Sirius 라이브러리 소개 (동영상)

1. DXF 파일을 열어(Open) 편집하기


2. DXF 파일 가져오기(Import) 후 분해하기



3. 폐곡선에 대한 해치(Hatch) 하기



4. 복사및 붙혀넣기(Copy and Paste) 하기



5. 윈도우 트루타입 폰트 사용하기



6. 2D 바코드 사용하기



7. 대량의 포인트 만들기및 가공경로 최적화 하기



8. 특수개체(그룹) 만들고 반복가공 하기



9. 레이어(Layer) 생성및 개체의 가공순서 변경하기



10. 폴리라인(Polyline) 정점 정보 편집하기



11. 에디터(Editor)와 뷰어(Viewer) 연동한 모습



12. 복수개의 에디터와 뷰어를 연동한 모습 (레이저 소스를 여러개 사용할 경우)



위에서 소개된 모든 가공 데이타는 스캔랩의 RTC5, 6, 6이더넷, XL-SCAN(SyncAXIS) 제품등을 통해 가공이 가능합니다. (지속적인 버전 업데이트 중)

라이브러리 저장소 위치 : https://github.com/labspiral/sirius


2020년 2월 17일

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

안녕하십니까
이번시간에는 Sirius 에서 레이저 가공시의 절차를 사용자 입맛에 맞도록 구현하는 방법에 대해 설명해 보겠습니다.

1. IMarker 인터페이스

Sirius 에서는 해당 기능을 마커(IMarker) 인터페이스에서 제공하고 있습니다. 즉 이 마커를 상속받아 사용자가 원하는 방식의 구현이 가능합니다.

예를 들어 마커의 핵심적인 함수를 보면
(상세한 구현 내용은 Demos 폴더의 8번 예제 참고)
- 가공할 데이타를 준비하는 Ready 함수
- 가공을 시작하는 Start 함수
- 가공을 중단하는 Stop 함수
- 에러상태를 해제하는 Reset 함수

앞서 살펴본 봐와 같이 가공 정보는 문서(Document)에 존재하고 있으며, 이 문서 데이타를 화면(View)에 그리는 등의 작업이 일어납니다. 마커(IMarker)는 많은 데이타 처리를 비동기적으로 해야 하므로, 가장 일반적인 구현방법은 마커 내부에 작업 쓰레드를 만들어 처리하는 방식입니다. 이때 주의할것은 화면에 다시 그리는 이벤트는 수시로 발생해 문서(Docment) 데이타에 수시로 접근되고, 마커(IMarker) 역시 쓰레드내에서 문서 데이타를 읽어 가공을 하게 되므로, 공유 데이타(Document)에 대한 크로스 쓰레드 문제가 발생하게 됩니다.

때문에 마커내에서 작업 쓰레드를 생성해 사용할 경우에는, 반드시 문서를 복제(Clone)한 복사본을 만들어 마커는 복사복만 접근하도록 제한해야 합니다.

즉, public bool Ready(IDocument doc, IRtc rtc, ILaser laser, IMotion motion=null)
함수로 가공데이타를 전달받을 경우, 인자로 전달된 doc 를 복제(doc.Clone()) 하여 변수에 저장후 작업 쓰레드에서 처리해 주셔야 합니다.



2. 문서(Document)의 기준점 

자 그럼 마커에서 레이저 가공시 기준 위치를 설정하는 법을 살펴보겠습니다.



SIriusEditor 에디터에서는 위와 같이 문서 정보 버튼을 눌려줍니다.


그럼 위와 같이 현재 문서의 크기 정보(Dimension)를 입력할 수 있게 됩니다.
문서 크기의 핵심 데이타는 폭(Width), 높이(Height), 중심점(Center) 정보들입니다.


위와 같이 입력하였다면, 폭과 높이가 50mm 이고 가공 중심점(원점)은 X=25, Y=25 가 됩니다. 이때 가공 중심점이라는것은 스캐너의 원점을 의미합니다.


결국 위와 같이 HELLO 라는 마킹 텍스트 개체가 있을 경우 가공원점은 25,25 이므로 실제 스캐너를 이용해 가공시에는 우상단이 아닌, 상단 중앙에 "HELLO"가 가공되게 됩니다. 스캐너 장치는 기본적으로 원점(0,0) 을 기준으로 데이타를 처리하게 되는데, 위와 같이 사용자가 1사분면에만 가공데이타를 놓이게 하고 싶을경우 사용하는 방식입니다. 즉 기준 원점(Center)을 변경하는것은 스캐너의 원점을 변경하는 것과 동일합니다. (참고 : 개체를 선택후 Ctrl + H 단축키를 누르면 원점 정렬이 이루어집니다)


3. 문서(Document)의 회전 기준점

그러나 한가지 문제점이 있는데, 만약 위 데이타를 각도를 회전시켜 가공해야 할 경우가 있습니다. 회전 기준정보가 없는 상태에서는 기본적으로 수학적 원점(0, 0) 즉 예전 원점을 기준으로 회전되기 때문에 회전 기준점을 변경할 수 있어야 합니다.

때문에 위와 같이 Rotate Offset 에서는 회전 기준점을 설정할수있습니다. 즉 Dimension 에서 Center 점을 설정하고, 회전 기준점을 Center 점과 같은 값으로 설정할수도 있고 위와 같이 다른 위치를 설정할수도 있습니다.


4. 마커에서의 행렬 처리

마커에서는 위와 같이 문서의 기준점및 회전점을 처리한후 데이타를 가공해야 합니다. 더우기 가공시에는 오프셋(Offset)을 외부 측정 장치로 부터 연산하고 이 이동량, 회전량을 (DX, DY, Angle) 한번 더 변경하는것도 지원해야 합니다.

즉,

문서상의 가공 데이타(위 HELLO) => 
문서에 지정된 기준점(Center)으로 이동 => 
문서에 지정된 회전점(Rotate) 처리 => 
사용자가 입력한 오프셋(X,Y,Angle) 처리

가 모두 적용되어야 합니다.

(설명에서는 누락하였지만 만약 스캐너 장치를 누군가가 90 혹은 180 도 회전된채로 장착하였다면 이 역시 회전 처리가 되어야 겠지요.)

이 같은 선형변환을 위해 Rtc 인터페이스 내부에는 행렬 스택(Matrix Stack)을 지원합니다.
이 행렬 스택은 입력된 데이타의 선형변환 (회전, 이동 등)을 스택(Stack)에 Push 하게 되면, 레이저 가공시 스택에 존재하는 모든 행렬을 연산한 결과값을 적용한 최종 위치를 계산하게 됩니다.

데모 8번 코드를 예를 들면,

var matrix =
      Matrix3x2.CreateTranslation(dx, dy) * /// 6. 오프셋 이동량
      Matrix3x2.CreateRotation((float)(angle * Math.PI / 180.0)) *  /// 5. 오프셋 회전량            Matrix3x2.CreateTranslation(Vector2.Negate(doc.Dimension.Center)) * ///4. 문서의 원점 위치 이동
      Matrix3x2.CreateTranslation(doc.RotateOffset.X, doc.RotateOffset.X) * ///3. 회전 중심 위치 원복
      Matrix3x2.CreateRotation((float)(doc.RotateOffset.Angle * Math.PI / 180.0)) *  ///2. 문서에 설정된 회전량
      Matrix3x2.CreateTranslation(-doc.RotateOffset.X, -doc.RotateOffset.X);  ///1. 회전을 위해 회점 중심을 원점으로 이동

/// 연산된 행렬 스택을 IRtc 에 설정함
rtc.MatrixStack.Push(matrix);


위와 같이 선형 변환에 필요한 행렬을 스택에 넣고 그 결과값을 IRtc 에 처리해 주고 있습니다. 자세한 구현사항은 데모 8번 예제를 참고해 주시기 바랍니다.

2020년 2월 11일

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


안녕하십니까
이번시간에는 최근 추가적용된 새로운 기능에 대한 설명입니다.


1. DXF 가져오기 및 벡터의 분해(Explode)


위와 같이 DXF 파일을 가져오게(Import) 되면 하나의 그룹(Group) 개체로 불러들여지게 됩니다. DXF 파일은 수많은 정점 정보가 있기 때문에 고속으로 화면에 렌더링을 위해서 Sirius 에서는 그룹(Group)이라는 특수 개체를 만들어 모든 벡터 정보를 가지도록 처리되었습니다.



해당 그룹(Group) 개체의 모든 데이타를 확인하고 싶을 경우에는 이 그룹 개체를 분해(Explode) 할수도 있습니다. 위와 같이 분해(Explode) 버튼을 사용해 분해를 하게 되면, 위 이미지처럼, 그룹 개체를 구성하고 있는 선, 호, 폴리선 등의 하부 개체로 쪼개지게 됩니다.  (특정 선, 호 등의 개체를 삭제하거나 추가도 가능하게 되겠지요)


2. 폴리라인의 정점들


또한 폴리선(Polyline : 통상 선과 호의 집합)은 캐드등에서 가장 많이 사용되는데, 이 폴리선의 내부 데이타 역시 Vertex Array 속성 버튼을 누르면 위와 같이 개별 정점(Vertex)으로 표시가 가능하며, 개별 정점을 선택하면 해당 위치가 어디인지를 같이 표시해 주게 됩니다. (X,Y, Bulge 같은 세부 데이타 조작도 가능하며, 가공순서를  반전(Reverse ) 시킬수도 있습니다)


3. 반복 가공 



Sirius에서는 레이저 가공이 가능한 모든 개체들에 Repeat 회수라는 항목을 제공하고 있습니다. 이 값을 통해 몇번이고 반복 가공이 가능해 집니다.




그러나 어떤 그룹개체에 속한 다수의 개체들을 반복 가공할 경우는 다양한 순서의 조합이 가능해야 할 경우가 있습니다.  이 경우에는 우선 해당 개체를 그룹(Group) 개체로 변경을 해줍니다. 여기 까지는 반복 가공 방식이 달라지지 않습니다.


이후 그룹 개체의 오프셋 정보를 적절히 입력하여 복수개의 나선 개체 가공을 각각 5회씩 반복한다고 가정하면, 

1. 첫 나선 개체를 5회 반복  -> 다음 나선 개체를 5회 반복 ->  ... -> 마지막 나선 개체를 5회 반복 => EntityFirst 방식

2. 첫 나선 개체를 1회 반복 -> 다음 나선 개체를 1회 반복 -> 마지막 나선 개체를 1회 반복
위의 가공을 5회 반복 => OffsetFirst 방식

3. 위 두 방식에서 홀수번째 반복 가공에서는 정방향/ 짝수번째 반복 가공에서는 역방향으로 가공 방향을 조합하고자 할때 => Reversible Mark 를 True 로 설정

와 같이 사용자가 적절한 방식을 선택가능하여 가공 품질을 변경할수있습니다. 아무래도 레이저를 반복해서 집중적으로 가공할 경우에는 다양한 품질 이슈가 있을수 있으니 시간을 두고 반복되도록 해야할 경우도 발생합니다.

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

안녕하십니까
이번시간에는 SiriusEditor 에 포함된 유용한 기능들을 소개하고자 합니다.

1. 해치 (Hatch)


닫힌 폐곡선(Closed figure) 의 형태에 대해서는 해치를 지원합니다. 즉 내부 폐영역에 대한 채우기라고 보시면 됩니다. 옵션으로는 해치를 사용할지 여부(True/False)와 모드(현재는 직선만 제공), 각도, 간격, 배제할 영역 크기 등의 정보를 입력해 주시면 됩니다. 위의 예에서는 트루투입 폰트에 대한 해칭을 활성화 한 모습입니다.


앞서 폰트에 직접 해치를 넣었지만, 또다른 해치의 방법은 위와 같이 개체를 선택하고 해치 버튼을 누른 화면입니다. 이 창에서 설정값들을 입력하게 되면 해치를 진행하고 그 결과 개체가 생성되는 방식입니다.


위와 같이 원본이 되는 영역은 남고, 그 영역 정보를 가지고 해치 패턴을 따내는 방법도 가능합니다.

* v0.9 버전에서는 원, 사각형, 폴리라인(Closed)에 대한 해치를 제공하고 있고, 선(Line) 타입만 제공중


2. 그룹및 오프셋 기능

어떤 개체를 반복적으로 가공하고자 할때 이를 복사해서 붙혀넣기 하기에는 그 개수가 많고 정렬에 어려움이 있습니다. 이를 위해 Sirius 에서는 그룹 + 오프셋 기능을 제공합니다.



우선 반복적으로 배열하고자 하는 개체를 선택하고 개체를 그룹 개체로 변환시킵니다. (개체 트리뷰에서 Group 으로 변환하는 모습)


그룹 개체로 변환이 이루어지면 속성에 Offset Array 이라는 항목이 생성됩니다. 이를 선택하면 위와 같이 오프셋 에디터 창이 뜨고 여기에서 원하는 오프셋 위치값들을 입력해주시면 됩니다. 오프셋 위치정보를 외부에 저장된 파일에서 가져오거(Import)나 내보내기(Export)가 가능하며, Row/Col 개수및 간격을 직접입력할수도 있습니다.


위와 같이 가로세로 개수및 간격등 정보를 입력하여 오프셋 배열정보를 만들어 보겠습니다.


해당 오프셋 정보를 가지고 25개의 나선 개체를 만든 모습입니다.


3. 가공 경로 최적화

가공 데이타가 많아지게 되면 반드시 필요한 것이 가공에 소요되는 시간을 단축해야 한다는 것입니다. 즉 가공 순서에 따라 같은 데이터라도 어떤 경로는 1분이 걸리고 또 다른 경로는 30초만에도 가공이 될수있기 때문입니다.



예를 들어 수많은 포인트(점) 을 이용한 구멍뚫는(Punch) 것이 필요하다고 가정해 보면, 위와같이 일단 점 집합(Points) 개체를 생성합니다.


해당 점 집합 개체는 그룹 개체의 Offset Array 와 유사하게 Vertex Array 항목이 있습니다. 이를 선택하면 포인트 집합 에디터 창이 위와 같이 표시됩니다.

많은 데이타의 예를 들고자 하므로, 임시로 만들어 놓은 랜덤 데이타(Generate Random)을 선택합니다. 그러면 임의의 수백개의 점 데이타가 생성됩니다. (외부 파일에서 Import/Export 등도 가능)

이 상태로 가공을 할 경우 수백개의 점들의 위치를 가공하는데 약 40초가 걸린다고 한다면, 이를 10초만에 가공할수있도록 경로를 최적해 해 보겠습니다.


메뉴 목록에서 경로 최적화(Path Optimizer)를 누르면 위와같이 경로 최적화 창에 수백개의 점 위치정보를 시각화한채 표시됩니다.

이때 위의 Start 버튼 을 누르면 경로최적화가 실시간으로 진행됩니다.


최적화 진행과정이 실시간 계산되며, 부과적으로 아래 상태바에는 최적화 전의 전체 경로 길이, 최적화 이후 전체 경로 길이, 최적화로 향상된 효율성이 계산되어 나옵니다. 약 334 %의 향상이 있는것이 보이시나요?

이 최적화는 앞서 Group 의 오프셋 에서도 제공하고 있으며, 위와 같이 복잡한 경로를 최적화 해야하는 경우 매우 효율적으로 사용이 가능합니다.

해당 최적화는 TSP(Travel Saleman Problem)으로 NP 복잡문제로 알려져 있습니다.

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...