C#ATIA

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

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

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

下準備が終わったので、ようやくメインとなる部分です。

//cs
    using System.Linq;
    using System.Diagnostics;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using INFITF;//Catiaのライブラリ
    using MECMOD;//Catiaのライブラリ
    using HybridShapeTypeLib;//Catiaのライブラリ

    static class Program {
        static void Main() {
            var catia = (INFITF.Application)Marshal
                        .GetActiveObject("CATIA.Application");
            var test = new LayerNumber_CS(catia);
            test.StartTest();
        }
    }

    class LayerNumber_CS {
        public LayerNumber_CS(INFITF.Application Catia) {
            CatExtension.State = new CatiaContainer(Catia);
        }

        public void StartTest() {
            var hybridShape = CatExtension.State.Part
                              .HybridBodies.Item(1)
                              .HybridShapes.Item(1);
            var LayerNumber = hybridShape.GetLayer();//①
            MessageBox.Show(LayerNumber.ToString());
        }
    }

①部分で当初望んでいた形で、レイヤー番号を取得できるようになりました。
それにしても長かったです。 が、下準備として用意したCatiaContainerクラス
やCatExtensionクラスを改良し育てて行けば、新たなマクロを作成する際の
負担が軽減できるのではないかな?と思っています。

余談ですが、今回使用したVisPropertySetクラスのGetLayerメソッドですが、
2番目の引数は、オートメーションマニュアルの記載では、Long型です。
f:id:kandennti:20150416182913j:plain
実際VBAでは、Long型で書いています。

    'vba
    Dim Layertype As CatVisLayerType, Layer As Long

ところが、C#の場合はlong型ではエラーになるため
int型にしています。

            //cs
            CatVisLayerType Layertype;
            int Layer;

これは、恐らくお互いの型サイズの違いによって起きるのですが、
頼るものがオートメーションマニュアルしかないのに、記述を
鵜呑みには出来ません。 但しVisual Studioを使用し参照設定を
行っていれば、マウスのカーソルをメソッド上に持って行けば
正しい型名で表示されています。
f:id:kandennti:20150420094655j:plain

又、COEで少し記載されていたのですが、CATIA V5のVBA
R2014でVBA7.1にバージョンアップしています。
(エディタの雰囲気が若干異なります)
手元のものでは
R2012-VBA6.5
R2013-VBA6.5
R2014-VBA7.1
になっています。

詳しくは調べていませんが、VBA7では64bit版Windows用の機能が強化
されているとの事で、型サイズについての仕様変更が有るか?無いか?
が話題となっていました。
結果的には仕様変更は無いようなので、R2014にした際にマクロが
動かなくなっても、型サイズが原因ではないはずですね。