以前、"Unofficial CATIA User Forum" に投稿したものです。
今見てもかなりしょぼいです。
namespace cattest { using System.Windows.Forms; using Microsoft.VisualBasic;//これを使っていたらC#の意味が半減 using System.Runtime.InteropServices;//COMオブジェクトを操作するために必要 using INFITF;//Catiaのライブラリ using MECMOD;//Catiaのライブラリ class Program { static void Main() { //CATIAを掴む INFITF.Application catia; if (!tryCatia(out catia)) { return; } //Documentを掴む Document catdoc = null; if (!tryDoc(catia, out catdoc)) { return; } //Partを掴む Part part = null; if (!tryPart(catdoc, out part)) { return; } //Selection準備 var arrFilterType = new object[1] { "AnyObject" };//Varianが無いためobject Selection oSel = catdoc.Selection;//VBAと異なりSelection oSel =~ で宣言してもSelectElement2が使用できるみたい //選択・メッセージ while (true) { oSel.Clear(); var Result = oSel.SelectElement2(arrFilterType, "Select Object // [Esc]=Cancel", false); if (Result == "Cancel") { return; }//キャンセル var obj = (AnyObject)oSel.Item(1).Value; //基本的にC#の配列は"[]"で囲むが、ここは"()"で囲む MessageBox.Show("Object Name(あまり正しくないです):" + obj.get_Name() + "\r\n" + "Object Type:" + Information.TypeName(obj) + "\r\n" + "ParentObj Name(全く正しくないです):" + obj.Parent.ToString() + "\r\n" + "ParentObj Type:" + Information.TypeName(obj.Parent)); oSel.Clear(); } } //CATIAの取得 private static bool tryCatia(out INFITF.Application catiaApp) { try { catiaApp = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application"); } catch { MessageBox.Show("CATIAが起動されていません"); catiaApp = null; return false; } return true; } //Documenの取得 private static bool tryDoc(INFITF.Application catia, out Document cat_doc) { try { cat_doc = (Document)catia.ActiveDocument; } catch { MessageBox.Show("ファイルが開かれていません"); cat_doc = null; return false; } return true; } //Partの取得 private static bool tryPart(Document cat_doc, out Part part) { var part_doc = (PartDocument)cat_doc;//都合上PartDocumentにキャスト try { part = part_doc.Part; } catch { MessageBox.Show("Partファイルが開かれていません"); part = null; return false; } return true; } } }