C#ATIA

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

スピードテスト3

こちらの続きです。kantoku.hatenablog.com
C#で繰り返し処理と言えば、Linqです。 使わないのはもったいないです。
同等な処理か?と言われれば疑問もありますが、実行結果は同じになります。
SpeedTest_CSクラスのみを修正です。

    //cs
    class SpeedTest_CS {
        private INFITF.Application catia;
        private PartDocument PartDoc = null;
        private Part oPart = null;
        private HybridShapeFactory oHybShpFact = null;
        private HybridShapePointCoord oHybShpPt = null;
        private HybridBody oHybBdy = null;

        public SpeedTest_CS(INFITF.Application Catia) {
            this.catia = Catia;
        }

        public void StartTest() {
            PartDoc = catia.ActiveDocument as PartDocument;
            oPart = PartDoc.Part as Part;
            oHybShpFact = oPart.HybridShapeFactory as HybridShapeFactory;

            oHybShpPt = oHybShpFact.AddNewPointCoord(0d, 0d, 0d);//①
            oPart.UpdateObject(oHybShpPt);
            var xPos = Enumerable.Range(1, 500)//②
                                 .Select(i => i * 10d)//②
                                 .ToList();//②

            oHybBdy = oPart.HybridBodies.Add();
            xPos.ForEach(Create_DetumPoints); //③

            oHybShpFact.DeleteObjectForDatum(
                oPart.CreateReferenceFromObject(oHybShpPt));
            oPart.Update();
        }

        private void Create_DetumPoints(double x) {
            oHybShpPt.SetCoordinates(new object[]{ x, 0d, 0d });
            oPart.UpdateObject((AnyObject)oHybShpPt);
            oHybBdy.AppendHybridShape(
                oHybShpFact.AddNewPointDatum(
                oPart.CreateReferenceFromObject(oHybShpPt)));
        }
    }

①部分で作成した点のインスタンスですが、形状セットに入れなくても
マクロは正常に実行します。(これはVBAでも同じです)
その為、今回は形状セットには入れませんでした。

②長いので複数行にしていますが、1行です。
Linqで予めX座標の全ての値を、ジェネリックコレクションとして
生成しています。

③X座標のForEachメソッドでCreate_DetumPointsメソッド
デリゲートで呼び出し処理しています。
試していませんが、処理速度は
For文 < Foreach文 < ForEachメソッド
だったと思います。

実行結果はこちらです。
 1回目:3.49秒
 2回目:3.67秒
 3回目:3.47秒
・・・やっぱりVBAより遅いですねw そうなんです。Linqは遅いんですよ。
まぁ500回程の処理であれば、実質気にならないと思いますが。

個人的に、C#でCATIA V5のマクロを作成する際の印象として、

・作成に手間がかかる

 とにかく参考となる情報が少ない。

・全般的に処理速度が遅い

 僕の能力不足もありますが、アウトプロセス自体が遅い。
 もっと良い方法がありますかね?(DLL化してVBAから呼び出し?)

ソースコードが短い

 同等の処理が、かなり短く書けていませんかね?
 (この部分だけは、かなりのメリット)