こちらの続き
レイヤーの扱いを考える1 - C#ATIA
VBAではこれは無理のような気がしますが、
'vba これは動きません LayerNumber = hybridShape.GetLayer()
まず、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オブジェクトはガベージコレクションの対象外となる
ようなので、本来は必要なようです。
ん~なかなか進まないなぁ