こちらの続きです。
レイヤーの扱いを考える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型です。
実際VBAでは、Long型で書いています。
'vba Dim Layertype As CatVisLayerType, Layer As Long
ところが、C#の場合はlong型ではエラーになるため
int型にしています。
//cs CatVisLayerType Layertype; int Layer;
これは、恐らくお互いの型サイズの違いによって起きるのですが、
頼るものがオートメーションマニュアルしかないのに、記述を
鵜呑みには出来ません。 但しVisual Studioを使用し参照設定を
行っていれば、マウスのカーソルをメソッド上に持って行けば
正しい型名で表示されています。
又、COEで少し記載されていたのですが、CATIA V5のVBAが
R2014でVBA7.1にバージョンアップしています。
(エディタの雰囲気が若干異なります)
手元のものでは
R2012-VBA6.5
R2013-VBA6.5
R2014-VBA7.1
になっています。
詳しくは調べていませんが、VBA7では64bit版Windows用の機能が強化
されているとの事で、型サイズについての仕様変更が有るか?無いか?
が話題となっていました。
結果的には仕様変更は無いようなので、R2014にした際にマクロが
動かなくなっても、型サイズが原因ではないはずですね。