C#을 사용해서 Catia V5용 매크로/프로그램을 MVVM 구조로 작성하기.
CATIA 열기 또는 실행 방법
MVVM 패턴 구조의 신규 프로젝트를 구성한 후 Catia 관련 작업을 할 class를 새로 추가한다. static 또는 singleton으로...나는 singleton으로 만들어 사용하기로 했다.
public class CatiaDefine
{
private static CATIA_Define _Instance = null;
public static CATIA_Define GetInstance()
{
if (_Instance == null)
{
_Instance = new CATIA_Define();
}
return _Instance;
}
}
INFITF CATIA Application에 대한 Typelib 라이브러리를 추가한다.
CATIA V5 Infinterfaces Object Library
참조>참조 추가
catia를 변수로 선언한다.
public INFITF.Application catia;
GetActiveObject는 이미 CATIA가 실행 중인 상태에서의 인스턴스를 가져온다.
catia = (INFITF.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application");
CreateInstance는 새 인스턴스를 생성한다.
catia = (INFITF.Application)Activator.CreateInstance(Type.GetTypeFromProgID("CATIA.Application"));
메서드로 만들어 컨트롤의 동작이 이루어질 때 실행하게 할 수 있다.
public void CatiaApp()
{
try
{
catia = (INFITF.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application");
}
catch (Exception ex)
{
catia = (INFITF.Application)Activator.CreateInstance(Type.GetTypeFromProgID("CATIA.Application"));
catia.Visible = true;
Console.WriteLine(ex.Message);
}
}
이렇게 작성하면 try에서 실행중인 CATIA 인스턴스를 못 가져왔을 경우 catch에서 새로 CATIA를 실행하게 된다.
다만 이미 CATIA가 실행 중일 때 새 CATIA를 실행하는 것이므로 계속해서 새 CATIA를 띄우는 문제가 생긴다.
처음 코드를 작성했을 때
catia = (INFITF.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("CATIA.Application");
이 부분에서 catia = null 상태였다. 인스턴스를 가져오지 못한 것인데 코드의 문제는 아니었고 Visual Studio를 껐다가 다시 켜보거나 컴퓨터의 재부팅을 하면 해결되는 문제였다.