こちらの続きです。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から呼び出し?)
・ソースコードが短い
同等の処理が、かなり短く書けていませんかね?
(この部分だけは、かなりのメリット)