ActiveDocument가 PartDocument일때 Axis System의 이름을 변경하거나 Publication을 추가, 제거하는 방법.
이 글에서 실행중인 CATIA를 얻어온 후 시작한다.
실행 중인 CATIA에서 열려 있는 PartDocument에서 Product를 찾는다.
PartDocument partDocument = (PartDocument)CATIA_Define.oCATIA.ActiveDocument;
Product product = partDocument.Product;
Selection을 Clear하고 시작한다.
Selection catiaSelect = partDocument.Selection;
catiaSelect.Clear();
Selection에서 사용할 수 있는 메소드로 SelectElement2, SelectElement3, SelectElement4 등이 있다.
2는 하나의 객체를 선택할 수 있다.
3은 여러 객체를 선택할 수 있다.
4는 활성화 되지 않은 Document에서 여러 객체를 선택할 수 있다.
하나의 객체를 선택할 것이기 때문에 SelectElement2를 사용한다.
SelectElement2의 인자는 다음과 같다.
SelectElement2(Array iFilterType, ref string iMessage, bool iObjectSelectionBeforeCommandUsePossibility)
object[] filter = new object[1];
object selectElement;
selectElement = catiaSelect.SelectElement2(filter, "Select Axis System in which you want to add", false);
SelectElement2가 실행되면 CATIA에서 객체를 선택할 수 있는 상태가 된다.
설명을 위해 Axis System을 선택하겠다고 적어두었지만 Axis System외에도 선택이 되기 때문에 선택된 객체가 어떤 타입인지 구분할 수 있어야 한다.
if (selectElement != null)
{
if (Information.TypeName(catiaSelect.Item(1).Value).Equals("AxisSystem"))
{
.
.
.
}
}
Selection의 첫 번째 item.Value의 TypeName이 AxisSystem이라는 것을 확인했다면 AxisSystem 타입의 객체에 넣어줄 수 있다.
AxisSystem axisSystem = catiaSelect.Item(1).Value;
axisSystem에서 .get_Name()으로 Feature Name을 얻을 수 있고, .set_Name()으로 Feature Name을 변경할 수 있다.
Catia의 Tools>Publication에서 Axis System과 연결된 Publication을 추가할 수 있다.
이때 추가된 Publication의 이름은 연결된 Axis System의 이름과 같다.
Axis System의 이름을 변경해도 연결은 끊어지지 않는다. 변경된 Axis System의 이름이 Element에 반영되어있기 때문이다.
Catia의 Visual Basic help의 내용에 따르면 CreateReferenceFromName은 이름으로 Reference를 생성하는 메서드이다.
들어가는 인자의 내용은 경로인데 "/"를 사용하여 구성 요소를 분리하고, 제품 경로는 "/!"을 사용하여 분리한다.
제품 경로에서 매개변수를 분리하려면 "\"를 사용하면 된다고 한다.
즉 /! 뒤의 문자열이 Publication의 이름이 된다.
Product product = partDocument.Product;
Reference reference = product.CreateReferenceFromName(product.get_Name() + "/!" + "Axis System.1");
Publications publications = product.Publications;
publications.Add("Axis System.1");
설명을 위해 간단한 구조의 PartDocument로 작업했기 때문에 CreateRefrenceFromName에 작성한 경로를 product.get_Name() + "/!" + "Axis System.1" 이라고 작성했는데 이 부분은 쓰는 사람마다 다 다를 것이다.
Publication의 이름을 알면 Publication을 제거할 수 있다.
또는 Publication에 연결된 Axis System의 이름을 알면 Publication을 제거할 수 있다.
다음의 코드는 Publications의 개수만큼 for문을 반복하여
Publication에 연결된 Axis System의 이름에 "Axis System.1"이 포함되어 있으면
그 Publication을 Publications에서 Remove하는 코드이다.
Publications publications = product.Publications;
for (int i = 1; i <= publications.Count; i++)
{
Publication publication = publications.Item(i);
Reference reference = (Reference)publication.Valuation;
if (reference.DisplayName.IndexOf("Axis System.1") > 0)
{
publications.Remove(publications.Item(i).get_Name());
}
}
Catia Automation 관련 글은 내가 잘 알아서 쓴다기보다는 정말로 안까먹으려고 작성한다.
구글링을 해도 특히 Automation, Macro 관련해서는 한글로 된 글이 별로 없거나...영어권 자료도 빨라야 19년, 22년...정도여서 난감하다.
하지만 비주얼 베이직으로 작성된 코드를 C#으로 바꾸는 과정은 흥미롭다.
Catia에 대해서도 더 알고싶다. 익숙해지는 그날까지 화이팅~~
혹시나 이 글을 읽었는데 잘 못 적은 어휘나 내용이 있다면 이해와 댓글을 부탁드립니다...
Selection 관련
Publications, Publication 관련