読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

手始めに

以前、"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;
        }
    }
}