読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

指定した平面から、穴の中心点を作成する3

こちらの続きです。
指定した平面から、穴の中心点を作成する2 - C#ATIA

続いてCATIAを操作する為のCatHelperクラスです。
ラッパークラス的な位置付けです。

//cs
    static class CatHelper {
        public static CatiaContainer State { get; set; }

        public static T SelectItem2<T>(object[] FilterType , string msg) where T : AnyObject {//①
            State.Selection.Clear();
            var Result = State.Selection.SelectElement2(FilterType, msg, false);
            if (Result == "Cancel") { return default(T); }
            return (T)State.Selection.Item(1).Value;
        }

        public static T SelectItem2<T>(string msg) where T : AnyObject {//②
            return SelectItem2<T>(
                new object[] { typeof(T).Name },msg);
        }

        public static void NewHybridBody(string name = null) {
            State.HybridBody = State.Part.HybridBodies.Add();
            if (string.IsNullOrEmpty(name)) { return; }
            State.HybridBody.set_Name(name);
        }

        public static HybridShapeExtract NewExtract(Reference Ref) {
            var Ext = CatHelper.State.HybridShapeFactory.AddNewExtract(Ref);
            Ext.PropagationType = 3;
            Ext.ComplementaryExtract = false;
            Ext.IsFederated = false;
            State.Part.UpdateObject(Ext);
            return Ext;
        }

        public static HybridShapeBoundary NewBoundaryOfSurface(Reference Ref) {
            var bou = State.HybridShapeFactory.AddNewBoundaryOfSurface(Ref);
            State.Part.UpdateObject(bou);
            return bou;
        }

        public static HybridShapePointCenter NewPointCenter(Reference Ref) {
            var pnt = State.HybridShapeFactory.AddNewPointCenter(Ref);
            try {
                State.Part.UpdateObject(pnt);
                return pnt;
            } catch (Exception) {
                State.HybridShapeFactory.DeleteObjectForDatum(Ref);
                return null;
            }
        }

        public static HybridShapePointExplicit NewPointDatum(Reference Ref) {
            var datam = State.HybridShapeFactory.AddNewPointDatum(Ref);
            State.Part.UpdateObject(datam);
            return datam;
        }

        public static void DeleteObject(List<AnyObject> dels) {
            foreach (Reference d in dels) {
                State.HybridShapeFactory.DeleteObjectForDatum(d);
            }
        }
    }

ユーザーに選択を行ってもらう"Selection.SelectElement2"は、どのマクロでも
比較的利用するものなので、何とかジェネリック化したいと思い、①を最初に作りました。

このまま利用すると呼び出し側では、こんな感じになります。

//cs
        var Result = CatHelper.SelectItem2<PlanarFace>//③
            (new object[] { "PlanarFace" },//④
            "中心を作成する面を選択して下さい / [Esc]=キャンセル");

③:型指定で「PlanarFace」としています。
④:選択時のフィルタとしてのオブジェクト配列(VBAではバリアント配列)
  で「"PlanarFace"」を指定しています。
そうなんです、③④で2度「PlanarFace」を指定しており、C#er(に限らず)は
大嫌いなんですよね、こんなヤツ。

その為オーバーロードさせ②を作りました。呼び出し側ではこんな感じです。

//cs
        var Result = CatHelper.SelectItem2<PlanarFace>//⑤
            ("中心を作成する面を選択して下さい // [Esc]=キャンセル");

「PlanarFace」の指定が⑤の一行となりました。選択時のフィルタは
1種類限定になるのですが、複数必要な場合の方が少ないはずなので
これで十分ですね。