こちらの続きです。
指定した平面から、穴の中心点を作成する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種類限定になるのですが、複数必要な場合の方が少ないはずなので
これで十分ですね。