C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

レイヤーの扱いを考える2

こちらの続き
レイヤーの扱いを考える1 - C#ATIA

VBAではこれは無理のような気がしますが、

    'vba これは動きません
    LayerNumber = hybridShape.GetLayer()

C#の場合なら、拡張メソッドで出来そうです。

まず、DocumentやらSelection等よく使いそうなものを毎回取得したり、
引数にするのも面倒なので、後々の事も考えそれらのオブジェクトを
保持するクラスを作っておきます。

    //cs
    class CatiaContainer {
        private INFITF.Application catia;
        private PartDocument partDoc = null;
        private Part part = null;
        private Selection selection = null;
        private HybridShapeFactory hybridShapeFactory = null;
        private HybridBody hybridBody = null;

        public CatiaContainer(INFITF.Application Catia) {
            this.catia = Catia;
            PartDoc = catia.ActiveDocument as PartDocument;
            Part = PartDoc.Part as Part;
            Selection = PartDoc.Selection as Selection;
            HybridShapeFactory = Part.HybridShapeFactory as HybridShapeFactory;
        }

        ~CatiaContainer(){
            if (hybridBody!=null) { Marshal.ReleaseComObject(hybridBody); }
            if (hybridShapeFactory !=null) { Marshal.ReleaseComObject(hybridShapeFactory); }
            if (selection!=null) { Marshal.ReleaseComObject(selection); }
            if (part!=null) { Marshal.ReleaseComObject(part); }
            if (partDoc!=null) { Marshal.ReleaseComObject(partDoc); }
            if (catia!=null) { Marshal.ReleaseComObject(catia); }
        }

        public PartDocument PartDoc { get; private set; }
        public Part Part { get; private set; }
        public Selection Selection { get; private set; }
        public HybridShapeFactory HybridShapeFactory { get; private set; }
        public HybridBody HybridBody {
            get {
                return hybridBody;
            }
            set {
                hybridBody = value as HybridBody;
            }
        }
    }

コンストラクタでCATIAを受け取ることにします。 その際にDocument等を
取得しますが、本来なら例外などが必要ですが、割愛。(ごめんなさい)
形状セット(HybridBody)だけは、作業領域として変化する可能性もあるため
読み書き可能なプロパティとします。
又、COMオブジェクトの破棄をデストラクタで行うことにします。
DotNet上では、COMオブジェクトはガベージコレクションの対象外となる
ようなので、本来は必要なようです。

ん~なかなか進まないなぁ